@seedprotocol/mapping 0.5.3 → 0.6.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +202 -36
  3. package/dist/adapters/rss.d.ts +2 -1
  4. package/dist/adapters/rss.d.ts.map +1 -1
  5. package/dist/applyMapping.d.ts +14 -1
  6. package/dist/applyMapping.d.ts.map +1 -1
  7. package/dist/autoMap-PTFd4l-9.js +534 -0
  8. package/dist/autoMap-PTFd4l-9.js.map +1 -0
  9. package/dist/autoMap.d.ts +3 -3
  10. package/dist/autoMap.d.ts.map +1 -1
  11. package/dist/classifyUrl.d.ts +14 -0
  12. package/dist/classifyUrl.d.ts.map +1 -0
  13. package/dist/index.d.ts +7 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +91 -402
  16. package/dist/index.js.map +1 -1
  17. package/dist/react/FieldMapper.d.ts +65 -5
  18. package/dist/react/FieldMapper.d.ts.map +1 -1
  19. package/dist/react/FieldMapperWires.d.ts +19 -0
  20. package/dist/react/FieldMapperWires.d.ts.map +1 -0
  21. package/dist/react/LookupEditor.d.ts +24 -0
  22. package/dist/react/LookupEditor.d.ts.map +1 -0
  23. package/dist/react/PropertyRows.d.ts +19 -0
  24. package/dist/react/PropertyRows.d.ts.map +1 -0
  25. package/dist/react/SourceRows.d.ts +18 -0
  26. package/dist/react/SourceRows.d.ts.map +1 -0
  27. package/dist/react/fieldMapperControls.d.ts +9 -0
  28. package/dist/react/fieldMapperControls.d.ts.map +1 -0
  29. package/dist/react/fieldMapperCore.d.ts +79 -0
  30. package/dist/react/fieldMapperCore.d.ts.map +1 -0
  31. package/dist/react/fieldMapperSlots.d.ts +69 -0
  32. package/dist/react/fieldMapperSlots.d.ts.map +1 -0
  33. package/dist/react/fieldMapperTheme.d.ts +34 -0
  34. package/dist/react/fieldMapperTheme.d.ts.map +1 -0
  35. package/dist/react/fieldMapperTypes.d.ts +63 -0
  36. package/dist/react/fieldMapperTypes.d.ts.map +1 -0
  37. package/dist/react/useFieldMapper.d.ts +8 -0
  38. package/dist/react/useFieldMapper.d.ts.map +1 -0
  39. package/dist/react.d.ts +10 -0
  40. package/dist/react.d.ts.map +1 -0
  41. package/dist/react.js +1617 -0
  42. package/dist/react.js.map +1 -0
  43. package/dist/relationLookup.d.ts +14 -0
  44. package/dist/relationLookup.d.ts.map +1 -0
  45. package/dist/resolvedSources.d.ts +32 -0
  46. package/dist/resolvedSources.d.ts.map +1 -0
  47. package/dist/types.d.ts +57 -2
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +19 -1
package/dist/react.js ADDED
@@ -0,0 +1,1617 @@
1
+ import { c as e, d as t, g as n, h as r, i, l as a, m as o, n as s, p as c, t as l } from "./autoMap-PTFd4l-9.js";
2
+ import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
3
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
4
+ //#region src/react/fieldMapperControls.tsx
5
+ function v({ className: e, value: t, onChange: n, children: r, disabled: i, "aria-label": a }) {
6
+ return /* @__PURE__ */ g("select", {
7
+ className: e,
8
+ "aria-label": a,
9
+ disabled: i,
10
+ value: t,
11
+ onChange: (e) => n(e.target.value),
12
+ children: r
13
+ });
14
+ }
15
+ function y({ className: e, type: t = "button", onClick: n, children: r, disabled: i, "aria-label": a, "aria-pressed": o }) {
16
+ return /* @__PURE__ */ g("button", {
17
+ type: t,
18
+ className: e,
19
+ onClick: n,
20
+ disabled: i,
21
+ "aria-label": a,
22
+ "aria-pressed": o,
23
+ children: r
24
+ });
25
+ }
26
+ function b({ className: e, children: t }) {
27
+ return /* @__PURE__ */ g("span", {
28
+ className: e,
29
+ children: t
30
+ });
31
+ }
32
+ //#endregion
33
+ //#region src/react/fieldMapperSlots.ts
34
+ var x = {
35
+ root: "seed-field-mapper",
36
+ toolbar: "fm-toolbar",
37
+ filter: "fm-filter",
38
+ coverage: "fm-meta",
39
+ autoMapButton: "fm-btn fm-btn-primary",
40
+ rowList: "fm-row-list",
41
+ row: "fm-row",
42
+ propertyLabel: "fm-row-prop-name",
43
+ dataType: "fm-dtype",
44
+ sourceSelect: "fm-select",
45
+ transformSelect: "fm-select",
46
+ rowAccessory: "fm-row-accessory",
47
+ preview: "fm-row-preview",
48
+ validation: "fm-row-flag",
49
+ removeButton: "fm-remove",
50
+ addButton: "fm-btn",
51
+ inspector: "fm-inspector",
52
+ lookupEditor: "fm-lookups",
53
+ jsonPreview: "fm-preview"
54
+ };
55
+ function S(e, t, n) {
56
+ return [
57
+ x[e],
58
+ t?.[e],
59
+ n
60
+ ].filter(Boolean).join(" ");
61
+ }
62
+ function C(e, t, n) {
63
+ let r;
64
+ r = e?.preview === void 0 ? t !== !1 && "both" : e.preview;
65
+ let i;
66
+ return i = e?.lookups === !1 ? !1 : e?.lookups === "row" || e?.lookups === "section" ? e.lookups : n?.layout === "rows" ? "row" : "section", {
67
+ autoMap: e?.autoMap ?? !0,
68
+ filter: e?.filter ?? !0,
69
+ inspector: e?.inspector ?? !0,
70
+ preview: r,
71
+ lookups: i
72
+ };
73
+ }
74
+ function w(e) {
75
+ return e === "row" || e === "both";
76
+ }
77
+ function T(e) {
78
+ return e === "json" || e === "both";
79
+ }
80
+ //#endregion
81
+ //#region src/react/fieldMapperCore.ts
82
+ function E(e, t = 40) {
83
+ let n = e.replace(/\s+/g, " ").trim();
84
+ return n.length <= t ? n : `${n.slice(0, t)}…`;
85
+ }
86
+ function D(e) {
87
+ let t = e.subtitle ? `${e.label} · ${e.subtitle}` : e.label, n = E(e.value, 36);
88
+ return n ? `${t} · "${n}"` : t;
89
+ }
90
+ function O(e) {
91
+ return e.filter((e) => e.kind !== "resolved");
92
+ }
93
+ function k(e) {
94
+ return O(e).map((e) => ({
95
+ value: e.id,
96
+ label: D(e),
97
+ sample: e.value,
98
+ kind: e.kind
99
+ }));
100
+ }
101
+ function A(e) {
102
+ return e.map((e) => ({
103
+ value: e.name,
104
+ label: e.required ? `${e.name} *` : e.name,
105
+ dataType: e.dataType
106
+ }));
107
+ }
108
+ function j(e) {
109
+ if (e.kind === "full" || e.kind === "section") return !1;
110
+ let t = typeof e.meta?.url == "string" && e.meta.url.trim() ? e.meta.url.trim() : e.value;
111
+ return !t.trim().includes("<") && c(t);
112
+ }
113
+ function M(e, t) {
114
+ if (!e || !t) return null;
115
+ if (o(t)) return "lookup";
116
+ if (j(e)) {
117
+ if (t.dataType === "Image" || t.dataType === "File") return "file";
118
+ if (t.dataType === "Html") return "extract";
119
+ }
120
+ return null;
121
+ }
122
+ function N(e, t, a) {
123
+ if (!e) return "";
124
+ if (t === "extract") return `‹extract HTML from ${E(e.value, 48)}›`;
125
+ if (t === "file") return `‹file stored from ${E(e.value, 48)}›`;
126
+ if (t === "lookup") {
127
+ let t = a?.propertyName ?? a?.target?.name, i = r(e.value || e.label), o = t ? a?.lookups?.[t] : void 0;
128
+ if (o && Object.prototype.hasOwnProperty.call(o, i)) {
129
+ let e = o[i], t = a?.target ? n(e, a.target) : e;
130
+ return E(Array.isArray(t) ? t.join(", ") : String(t), 80);
131
+ }
132
+ return `‹lookup uid for "${E(e.value, 48)}"›`;
133
+ }
134
+ if (a?.target && o(a.target)) return "";
135
+ if (a?.target) {
136
+ let t = e.value || e.label, n = i(t, a.target.dataType);
137
+ if (typeof n == "string") return E(n, 80);
138
+ if (typeof n == "number" || typeof n == "boolean") return String(n);
139
+ try {
140
+ return E(JSON.stringify(n), 80);
141
+ } catch {
142
+ return E(String(n), 80);
143
+ }
144
+ }
145
+ return E(e.value, 80);
146
+ }
147
+ function P(e, t, n) {
148
+ let r = s(e, t, n), i = t.filter((e) => e.resolve);
149
+ return i.length === 0 ? r : {
150
+ ...r,
151
+ _pendingResolve: i.map((e) => ({
152
+ propertyName: e.propertyName,
153
+ sourceId: e.sourceId,
154
+ resolve: e.resolve
155
+ }))
156
+ };
157
+ }
158
+ function F(e) {
159
+ if (e.conflict) return "conflict";
160
+ if (!e.mapping?.sourceId || !e.mapping.propertyName) return "empty";
161
+ let t = e.mapping.resolve ?? null;
162
+ return e.requiredResolve && t !== e.requiredResolve ? "needsResolve" : "mapped";
163
+ }
164
+ function I(e, t) {
165
+ let n = new Set(t.filter((e) => e.sourceId && e.propertyName).map((e) => e.propertyName)), r = e.filter((e) => e.required && !n.has(e.name)).map((e) => e.name);
166
+ return {
167
+ mapped: n.size,
168
+ total: e.length,
169
+ missingRequired: r
170
+ };
171
+ }
172
+ function L(e) {
173
+ let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Set();
174
+ for (let r of e) {
175
+ let e = r.propertyName;
176
+ if (!e) continue;
177
+ let i = t.get(e);
178
+ i ? (n.add(r.id), n.add(i)) : t.set(e, r.id);
179
+ }
180
+ return n;
181
+ }
182
+ function R(e, t) {
183
+ return e.resolve ? e : t && o(t) ? {
184
+ ...e,
185
+ resolve: "lookup"
186
+ } : e;
187
+ }
188
+ function z(e, t) {
189
+ let n = e.filter((e) => e.propertyName !== t.propertyName);
190
+ return n.push(t), n;
191
+ }
192
+ function B(e, t) {
193
+ if (t.length === 0) return null;
194
+ let n = !1, r = { ...e };
195
+ for (let e of t) e in r && (delete r[e], n = !0);
196
+ return n ? r : null;
197
+ }
198
+ function V(t, n, r, i, a) {
199
+ let o = new Map(r.map((e) => [e.name, e])), s = e(i, a);
200
+ s = R(s, o.get(a)), n.some((e) => e.id === s.sourceId) || !O(n).find((e) => e.id === s.sourceId) && n.some((e) => e.id === i);
201
+ let c = t.find((e) => e.propertyName === a), l = z(t, s), u = [];
202
+ return c?.resolve === "lookup" && s.resolve !== "lookup" && u.push(a), {
203
+ mappings: l,
204
+ clearedLookupProps: u
205
+ };
206
+ }
207
+ function ee(e, t) {
208
+ let n = a(t), r = [];
209
+ return {
210
+ mappings: e.filter((e) => {
211
+ let i;
212
+ return i = n ? e.sourceId !== n.originId || e.resolve !== n.resolve : e.sourceId !== t, !i && e.resolve === "lookup" && r.push(e.propertyName), i;
213
+ }),
214
+ clearedLookupProps: r
215
+ };
216
+ }
217
+ function H(e) {
218
+ let { targets: t, mappings: n, sources: r, lookups: i } = e, a = new Map(n.map((e) => [e.propertyName, e])), o = new Map(O(r).map((e) => [e.id, e]));
219
+ for (let e of r) o.has(e.id) || o.set(e.id, e);
220
+ return (e.visiblePropertyNames == null ? t : t.filter((t) => e.visiblePropertyNames.has(t.name))).map((e) => {
221
+ let t = a.get(e.name), n = t ? o.get(t.sourceId) : void 0, r = M(n, e), s = F({
222
+ mapping: t,
223
+ requiredResolve: r
224
+ });
225
+ return {
226
+ id: e.name,
227
+ target: e,
228
+ mapping: t,
229
+ source: n,
230
+ preview: N(n, t?.resolve, {
231
+ target: e,
232
+ lookups: i,
233
+ propertyName: e.name
234
+ }),
235
+ requiredResolve: r,
236
+ state: s
237
+ };
238
+ });
239
+ }
240
+ function U(e) {
241
+ let { mappings: t, edgeIds: n, drafts: r, sources: i, targets: a, lookups: o } = e, s = new Map(i.map((e) => [e.id, e])), c = new Map(a.map((e) => [e.name, e])), l = [];
242
+ for (let e = 0; e < t.length; e++) {
243
+ let r = t[e], i = n[e] ?? `edge-${e}`;
244
+ l.push({
245
+ id: i,
246
+ propertyName: r.propertyName,
247
+ mapping: r,
248
+ source: s.get(r.sourceId),
249
+ target: c.get(r.propertyName)
250
+ });
251
+ }
252
+ for (let e of r) l.push({
253
+ id: e.id,
254
+ propertyName: e.propertyName,
255
+ mapping: e.sourceId && e.propertyName ? {
256
+ sourceId: e.sourceId,
257
+ propertyName: e.propertyName,
258
+ ...e.resolve ? { resolve: e.resolve } : {}
259
+ } : e.sourceId || e.propertyName ? {
260
+ sourceId: e.sourceId ?? "",
261
+ propertyName: e.propertyName ?? "",
262
+ ...e.resolve ? { resolve: e.resolve } : {}
263
+ } : void 0,
264
+ source: e.sourceId ? s.get(e.sourceId) : void 0,
265
+ target: e.propertyName ? c.get(e.propertyName) : void 0
266
+ });
267
+ let u = L(l);
268
+ return {
269
+ rows: l.map((e) => {
270
+ let t = M(e.source, e.target), n = (e.mapping && e.mapping.sourceId && e.mapping.propertyName, e.mapping), r = F({
271
+ mapping: n && n.sourceId && n.propertyName ? n : void 0,
272
+ requiredResolve: t,
273
+ conflict: u.has(e.id)
274
+ }), i = !n?.sourceId || !n?.propertyName ? u.has(e.id) ? "conflict" : "empty" : r, a = n && n.sourceId && n.propertyName ? n : void 0;
275
+ return {
276
+ id: e.id,
277
+ target: e.target,
278
+ mapping: a,
279
+ source: e.source,
280
+ preview: N(e.source, a?.resolve, {
281
+ target: e.target,
282
+ lookups: o,
283
+ propertyName: a?.propertyName
284
+ }),
285
+ requiredResolve: t,
286
+ state: i
287
+ };
288
+ }),
289
+ conflicts: u
290
+ };
291
+ }
292
+ function W(e) {
293
+ return `${e}-${Math.random().toString(36).slice(2, 10)}`;
294
+ }
295
+ function G(e, t) {
296
+ if (e.length === t) return e;
297
+ if (e.length > t) return e.slice(0, t);
298
+ let n = [...e];
299
+ for (; n.length < t;) n.push(W("edge"));
300
+ return n;
301
+ }
302
+ function K(e, t, n, r) {
303
+ if (n === "all") return null;
304
+ let i = new Set(t.map((e) => e.propertyName)), a = new Set(r);
305
+ for (let t of e) (i.has(t.name) || n === "requiredAndMapped" && t.required) && a.add(t.name);
306
+ return a;
307
+ }
308
+ //#endregion
309
+ //#region src/react/LookupEditor.tsx
310
+ function q(e) {
311
+ let t = e.split(",").map((e) => e.trim()).filter(Boolean);
312
+ return t.length === 0 ? "" : t.length === 1 ? t[0] : t;
313
+ }
314
+ function te(e) {
315
+ return e == null ? "" : Array.isArray(e) ? e.join(", ") : e;
316
+ }
317
+ function ne(e, t, n, r) {
318
+ let i = { ...e[t] ?? {} }, a = q(r);
319
+ a === "" || Array.isArray(a) && a.length === 0 ? delete i[n] : i[n] = a;
320
+ let o = { ...e };
321
+ return Object.keys(i).length === 0 ? delete o[t] : o[t] = i, o;
322
+ }
323
+ function J({ mapping: e, sources: t, targetsByName: n, lookups: i, onLookupsChange: a, compact: o }) {
324
+ let s = t.find((t) => t.id === e.sourceId), c = r(s?.value || s?.label || ""), l = i[e.propertyName] ?? {}, u = new Set(Object.keys(l));
325
+ c && u.add(c);
326
+ let d = [...u], f = n.get(e.propertyName);
327
+ return /* @__PURE__ */ _("div", {
328
+ className: "fm-lookup-block",
329
+ children: [
330
+ !o && /* @__PURE__ */ _("h4", { children: [e.propertyName, f?.ref ? ` → ${f.ref}` : ""] }),
331
+ /* @__PURE__ */ _("div", {
332
+ className: "fm-lookup-hint",
333
+ children: [
334
+ "Map source strings to seed UIDs",
335
+ f?.dataType === "List" ? " (comma-separate for multiple)" : "",
336
+ ". Host owns Identity search/create."
337
+ ]
338
+ }),
339
+ d.length === 0 ? /* @__PURE__ */ g("div", {
340
+ className: "fm-lookup-hint",
341
+ children: "No sample value yet — paste a source string key after connecting."
342
+ }) : d.map((t) => /* @__PURE__ */ _("div", {
343
+ className: "fm-lookup-row",
344
+ children: [/* @__PURE__ */ g("div", {
345
+ className: "fm-lookup-key",
346
+ title: t,
347
+ children: t || "(empty)"
348
+ }), /* @__PURE__ */ g("input", {
349
+ className: "fm-lookup-input",
350
+ type: "text",
351
+ placeholder: "seed uid",
352
+ value: te(l[t]),
353
+ onChange: (n) => a(ne(i, e.propertyName, t, n.target.value)),
354
+ onClick: (e) => e.stopPropagation()
355
+ })]
356
+ }, t))
357
+ ]
358
+ });
359
+ }
360
+ function Y({ mode: e, mappings: t, sources: n, targets: r, lookups: i, onLookupsChange: a, classNames: o, className: s }) {
361
+ let c = f(() => t.filter((e) => e.resolve === "lookup"), [t]), l = f(() => {
362
+ let e = /* @__PURE__ */ new Map();
363
+ for (let t of r) e.set(t.name, t);
364
+ return e;
365
+ }, [r]);
366
+ if (c.length === 0) return null;
367
+ let u = [
368
+ S("lookupEditor", o),
369
+ e === "row" ? "fm-lookups--row" : null,
370
+ s
371
+ ].filter(Boolean).join(" ");
372
+ return /* @__PURE__ */ _("div", {
373
+ className: u,
374
+ children: [e === "section" && /* @__PURE__ */ g("div", {
375
+ className: "fm-lookups-title",
376
+ children: "Relation lookups"
377
+ }), c.map((t) => /* @__PURE__ */ g(J, {
378
+ mapping: t,
379
+ sources: n,
380
+ targetsByName: l,
381
+ lookups: i,
382
+ onLookupsChange: a,
383
+ compact: e === "row"
384
+ }, `${t.sourceId}-${t.propertyName}`))]
385
+ });
386
+ }
387
+ //#endregion
388
+ //#region src/react/fieldMapperTheme.ts
389
+ var re = 8, X = "seed-field-mapper-theme";
390
+ function Z(e) {
391
+ return e % 8;
392
+ }
393
+ function ie(e, t) {
394
+ if (t && t.length > 0) return t[e % t.length];
395
+ let n = Z(e) + 1;
396
+ return `var(--fm-map-${n}, var(--map-${n}, currentColor))`;
397
+ }
398
+ function ae(e = "default") {
399
+ return e === "unstyled" ? "none" : e;
400
+ }
401
+ var oe = "\n --sfm-color-ground: #0f172a;\n --sfm-color-ink: #e2e8f0;\n --sfm-color-well: #1e293b;\n --sfm-color-line: #334155;\n --sfm-color-muted: #94a3b8;\n --sfm-color-faint: #64748b;\n --sfm-color-selection: #3b82f6;\n --sfm-color-warning: #fbbf24;\n --sfm-color-danger: #f87171;\n --sfm-color-highlight: #f59e0b;\n --sfm-map-1: #3b82f6;\n --sfm-map-2: #8b5cf6;\n --sfm-map-3: #ec4899;\n --sfm-map-4: #f59e0b;\n --sfm-map-5: #10b981;\n --sfm-map-6: #06b6d4;\n --sfm-map-7: #f97316;\n --sfm-map-8: #14b8a6;\n --fm-ground: var(--sfm-color-ground);\n --fm-ink: var(--sfm-color-ink);\n --fm-well: var(--sfm-color-well);\n --fm-line: var(--sfm-color-line);\n --fm-muted: var(--sfm-color-muted);\n --fm-faint: var(--sfm-color-faint);\n --fm-selection: var(--sfm-color-selection);\n --fm-highlight: var(--sfm-color-highlight);\n --fm-danger: var(--sfm-color-danger);\n --fm-warning: var(--sfm-color-warning);\n --fm-map-1: var(--sfm-map-1);\n --fm-map-2: var(--sfm-map-2);\n --fm-map-3: var(--sfm-map-3);\n --fm-map-4: var(--sfm-map-4);\n --fm-map-5: var(--sfm-map-5);\n --fm-map-6: var(--sfm-map-6);\n --fm-map-7: var(--sfm-map-7);\n --fm-map-8: var(--sfm-map-8);\n", se = "\n.seed-field-mapper {\n\n --sfm-space-1: 4px;\n --sfm-space-2: 8px;\n --sfm-space-3: 12px;\n --sfm-space-4: 16px;\n --sfm-radius-sm: 4px;\n --sfm-radius-md: 8px;\n --sfm-radius-lg: 12px;\n --sfm-font-family: inherit;\n --sfm-font-mono: ui-monospace, monospace;\n --sfm-font-size-sm: 11px;\n --sfm-font-size-md: 13px;\n --sfm-control-height: 32px;\n --sfm-row-gap: var(--sfm-space-2);\n\n font-family: var(--sfm-font-family);\n border-radius: var(--sfm-radius-lg);\n padding: var(--sfm-space-4);\n}\n.seed-field-mapper * { box-sizing: border-box; }\n.seed-field-mapper .fm-toolbar {\n display: flex;\n gap: var(--sfm-space-2);\n align-items: center;\n margin-bottom: var(--sfm-space-3);\n flex-wrap: wrap;\n}\n.seed-field-mapper .fm-btn {\n border: 1px solid;\n border-radius: var(--sfm-radius-md);\n padding: 6px var(--sfm-space-3);\n cursor: pointer;\n font-size: var(--sfm-font-size-md);\n min-height: var(--sfm-control-height);\n}\n.seed-field-mapper .fm-meta {\n font-size: 12px;\n margin-left: auto;\n}\n.seed-field-mapper .fm-banner {\n font-size: 12px;\n padding: var(--sfm-space-2) 10px;\n border-radius: var(--sfm-radius-md);\n margin-bottom: 10px;\n border: 1px solid;\n}\n.seed-field-mapper .fm-grid {\n position: relative;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 48px;\n min-height: 240px;\n}\n.seed-field-mapper .fm-col-title {\n font-size: var(--sfm-font-size-sm);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n margin-bottom: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-card {\n border: 1px solid;\n border-radius: var(--sfm-radius-md);\n padding: 10px var(--sfm-space-3);\n margin-bottom: var(--sfm-space-2);\n cursor: pointer;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.seed-field-mapper .fm-label {\n font-weight: 600;\n font-size: var(--sfm-font-size-md);\n margin-bottom: var(--sfm-space-1);\n}\n.seed-field-mapper .fm-value {\n font-family: var(--sfm-font-mono);\n font-size: var(--sfm-font-size-sm);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.seed-field-mapper .fm-kind {\n font-size: 10px;\n margin-left: 6px;\n}\n.seed-field-mapper .fm-prop-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-dtype {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: var(--sfm-radius-sm);\n border: 1px solid;\n}\n.seed-field-mapper .fm-remove {\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 14px;\n padding: 0 var(--sfm-space-1);\n}\n.seed-field-mapper .fm-svg {\n position: absolute;\n inset: 0;\n pointer-events: none;\n overflow: visible;\n}\n.seed-field-mapper .fm-preview {\n margin-top: var(--sfm-space-3);\n border: 1px solid;\n border-radius: var(--sfm-radius-md);\n padding: var(--sfm-space-3);\n font-family: var(--sfm-font-mono);\n font-size: var(--sfm-font-size-sm);\n white-space: pre-wrap;\n max-height: 200px;\n overflow: auto;\n}\n.seed-field-mapper details.fm-preview {\n font-family: var(--sfm-font-family);\n white-space: normal;\n max-height: none;\n overflow: visible;\n padding: var(--sfm-space-2) var(--sfm-space-3);\n}\n.seed-field-mapper details.fm-preview > summary {\n cursor: pointer;\n font-size: var(--sfm-font-size-sm);\n list-style: disclosure-closed;\n}\n.seed-field-mapper details.fm-preview[open] > summary {\n list-style: disclosure-open;\n margin-bottom: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-preview-body {\n margin: 0;\n font-family: var(--sfm-font-mono);\n font-size: var(--sfm-font-size-sm);\n white-space: pre-wrap;\n max-height: 200px;\n overflow: auto;\n}\n.seed-field-mapper .fm-lookups {\n margin-top: var(--sfm-space-4);\n border-top: 1px solid;\n padding-top: var(--sfm-space-3);\n}\n.seed-field-mapper .fm-row .fm-lookups,\n.seed-field-mapper .fm-lookups--row {\n margin-top: var(--sfm-space-2);\n border-top: none;\n padding-top: 0;\n}\n.seed-field-mapper .fm-row .fm-lookup-block {\n margin-bottom: 0;\n padding: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-lookups-title {\n font-size: var(--sfm-font-size-sm);\n text-transform: uppercase;\n letter-spacing: 0.06em;\n margin-bottom: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-lookup-block {\n border: 1px solid;\n border-radius: var(--sfm-radius-md);\n padding: 10px var(--sfm-space-3);\n margin-bottom: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-lookup-block h4 {\n margin: 0 0 var(--sfm-space-2);\n font-size: var(--sfm-font-size-md);\n font-weight: 600;\n}\n.seed-field-mapper .fm-lookup-hint {\n font-size: var(--sfm-font-size-sm);\n margin-bottom: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-lookup-row {\n display: grid;\n grid-template-columns: 1fr 1.4fr;\n gap: var(--sfm-space-2);\n align-items: center;\n margin-bottom: 6px;\n}\n.seed-field-mapper .fm-lookup-key {\n font-family: var(--sfm-font-mono);\n font-size: var(--sfm-font-size-sm);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.seed-field-mapper .fm-lookup-input {\n width: 100%;\n border: 1px solid;\n border-radius: 6px;\n font-family: var(--sfm-font-mono);\n font-size: var(--sfm-font-size-sm);\n padding: 6px var(--sfm-space-2);\n}\n.seed-field-mapper .fm-lookup-input:focus {\n outline: none;\n}\n.seed-field-mapper .fm-row-list {\n display: flex;\n flex-direction: column;\n gap: var(--sfm-row-gap);\n}\n.seed-field-mapper .fm-row {\n border: 1px solid;\n border-radius: var(--sfm-radius-md);\n padding: 10px var(--sfm-space-3);\n}\n.seed-field-mapper .fm-row-main {\n display: grid;\n grid-template-columns: minmax(100px, 140px) 1fr auto auto auto;\n gap: var(--sfm-space-2);\n align-items: center;\n}\n.seed-field-mapper .fm-row-main-source {\n grid-template-columns: 1fr auto auto 1fr auto auto;\n}\n.seed-field-mapper .fm-row-accessory {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n.seed-field-mapper .fm-row-accessory:empty {\n display: none;\n}\n.seed-field-mapper .fm-row-prop {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n.seed-field-mapper .fm-row-prop-name {\n font-weight: 600;\n font-size: var(--sfm-font-size-md);\n}\n.seed-field-mapper .fm-row-preview {\n margin-top: 6px;\n font-family: var(--sfm-font-mono);\n font-size: var(--sfm-font-size-sm);\n}\n.seed-field-mapper .fm-row-flag {\n font-size: var(--sfm-font-size-sm);\n margin-top: var(--sfm-space-1);\n}\n.seed-field-mapper .fm-select {\n width: 100%;\n border: 1px solid;\n border-radius: 6px;\n font-size: 12px;\n padding: 6px var(--sfm-space-2);\n min-width: 0;\n min-height: var(--sfm-control-height);\n}\n.seed-field-mapper .fm-select:focus {\n outline: none;\n}\n.seed-field-mapper .fm-filter {\n display: flex;\n gap: 6px;\n margin-bottom: 10px;\n flex-wrap: wrap;\n}\n.seed-field-mapper .fm-inspector {\n margin-top: var(--sfm-space-3);\n border-top: 1px solid;\n padding-top: 10px;\n}\n.seed-field-mapper .fm-inspector summary {\n cursor: pointer;\n font-size: 12px;\n margin-bottom: var(--sfm-space-2);\n}\n.seed-field-mapper .fm-inspector-row {\n display: grid;\n grid-template-columns: 1fr 1.5fr auto;\n gap: var(--sfm-space-2);\n align-items: center;\n padding: 6px 0;\n border-bottom: 1px solid;\n font-size: 12px;\n}\n.seed-field-mapper .fm-into {\n font-size: var(--sfm-font-size-sm);\n}\n", ce = `
402
+ .seed-field-mapper {
403
+ ${oe}
404
+ color: var(--sfm-color-ink);
405
+ background: var(--sfm-color-ground);
406
+ }
407
+ .seed-field-mapper .fm-btn {
408
+ background: var(--sfm-color-well);
409
+ border-color: var(--sfm-color-line);
410
+ color: var(--sfm-color-ink);
411
+ }
412
+ .seed-field-mapper .fm-btn:hover { border-color: var(--sfm-color-faint); }
413
+ .seed-field-mapper .fm-btn-primary {
414
+ background: var(--sfm-color-selection);
415
+ border-color: var(--sfm-color-selection);
416
+ }
417
+ .seed-field-mapper .fm-meta {
418
+ color: var(--sfm-color-muted);
419
+ }
420
+ .seed-field-mapper .fm-banner {
421
+ border-color: var(--sfm-color-line);
422
+ background: var(--sfm-color-well);
423
+ }
424
+ .seed-field-mapper .fm-banner-warn {
425
+ border-color: var(--sfm-color-warning);
426
+ color: var(--sfm-color-warning);
427
+ }
428
+ .seed-field-mapper .fm-banner-danger {
429
+ border-color: var(--sfm-color-danger);
430
+ color: var(--sfm-color-danger);
431
+ }
432
+ .seed-field-mapper .fm-col-title {
433
+ color: var(--sfm-color-faint);
434
+ }
435
+ .seed-field-mapper .fm-card {
436
+ border-color: var(--sfm-color-line);
437
+ background: var(--sfm-color-well);
438
+ }
439
+ .seed-field-mapper .fm-card.active,
440
+ .seed-field-mapper .fm-card.pending {
441
+ border-color: var(--sfm-color-selection);
442
+ box-shadow: 0 0 0 1px var(--sfm-color-selection);
443
+ }
444
+ .seed-field-mapper .fm-card.mapped {
445
+ border-color: var(--sfm-color-faint);
446
+ }
447
+ .seed-field-mapper .fm-card.highlight {
448
+ border-color: var(--sfm-color-highlight);
449
+ }
450
+ .seed-field-mapper .fm-value {
451
+ color: var(--sfm-color-muted);
452
+ }
453
+ .seed-field-mapper .fm-kind {
454
+ color: var(--sfm-color-faint);
455
+ }
456
+ .seed-field-mapper .fm-dtype {
457
+ border-color: var(--sfm-color-line);
458
+ color: var(--sfm-color-muted);
459
+ background: transparent;
460
+ }
461
+ .seed-field-mapper .fm-remove {
462
+ color: var(--sfm-color-muted);
463
+ }
464
+ .seed-field-mapper .fm-remove:hover { color: var(--sfm-color-danger); }
465
+ .seed-field-mapper .fm-preview {
466
+ background: color-mix(in srgb, var(--sfm-color-ground) 80%, black);
467
+ border-color: var(--sfm-color-line);
468
+ color: var(--sfm-color-ink);
469
+ }
470
+ .seed-field-mapper details.fm-preview > summary {
471
+ color: var(--sfm-color-muted);
472
+ }
473
+ .seed-field-mapper .fm-lookups {
474
+ border-color: var(--sfm-color-line);
475
+ }
476
+ .seed-field-mapper .fm-lookups-title {
477
+ color: var(--sfm-color-faint);
478
+ }
479
+ .seed-field-mapper .fm-lookup-block {
480
+ border-color: var(--sfm-color-line);
481
+ background: var(--sfm-color-well);
482
+ }
483
+ .seed-field-mapper .fm-lookup-hint {
484
+ color: var(--sfm-color-muted);
485
+ }
486
+ .seed-field-mapper .fm-lookup-key {
487
+ color: var(--sfm-color-muted);
488
+ }
489
+ .seed-field-mapper .fm-lookup-input {
490
+ background: var(--sfm-color-ground);
491
+ border-color: var(--sfm-color-line);
492
+ color: var(--sfm-color-ink);
493
+ }
494
+ .seed-field-mapper .fm-lookup-input:focus {
495
+ border-color: var(--sfm-color-selection);
496
+ }
497
+ .seed-field-mapper .fm-row {
498
+ border-color: var(--sfm-color-line);
499
+ background: var(--sfm-color-well);
500
+ }
501
+ .seed-field-mapper .fm-row[data-state="needsResolve"] {
502
+ border-color: var(--sfm-color-warning);
503
+ }
504
+ .seed-field-mapper .fm-row[data-state="conflict"] {
505
+ border-color: var(--sfm-color-danger);
506
+ }
507
+ .seed-field-mapper .fm-row-preview {
508
+ color: var(--sfm-color-muted);
509
+ }
510
+ .seed-field-mapper .fm-row-flag {
511
+ color: var(--sfm-color-warning);
512
+ }
513
+ .seed-field-mapper .fm-select {
514
+ background: var(--sfm-color-ground);
515
+ border-color: var(--sfm-color-line);
516
+ color: var(--sfm-color-ink);
517
+ }
518
+ .seed-field-mapper .fm-select:focus {
519
+ border-color: var(--sfm-color-selection);
520
+ }
521
+ .seed-field-mapper .fm-filter .fm-btn[aria-pressed="true"] {
522
+ border-color: var(--sfm-color-selection);
523
+ color: var(--sfm-color-ink);
524
+ }
525
+ .seed-field-mapper .fm-inspector {
526
+ border-color: var(--sfm-color-line);
527
+ }
528
+ .seed-field-mapper .fm-inspector summary {
529
+ color: var(--sfm-color-muted);
530
+ }
531
+ .seed-field-mapper .fm-inspector-row {
532
+ border-color: var(--sfm-color-line);
533
+ }
534
+ .seed-field-mapper .fm-into {
535
+ color: var(--sfm-color-faint);
536
+ }
537
+ `;
538
+ function le(e) {
539
+ return `@layer seed-field-mapper {\n${e}\n}`;
540
+ }
541
+ function ue(e) {
542
+ return e === "none" ? "" : le(e === "structural" ? se : `${se}\n${ce}`);
543
+ }
544
+ var de = ue("default"), Q = null;
545
+ function fe(e) {
546
+ if (typeof document > "u" || e === "none") return;
547
+ let t = ue(e), n = document.getElementById(X);
548
+ if (n) {
549
+ Q !== e && (n.textContent = t, Q = e);
550
+ return;
551
+ }
552
+ let r = document.createElement("style");
553
+ r.id = X, r.textContent = t, document.head.appendChild(r), Q = e;
554
+ }
555
+ function pe() {
556
+ if (Q = null, typeof document > "u") return;
557
+ let e = document.getElementById(X);
558
+ e && (typeof e.remove == "function" ? e.remove() : e.parentNode && e.parentNode.removeChild(e));
559
+ }
560
+ //#endregion
561
+ //#region src/react/FieldMapperWires.tsx
562
+ function $(e, n) {
563
+ if (!e.resolve) return e.sourceId;
564
+ let r = t(e.sourceId, e.resolve);
565
+ return n.some((e) => e.id === r) ? r : e.sourceId;
566
+ }
567
+ function me(e, t) {
568
+ let n = e.replace(/\s+/g, " ").trim();
569
+ return n.length <= t ? n : `${n.slice(0, t)}…`;
570
+ }
571
+ function he({ sources: e, targets: t, mappings: n, mapper: r, lookups: i = {}, onLookupsChange: o, connectionColors: s, slots: c, classNames: l, ui: x = {
572
+ Select: v,
573
+ Button: y,
574
+ Pill: b
575
+ } }) {
576
+ let C = x.Button, [w, E] = m(null), [D, O] = m(null), [k, A] = m(null), [j, M] = m(!1), [N, F] = m({
577
+ width: 0,
578
+ height: 0
579
+ }), [I, L] = m([]), R = p(null), z = p({}), B = p({}), V = f(() => {
580
+ let e = /* @__PURE__ */ new Map();
581
+ return n.forEach((t, n) => {
582
+ e.set(t.propertyName, n);
583
+ }), e;
584
+ }, [n]), ee = f(() => {
585
+ let t = /* @__PURE__ */ new Map();
586
+ return n.forEach((n, r) => {
587
+ let i = $(n, e);
588
+ for (let e of /* @__PURE__ */ new Set([n.sourceId, i])) {
589
+ let n = t.get(e) ?? [];
590
+ n.push(r), t.set(e, n);
591
+ }
592
+ }), t;
593
+ }, [n, e]), H = u(() => {
594
+ if (!R.current) return [];
595
+ let t = R.current.getBoundingClientRect();
596
+ return n.map((n, r) => {
597
+ let i = $(n, e), a = z.current[i] ?? z.current[n.sourceId], o = B.current[n.propertyName];
598
+ if (!a || !o) return null;
599
+ let c = a.getBoundingClientRect(), l = o.getBoundingClientRect();
600
+ return {
601
+ x1: c.right - t.left,
602
+ y1: c.top + c.height / 2 - t.top,
603
+ x2: l.left - t.left,
604
+ y2: l.top + l.height / 2 - t.top,
605
+ stroke: ie(r, s),
606
+ mappingIndex: r,
607
+ mapping: n
608
+ };
609
+ }).filter((e) => e !== null);
610
+ }, [
611
+ n,
612
+ s,
613
+ e
614
+ ]);
615
+ d(() => {
616
+ let e = () => {
617
+ if (R.current) {
618
+ let e = R.current.getBoundingClientRect();
619
+ F({
620
+ width: e.width,
621
+ height: e.height
622
+ });
623
+ }
624
+ L(H());
625
+ };
626
+ e(), window.addEventListener("resize", e);
627
+ let t = setInterval(e, 200);
628
+ return () => {
629
+ window.removeEventListener("resize", e), clearInterval(t);
630
+ };
631
+ }, [
632
+ H,
633
+ n,
634
+ e,
635
+ t
636
+ ]);
637
+ let U = (e) => {
638
+ E((t) => t === e ? null : e);
639
+ }, W = (e) => {
640
+ w && r.connect(w, e);
641
+ }, G = (e) => {
642
+ let t = a(e);
643
+ return t ? n.some((e) => e.sourceId === t.originId && e.resolve === t.resolve) : n.some((t) => t.sourceId === e);
644
+ }, K = (e) => n.find((t) => t.propertyName === e), q = (t) => {
645
+ if (D) return t.propertyName === D;
646
+ if (k) {
647
+ let n = $(t, e);
648
+ return t.sourceId === k || n === k;
649
+ }
650
+ return !1;
651
+ }, te = D != null || k != null, ne = f(() => P(e, n, t), [
652
+ e,
653
+ n,
654
+ t
655
+ ]), { coverage: J } = r, re = T(c.preview);
656
+ return /* @__PURE__ */ _(h, { children: [
657
+ /* @__PURE__ */ _("div", {
658
+ className: S("toolbar", l),
659
+ children: [c.autoMap && /* @__PURE__ */ g(C, {
660
+ className: S("autoMapButton", l),
661
+ onClick: () => r.autoMap(),
662
+ children: "Auto-map"
663
+ }), /* @__PURE__ */ _("span", {
664
+ className: S("coverage", l),
665
+ children: [
666
+ J.mapped,
667
+ " / ",
668
+ J.total,
669
+ " mapped",
670
+ J.missingRequired.length > 0 ? ` · ${J.missingRequired.length} required missing` : "",
671
+ w ? " · click properties (source stays selected)" : " · click a source"
672
+ ]
673
+ })]
674
+ }),
675
+ /* @__PURE__ */ _("div", {
676
+ className: "fm-grid",
677
+ ref: R,
678
+ children: [
679
+ /* @__PURE__ */ g("svg", {
680
+ className: "fm-svg",
681
+ width: N.width,
682
+ height: N.height,
683
+ children: I.map((e) => {
684
+ let t = q(e.mapping), n = (e.x1 + e.x2) / 2;
685
+ return /* @__PURE__ */ g("path", {
686
+ className: "fm-connector",
687
+ "data-mapping-index": e.mappingIndex,
688
+ "data-pair": Z(e.mappingIndex),
689
+ d: `M ${e.x1} ${e.y1} C ${n} ${e.y1}, ${n} ${e.y2}, ${e.x2} ${e.y2}`,
690
+ stroke: e.stroke,
691
+ strokeWidth: t ? 3 : 2,
692
+ fill: "none",
693
+ opacity: te && !t ? .25 : .85
694
+ }, `${e.mapping.sourceId}-${e.mapping.propertyName}-${e.mapping.resolve ?? "copy"}`);
695
+ })
696
+ }),
697
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("div", {
698
+ className: "fm-col-title",
699
+ children: "Sources"
700
+ }), e.map((t) => {
701
+ let i = G(t.id), a = w === t.id, o = ee.get(t.id) ?? [], s = o[0], c = k === t.id || D != null && n.some((n) => {
702
+ let r = $(n, e);
703
+ return (n.sourceId === t.id || r === t.id) && n.propertyName === D;
704
+ });
705
+ return /* @__PURE__ */ _("div", {
706
+ ref: (e) => {
707
+ z.current[t.id] = e;
708
+ },
709
+ className: `fm-card${a ? " active pending" : ""}${i ? " mapped" : ""}${c ? " highlight" : ""}`,
710
+ "data-source-id": t.id,
711
+ ...o.length > 0 ? {
712
+ "data-mapping-index": o.join(" "),
713
+ "data-pair": String(Z(s))
714
+ } : {},
715
+ onClick: () => U(t.id),
716
+ onMouseEnter: () => A(t.id),
717
+ onMouseLeave: () => A(null),
718
+ children: [/* @__PURE__ */ _("div", {
719
+ className: "fm-prop-row",
720
+ children: [/* @__PURE__ */ _("div", {
721
+ className: "fm-label",
722
+ children: [
723
+ t.label,
724
+ t.subtitle ? /* @__PURE__ */ g("span", {
725
+ className: "fm-kind",
726
+ children: t.subtitle
727
+ }) : null,
728
+ /* @__PURE__ */ g("span", {
729
+ className: "fm-kind",
730
+ children: t.kind
731
+ })
732
+ ]
733
+ }), i && /* @__PURE__ */ g(C, {
734
+ className: S("removeButton", l),
735
+ "aria-label": "Remove all mappings for source",
736
+ onClick: (e) => {
737
+ e.stopPropagation(), r.removeBySource(t.id);
738
+ },
739
+ children: "×"
740
+ })]
741
+ }), /* @__PURE__ */ g("div", {
742
+ className: "fm-value",
743
+ children: me(t.value, 80)
744
+ })]
745
+ }, t.id);
746
+ })] }),
747
+ /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("div", {
748
+ className: "fm-col-title",
749
+ children: "Model properties"
750
+ }), t.map((t) => {
751
+ let n = K(t.name), i = V.get(t.name), a = D === t.name || k != null && n != null && (n.sourceId === k || $(n, e) === k);
752
+ return /* @__PURE__ */ _("div", {
753
+ ref: (e) => {
754
+ B.current[t.name] = e;
755
+ },
756
+ className: `fm-card${n ? " mapped" : ""}${a ? " highlight" : ""}`,
757
+ "data-property-name": t.name,
758
+ ...i == null ? {} : {
759
+ "data-mapping-index": String(i),
760
+ "data-pair": String(Z(i))
761
+ },
762
+ onClick: () => W(t.name),
763
+ onMouseEnter: () => O(t.name),
764
+ onMouseLeave: () => O(null),
765
+ children: [/* @__PURE__ */ _("div", {
766
+ className: "fm-prop-row",
767
+ children: [/* @__PURE__ */ g("div", {
768
+ className: "fm-label",
769
+ children: t.name
770
+ }), /* @__PURE__ */ _("div", {
771
+ style: {
772
+ display: "flex",
773
+ alignItems: "center",
774
+ gap: 4
775
+ },
776
+ children: [/* @__PURE__ */ _("span", {
777
+ className: "fm-dtype",
778
+ children: [t.dataType, t.ref ? ` → ${t.ref}` : ""]
779
+ }), n && /* @__PURE__ */ g(C, {
780
+ className: S("removeButton", l),
781
+ "aria-label": "Remove mapping for property",
782
+ onClick: (e) => {
783
+ e.stopPropagation(), r.removeRow(t.name);
784
+ },
785
+ children: "×"
786
+ })]
787
+ })]
788
+ }), n && /* @__PURE__ */ _("div", {
789
+ className: "fm-value",
790
+ children: [
791
+ "← ",
792
+ n.sourceId,
793
+ n.resolve ? ` (${n.resolve})` : ""
794
+ ]
795
+ })]
796
+ }, t.name);
797
+ })] })
798
+ ]
799
+ }),
800
+ c.lookups === "section" && o && /* @__PURE__ */ g(Y, {
801
+ mode: "section",
802
+ mappings: n,
803
+ sources: e,
804
+ targets: t,
805
+ lookups: i,
806
+ onLookupsChange: o,
807
+ classNames: l
808
+ }),
809
+ re && /* @__PURE__ */ _("details", {
810
+ className: S("jsonPreview", l),
811
+ open: j,
812
+ onToggle: (e) => M(e.target.open),
813
+ children: [/* @__PURE__ */ g("summary", { children: "Preview JSON" }), /* @__PURE__ */ g("pre", {
814
+ className: "fm-preview-body",
815
+ children: JSON.stringify(ne, null, 2)
816
+ })]
817
+ })
818
+ ] });
819
+ }
820
+ //#endregion
821
+ //#region src/react/PropertyRows.tsx
822
+ var ge = [
823
+ {
824
+ value: "",
825
+ label: "copy"
826
+ },
827
+ {
828
+ value: "extract",
829
+ label: "extract"
830
+ },
831
+ {
832
+ value: "file",
833
+ label: "file"
834
+ },
835
+ {
836
+ value: "lookup",
837
+ label: "lookup"
838
+ }
839
+ ];
840
+ function _e({ sources: e, targets: t, mappings: n, mapper: r, defaultRows: i = "requiredAndMapped", lookups: a = {}, onLookupsChange: o, slots: s, classNames: c, ui: l = {
841
+ Select: v,
842
+ Button: y,
843
+ Pill: b
844
+ }, renderRowAccessory: u }) {
845
+ let d = l.Select, p = l.Button, x = l.Pill, [C, D] = m(i), [k, A] = m(() => /* @__PURE__ */ new Set()), [j, M] = m(!1), [N, F] = m(!1), [I, L] = m(null), [R, z] = m(!1), B = f(() => K(t, n, C, k), [
846
+ t,
847
+ n,
848
+ C,
849
+ k
850
+ ]), V = f(() => B == null ? r.rows : r.rows.filter((e) => B.has(e.id)), [r.rows, B]), ee = f(() => {
851
+ let e = /* @__PURE__ */ new Map();
852
+ for (let t of n) {
853
+ let n = e.get(t.sourceId) ?? [];
854
+ n.push(t.propertyName), e.set(t.sourceId, n);
855
+ }
856
+ return e;
857
+ }, [n]), H = f(() => P(e, n, t), [
858
+ e,
859
+ n,
860
+ t
861
+ ]), { coverage: U, sourceOptions: W, addableProperties: G } = r, q = T(s.preview), te = w(s.preview), ne = s.lookups === "row" && !!o, J = s.lookups === "section" && !!o, re = (e) => {
862
+ r.addRow(e), A((t) => new Set(t).add(e)), F(!1);
863
+ }, X = (e) => {
864
+ L(e), F(!0);
865
+ }, Z = (e) => {
866
+ re(e), I && (r.setSource(e, I), L(null));
867
+ };
868
+ return /* @__PURE__ */ _(h, { children: [
869
+ /* @__PURE__ */ _("div", {
870
+ className: S("toolbar", c),
871
+ children: [s.autoMap && /* @__PURE__ */ g(p, {
872
+ className: S("autoMapButton", c),
873
+ onClick: () => r.autoMap(),
874
+ children: "Auto-map"
875
+ }), /* @__PURE__ */ _("span", {
876
+ className: S("coverage", c),
877
+ children: [
878
+ U.mapped,
879
+ " of ",
880
+ U.total,
881
+ " properties mapped",
882
+ U.missingRequired.length > 0 ? ` · ${U.missingRequired.length} required missing` : ""
883
+ ]
884
+ })]
885
+ }),
886
+ s.filter && /* @__PURE__ */ _("div", {
887
+ className: S("filter", c),
888
+ role: "group",
889
+ "aria-label": "Row filter",
890
+ children: [/* @__PURE__ */ g(p, {
891
+ className: "fm-btn",
892
+ "aria-pressed": C === "requiredAndMapped",
893
+ onClick: () => D("requiredAndMapped"),
894
+ children: "Mapped + required"
895
+ }), /* @__PURE__ */ _(p, {
896
+ className: "fm-btn",
897
+ "aria-pressed": C === "all",
898
+ onClick: () => D("all"),
899
+ children: [
900
+ "All ",
901
+ t.length,
902
+ " properties"
903
+ ]
904
+ })]
905
+ }),
906
+ /* @__PURE__ */ g("div", {
907
+ className: S("rowList", c),
908
+ children: V.map((n) => {
909
+ let i = n.mapping?.resolve ?? "";
910
+ return /* @__PURE__ */ _("div", {
911
+ className: S("row", c),
912
+ "data-state": n.state,
913
+ "data-property-name": n.id,
914
+ "data-required": n.target?.required ? "true" : void 0,
915
+ "data-resolve": n.mapping?.resolve,
916
+ "data-source-kind": n.source?.kind,
917
+ children: [
918
+ /* @__PURE__ */ _("div", {
919
+ className: "fm-row-main",
920
+ children: [
921
+ /* @__PURE__ */ _("div", {
922
+ className: "fm-row-prop",
923
+ children: [/* @__PURE__ */ _("div", {
924
+ className: S("propertyLabel", c),
925
+ children: [n.target?.name, n.target?.required ? " *" : ""]
926
+ }), /* @__PURE__ */ g(x, {
927
+ className: S("dataType", c),
928
+ children: n.target?.dataType
929
+ })]
930
+ }),
931
+ /* @__PURE__ */ _(d, {
932
+ className: S("sourceSelect", c),
933
+ "aria-label": `Source for ${n.id}`,
934
+ value: n.mapping?.sourceId ?? "",
935
+ onChange: (e) => {
936
+ r.setSource(n.id, e || null);
937
+ },
938
+ children: [/* @__PURE__ */ g("option", {
939
+ value: "",
940
+ children: "Choose a source field…"
941
+ }), W.map((e) => /* @__PURE__ */ g("option", {
942
+ value: e.value,
943
+ children: e.label
944
+ }, e.value))]
945
+ }),
946
+ n.mapping?.sourceId ? /* @__PURE__ */ g(d, {
947
+ className: S("transformSelect", c),
948
+ "aria-label": `Transform for ${n.id}`,
949
+ value: i,
950
+ onChange: (e) => {
951
+ r.setTransform(n.id, e || null);
952
+ },
953
+ children: ge.map((e) => /* @__PURE__ */ g("option", {
954
+ value: e.value,
955
+ children: e.label
956
+ }, e.label))
957
+ }) : /* @__PURE__ */ g(x, {
958
+ className: S("dataType", c),
959
+ children: n.target?.dataType
960
+ }),
961
+ /* @__PURE__ */ g("div", {
962
+ className: S("rowAccessory", c),
963
+ children: u?.(n) ?? null
964
+ }),
965
+ /* @__PURE__ */ g(p, {
966
+ className: S("removeButton", c),
967
+ "aria-label": `Remove mapping for ${n.id}`,
968
+ onClick: () => r.removeRow(n.id),
969
+ children: "×"
970
+ })
971
+ ]
972
+ }),
973
+ te && n.preview && /* @__PURE__ */ g("div", {
974
+ className: S("preview", c),
975
+ children: n.preview
976
+ }),
977
+ n.state === "needsResolve" && n.requiredResolve && /* @__PURE__ */ _("div", {
978
+ className: S("validation", c),
979
+ children: ["needs ", n.requiredResolve]
980
+ }),
981
+ ne && n.mapping?.resolve === "lookup" && n.mapping && /* @__PURE__ */ g(Y, {
982
+ mode: "row",
983
+ mappings: [n.mapping],
984
+ sources: e,
985
+ targets: t,
986
+ lookups: a,
987
+ onLookupsChange: o,
988
+ classNames: c
989
+ })
990
+ ]
991
+ }, n.id);
992
+ })
993
+ }),
994
+ /* @__PURE__ */ g("div", {
995
+ style: { marginTop: 10 },
996
+ children: N ? /* @__PURE__ */ _(d, {
997
+ className: S("sourceSelect", c),
998
+ "aria-label": "Add property mapping",
999
+ value: "",
1000
+ onChange: (e) => {
1001
+ e && Z(e);
1002
+ },
1003
+ children: [/* @__PURE__ */ g("option", {
1004
+ value: "",
1005
+ children: "Choose a property…"
1006
+ }), G.map((e) => /* @__PURE__ */ _("option", {
1007
+ value: e.name,
1008
+ children: [
1009
+ e.name,
1010
+ e.required ? " *" : "",
1011
+ " (",
1012
+ e.dataType,
1013
+ ")"
1014
+ ]
1015
+ }, e.name))]
1016
+ }) : /* @__PURE__ */ g(p, {
1017
+ className: S("addButton", c),
1018
+ onClick: () => F(!0),
1019
+ disabled: G.length === 0,
1020
+ children: "+ Add mapping"
1021
+ })
1022
+ }),
1023
+ s.inspector && /* @__PURE__ */ _("details", {
1024
+ className: S("inspector", c),
1025
+ open: j,
1026
+ onToggle: (e) => M(e.target.open),
1027
+ children: [/* @__PURE__ */ _("summary", { children: [
1028
+ "Source fields (",
1029
+ O(e).length,
1030
+ ")"
1031
+ ] }), O(e).map((e) => {
1032
+ let t = ee.get(e.id) ?? [];
1033
+ return /* @__PURE__ */ _("div", {
1034
+ className: "fm-inspector-row",
1035
+ children: [
1036
+ /* @__PURE__ */ _("div", { children: [
1037
+ /* @__PURE__ */ g("strong", { children: e.label }),
1038
+ e.subtitle ? /* @__PURE__ */ g("div", {
1039
+ className: "fm-value",
1040
+ children: e.subtitle
1041
+ }) : null,
1042
+ /* @__PURE__ */ g("div", {
1043
+ className: "fm-value",
1044
+ children: E(e.value, 60)
1045
+ })
1046
+ ] }),
1047
+ /* @__PURE__ */ g("div", {
1048
+ className: "fm-value",
1049
+ children: t.length > 0 ? `→ ${t.join(", ")}` : "unused"
1050
+ }),
1051
+ /* @__PURE__ */ g(p, {
1052
+ className: "fm-btn",
1053
+ onClick: () => X(e.id),
1054
+ children: "Map this"
1055
+ })
1056
+ ]
1057
+ }, e.id);
1058
+ })]
1059
+ }),
1060
+ J && /* @__PURE__ */ g(Y, {
1061
+ mode: "section",
1062
+ mappings: n,
1063
+ sources: e,
1064
+ targets: t,
1065
+ lookups: a,
1066
+ onLookupsChange: o,
1067
+ classNames: c
1068
+ }),
1069
+ q && /* @__PURE__ */ _("details", {
1070
+ className: S("jsonPreview", c),
1071
+ open: R,
1072
+ onToggle: (e) => z(e.target.open),
1073
+ children: [/* @__PURE__ */ g("summary", { children: "Preview JSON" }), /* @__PURE__ */ g("pre", {
1074
+ className: "fm-preview-body",
1075
+ children: JSON.stringify(H, null, 2)
1076
+ })]
1077
+ })
1078
+ ] });
1079
+ }
1080
+ //#endregion
1081
+ //#region src/react/SourceRows.tsx
1082
+ var ve = [
1083
+ {
1084
+ value: "",
1085
+ label: "copy"
1086
+ },
1087
+ {
1088
+ value: "extract",
1089
+ label: "extract"
1090
+ },
1091
+ {
1092
+ value: "file",
1093
+ label: "file"
1094
+ },
1095
+ {
1096
+ value: "lookup",
1097
+ label: "lookup"
1098
+ }
1099
+ ];
1100
+ function ye({ sources: e, targets: t, mappings: n, mapper: r, lookups: i = {}, onLookupsChange: a, slots: o, classNames: s, ui: c = {
1101
+ Select: v,
1102
+ Button: y,
1103
+ Pill: b
1104
+ }, renderRowAccessory: l }) {
1105
+ let u = c.Select, d = c.Button, [p, x] = m(!1), { rows: C, sourceOptions: E, propertyOptions: D, coverage: O, conflicts: k, setSource: A, setProperty: j, setTransform: M, addRow: N, removeRow: F, autoMap: I } = r, L = f(() => P(e, n, t), [
1106
+ e,
1107
+ n,
1108
+ t
1109
+ ]), R = T(o.preview), z = w(o.preview), B = o.lookups === "row" && !!a, V = o.lookups === "section" && !!a;
1110
+ return /* @__PURE__ */ _(h, { children: [
1111
+ /* @__PURE__ */ _("div", {
1112
+ className: S("toolbar", s),
1113
+ children: [o.autoMap && /* @__PURE__ */ g(d, {
1114
+ className: S("autoMapButton", s),
1115
+ onClick: () => I(),
1116
+ children: "Auto-map"
1117
+ }), /* @__PURE__ */ _("span", {
1118
+ className: S("coverage", s),
1119
+ children: [
1120
+ O.mapped,
1121
+ " of ",
1122
+ O.total,
1123
+ " mapped",
1124
+ O.missingRequired.length > 0 ? ` · ${O.missingRequired.length} required missing: ${O.missingRequired.join(", ")}` : ""
1125
+ ]
1126
+ })]
1127
+ }),
1128
+ k.size > 0 && /* @__PURE__ */ _("div", {
1129
+ className: "fm-banner fm-banner-danger",
1130
+ role: "alert",
1131
+ children: [
1132
+ k.size,
1133
+ " row",
1134
+ k.size === 1 ? "" : "s",
1135
+ " claim the same property — each property can only have one source."
1136
+ ]
1137
+ }),
1138
+ O.missingRequired.length > 0 && /* @__PURE__ */ _("div", {
1139
+ className: "fm-banner fm-banner-warn",
1140
+ role: "status",
1141
+ children: ["Required missing: ", O.missingRequired.join(", ")]
1142
+ }),
1143
+ /* @__PURE__ */ g("div", {
1144
+ className: S("rowList", s),
1145
+ children: C.map((n) => {
1146
+ let r = n.mapping?.resolve ?? "", o = n.source?.id ?? n.mapping?.sourceId ?? "", c = n.target?.name ?? n.mapping?.propertyName ?? "";
1147
+ return /* @__PURE__ */ _("div", {
1148
+ className: S("row", s),
1149
+ "data-state": n.state,
1150
+ "data-property-name": c || void 0,
1151
+ "data-required": n.target?.required ? "true" : void 0,
1152
+ "data-resolve": n.mapping?.resolve,
1153
+ "data-source-kind": n.source?.kind,
1154
+ children: [
1155
+ /* @__PURE__ */ _("div", {
1156
+ className: "fm-row-main fm-row-main-source",
1157
+ children: [
1158
+ /* @__PURE__ */ _(u, {
1159
+ className: S("sourceSelect", s),
1160
+ "aria-label": "Source field",
1161
+ value: o,
1162
+ onChange: (e) => {
1163
+ A(n.id, e || null);
1164
+ },
1165
+ children: [/* @__PURE__ */ g("option", {
1166
+ value: "",
1167
+ children: "Choose a source field…"
1168
+ }), E.map((e) => /* @__PURE__ */ g("option", {
1169
+ value: e.value,
1170
+ children: e.label
1171
+ }, e.value))]
1172
+ }),
1173
+ o ? /* @__PURE__ */ g(u, {
1174
+ className: S("transformSelect", s),
1175
+ "aria-label": "Transform",
1176
+ value: r,
1177
+ onChange: (e) => {
1178
+ M(n.id, e || null);
1179
+ },
1180
+ children: ve.map((e) => /* @__PURE__ */ g("option", {
1181
+ value: e.value,
1182
+ children: e.label
1183
+ }, e.label))
1184
+ }) : /* @__PURE__ */ g("span", { className: "fm-into" }),
1185
+ /* @__PURE__ */ g("span", {
1186
+ className: "fm-into",
1187
+ children: "into"
1188
+ }),
1189
+ /* @__PURE__ */ _(u, {
1190
+ className: S("sourceSelect", s),
1191
+ "aria-label": "Target property",
1192
+ value: c,
1193
+ onChange: (e) => {
1194
+ e && j(n.id, e);
1195
+ },
1196
+ children: [/* @__PURE__ */ g("option", {
1197
+ value: "",
1198
+ children: "Choose a property…"
1199
+ }), D.map((e) => /* @__PURE__ */ g("option", {
1200
+ value: e.value,
1201
+ children: e.label
1202
+ }, e.value))]
1203
+ }),
1204
+ /* @__PURE__ */ g("div", {
1205
+ className: S("rowAccessory", s),
1206
+ children: l?.(n) ?? null
1207
+ }),
1208
+ /* @__PURE__ */ g(d, {
1209
+ className: S("removeButton", s),
1210
+ "aria-label": "Remove row",
1211
+ onClick: () => F(n.id),
1212
+ children: "×"
1213
+ })
1214
+ ]
1215
+ }),
1216
+ z && n.preview && /* @__PURE__ */ g("div", {
1217
+ className: S("preview", s),
1218
+ children: n.preview
1219
+ }),
1220
+ n.state === "needsResolve" && n.requiredResolve && /* @__PURE__ */ _("div", {
1221
+ className: S("validation", s),
1222
+ children: ["needs ", n.requiredResolve]
1223
+ }),
1224
+ n.state === "conflict" && /* @__PURE__ */ g("div", {
1225
+ className: S("validation", s),
1226
+ style: { color: "var(--fm-danger)" },
1227
+ children: "property already mapped by another row"
1228
+ }),
1229
+ B && n.mapping?.resolve === "lookup" && n.mapping && /* @__PURE__ */ g(Y, {
1230
+ mode: "row",
1231
+ mappings: [n.mapping],
1232
+ sources: e,
1233
+ targets: t,
1234
+ lookups: i,
1235
+ onLookupsChange: a,
1236
+ classNames: s
1237
+ })
1238
+ ]
1239
+ }, n.id);
1240
+ })
1241
+ }),
1242
+ /* @__PURE__ */ g("div", {
1243
+ style: { marginTop: 10 },
1244
+ children: /* @__PURE__ */ g(d, {
1245
+ className: S("addButton", s),
1246
+ onClick: () => N(),
1247
+ children: "+ Add mapping"
1248
+ })
1249
+ }),
1250
+ V && /* @__PURE__ */ g(Y, {
1251
+ mode: "section",
1252
+ mappings: n,
1253
+ sources: e,
1254
+ targets: t,
1255
+ lookups: i,
1256
+ onLookupsChange: a,
1257
+ classNames: s
1258
+ }),
1259
+ R && /* @__PURE__ */ _("details", {
1260
+ className: S("jsonPreview", s),
1261
+ open: p,
1262
+ onToggle: (e) => x(e.target.open),
1263
+ children: [/* @__PURE__ */ g("summary", { children: "Preview JSON" }), /* @__PURE__ */ g("pre", {
1264
+ className: "fm-preview-body",
1265
+ children: JSON.stringify(L, null, 2)
1266
+ })]
1267
+ })
1268
+ ] });
1269
+ }
1270
+ //#endregion
1271
+ //#region src/react/useFieldMapper.ts
1272
+ function be({ sources: e, targets: t, mappings: n, onChange: r, lookups: i = {}, onLookupsChange: a, rowKey: o = "property", onAutoMap: s }) {
1273
+ let [c, d] = m(() => /* @__PURE__ */ new Set()), [h, g] = m([]), _ = p([]);
1274
+ _.current = G(_.current, n.length);
1275
+ let v = _.current, y = u((e) => {
1276
+ if (!a || e.length === 0) return;
1277
+ let t = B(i, e);
1278
+ t && a(t);
1279
+ }, [i, a]), b = f(() => k(e), [e]), x = f(() => A(t), [t]), S = f(() => I(t, n), [t, n]), C = f(() => new Set(n.map((e) => e.propertyName)), [n]), w = f(() => t.filter((e) => !C.has(e.name) && !c.has(e.name)), [
1280
+ t,
1281
+ C,
1282
+ c
1283
+ ]), T = f(() => H({
1284
+ targets: t,
1285
+ mappings: n,
1286
+ sources: e,
1287
+ lookups: i
1288
+ }), [
1289
+ t,
1290
+ n,
1291
+ e,
1292
+ i
1293
+ ]), E = f(() => U({
1294
+ mappings: n,
1295
+ edgeIds: v,
1296
+ drafts: h,
1297
+ sources: e,
1298
+ targets: t,
1299
+ lookups: i
1300
+ }), [
1301
+ n,
1302
+ v,
1303
+ h,
1304
+ e,
1305
+ t,
1306
+ i
1307
+ ]), D = o === "property" ? T : E.rows, j = o === "property" ? /* @__PURE__ */ new Set() : E.conflicts, N = u((i, a) => {
1308
+ let o = V(n, e, t, i, a);
1309
+ r(o.mappings), y(o.clearedLookupProps);
1310
+ }, [
1311
+ n,
1312
+ e,
1313
+ t,
1314
+ r,
1315
+ y
1316
+ ]), P = u((e) => {
1317
+ let t = ee(n, e);
1318
+ r(t.mappings), y(t.clearedLookupProps);
1319
+ }, [
1320
+ n,
1321
+ r,
1322
+ y
1323
+ ]), F = u(() => {
1324
+ r(s ? s() : l(e, t)), g([]), d(/* @__PURE__ */ new Set());
1325
+ }, [
1326
+ s,
1327
+ e,
1328
+ t,
1329
+ r
1330
+ ]);
1331
+ return {
1332
+ rows: D,
1333
+ sourceOptions: b,
1334
+ propertyOptions: x,
1335
+ addableProperties: w,
1336
+ coverage: S,
1337
+ conflicts: j,
1338
+ setSource: u((i, a) => {
1339
+ if (o === "property") {
1340
+ if (!a) {
1341
+ let e = n.find((e) => e.propertyName === i);
1342
+ r(n.filter((e) => e.propertyName !== i)), e?.resolve === "lookup" && y([i]);
1343
+ return;
1344
+ }
1345
+ let o = V(n, e, t, a, i), s = t.find((e) => e.name === i), c = O(e).find((e) => e.id === a), l = o.mappings.find((e) => e.propertyName === i);
1346
+ if (!l.resolve) {
1347
+ let e = M(c, s);
1348
+ if (e) {
1349
+ l = {
1350
+ ...l,
1351
+ resolve: e
1352
+ }, r(z(o.mappings, l)), y(o.clearedLookupProps);
1353
+ return;
1354
+ }
1355
+ }
1356
+ r(o.mappings), y(o.clearedLookupProps);
1357
+ return;
1358
+ }
1359
+ let s = v.indexOf(i);
1360
+ if (s >= 0) {
1361
+ if (!a) {
1362
+ let e = n[s];
1363
+ r(n.filter((e, t) => t !== s)), e?.resolve === "lookup" && y([e.propertyName]);
1364
+ return;
1365
+ }
1366
+ let i = n[s], o = t.find((e) => e.name === i.propertyName), c = {
1367
+ sourceId: a,
1368
+ propertyName: i.propertyName
1369
+ };
1370
+ if (c = R(c, o), !c.resolve) {
1371
+ let t = M(O(e).find((e) => e.id === a), o);
1372
+ t && (c = {
1373
+ ...c,
1374
+ resolve: t
1375
+ });
1376
+ }
1377
+ let l = [...n];
1378
+ l[s] = c, r(l), i.resolve === "lookup" && c.resolve !== "lookup" && y([i.propertyName]);
1379
+ return;
1380
+ }
1381
+ g((o) => {
1382
+ let s = o.map((n) => {
1383
+ if (n.id !== i) return n;
1384
+ if (!a) return {
1385
+ id: n.id,
1386
+ propertyName: n.propertyName
1387
+ };
1388
+ let r = n.propertyName ? t.find((e) => e.name === n.propertyName) : void 0, o = M(O(e).find((e) => e.id === a), r), s = r && R({
1389
+ sourceId: a,
1390
+ propertyName: n.propertyName ?? ""
1391
+ }, r).resolve || o || void 0;
1392
+ return {
1393
+ id: n.id,
1394
+ sourceId: a,
1395
+ propertyName: n.propertyName,
1396
+ resolve: s
1397
+ };
1398
+ }), c = s.filter((e) => e.sourceId && e.propertyName), l = s.filter((e) => !(e.sourceId && e.propertyName));
1399
+ return c.length > 0 ? (r([...n, ...c.map((e) => ({
1400
+ sourceId: e.sourceId,
1401
+ propertyName: e.propertyName,
1402
+ ...e.resolve ? { resolve: e.resolve } : {}
1403
+ }))]), l) : s;
1404
+ });
1405
+ }, [
1406
+ o,
1407
+ n,
1408
+ e,
1409
+ t,
1410
+ r,
1411
+ y,
1412
+ v
1413
+ ]),
1414
+ setProperty: u((i, a) => {
1415
+ if (o === "property") return;
1416
+ let s = v.indexOf(i);
1417
+ if (s >= 0) {
1418
+ let i = n[s], o = t.find((e) => e.name === a), c = O(e).find((e) => e.id === i.sourceId), l = {
1419
+ sourceId: i.sourceId,
1420
+ propertyName: a
1421
+ };
1422
+ if (l = R(l, o), !l.resolve) {
1423
+ let e = M(c, o);
1424
+ e && (l = {
1425
+ ...l,
1426
+ resolve: e
1427
+ });
1428
+ }
1429
+ let u = [...n];
1430
+ u[s] = l, r(u), i.resolve === "lookup" && l.resolve !== "lookup" && y([i.propertyName]), i.propertyName !== a && i.resolve === "lookup" && l.resolve === "lookup" && y([i.propertyName]);
1431
+ return;
1432
+ }
1433
+ g((o) => {
1434
+ let s = o.map((n) => {
1435
+ if (n.id !== i) return n;
1436
+ let r = t.find((e) => e.name === a), o = n.sourceId ? O(e).find((e) => e.id === n.sourceId) : void 0, s = n.resolve;
1437
+ n.sourceId && r && (s = R({
1438
+ sourceId: n.sourceId,
1439
+ propertyName: a
1440
+ }, r).resolve ?? M(o, r) ?? void 0);
1441
+ let c = {
1442
+ id: n.id,
1443
+ sourceId: n.sourceId,
1444
+ propertyName: a,
1445
+ resolve: s
1446
+ };
1447
+ return c.sourceId && c.propertyName, c;
1448
+ }), c = s.filter((e) => e.sourceId && e.propertyName), l = s.filter((e) => !(e.sourceId && e.propertyName));
1449
+ if (c.length > 0) {
1450
+ let e = c.map((e) => ({
1451
+ sourceId: e.sourceId,
1452
+ propertyName: e.propertyName,
1453
+ ...e.resolve ? { resolve: e.resolve } : {}
1454
+ }));
1455
+ return r([...n, ...e]), l;
1456
+ }
1457
+ return s;
1458
+ });
1459
+ }, [
1460
+ o,
1461
+ v,
1462
+ n,
1463
+ t,
1464
+ e,
1465
+ r,
1466
+ y
1467
+ ]),
1468
+ setTransform: u((e, t) => {
1469
+ if (o === "property") {
1470
+ let i = n.find((t) => t.propertyName === e);
1471
+ if (!i) return;
1472
+ r(z(n, t ? {
1473
+ ...i,
1474
+ resolve: t
1475
+ } : {
1476
+ sourceId: i.sourceId,
1477
+ propertyName: i.propertyName
1478
+ })), i.resolve === "lookup" && t !== "lookup" && y([e]);
1479
+ return;
1480
+ }
1481
+ let i = v.indexOf(e);
1482
+ if (i >= 0) {
1483
+ let e = n[i], a = t ? {
1484
+ ...e,
1485
+ resolve: t
1486
+ } : {
1487
+ sourceId: e.sourceId,
1488
+ propertyName: e.propertyName
1489
+ }, o = [...n];
1490
+ o[i] = a, r(o), e.resolve === "lookup" && t !== "lookup" && y([e.propertyName]);
1491
+ return;
1492
+ }
1493
+ g((n) => n.map((n) => n.id === e ? {
1494
+ ...n,
1495
+ resolve: t ?? void 0
1496
+ } : n));
1497
+ }, [
1498
+ o,
1499
+ n,
1500
+ v,
1501
+ r,
1502
+ y
1503
+ ]),
1504
+ addRow: u((e) => {
1505
+ if (o === "property") {
1506
+ e && d((t) => new Set(t).add(e));
1507
+ return;
1508
+ }
1509
+ g((t) => [...t, {
1510
+ id: W("draft"),
1511
+ ...e ? { propertyName: e } : {}
1512
+ }]);
1513
+ }, [o]),
1514
+ removeRow: u((e) => {
1515
+ if (o === "property") {
1516
+ let t = n.find((t) => t.propertyName === e);
1517
+ r(n.filter((t) => t.propertyName !== e)), t?.resolve === "lookup" && y([e]), d((t) => {
1518
+ if (!t.has(e)) return t;
1519
+ let n = new Set(t);
1520
+ return n.delete(e), n;
1521
+ });
1522
+ return;
1523
+ }
1524
+ let t = v.indexOf(e);
1525
+ if (t >= 0) {
1526
+ let e = n[t];
1527
+ r(n.filter((e, n) => n !== t)), e?.resolve === "lookup" && y([e.propertyName]);
1528
+ return;
1529
+ }
1530
+ g((t) => t.filter((t) => t.id !== e));
1531
+ }, [
1532
+ o,
1533
+ n,
1534
+ v,
1535
+ r,
1536
+ y
1537
+ ]),
1538
+ autoMap: F,
1539
+ connect: N,
1540
+ removeBySource: P
1541
+ };
1542
+ }
1543
+ //#endregion
1544
+ //#region src/react/FieldMapper.tsx
1545
+ function xe({ sources: e, targets: t, mappings: n, onChange: r, lookups: i = {}, onLookupsChange: a, onAutoMap: o, className: s, theme: c = "default", connectionColors: l, showPreview: u, layout: p = "rows", rowKey: m = "property", defaultRows: h = "requiredAndMapped", classNames: _, components: x, slots: w, renderRowAccessory: T }) {
1546
+ let E = be({
1547
+ sources: e,
1548
+ targets: t,
1549
+ mappings: n,
1550
+ onChange: r,
1551
+ lookups: i,
1552
+ onLookupsChange: a,
1553
+ rowKey: p === "rows" ? m : "property",
1554
+ onAutoMap: o
1555
+ }), D = ae(c), O = f(() => C(w, u, { layout: p }), [
1556
+ w,
1557
+ u,
1558
+ p
1559
+ ]), k = f(() => ({
1560
+ Select: x?.Select ?? v,
1561
+ Button: x?.Button ?? y,
1562
+ Pill: x?.Pill ?? b
1563
+ }), [x]);
1564
+ d(() => {
1565
+ fe(D);
1566
+ }, [D]);
1567
+ let A = S("root", _, [
1568
+ D === "none" || c === "unstyled" || c === "none" ? "seed-field-mapper--unstyled" : null,
1569
+ p === "rows" ? "seed-field-mapper--rows" : "seed-field-mapper--wires",
1570
+ s
1571
+ ].filter(Boolean).join(" ") || null);
1572
+ return /* @__PURE__ */ g("div", {
1573
+ className: A,
1574
+ "data-theme": D,
1575
+ "data-layout": p,
1576
+ "data-row-key": p === "rows" ? m : void 0,
1577
+ children: p === "wires" ? /* @__PURE__ */ g(he, {
1578
+ sources: e,
1579
+ targets: t,
1580
+ mappings: n,
1581
+ mapper: E,
1582
+ lookups: i,
1583
+ onLookupsChange: a,
1584
+ connectionColors: l,
1585
+ slots: O,
1586
+ classNames: _,
1587
+ ui: k
1588
+ }) : m === "source" ? /* @__PURE__ */ g(ye, {
1589
+ sources: e,
1590
+ targets: t,
1591
+ mappings: n,
1592
+ mapper: E,
1593
+ lookups: i,
1594
+ onLookupsChange: a,
1595
+ slots: O,
1596
+ classNames: _,
1597
+ ui: k,
1598
+ renderRowAccessory: T
1599
+ }) : /* @__PURE__ */ g(_e, {
1600
+ sources: e,
1601
+ targets: t,
1602
+ mappings: n,
1603
+ mapper: E,
1604
+ defaultRows: h,
1605
+ lookups: i,
1606
+ onLookupsChange: a,
1607
+ slots: O,
1608
+ classNames: _,
1609
+ ui: k,
1610
+ renderRowAccessory: T
1611
+ })
1612
+ });
1613
+ }
1614
+ //#endregion
1615
+ export { de as DEFAULT_THEME_CSS, re as FIELD_MAPPER_PAIR_SLOTS, xe as FieldMapper, ce as PAINT_THEME_CSS, x as SLOT_BASE_CLASS, se as STRUCTURAL_THEME_CSS, X as THEME_STYLE_ID, H as buildPropertyModeRows, k as buildSourceOptions, P as buildSyncPreviewBag, ue as buildThemeCss, I as computeCoverage, M as computeRequiredResolve, V as connectSourceToProperty, ie as connectionStrokeForIndex, fe as ensureThemeInjected, K as filterPropertyNames, L as findConflicts, N as previewForEdge, pe as resetThemeInjectionForTests, C as resolveSlots, ae as resolveTheme, T as showJsonPreview, w as showRowPreview, S as slotClass, be as useFieldMapper, le as wrapInThemeLayer };
1616
+
1617
+ //# sourceMappingURL=react.js.map