@spfn/cms 0.1.0-alpha.7 → 0.1.0-alpha.71
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-BpTAYuBA.d.ts} +70 -7
- package/dist/actions.d.ts +2 -9
- package/dist/actions.js +97 -10
- package/dist/actions.js.map +1 -1
- package/dist/api.d.ts +214 -0
- package/dist/api.js +353 -0
- package/dist/api.js.map +1 -0
- package/dist/client.d.ts +136 -127
- package/dist/client.js +1199 -59
- package/dist/client.js.map +1 -1
- package/dist/{types.d.ts → index-Dh5FjWzR.d.ts} +45 -7
- package/dist/index.d.ts +108 -16
- package/dist/index.js +610 -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 +151 -0
- package/dist/lib/contracts/labels.js +168 -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 +103 -0
- package/dist/lib/contracts/values.js.map +1 -0
- package/dist/locale.constants-BMBK70YM.d.ts +104 -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-label-versions.d.ts +16 -49
- package/dist/server/entities/cms-label-versions.js +76 -0
- package/dist/server/entities/cms-label-versions.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 +7 -0
- package/dist/server/entities/index.js +218 -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 +753 -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 +32 -0
- package/dist/server/labels/index.js.map +1 -0
- package/dist/server/repositories/index.d.ts +209 -0
- package/dist/server/repositories/index.js +441 -0
- package/dist/server/repositories/index.js.map +1 -0
- package/dist/server/routes/labels/[id]/index.js +508 -0
- package/dist/server/routes/labels/[id]/index.js.map +1 -0
- package/dist/{routes/labels/[id] → server/routes/labels/_id_}/index.d.ts +5 -3
- package/dist/server/routes/labels/by-key/[key]/index.js +458 -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 +620 -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 +369 -0
- package/dist/server/routes/published-cache/index.js.map +1 -0
- package/dist/server/routes/values/[labelId]/[version]/index.js +479 -0
- package/dist/server/routes/values/[labelId]/[version]/index.js.map +1 -0
- package/dist/server/routes/values/[labelId]/index.js +474 -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 +78 -7
- package/dist/server.js +1750 -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/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/_journal.json +27 -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.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 -87
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spfn/cms",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.71",
|
|
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,38 @@
|
|
|
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
|
"./server": {
|
|
14
15
|
"types": "./dist/server.d.ts",
|
|
15
|
-
"import": "./dist/server.js"
|
|
16
|
+
"import": "./dist/server.js",
|
|
17
|
+
"require": "./dist/server.js"
|
|
16
18
|
},
|
|
17
19
|
"./client": {
|
|
18
20
|
"types": "./dist/client.d.ts",
|
|
19
|
-
"import": "./dist/client.js"
|
|
21
|
+
"import": "./dist/client.js",
|
|
22
|
+
"require": "./dist/client.js"
|
|
23
|
+
},
|
|
24
|
+
"./api": {
|
|
25
|
+
"types": "./dist/api.d.ts",
|
|
26
|
+
"import": "./dist/api.js",
|
|
27
|
+
"require": "./dist/api.js"
|
|
20
28
|
},
|
|
21
29
|
"./actions": {
|
|
22
30
|
"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"
|
|
32
|
-
},
|
|
33
|
-
"./labels": {
|
|
34
|
-
"types": "./dist/labels/index.d.ts",
|
|
35
|
-
"import": "./dist/labels/index.js"
|
|
31
|
+
"import": "./dist/actions.js",
|
|
32
|
+
"require": "./dist/actions.js"
|
|
36
33
|
},
|
|
37
34
|
"./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"
|
|
44
|
-
},
|
|
45
|
-
"./repositories": {
|
|
46
|
-
"types": "./dist/repositories/index.d.ts",
|
|
47
|
-
"import": "./dist/repositories/index.js"
|
|
35
|
+
"types": "./dist/server/generators/index.d.ts",
|
|
36
|
+
"import": "./dist/server/generators/index.js",
|
|
37
|
+
"require": "./dist/server/generators/index.js"
|
|
48
38
|
}
|
|
49
39
|
},
|
|
50
40
|
"files": [
|
|
51
41
|
"dist",
|
|
42
|
+
"migrations",
|
|
52
43
|
"README.md"
|
|
53
44
|
],
|
|
54
45
|
"keywords": [
|
|
@@ -67,20 +58,32 @@
|
|
|
67
58
|
"directory": "packages/cms"
|
|
68
59
|
},
|
|
69
60
|
"spfn": {
|
|
61
|
+
"prefix": "/_cms",
|
|
70
62
|
"schemas": [
|
|
71
|
-
"./dist/entities/*.js"
|
|
63
|
+
"./dist/server/entities/*.js"
|
|
72
64
|
],
|
|
73
65
|
"routes": {
|
|
74
|
-
"
|
|
75
|
-
|
|
66
|
+
"dir": "./dist/server/routes"
|
|
67
|
+
},
|
|
68
|
+
"migrations": {
|
|
69
|
+
"dir": "./migrations"
|
|
70
|
+
},
|
|
71
|
+
"codegen": {
|
|
72
|
+
"generators": [
|
|
73
|
+
{
|
|
74
|
+
"name": "@spfn/core:contract",
|
|
75
|
+
"contractsDir": "src/lib/contracts",
|
|
76
|
+
"outputPath": "src/api"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
76
79
|
},
|
|
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/
|
|
80
|
+
"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
81
|
},
|
|
79
82
|
"peerDependencies": {
|
|
80
83
|
"drizzle-orm": "^0.44.0",
|
|
81
84
|
"next": "^15.0.0",
|
|
82
85
|
"react": "^18.0.0 || ^19.0.0",
|
|
83
|
-
"@spfn/core": "0.1.0-alpha.
|
|
86
|
+
"@spfn/core": "0.1.0-alpha.68"
|
|
84
87
|
},
|
|
85
88
|
"dependencies": {
|
|
86
89
|
"@sinclair/typebox": "^0.34.0",
|
|
@@ -88,14 +91,30 @@
|
|
|
88
91
|
"zustand": "^5.0.8"
|
|
89
92
|
},
|
|
90
93
|
"devDependencies": {
|
|
94
|
+
"@types/node": "^20.11.0",
|
|
91
95
|
"@types/react": "^19",
|
|
96
|
+
"@vitest/coverage-v8": "^4.0.6",
|
|
97
|
+
"drizzle-kit": "^0.31.6",
|
|
92
98
|
"drizzle-typebox": "^0.1.0",
|
|
99
|
+
"glob": "^11.0.3",
|
|
100
|
+
"postgres": "^3.4.0",
|
|
93
101
|
"tsup": "^8.3.5",
|
|
94
|
-
"
|
|
102
|
+
"tsx": "^4.19.2",
|
|
103
|
+
"typescript": "^5",
|
|
104
|
+
"vitest": "^4.0.6",
|
|
105
|
+
"spfn": "0.1.0-alpha.68"
|
|
95
106
|
},
|
|
96
107
|
"scripts": {
|
|
97
|
-
"build": "
|
|
98
|
-
"watch": "
|
|
99
|
-
"clean": "rm -rf dist"
|
|
108
|
+
"build": "npm run db:generate && tsup",
|
|
109
|
+
"watch": "tsup --watch",
|
|
110
|
+
"clean": "rm -rf dist migrations",
|
|
111
|
+
"db:generate": "drizzle-kit generate",
|
|
112
|
+
"codegen": "spfn codegen run",
|
|
113
|
+
"test": "vitest",
|
|
114
|
+
"test:coverage": "vitest run --coverage",
|
|
115
|
+
"test:routes": "vitest src/server/routes",
|
|
116
|
+
"docker:test:up": "docker compose -f docker-compose.test.yml up -d",
|
|
117
|
+
"docker:test:down": "docker compose -f docker-compose.test.yml down",
|
|
118
|
+
"docker:test:logs": "docker compose -f docker-compose.test.yml logs -f"
|
|
100
119
|
}
|
|
101
120
|
}
|
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.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/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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-audit-logs.d.ts","sourceRoot":"","sources":["../../src/entities/cms-audit-logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCvB,CAAC;AAGH,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,YAAY,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,OAAO,YAAY,CAAC,YAAY,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CMS Audit Logs Entity
|
|
3
|
-
*
|
|
4
|
-
* CMS의 모든 변경사항을 추적합니다.
|
|
5
|
-
* - 누가 (userId, userName)
|
|
6
|
-
* - 언제 (createdAt)
|
|
7
|
-
* - 무엇을 (action, changes)
|
|
8
|
-
* - 왜 (metadata)
|
|
9
|
-
*/
|
|
10
|
-
import { serial, integer, text, jsonb, timestamp, index } from 'drizzle-orm/pg-core';
|
|
11
|
-
import { createFunctionSchema } from '@spfn/core/db';
|
|
12
|
-
import { cmsLabels } from './cms-labels.js';
|
|
13
|
-
// Create isolated schema for @spfn/cms
|
|
14
|
-
const schema = createFunctionSchema('@spfn/cms');
|
|
15
|
-
export const cmsAuditLogs = schema.table('audit_logs', {
|
|
16
|
-
// Primary Key
|
|
17
|
-
id: serial('id').primaryKey(),
|
|
18
|
-
// Foreign Key: cms_labels (nullable - 라벨 삭제 시 로그는 유지)
|
|
19
|
-
labelId: integer('label_id')
|
|
20
|
-
.references(() => cmsLabels.id, { onDelete: 'set null' }),
|
|
21
|
-
// 작업 유형
|
|
22
|
-
action: text('action').notNull(),
|
|
23
|
-
// "create" | "update" | "publish" | "unpublish" | "archive" | "delete" | "rollback" | "duplicate"
|
|
24
|
-
// 사용자 정보
|
|
25
|
-
userId: text('user_id').notNull(),
|
|
26
|
-
userName: text('user_name'),
|
|
27
|
-
// 변경 내용 (before/after)
|
|
28
|
-
changes: jsonb('changes'),
|
|
29
|
-
// { before: {...}, after: {...} }
|
|
30
|
-
// 추가 메타데이터
|
|
31
|
-
metadata: jsonb('metadata'),
|
|
32
|
-
// { version: number, ip: string, userAgent: string, ... }
|
|
33
|
-
// 작업 시각
|
|
34
|
-
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
35
|
-
}, (table) => [
|
|
36
|
-
// 인덱스: labelId로 이력 조회 최적화
|
|
37
|
-
index('cms_audit_logs_label_id_idx').on(table.labelId),
|
|
38
|
-
// 인덱스: userId로 사용자 활동 조회 최적화
|
|
39
|
-
index('cms_audit_logs_user_id_idx').on(table.userId),
|
|
40
|
-
// 인덱스: action 필터링 최적화
|
|
41
|
-
index('cms_audit_logs_action_idx').on(table.action),
|
|
42
|
-
// 인덱스: 시간순 조회 최적화
|
|
43
|
-
index('cms_audit_logs_created_at_idx').on(table.createdAt),
|
|
44
|
-
]);
|
|
45
|
-
/**
|
|
46
|
-
* 사용 예시:
|
|
47
|
-
*
|
|
48
|
-
* // 라벨 생성 로그
|
|
49
|
-
* await db.insert(cmsAuditLogs).values({
|
|
50
|
-
* labelId: 1,
|
|
51
|
-
* action: 'create',
|
|
52
|
-
* userId: 'user123',
|
|
53
|
-
* userName: '김철수',
|
|
54
|
-
* changes: {
|
|
55
|
-
* before: null,
|
|
56
|
-
* after: {
|
|
57
|
-
* key: 'home.hero.title',
|
|
58
|
-
* section: 'home',
|
|
59
|
-
* type: 'text'
|
|
60
|
-
* }
|
|
61
|
-
* },
|
|
62
|
-
* metadata: {
|
|
63
|
-
* ip: '192.168.1.1',
|
|
64
|
-
* userAgent: 'Mozilla/5.0...'
|
|
65
|
-
* }
|
|
66
|
-
* });
|
|
67
|
-
*
|
|
68
|
-
* // 발행 로그
|
|
69
|
-
* await db.insert(cmsAuditLogs).values({
|
|
70
|
-
* labelId: 1,
|
|
71
|
-
* action: 'publish',
|
|
72
|
-
* userId: 'admin123',
|
|
73
|
-
* userName: '관리자',
|
|
74
|
-
* changes: {
|
|
75
|
-
* before: { status: 'draft', publishedVersion: null },
|
|
76
|
-
* after: { status: 'published', publishedVersion: 2 }
|
|
77
|
-
* },
|
|
78
|
-
* metadata: {
|
|
79
|
-
* version: 2,
|
|
80
|
-
* notes: '신규 브랜딩 적용'
|
|
81
|
-
* }
|
|
82
|
-
* });
|
|
83
|
-
*
|
|
84
|
-
* // 라벨별 이력 조회
|
|
85
|
-
* const logs = await db.select()
|
|
86
|
-
* .from(cmsAuditLogs)
|
|
87
|
-
* .where(eq(cmsAuditLogs.labelId, 1))
|
|
88
|
-
* .orderBy(desc(cmsAuditLogs.createdAt))
|
|
89
|
-
* .limit(20);
|
|
90
|
-
*
|
|
91
|
-
* // 사용자별 활동 조회
|
|
92
|
-
* const userActivity = await db.select()
|
|
93
|
-
* .from(cmsAuditLogs)
|
|
94
|
-
* .where(eq(cmsAuditLogs.userId, 'user123'))
|
|
95
|
-
* .orderBy(desc(cmsAuditLogs.createdAt));
|
|
96
|
-
*
|
|
97
|
-
* // 최근 24시간 변경 이력
|
|
98
|
-
* const recent = await db.select()
|
|
99
|
-
* .from(cmsAuditLogs)
|
|
100
|
-
* .where(gte(cmsAuditLogs.createdAt, new Date(Date.now() - 24 * 60 * 60 * 1000)))
|
|
101
|
-
* .orderBy(desc(cmsAuditLogs.createdAt));
|
|
102
|
-
*/
|
|
103
|
-
//# sourceMappingURL=cms-audit-logs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-audit-logs.js","sourceRoot":"","sources":["../../src/entities/cms-audit-logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,uCAAuC;AACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;IACnD,cAAc;IACd,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE7B,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;SAC3B,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEzD,QAAQ;IACR,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;IAChC,kGAAkG;IAElG,SAAS;IACT,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACjC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;IAE3B,uBAAuB;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,kCAAkC;IAElC,WAAW;IACX,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;IAC3B,0DAA0D;IAE1D,QAAQ;IACR,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CACpF,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IACV,0BAA0B;IAC1B,KAAK,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IAEtD,6BAA6B;IAC7B,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAEpD,sBAAsB;IACtB,KAAK,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAEnD,kBAAkB;IAClB,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAC7D,CAAC,CAAC;AAMH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-draft-cache.d.ts","sourceRoot":"","sources":["../../src/entities/cms-draft-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCxB,CAAC;AAGH,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CMS Draft Cache Entity
|
|
3
|
-
*
|
|
4
|
-
* 관리자별 Draft 콘텐츠를 캐싱합니다.
|
|
5
|
-
* - 사용자별 격리 (userId)
|
|
6
|
-
* - 실시간 미리보기 지원
|
|
7
|
-
* - 동시 편집 가능
|
|
8
|
-
*
|
|
9
|
-
* 핵심 기능:
|
|
10
|
-
* - 여러 관리자가 같은 섹션을 동시에 편집
|
|
11
|
-
* - 각자의 변경사항은 자신의 미리보기에만 표시
|
|
12
|
-
* - 충돌 없이 안전하게 작업
|
|
13
|
-
*/
|
|
14
|
-
import { serial, text, jsonb, timestamp, index, unique } from 'drizzle-orm/pg-core';
|
|
15
|
-
import { createFunctionSchema } from '@spfn/core/db';
|
|
16
|
-
// Create isolated schema for @spfn/cms
|
|
17
|
-
const schema = createFunctionSchema('@spfn/cms');
|
|
18
|
-
export const cmsDraftCache = schema.table('draft_cache', {
|
|
19
|
-
// Primary Key
|
|
20
|
-
id: serial('id').primaryKey(),
|
|
21
|
-
// 섹션 (페이지 단위)
|
|
22
|
-
section: text('section').notNull(),
|
|
23
|
-
// "home" | "why-futureplay" | "team" | "our-companies" | "apply"
|
|
24
|
-
// 언어
|
|
25
|
-
locale: text('locale').notNull(),
|
|
26
|
-
// "ko" | "en" | "ja"
|
|
27
|
-
// 사용자 ID (핵심 필드!)
|
|
28
|
-
userId: text('user_id').notNull(),
|
|
29
|
-
// 각 관리자의 독립적인 작업 공간
|
|
30
|
-
// Draft 콘텐츠 (JSONB)
|
|
31
|
-
content: jsonb('content').notNull(),
|
|
32
|
-
// Record<string, LabelValue>
|
|
33
|
-
// {
|
|
34
|
-
// "home.hero.title": { type: "text", content: "수정 중..." },
|
|
35
|
-
// "home.hero.subtitle": { type: "text", content: "새로운 문구" },
|
|
36
|
-
// ...
|
|
37
|
-
// }
|
|
38
|
-
// 최종 수정 시각
|
|
39
|
-
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
|
40
|
-
}, (table) => [
|
|
41
|
-
// UNIQUE 제약: section + locale + userId 조합은 유일
|
|
42
|
-
unique('cms_draft_cache_unique')
|
|
43
|
-
.on(table.section, table.locale, table.userId),
|
|
44
|
-
// 인덱스: section으로 조회 최적화
|
|
45
|
-
index('cms_draft_cache_section_idx').on(table.section),
|
|
46
|
-
// 인덱스: userId로 사용자의 모든 draft 조회 최적화
|
|
47
|
-
index('cms_draft_cache_user_idx').on(table.userId),
|
|
48
|
-
]);
|
|
49
|
-
/**
|
|
50
|
-
* 사용 예시:
|
|
51
|
-
*
|
|
52
|
-
* // Draft 초기화 (편집 시작)
|
|
53
|
-
* await db.insert(cmsDraftCache)
|
|
54
|
-
* .values({
|
|
55
|
-
* section: 'home',
|
|
56
|
-
* locale: 'ko',
|
|
57
|
-
* userId: 'user-a@futureplay.com',
|
|
58
|
-
* content: publishedContent // 발행 버전 복사
|
|
59
|
-
* });
|
|
60
|
-
*
|
|
61
|
-
* // Draft 업데이트 (값 수정 시)
|
|
62
|
-
* const cache = await db.select()
|
|
63
|
-
* .from(cmsDraftCache)
|
|
64
|
-
* .where(and(
|
|
65
|
-
* eq(cmsDraftCache.section, 'home'),
|
|
66
|
-
* eq(cmsDraftCache.locale, 'ko'),
|
|
67
|
-
* eq(cmsDraftCache.userId, userId)
|
|
68
|
-
* ))
|
|
69
|
-
* .limit(1);
|
|
70
|
-
*
|
|
71
|
-
* const updatedContent = {
|
|
72
|
-
* ...cache[0].content,
|
|
73
|
-
* 'home.hero.title': newValue // 부분 업데이트
|
|
74
|
-
* };
|
|
75
|
-
*
|
|
76
|
-
* await db.update(cmsDraftCache)
|
|
77
|
-
* .set({ content: updatedContent, updatedAt: new Date() })
|
|
78
|
-
* .where(eq(cmsDraftCache.id, cache[0].id));
|
|
79
|
-
*
|
|
80
|
-
* // Draft 조회 (미리보기)
|
|
81
|
-
* const draft = await db.select()
|
|
82
|
-
* .from(cmsDraftCache)
|
|
83
|
-
* .where(and(
|
|
84
|
-
* eq(cmsDraftCache.section, 'home'),
|
|
85
|
-
* eq(cmsDraftCache.locale, 'ko'),
|
|
86
|
-
* eq(cmsDraftCache.userId, session.user.id)
|
|
87
|
-
* ))
|
|
88
|
-
* .limit(1);
|
|
89
|
-
*
|
|
90
|
-
* // 사용자의 모든 작업 중인 섹션 조회
|
|
91
|
-
* const userDrafts = await db.select()
|
|
92
|
-
* .from(cmsDraftCache)
|
|
93
|
-
* .where(eq(cmsDraftCache.userId, userId))
|
|
94
|
-
* .orderBy(desc(cmsDraftCache.updatedAt));
|
|
95
|
-
*
|
|
96
|
-
* // 오래된 Draft 정리 (30일 이상)
|
|
97
|
-
* const stale = await db.delete(cmsDraftCache)
|
|
98
|
-
* .where(lt(
|
|
99
|
-
* cmsDraftCache.updatedAt,
|
|
100
|
-
* new Date(Date.now() - 30 * 24 * 60 * 60 * 1000)
|
|
101
|
-
* ))
|
|
102
|
-
* .returning();
|
|
103
|
-
*
|
|
104
|
-
* // Draft 폐기 (변경사항 버리기)
|
|
105
|
-
* await db.delete(cmsDraftCache)
|
|
106
|
-
* .where(and(
|
|
107
|
-
* eq(cmsDraftCache.section, 'home'),
|
|
108
|
-
* eq(cmsDraftCache.locale, 'ko'),
|
|
109
|
-
* eq(cmsDraftCache.userId, userId)
|
|
110
|
-
* ));
|
|
111
|
-
*/
|
|
112
|
-
//# sourceMappingURL=cms-draft-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-draft-cache.js","sourceRoot":"","sources":["../../src/entities/cms-draft-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,uCAAuC;AACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE;IACrD,cAAc;IACd,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE7B,cAAc;IACd,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,iEAAiE;IAEjE,KAAK;IACL,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;IAChC,qBAAqB;IAErB,kBAAkB;IAClB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACjC,oBAAoB;IAEpB,oBAAoB;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACnC,6BAA6B;IAC7B,IAAI;IACJ,6DAA6D;IAC7D,+DAA+D;IAC/D,QAAQ;IACR,IAAI;IAEJ,WAAW;IACX,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CACpF,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IACV,8CAA8C;IAC9C,MAAM,CAAC,wBAAwB,CAAC;SAC/B,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IAE9C,wBAAwB;IACxB,KAAK,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IAEtD,oCAAoC;IACpC,KAAK,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;CACrD,CAAC,CAAC;AAMH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms-label-values.d.ts","sourceRoot":"","sources":["../../src/entities/cms-label-values.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CzB,CAAC;AAGH,MAAM,MAAM,aAAa,GAAG,OAAO,cAAc,CAAC,YAAY,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,OAAO,cAAc,CAAC,YAAY,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG"}
|