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