@roottale/cms-core 0.70.1 → 0.72.0
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/CHANGELOG.md +27 -0
- package/README.md +21 -0
- package/dist/chunk-WNU53PSH.js +197 -0
- package/dist/chunk-WNU53PSH.js.map +1 -0
- package/dist/index.cjs +424 -93
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +130 -1
- package/dist/index.d.ts +130 -1
- package/dist/index.js +151 -1
- package/dist/index.js.map +1 -1
- package/dist/visual-edit-contract-DzlMel7r.d.cts +822 -0
- package/dist/visual-edit-contract-DzlMel7r.d.ts +822 -0
- package/dist/visual-edit.cjs +339 -0
- package/dist/visual-edit.cjs.map +1 -0
- package/dist/visual-edit.d.cts +77 -0
- package/dist/visual-edit.d.ts +77 -0
- package/dist/visual-edit.js +153 -0
- package/dist/visual-edit.js.map +1 -0
- package/package.json +7 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VISUAL_EDIT_ATTRIBUTE,
|
|
3
|
+
VISUAL_EDIT_PROTOCOL,
|
|
4
|
+
VISUAL_EDIT_PROTOCOL_VERSION,
|
|
5
|
+
buildVisualEditPreviewUrl,
|
|
6
|
+
getContentValue,
|
|
7
|
+
isVisualEditOrigin,
|
|
8
|
+
parseVisualEditAddress,
|
|
9
|
+
parseVisualEditMessage,
|
|
10
|
+
sameVisualDependencies,
|
|
11
|
+
sameVisualPreviewTarget,
|
|
12
|
+
visualEditAddressKey,
|
|
13
|
+
visualEditAddressSchema,
|
|
14
|
+
visualEditAttributes,
|
|
15
|
+
visualPreviewTargetSchema,
|
|
16
|
+
visualRenderReceiptSchema
|
|
17
|
+
} from "./chunk-WNU53PSH.js";
|
|
18
|
+
|
|
19
|
+
// src/visual-edit-preview.ts
|
|
20
|
+
function createVisualEditMessage(envelope, payload) {
|
|
21
|
+
return { protocol: VISUAL_EDIT_PROTOCOL, protocolVersion: VISUAL_EDIT_PROTOCOL_VERSION, ...envelope, ...payload };
|
|
22
|
+
}
|
|
23
|
+
function isCurrentVisualEditMessage(message, expected) {
|
|
24
|
+
return message !== null && message.session === expected.session && message.sequence > expected.sequence && sameVisualPreviewTarget(message.target, expected.target);
|
|
25
|
+
}
|
|
26
|
+
function checkPreviewCompatibility(target, receipt, templateVersion) {
|
|
27
|
+
return receipt.schemaVersion === 1 && target.contractVersion === receipt.contractVersion && target.templateVersion === templateVersion && receipt.templateVersion === templateVersion;
|
|
28
|
+
}
|
|
29
|
+
function visualEditorOrigins(extra) {
|
|
30
|
+
const origins = /* @__PURE__ */ new Set(["https://admin.roottale.com"]);
|
|
31
|
+
for (const value of extra) {
|
|
32
|
+
try {
|
|
33
|
+
const url = new URL(value.trim());
|
|
34
|
+
if (isVisualEditOrigin(url.origin) && !url.username && !url.password && !url.hostname.includes("*")) {
|
|
35
|
+
origins.add(url.origin);
|
|
36
|
+
}
|
|
37
|
+
} catch {
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return [...origins];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/visual-edit-coverage.ts
|
|
44
|
+
function checkFieldPath(address, definitions, values) {
|
|
45
|
+
let fields = definitions;
|
|
46
|
+
let leaf;
|
|
47
|
+
let previous;
|
|
48
|
+
const ids = [];
|
|
49
|
+
const keys = [];
|
|
50
|
+
const path = [];
|
|
51
|
+
for (const segment of address.path ?? []) {
|
|
52
|
+
path.push(segment);
|
|
53
|
+
if (segment.startsWith("@")) {
|
|
54
|
+
if (leaf?.type !== "repeater" && leaf?.type !== "flexible_content" || previous?.startsWith("@")) {
|
|
55
|
+
throw new Error("\uD589 \uC8FC\uC18C\uB294 \uBC18\uBCF5 \uD544\uB4DC \uB2E4\uC74C\uC5D0 \uC640\uC57C \uD569\uB2C8\uB2E4.");
|
|
56
|
+
}
|
|
57
|
+
ids.push(segment.slice(1));
|
|
58
|
+
if (leaf.type === "flexible_content") {
|
|
59
|
+
const row = getContentValue(values, path);
|
|
60
|
+
const layout = row && typeof row === "object" && !Array.isArray(row) ? row.__layout : void 0;
|
|
61
|
+
const definition = leaf.layouts?.find((candidate) => candidate.name === layout);
|
|
62
|
+
if (!definition) throw new Error("\uBC18\uBCF5 \uD56D\uBAA9\uC758 \uB808\uC774\uC544\uC6C3\uC774 \uC815\uC758\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
63
|
+
fields = definition.subFields;
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
if ((leaf?.type === "repeater" || leaf?.type === "flexible_content") && !previous?.startsWith("@")) {
|
|
67
|
+
throw new Error("\uBC18\uBCF5 \uD544\uB4DC\uC5D0\uB294 \uD589 \uC8FC\uC18C\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.");
|
|
68
|
+
}
|
|
69
|
+
leaf = fields.find((field) => field.name === segment);
|
|
70
|
+
if (!leaf) throw new Error("\uD544\uB4DC \uACBD\uB85C\uAC00 \uC815\uC758\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
71
|
+
keys.push(leaf.key);
|
|
72
|
+
fields = leaf.subFields ?? [];
|
|
73
|
+
}
|
|
74
|
+
previous = segment;
|
|
75
|
+
}
|
|
76
|
+
if (leaf?.key !== address.fieldKey) throw new Error("\uD544\uB4DC key\uC640 \uC804\uCCB4 \uACBD\uB85C\uAC00 \uB2E4\uB985\uB2C8\uB2E4.");
|
|
77
|
+
if (address.itemId !== void 0 && address.itemId !== ids.at(-1)) {
|
|
78
|
+
throw new Error("itemId\uC640 \uB9C8\uC9C0\uB9C9 \uD589 \uC8FC\uC18C\uAC00 \uB2E4\uB985\uB2C8\uB2E4.");
|
|
79
|
+
}
|
|
80
|
+
return keys;
|
|
81
|
+
}
|
|
82
|
+
function coverageReport(contract, observations, exceptions) {
|
|
83
|
+
const report = {
|
|
84
|
+
missingFields: [],
|
|
85
|
+
invalidAddresses: [],
|
|
86
|
+
invalidSections: [],
|
|
87
|
+
invalidExceptions: [],
|
|
88
|
+
repeaterSegments: 0
|
|
89
|
+
};
|
|
90
|
+
const templates = new Map(contract.visualEditing.templates.map((template) => [template.key, template]));
|
|
91
|
+
const documents = new Map(observations.documents.map((document) => [document.id, document]));
|
|
92
|
+
const exceptionKeys = /* @__PURE__ */ new Set();
|
|
93
|
+
for (const exception of exceptions) {
|
|
94
|
+
const key = `${exception.templateKey}:${exception.fieldKey}`;
|
|
95
|
+
const template = templates.get(exception.templateKey);
|
|
96
|
+
if (exceptionKeys.has(key) || !exception.reason.trim() || !template?.sections.some((section) => section.fieldKeys.includes(exception.fieldKey))) {
|
|
97
|
+
report.invalidExceptions.push(key);
|
|
98
|
+
}
|
|
99
|
+
exceptionKeys.add(key);
|
|
100
|
+
}
|
|
101
|
+
for (const template of templates.values()) {
|
|
102
|
+
const rendered = new Set(observations.addresses.filter(
|
|
103
|
+
(address) => documents.get(address.entityId)?.templateKey === template.key
|
|
104
|
+
).map((address) => address.fieldKey));
|
|
105
|
+
for (const fieldKey of new Set(template.sections.flatMap((section) => [...section.fieldKeys]))) {
|
|
106
|
+
const key = `${template.key}:${fieldKey}`;
|
|
107
|
+
if (!rendered.has(fieldKey) && !exceptionKeys.has(key)) report.missingFields.push(key);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (const address of observations.addresses) {
|
|
111
|
+
try {
|
|
112
|
+
if (!parseVisualEditAddress(address)) throw new Error("\uD3B8\uC9D1 \uC8FC\uC18C \uD615\uC2DD\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");
|
|
113
|
+
const document = documents.get(address.entityId);
|
|
114
|
+
if (!document) throw new Error("\uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
115
|
+
const fieldKeys = checkFieldPath(address, document.fieldDefinitions, document.fields);
|
|
116
|
+
if (!templates.get(document.templateKey)?.sections.some((section) => section.fieldKeys.some((key) => fieldKeys.includes(key)))) {
|
|
117
|
+
throw new Error("\uACC4\uC57D\uC5D0 \uC5C6\uB294 \uD3B8\uC9D1 \uD544\uB4DC\uC785\uB2C8\uB2E4.");
|
|
118
|
+
}
|
|
119
|
+
if (getContentValue(document.fields, address.path ?? []) === void 0) {
|
|
120
|
+
throw new Error("\uD544\uB4DC \uAC12\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
121
|
+
}
|
|
122
|
+
report.repeaterSegments += (address.path ?? []).filter((segment) => segment.startsWith("@")).length;
|
|
123
|
+
} catch (error) {
|
|
124
|
+
report.invalidAddresses.push({ address, reason: error instanceof Error ? error.message : "\uC8FC\uC18C \uAC80\uC0AC \uC2E4\uD328" });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
report.invalidSections = [...new Set(observations.sections.filter(
|
|
128
|
+
({ template, key }) => !templates.get(template)?.sections.some((section) => section.key === key)
|
|
129
|
+
).map(({ template, key }) => `${template}:${key}`))];
|
|
130
|
+
return report;
|
|
131
|
+
}
|
|
132
|
+
export {
|
|
133
|
+
VISUAL_EDIT_ATTRIBUTE,
|
|
134
|
+
VISUAL_EDIT_PROTOCOL,
|
|
135
|
+
VISUAL_EDIT_PROTOCOL_VERSION,
|
|
136
|
+
buildVisualEditPreviewUrl,
|
|
137
|
+
checkPreviewCompatibility,
|
|
138
|
+
coverageReport,
|
|
139
|
+
createVisualEditMessage,
|
|
140
|
+
isCurrentVisualEditMessage,
|
|
141
|
+
isVisualEditOrigin,
|
|
142
|
+
parseVisualEditAddress,
|
|
143
|
+
parseVisualEditMessage,
|
|
144
|
+
sameVisualDependencies,
|
|
145
|
+
sameVisualPreviewTarget,
|
|
146
|
+
visualEditAddressKey,
|
|
147
|
+
visualEditAddressSchema,
|
|
148
|
+
visualEditAttributes,
|
|
149
|
+
visualEditorOrigins,
|
|
150
|
+
visualPreviewTargetSchema,
|
|
151
|
+
visualRenderReceiptSchema
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=visual-edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/visual-edit-preview.ts","../src/visual-edit-coverage.ts"],"sourcesContent":["import {\n isVisualEditOrigin, sameVisualPreviewTarget, VISUAL_EDIT_PROTOCOL, VISUAL_EDIT_PROTOCOL_VERSION,\n type VisualEditMessage, type VisualEditPayload, type VisualPreviewTarget,\n} from \"./visual-edit-contract\";\n\nexport type VisualEditEnvelope = Pick<VisualEditMessage, \"session\" | \"sequence\" | \"target\">;\nexport interface VisualPreviewRuntimeReceipt {\n schemaVersion: number;\n contractVersion: string;\n templateVersion: string;\n}\n\n/** sequence의 증가와 연결 수명은 호출자가 소유한다. wire 형식은 그대로 조립한다. */\nexport function createVisualEditMessage(envelope: VisualEditEnvelope, payload: VisualEditPayload): VisualEditMessage {\n return { protocol: VISUAL_EDIT_PROTOCOL, protocolVersion: VISUAL_EDIT_PROTOCOL_VERSION, ...envelope, ...payload };\n}\n\n/** 파싱한 메시지를 비교한다. source·origin 확인과 수신 sequence 갱신은 호출자 책임이다. */\nexport function isCurrentVisualEditMessage(message: VisualEditMessage | null, expected: VisualEditEnvelope): message is VisualEditMessage {\n return message !== null && message.session === expected.session && message.sequence > expected.sequence\n && sameVisualPreviewTarget(message.target, expected.target);\n}\n\n/** 인증된 target과 사이트에 배포한 계약 영수증·템플릿을 대조한다. */\nexport function checkPreviewCompatibility(target: VisualPreviewTarget, receipt: VisualPreviewRuntimeReceipt, templateVersion: string): boolean {\n return receipt.schemaVersion === 1 && target.contractVersion === receipt.contractVersion\n && target.templateVersion === templateVersion && receipt.templateVersion === templateVersion;\n}\n\n/** env는 사이트가 읽는다. CSP와 브리지에 같은 정규화 목록을 전달한다. */\nexport function visualEditorOrigins(extra: readonly string[]): string[] {\n const origins = new Set([\"https://admin.roottale.com\"]);\n for (const value of extra) {\n try {\n const url = new URL(value.trim());\n if (isVisualEditOrigin(url.origin) && !url.username && !url.password && !url.hostname.includes(\"*\")) {\n origins.add(url.origin);\n }\n } catch {\n // 빈 값·와일드카드·잘못된 URL은 허용 목록에 넣지 않는다.\n }\n }\n return [...origins];\n}\n","import { getContentValue } from \"./content-values\";\nimport { parseVisualEditAddress, type VisualEditAddress } from \"./visual-edit-contract\";\n\n/** 실제 계약과 필드 정의에서 비교에 필요한 부분만 받는다. */\nexport interface CoverageContract {\n visualEditing: { templates: readonly {\n key: string;\n sections: readonly { key: string; fieldKeys: readonly string[] }[];\n }[] };\n}\n\nexport interface CoverageFieldDefinition {\n key: string;\n name: string;\n type: string;\n subFields?: readonly CoverageFieldDefinition[];\n layouts?: readonly { name: string; subFields: readonly CoverageFieldDefinition[] }[];\n}\n\nexport interface CoverageException {\n templateKey: string;\n fieldKey: string;\n reason: string;\n}\n\nexport interface CoverageObservations {\n documents: readonly {\n id: string;\n templateKey: string;\n fields: Readonly<Record<string, unknown>>;\n fieldDefinitions: readonly CoverageFieldDefinition[];\n }[];\n addresses: readonly VisualEditAddress[];\n sections: readonly { template: string; key: string }[];\n}\n\nexport interface CoverageReport {\n missingFields: string[];\n invalidAddresses: { address: VisualEditAddress; reason: string }[];\n invalidSections: string[];\n invalidExceptions: string[];\n repeaterSegments: number;\n}\n\nfunction checkFieldPath(address: VisualEditAddress, definitions: readonly CoverageFieldDefinition[], values: Readonly<Record<string, unknown>>): string[] {\n let fields = definitions;\n let leaf: CoverageFieldDefinition | undefined;\n let previous: string | undefined;\n const ids: string[] = [];\n const keys: string[] = [];\n const path: string[] = [];\n for (const segment of address.path ?? []) {\n path.push(segment);\n if (segment.startsWith(\"@\")) {\n if ((leaf?.type !== \"repeater\" && leaf?.type !== \"flexible_content\") || previous?.startsWith(\"@\")) {\n throw new Error(\"행 주소는 반복 필드 다음에 와야 합니다.\");\n }\n ids.push(segment.slice(1));\n if (leaf.type === \"flexible_content\") {\n const row = getContentValue(values, path);\n const layout = row && typeof row === \"object\" && !Array.isArray(row)\n ? (row as Record<string, unknown>).__layout : undefined;\n const definition = leaf.layouts?.find(candidate => candidate.name === layout);\n if (!definition) throw new Error(\"반복 항목의 레이아웃이 정의에 없습니다.\");\n fields = definition.subFields;\n }\n } else {\n // 반복 필드는 반드시 @id를 거쳐 자식 필드로 내려간다.\n if ((leaf?.type === \"repeater\" || leaf?.type === \"flexible_content\") && !previous?.startsWith(\"@\")) {\n throw new Error(\"반복 필드에는 행 주소가 필요합니다.\");\n }\n leaf = fields.find(field => field.name === segment);\n if (!leaf) throw new Error(\"필드 경로가 정의에 없습니다.\");\n keys.push(leaf.key);\n fields = leaf.subFields ?? [];\n }\n previous = segment;\n }\n if (leaf?.key !== address.fieldKey) throw new Error(\"필드 key와 전체 경로가 다릅니다.\");\n if (address.itemId !== undefined && address.itemId !== ids.at(-1)) {\n throw new Error(\"itemId와 마지막 행 주소가 다릅니다.\");\n }\n return keys;\n}\n\n/**\n * ① 계약 → 렌더 필드, ② 전체 주소·섹션 → 계약을 비교한다.\n * 렌더·fixture 생성·예외 선정·③ 클릭 도달 검사는 호출 사이트가 소유한다.\n * 예외는 미연결 필드에만 적용하며 잘못된 주소·섹션을 숨기지 않는다.\n */\nexport function coverageReport(\n contract: CoverageContract,\n observations: CoverageObservations,\n exceptions: readonly CoverageException[],\n): CoverageReport {\n const report: CoverageReport = {\n missingFields: [], invalidAddresses: [], invalidSections: [], invalidExceptions: [], repeaterSegments: 0,\n };\n const templates = new Map(contract.visualEditing.templates.map(template => [template.key, template]));\n const documents = new Map(observations.documents.map(document => [document.id, document]));\n const exceptionKeys = new Set<string>();\n for (const exception of exceptions) {\n const key = `${exception.templateKey}:${exception.fieldKey}`;\n const template = templates.get(exception.templateKey);\n if (exceptionKeys.has(key) || !exception.reason.trim()\n || !template?.sections.some(section => section.fieldKeys.includes(exception.fieldKey))) {\n report.invalidExceptions.push(key);\n }\n exceptionKeys.add(key);\n }\n for (const template of templates.values()) {\n const rendered = new Set(observations.addresses.filter(address =>\n documents.get(address.entityId)?.templateKey === template.key,\n ).map(address => address.fieldKey));\n for (const fieldKey of new Set(template.sections.flatMap(section => [...section.fieldKeys]))) {\n const key = `${template.key}:${fieldKey}`;\n if (!rendered.has(fieldKey) && !exceptionKeys.has(key)) report.missingFields.push(key);\n }\n }\n for (const address of observations.addresses) {\n try {\n if (!parseVisualEditAddress(address)) throw new Error(\"편집 주소 형식이 잘못되었습니다.\");\n const document = documents.get(address.entityId);\n if (!document) throw new Error(\"문서를 찾을 수 없습니다.\");\n const fieldKeys = checkFieldPath(address, document.fieldDefinitions, document.fields);\n if (!templates.get(document.templateKey)?.sections.some(section => section.fieldKeys.some(key => fieldKeys.includes(key)))) {\n throw new Error(\"계약에 없는 편집 필드입니다.\");\n }\n if (getContentValue(document.fields, address.path ?? []) === undefined) {\n throw new Error(\"필드 값이 없습니다.\");\n }\n report.repeaterSegments += (address.path ?? []).filter(segment => segment.startsWith(\"@\")).length;\n } catch (error) {\n report.invalidAddresses.push({ address, reason: error instanceof Error ? error.message : \"주소 검사 실패\" });\n }\n }\n report.invalidSections = [...new Set(observations.sections.filter(({ template, key }) =>\n !templates.get(template)?.sections.some(section => section.key === key),\n ).map(({ template, key }) => `${template}:${key}`))];\n return report;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roottale/cms-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.72.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "RootTale CMS core — Block JSON schema (Gutenberg-compatible), serialize, validate. ADR-0034 §3 §5. Transitive dependency of @roottale/cms-renderer-next.",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
"require": "./dist/index.cjs",
|
|
14
14
|
"default": "./dist/index.js"
|
|
15
15
|
},
|
|
16
|
+
"./visual-edit": {
|
|
17
|
+
"types": "./dist/visual-edit.d.ts",
|
|
18
|
+
"import": "./dist/visual-edit.js",
|
|
19
|
+
"require": "./dist/visual-edit.cjs",
|
|
20
|
+
"default": "./dist/visual-edit.js"
|
|
21
|
+
},
|
|
16
22
|
"./package.json": "./package.json"
|
|
17
23
|
},
|
|
18
24
|
"files": [
|