@mp3wizard/figma-console-mcp 1.22.6 → 1.23.1
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 +15 -38
- package/dist/cloudflare/core/design-code-tools.js +3 -29
- package/dist/cloudflare/core/diff/changelog-formatter.js +275 -0
- package/dist/cloudflare/core/diff/diff-engine.js +334 -0
- package/dist/cloudflare/core/diff/property-compare.js +36 -0
- package/dist/cloudflare/core/diff/version-cache.js +74 -0
- package/dist/cloudflare/core/figma-api.js +19 -0
- package/dist/cloudflare/core/version-tools.js +1014 -0
- package/dist/cloudflare/index.js +17 -13
- package/dist/core/design-code-tools.d.ts +1 -12
- package/dist/core/design-code-tools.d.ts.map +1 -1
- package/dist/core/design-code-tools.js +3 -29
- package/dist/core/design-code-tools.js.map +1 -1
- package/dist/core/diff/changelog-formatter.d.ts +35 -0
- package/dist/core/diff/changelog-formatter.d.ts.map +1 -0
- package/dist/core/diff/changelog-formatter.js +276 -0
- package/dist/core/diff/changelog-formatter.js.map +1 -0
- package/dist/core/diff/diff-engine.d.ts +113 -0
- package/dist/core/diff/diff-engine.d.ts.map +1 -0
- package/dist/core/diff/diff-engine.js +335 -0
- package/dist/core/diff/diff-engine.js.map +1 -0
- package/dist/core/diff/property-compare.d.ts +19 -0
- package/dist/core/diff/property-compare.d.ts.map +1 -0
- package/dist/core/diff/property-compare.js +37 -0
- package/dist/core/diff/property-compare.js.map +1 -0
- package/dist/core/diff/version-cache.d.ts +40 -0
- package/dist/core/diff/version-cache.d.ts.map +1 -0
- package/dist/core/diff/version-cache.js +75 -0
- package/dist/core/diff/version-cache.js.map +1 -0
- package/dist/core/figma-api.d.ts +29 -0
- package/dist/core/figma-api.d.ts.map +1 -1
- package/dist/core/figma-api.js +19 -0
- package/dist/core/figma-api.js.map +1 -1
- package/dist/core/version-tools.d.ts +30 -0
- package/dist/core/version-tools.d.ts.map +1 -0
- package/dist/core/version-tools.js +1015 -0
- package/dist/core/version-tools.js.map +1 -0
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +8 -0
- package/dist/local.js.map +1 -1
- package/figma-desktop-bridge/code.js +1 -1
- package/package.json +108 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure-function markdown formatter for version diff results.
|
|
3
|
+
*
|
|
4
|
+
* Takes a diff payload (the structured response from figma_diff_versions)
|
|
5
|
+
* plus optional author/label metadata for the from/to versions, and produces
|
|
6
|
+
* a release-notes-style markdown string.
|
|
7
|
+
*
|
|
8
|
+
* Mode-aware:
|
|
9
|
+
* summary — header + a single line of counts
|
|
10
|
+
* standard — header + page section + per-component counts
|
|
11
|
+
* detailed — header + page section + per-component property/binding details
|
|
12
|
+
*
|
|
13
|
+
* Pure: no I/O, no side effects. Trivially testable.
|
|
14
|
+
*/
|
|
15
|
+
export function formatChangelogMarkdown(input, mode = "standard") {
|
|
16
|
+
const lines = [];
|
|
17
|
+
// Header
|
|
18
|
+
const title = input.file_name ? `${input.file_name} — Change Log` : "Figma File Change Log";
|
|
19
|
+
lines.push(`# ${title}`);
|
|
20
|
+
lines.push("");
|
|
21
|
+
lines.push(`**From:** ${formatVersionRef(input.from_meta, input.from_version_id, false)}`);
|
|
22
|
+
lines.push(`**To:** ${formatVersionRef(input.to_meta, input.to_version_id, true)}`);
|
|
23
|
+
const span = computeSpanDays(input.from_meta?.created_at, input.to_meta?.created_at);
|
|
24
|
+
if (span !== null) {
|
|
25
|
+
lines.push(`**Span:** ${span} day${span === 1 ? "" : "s"}`);
|
|
26
|
+
}
|
|
27
|
+
lines.push("");
|
|
28
|
+
// Summary mode: one-line punch line
|
|
29
|
+
if (mode === "summary") {
|
|
30
|
+
lines.push(formatSummaryLine(input));
|
|
31
|
+
lines.push("");
|
|
32
|
+
appendNotes(lines, input.notes);
|
|
33
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
34
|
+
}
|
|
35
|
+
// Page Structure section (always for standard/detailed)
|
|
36
|
+
appendPageStructureSection(lines, input.page_structure);
|
|
37
|
+
// Components section
|
|
38
|
+
if (input.scoped_nodes && input.scoped_nodes.length > 0) {
|
|
39
|
+
appendComponentsSection(lines, input.scoped_nodes, mode);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
lines.push("## Components");
|
|
43
|
+
lines.push("");
|
|
44
|
+
lines.push("_No components were scoped for this changelog. Pass `component_ids` to include per-component changes._");
|
|
45
|
+
lines.push("");
|
|
46
|
+
}
|
|
47
|
+
appendNotes(lines, input.notes);
|
|
48
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
49
|
+
}
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Section formatters
|
|
52
|
+
// ============================================================================
|
|
53
|
+
function appendPageStructureSection(lines, page) {
|
|
54
|
+
const total = page.summary.added + page.summary.removed + page.summary.renamed;
|
|
55
|
+
lines.push("## Page Structure");
|
|
56
|
+
lines.push("");
|
|
57
|
+
if (total === 0) {
|
|
58
|
+
lines.push("_No page-level changes._");
|
|
59
|
+
lines.push("");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (page.pages_added.length > 0) {
|
|
63
|
+
lines.push(`**Added (${page.pages_added.length}):**`);
|
|
64
|
+
for (const p of page.pages_added)
|
|
65
|
+
lines.push(`- ${escapeMd(p.name)} \`${p.id}\``);
|
|
66
|
+
lines.push("");
|
|
67
|
+
}
|
|
68
|
+
if (page.pages_removed.length > 0) {
|
|
69
|
+
lines.push(`**Removed (${page.pages_removed.length}):**`);
|
|
70
|
+
for (const p of page.pages_removed)
|
|
71
|
+
lines.push(`- ${escapeMd(p.name)} \`${p.id}\``);
|
|
72
|
+
lines.push("");
|
|
73
|
+
}
|
|
74
|
+
if (page.pages_renamed.length > 0) {
|
|
75
|
+
lines.push(`**Renamed (${page.pages_renamed.length}):**`);
|
|
76
|
+
for (const r of page.pages_renamed) {
|
|
77
|
+
lines.push(`- \`${r.id}\`: ${escapeMd(r.old_name)} → ${escapeMd(r.new_name)}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push("");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function appendComponentsSection(lines, scoped, mode) {
|
|
83
|
+
lines.push("## Components");
|
|
84
|
+
lines.push("");
|
|
85
|
+
const withChanges = scoped.filter((n) => n.change_count > 0);
|
|
86
|
+
const unchanged = scoped.filter((n) => n.change_count === 0 && n.notes.length === 0);
|
|
87
|
+
const notFound = scoped.filter((n) => n.notes.some((note) => note.toLowerCase().includes("not found")));
|
|
88
|
+
if (withChanges.length === 0 && unchanged.length === 0 && notFound.length === 0) {
|
|
89
|
+
lines.push("_No scoped components had changes._");
|
|
90
|
+
lines.push("");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
for (const n of withChanges) {
|
|
94
|
+
appendComponentBlock(lines, n, mode);
|
|
95
|
+
}
|
|
96
|
+
if (unchanged.length > 0) {
|
|
97
|
+
lines.push(`**No changes:** ${unchanged.map((n) => `\`${n.node_name || n.node_id}\``).join(", ")}`);
|
|
98
|
+
lines.push("");
|
|
99
|
+
}
|
|
100
|
+
if (notFound.length > 0) {
|
|
101
|
+
lines.push(`**Not found in either version:** ${notFound.map((n) => `\`${n.node_id || "(empty)"}\``).join(", ")}`);
|
|
102
|
+
lines.push("");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function appendComponentBlock(lines, n, mode) {
|
|
106
|
+
const heading = n.node_name ? `${n.node_name}` : "(unnamed)";
|
|
107
|
+
lines.push(`### ${escapeMd(heading)} — \`${n.node_id}\``);
|
|
108
|
+
lines.push(`**${n.change_count} change${n.change_count === 1 ? "" : "s"}**`);
|
|
109
|
+
// Each subsequent sub-section adds its own single-blank-line separator so
|
|
110
|
+
// we don't end up with two consecutive blank lines when one of these
|
|
111
|
+
// sub-sections is empty. (Earlier versions unconditionally pushed a blank
|
|
112
|
+
// after the change count then again before each sub-section, producing
|
|
113
|
+
// double-blanks in the common case.)
|
|
114
|
+
const bullets = [];
|
|
115
|
+
if (n.name_changed) {
|
|
116
|
+
bullets.push(`- Renamed: \`${escapeMd(n.name_changed.from)}\` → \`${escapeMd(n.name_changed.to)}\``);
|
|
117
|
+
}
|
|
118
|
+
if (n.description_changed) {
|
|
119
|
+
const fromLen = n.description_changed.from.length;
|
|
120
|
+
const toLen = n.description_changed.to.length;
|
|
121
|
+
bullets.push(`- Description changed (${fromLen} → ${toLen} chars)`);
|
|
122
|
+
}
|
|
123
|
+
if (n.children_added.length > 0) {
|
|
124
|
+
const inline = n.children_added.map((c) => `\`${escapeMd(c.name || c.id)}\``).join(", ");
|
|
125
|
+
bullets.push(`- Children added (${n.children_added.length}): ${inline}`);
|
|
126
|
+
}
|
|
127
|
+
if (n.children_removed.length > 0) {
|
|
128
|
+
const inline = n.children_removed.map((c) => `\`${escapeMd(c.name || c.id)}\``).join(", ");
|
|
129
|
+
bullets.push(`- Children removed (${n.children_removed.length}): ${inline}`);
|
|
130
|
+
}
|
|
131
|
+
if (bullets.length > 0) {
|
|
132
|
+
lines.push("");
|
|
133
|
+
lines.push(...bullets);
|
|
134
|
+
}
|
|
135
|
+
if (n.component_properties && hasAnyPropChanges(n.component_properties.summary)) {
|
|
136
|
+
const s = n.component_properties.summary;
|
|
137
|
+
const parts = [];
|
|
138
|
+
if (s.added > 0)
|
|
139
|
+
parts.push(`${s.added} added`);
|
|
140
|
+
if (s.removed > 0)
|
|
141
|
+
parts.push(`${s.removed} removed`);
|
|
142
|
+
if (s.type_changed > 0)
|
|
143
|
+
parts.push(`${s.type_changed} type changed`);
|
|
144
|
+
if (s.default_changed > 0)
|
|
145
|
+
parts.push(`${s.default_changed} default changed`);
|
|
146
|
+
lines.push("");
|
|
147
|
+
lines.push(`**Component properties:** ${parts.join(", ")}`);
|
|
148
|
+
if (mode === "detailed") {
|
|
149
|
+
for (const p of n.component_properties.added) {
|
|
150
|
+
lines.push(`- ➕ \`${escapeMd(p.name)}\` (${p.type}, default: \`${stringifyValue(p.default_value)}\`)`);
|
|
151
|
+
}
|
|
152
|
+
for (const p of n.component_properties.removed) {
|
|
153
|
+
lines.push(`- ➖ \`${escapeMd(p.name)}\` (${p.type})`);
|
|
154
|
+
}
|
|
155
|
+
for (const t of n.component_properties.type_changed) {
|
|
156
|
+
lines.push(`- 🔄 \`${escapeMd(t.name)}\`: ${t.from_type} → ${t.to_type}`);
|
|
157
|
+
}
|
|
158
|
+
for (const d of n.component_properties.default_changed) {
|
|
159
|
+
lines.push(`- ⚙️ \`${escapeMd(d.name)}\`: \`${stringifyValue(d.from_default)}\` → \`${stringifyValue(d.to_default)}\``);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (n.binding_changes.length > 0) {
|
|
164
|
+
lines.push("");
|
|
165
|
+
lines.push(`**Variable bindings (${n.binding_changes.length}):**`);
|
|
166
|
+
if (mode === "detailed") {
|
|
167
|
+
for (const b of n.binding_changes) {
|
|
168
|
+
const arrow = b.change_kind === "added"
|
|
169
|
+
? `→ \`${b.to_variable_id}\``
|
|
170
|
+
: b.change_kind === "removed"
|
|
171
|
+
? `(removed, was \`${b.from_variable_id}\`)`
|
|
172
|
+
: `\`${b.from_variable_id}\` → \`${b.to_variable_id}\``;
|
|
173
|
+
lines.push(`- ${escapeMd(b.node_name || b.node_id)} — \`${b.property}\` ${arrow}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// standard mode: group by change_kind, give counts
|
|
178
|
+
const counts = { added: 0, removed: 0, rebound: 0 };
|
|
179
|
+
for (const b of n.binding_changes)
|
|
180
|
+
counts[b.change_kind]++;
|
|
181
|
+
const parts = [];
|
|
182
|
+
if (counts.added > 0)
|
|
183
|
+
parts.push(`${counts.added} added`);
|
|
184
|
+
if (counts.removed > 0)
|
|
185
|
+
parts.push(`${counts.removed} removed`);
|
|
186
|
+
if (counts.rebound > 0)
|
|
187
|
+
parts.push(`${counts.rebound} rebound`);
|
|
188
|
+
lines.push(`_${parts.join(", ")}._`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
lines.push("");
|
|
192
|
+
}
|
|
193
|
+
function appendNotes(lines, notes) {
|
|
194
|
+
if (!notes || notes.length === 0)
|
|
195
|
+
return;
|
|
196
|
+
lines.push("## Notes");
|
|
197
|
+
lines.push("");
|
|
198
|
+
for (const n of notes)
|
|
199
|
+
lines.push(`- ${n}`);
|
|
200
|
+
lines.push("");
|
|
201
|
+
}
|
|
202
|
+
// ============================================================================
|
|
203
|
+
// Helpers
|
|
204
|
+
// ============================================================================
|
|
205
|
+
function formatVersionRef(meta, versionId, isTo) {
|
|
206
|
+
if (meta?.is_head || versionId === "current") {
|
|
207
|
+
const date = meta?.created_at ? formatDate(meta.created_at) : "current state";
|
|
208
|
+
const user = meta?.user_handle ? ` by ${meta.user_handle}` : "";
|
|
209
|
+
return `Current state (last modified ${date}${user})`;
|
|
210
|
+
}
|
|
211
|
+
if (!meta) {
|
|
212
|
+
return `\`${versionId}\` _(metadata not available)_`;
|
|
213
|
+
}
|
|
214
|
+
const label = meta.label && meta.label.trim() !== "" ? `"${meta.label}"` : "_(unlabeled)_";
|
|
215
|
+
const date = meta.created_at ? formatDate(meta.created_at) : "";
|
|
216
|
+
const user = meta.user_handle ? `by ${meta.user_handle}` : "";
|
|
217
|
+
const parts = [label, date, user].filter(Boolean).join(" — ");
|
|
218
|
+
return `${parts} \`${versionId}\``;
|
|
219
|
+
}
|
|
220
|
+
function formatSummaryLine(input) {
|
|
221
|
+
const p = input.page_structure.summary;
|
|
222
|
+
const componentCount = input.scoped_nodes?.filter((n) => n.change_count > 0).length ?? 0;
|
|
223
|
+
const totalComponentChanges = input.scoped_nodes?.reduce((acc, n) => acc + n.change_count, 0) ?? 0;
|
|
224
|
+
const parts = [];
|
|
225
|
+
if (p.added > 0)
|
|
226
|
+
parts.push(`${p.added} page${p.added === 1 ? "" : "s"} added`);
|
|
227
|
+
if (p.removed > 0)
|
|
228
|
+
parts.push(`${p.removed} page${p.removed === 1 ? "" : "s"} removed`);
|
|
229
|
+
if (p.renamed > 0)
|
|
230
|
+
parts.push(`${p.renamed} page${p.renamed === 1 ? "" : "s"} renamed`);
|
|
231
|
+
if (componentCount > 0) {
|
|
232
|
+
parts.push(`${componentCount} component${componentCount === 1 ? "" : "s"} with ${totalComponentChanges} change${totalComponentChanges === 1 ? "" : "s"}`);
|
|
233
|
+
}
|
|
234
|
+
if (parts.length === 0)
|
|
235
|
+
return "_No structural changes detected._";
|
|
236
|
+
return parts.join("; ") + ".";
|
|
237
|
+
}
|
|
238
|
+
function computeSpanDays(fromIso, toIso) {
|
|
239
|
+
if (!fromIso || !toIso)
|
|
240
|
+
return null;
|
|
241
|
+
const from = new Date(fromIso).getTime();
|
|
242
|
+
const to = new Date(toIso).getTime();
|
|
243
|
+
if (isNaN(from) || isNaN(to))
|
|
244
|
+
return null;
|
|
245
|
+
return Math.max(0, Math.round((to - from) / (1000 * 60 * 60 * 24)));
|
|
246
|
+
}
|
|
247
|
+
function formatDate(iso) {
|
|
248
|
+
// ISO 8601 is fine as-is for release notes; trim time if it's midnight UTC for cleaner output
|
|
249
|
+
const d = new Date(iso);
|
|
250
|
+
if (isNaN(d.getTime()))
|
|
251
|
+
return iso;
|
|
252
|
+
return d.toISOString().slice(0, 10);
|
|
253
|
+
}
|
|
254
|
+
function escapeMd(s) {
|
|
255
|
+
// Escape characters that would break markdown. Keep light — release notes
|
|
256
|
+
// should be readable, not over-escaped.
|
|
257
|
+
return s.replace(/([\\`*_{}\[\]<>])/g, "\\$1");
|
|
258
|
+
}
|
|
259
|
+
function stringifyValue(v) {
|
|
260
|
+
if (v === undefined)
|
|
261
|
+
return "?"; // standard mode strips defaults; render placeholder
|
|
262
|
+
if (v === null)
|
|
263
|
+
return "null";
|
|
264
|
+
if (typeof v === "string")
|
|
265
|
+
return v;
|
|
266
|
+
try {
|
|
267
|
+
return JSON.stringify(v);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return String(v);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function hasAnyPropChanges(s) {
|
|
274
|
+
return s.added > 0 || s.removed > 0 || s.type_changed > 0 || s.default_changed > 0;
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=changelog-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog-formatter.js","sourceRoot":"","sources":["../../../src/core/diff/changelog-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff engine — pure functions for comparing Figma file/node snapshots
|
|
3
|
+
* across two versions.
|
|
4
|
+
*
|
|
5
|
+
* Scope (v1):
|
|
6
|
+
* - Page-structure diff (added/removed/renamed pages) from depth=1 file fetches
|
|
7
|
+
* - Per-node diff for scoped fetches: name, description, children added/removed,
|
|
8
|
+
* componentPropertyDefinitions changes (for COMPONENT_SET), boundVariables changes
|
|
9
|
+
*
|
|
10
|
+
* NOT in scope (deferred):
|
|
11
|
+
* - Variable VALUE history (Figma REST does not expose this; planned forward
|
|
12
|
+
* ledger will fill the gap going forward, never retroactively)
|
|
13
|
+
* - Style-content diffs (only style add/remove via reachable styles map)
|
|
14
|
+
* - Inside-fills/strokes binding diffs (top-level boundVariables only for v1)
|
|
15
|
+
*/
|
|
16
|
+
export type DiffMode = "summary" | "standard" | "detailed";
|
|
17
|
+
export interface PageEntry {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PageStructureDiff {
|
|
22
|
+
pages_added: PageEntry[];
|
|
23
|
+
pages_removed: PageEntry[];
|
|
24
|
+
pages_renamed: Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
old_name: string;
|
|
27
|
+
new_name: string;
|
|
28
|
+
}>;
|
|
29
|
+
summary: {
|
|
30
|
+
added: number;
|
|
31
|
+
removed: number;
|
|
32
|
+
renamed: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compare two file documents (from /v1/files/:key?version=X with depth=1 or higher).
|
|
37
|
+
* Both arguments should be the `document` field of a Figma file response.
|
|
38
|
+
*/
|
|
39
|
+
export declare function diffPageStructure(fromDoc: any, toDoc: any): PageStructureDiff;
|
|
40
|
+
export interface PropertyDefSummary {
|
|
41
|
+
name: string;
|
|
42
|
+
type: string;
|
|
43
|
+
default_value: any;
|
|
44
|
+
}
|
|
45
|
+
export interface ComponentPropertyDefDiff {
|
|
46
|
+
added: PropertyDefSummary[];
|
|
47
|
+
removed: PropertyDefSummary[];
|
|
48
|
+
type_changed: Array<{
|
|
49
|
+
name: string;
|
|
50
|
+
from_type: string;
|
|
51
|
+
to_type: string;
|
|
52
|
+
}>;
|
|
53
|
+
default_changed: Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
from_default: any;
|
|
56
|
+
to_default: any;
|
|
57
|
+
}>;
|
|
58
|
+
summary: {
|
|
59
|
+
added: number;
|
|
60
|
+
removed: number;
|
|
61
|
+
type_changed: number;
|
|
62
|
+
default_changed: number;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Diff a COMPONENT_SET's componentPropertyDefinitions map.
|
|
67
|
+
* Each definition is keyed by `propName#nodeId` in Figma's response.
|
|
68
|
+
*/
|
|
69
|
+
export declare function diffComponentPropertyDefinitions(fromDefs: Record<string, any> | undefined, toDefs: Record<string, any> | undefined): ComponentPropertyDefDiff;
|
|
70
|
+
export interface BindingChange {
|
|
71
|
+
node_id: string;
|
|
72
|
+
node_name: string;
|
|
73
|
+
property: string;
|
|
74
|
+
from_variable_id: string | null;
|
|
75
|
+
to_variable_id: string | null;
|
|
76
|
+
change_kind: "added" | "removed" | "rebound";
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Walk both node trees in parallel (matched by node id), comparing top-level
|
|
80
|
+
* boundVariables. Inside-fills/strokes binding diffs are explicitly NOT included
|
|
81
|
+
* in v1 — they add complexity for marginal additional value over node-level deltas.
|
|
82
|
+
*/
|
|
83
|
+
export declare function collectBindingChanges(fromNode: any, toNode: any): BindingChange[];
|
|
84
|
+
export interface NodeChildSummary {
|
|
85
|
+
id: string;
|
|
86
|
+
name: string;
|
|
87
|
+
type: string;
|
|
88
|
+
}
|
|
89
|
+
export interface NodeDiff {
|
|
90
|
+
node_id: string;
|
|
91
|
+
node_name: string;
|
|
92
|
+
node_type: string;
|
|
93
|
+
name_changed: {
|
|
94
|
+
from: string;
|
|
95
|
+
to: string;
|
|
96
|
+
} | null;
|
|
97
|
+
description_changed: {
|
|
98
|
+
from: string;
|
|
99
|
+
to: string;
|
|
100
|
+
} | null;
|
|
101
|
+
children_added: NodeChildSummary[];
|
|
102
|
+
children_removed: NodeChildSummary[];
|
|
103
|
+
component_properties: ComponentPropertyDefDiff | null;
|
|
104
|
+
binding_changes: BindingChange[];
|
|
105
|
+
change_count: number;
|
|
106
|
+
notes: string[];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Diff a single node (typically a COMPONENT_SET) at depth=2. Either side may be
|
|
110
|
+
* null/undefined to represent "newly added" or "removed entirely."
|
|
111
|
+
*/
|
|
112
|
+
export declare function diffNode(fromNode: any, toNode: any, mode?: DiffMode): NodeDiff;
|
|
113
|
+
//# sourceMappingURL=diff-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-engine.d.ts","sourceRoot":"","sources":["../../../src/core/diff/diff-engine.ts"],"names":[],"mappings":"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"}
|