@bian-womp/spark-graph 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cjs/index.cjs CHANGED
@@ -28,6 +28,46 @@ function isInputPrivate(inputs, handle) {
28
28
  const v = inputs ? inputs[handle] : undefined;
29
29
  return !!(v && typeof v === "object" && v.private);
30
30
  }
31
+ /**
32
+ * Merge two InputHandleDescriptor values, with dynamic taking precedence.
33
+ * If both have metadata, merge the metadata objects (dynamic overrides static).
34
+ */
35
+ function mergeInputHandleDescriptors(staticDesc, dynamicDesc) {
36
+ // If only one exists, return it
37
+ if (!staticDesc)
38
+ return dynamicDesc;
39
+ if (!dynamicDesc)
40
+ return staticDesc;
41
+ // If both are strings, dynamic wins
42
+ if (typeof staticDesc === "string" && typeof dynamicDesc === "string") {
43
+ return dynamicDesc;
44
+ }
45
+ const staticObj = typeof staticDesc === "string" ? { typeId: staticDesc } : staticDesc;
46
+ const dynamicObj = typeof dynamicDesc === "string" ? { typeId: dynamicDesc } : dynamicDesc;
47
+ // Merge: dynamic takes precedence, but merge metadata objects
48
+ const merged = {
49
+ typeId: dynamicObj.typeId ?? staticObj.typeId,
50
+ private: dynamicObj.private ?? staticObj.private,
51
+ };
52
+ // Merge metadata if either has it
53
+ if (staticObj.metadata || dynamicObj.metadata) {
54
+ merged.metadata = {
55
+ ...staticObj.metadata,
56
+ ...dynamicObj.metadata, // Dynamic metadata overrides static
57
+ };
58
+ }
59
+ // Return as InputHandleDescriptor (which accepts object form)
60
+ return merged;
61
+ }
62
+ /**
63
+ * Extract metadata from an InputHandleDescriptor
64
+ */
65
+ function getInputHandleMetadata(inputs, handle) {
66
+ const v = inputs ? inputs[handle] : undefined;
67
+ if (!v || typeof v === "string")
68
+ return undefined;
69
+ return v.metadata;
70
+ }
31
71
 
32
72
  class CategoryRegistry {
33
73
  constructor() {
@@ -752,11 +792,34 @@ function tryHandleResolving(def, registry, environment) {
752
792
  // ignore dynamic resolution errors at this stage
753
793
  }
754
794
  // Merge base with dynamic and overrides (allow partial resolvedHandles)
755
- const inputs = {
756
- ...desc.inputs,
757
- ...dyn.inputs,
758
- ...overrideInputs,
759
- };
795
+ // Merge inputs properly, handling metadata
796
+ const inputs = {};
797
+ // First, add all static handles
798
+ if (desc.inputs) {
799
+ for (const [handle, staticDesc] of Object.entries(desc.inputs)) {
800
+ inputs[handle] = staticDesc;
801
+ }
802
+ }
803
+ // Then, merge dynamic handles
804
+ if (dyn.inputs) {
805
+ for (const [handle, dynamicDesc] of Object.entries(dyn.inputs)) {
806
+ const staticDesc = desc.inputs?.[handle];
807
+ const merged = mergeInputHandleDescriptors(staticDesc, dynamicDesc);
808
+ if (merged) {
809
+ inputs[handle] = merged;
810
+ }
811
+ }
812
+ }
813
+ // Finally, merge overrides
814
+ if (overrideInputs) {
815
+ for (const [handle, overrideDesc] of Object.entries(overrideInputs)) {
816
+ const existingDesc = inputs[handle];
817
+ const merged = mergeInputHandleDescriptors(existingDesc, overrideDesc);
818
+ if (merged) {
819
+ inputs[handle] = merged;
820
+ }
821
+ }
822
+ }
760
823
  const outputs = {
761
824
  ...desc.outputs,
762
825
  ...dyn.outputs,
@@ -1022,7 +1085,24 @@ class HandleResolver {
1022
1085
  const nodeDesc = this.registry.nodes.get(node.typeId);
1023
1086
  if (!nodeDesc)
1024
1087
  return;
1025
- const inputs = { ...nodeDesc.inputs, ...resolved?.inputs };
1088
+ // Merge inputs properly, handling metadata
1089
+ const inputs = {};
1090
+ // First, add all static handles
1091
+ if (nodeDesc.inputs) {
1092
+ for (const [handle, staticDesc] of Object.entries(nodeDesc.inputs)) {
1093
+ inputs[handle] = staticDesc;
1094
+ }
1095
+ }
1096
+ // Then, merge dynamic handles
1097
+ if (resolved?.inputs) {
1098
+ for (const [handle, dynamicDesc] of Object.entries(resolved.inputs)) {
1099
+ const staticDesc = nodeDesc.inputs?.[handle];
1100
+ const merged = mergeInputHandleDescriptors(staticDesc, dynamicDesc);
1101
+ if (merged) {
1102
+ inputs[handle] = merged;
1103
+ }
1104
+ }
1105
+ }
1026
1106
  const outputs = { ...nodeDesc.outputs, ...resolved?.outputs };
1027
1107
  const inputDefaults = {
1028
1108
  ...nodeDesc.inputDefaults,
@@ -5087,6 +5167,7 @@ exports.createValidationGraphDef = createValidationGraphDef;
5087
5167
  exports.createValidationGraphRegistry = createValidationGraphRegistry;
5088
5168
  exports.findMatchingPaths = findMatchingPaths;
5089
5169
  exports.generateId = generateId;
5170
+ exports.getInputHandleMetadata = getInputHandleMetadata;
5090
5171
  exports.getInputTypeId = getInputTypeId;
5091
5172
  exports.getTypedOutputTypeId = getTypedOutputTypeId;
5092
5173
  exports.getTypedOutputValue = getTypedOutputValue;
@@ -5095,6 +5176,7 @@ exports.installLogging = installLogging;
5095
5176
  exports.isInputPrivate = isInputPrivate;
5096
5177
  exports.isTypedOutput = isTypedOutput;
5097
5178
  exports.mergeGraphDefinitions = mergeGraphDefinitions;
5179
+ exports.mergeInputHandleDescriptors = mergeInputHandleDescriptors;
5098
5180
  exports.mergeInputsOutputs = mergeInputsOutputs;
5099
5181
  exports.mergeRuntimeState = mergeRuntimeState;
5100
5182
  exports.mergeSnapshotData = mergeSnapshotData;