@bian-womp/spark-graph 0.2.63 → 0.2.65

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
@@ -3757,7 +3757,7 @@ function mergeGraphDefinitions(target, source, converter) {
3757
3757
  ? transformedNode.resolvedHandles.inputs[handleId]
3758
3758
  : transformedNode.resolvedHandles.inputs[handleId]?.typeId
3759
3759
  : undefined;
3760
- transformedInputDefaults[handleId] = converter({
3760
+ const convertedValue = converter({
3761
3761
  nodeId: newId,
3762
3762
  handleId,
3763
3763
  value,
@@ -3765,11 +3765,23 @@ function mergeGraphDefinitions(target, source, converter) {
3765
3765
  nodeTypeId,
3766
3766
  handleDataType,
3767
3767
  });
3768
+ // If converter returns null, skip this input default (delete it)
3769
+ if (convertedValue !== null) {
3770
+ transformedInputDefaults[handleId] = convertedValue;
3771
+ }
3772
+ }
3773
+ // Only set inputDefaults if there are any remaining after conversion
3774
+ if (Object.keys(transformedInputDefaults).length > 0) {
3775
+ transformedNode.resolvedHandles = {
3776
+ ...transformedNode.resolvedHandles,
3777
+ inputDefaults: transformedInputDefaults,
3778
+ };
3779
+ }
3780
+ else if (transformedNode.resolvedHandles) {
3781
+ // Remove inputDefaults if all were deleted
3782
+ const { inputDefaults, ...restHandles } = transformedNode.resolvedHandles;
3783
+ transformedNode.resolvedHandles = restHandles;
3768
3784
  }
3769
- transformedNode.resolvedHandles = {
3770
- ...transformedNode.resolvedHandles,
3771
- inputDefaults: transformedInputDefaults,
3772
- };
3773
3785
  }
3774
3786
  }
3775
3787
  return transformedNode;
@@ -3852,16 +3864,28 @@ function offsetImportedPositions(targetPositions, sourcePositions, sourceDef, no
3852
3864
  * Source values override target when merging.
3853
3865
  */
3854
3866
  function mergeInputsOutputs(targetInputs, targetOutputs, sourceInputs, sourceOutputs, nodeIdMap, converter, nodeTypeMap, handleTypeMap) {
3855
- const mergedInputs = { ...targetInputs };
3856
- const mergedOutputs = { ...targetOutputs };
3867
+ // Deep copy target inputs/outputs to avoid mutating the original
3868
+ const mergedInputs = {};
3869
+ const mergedOutputs = {};
3870
+ // Copy target inputs/outputs
3871
+ for (const [nodeId, inputs] of Object.entries(targetInputs)) {
3872
+ mergedInputs[nodeId] = { ...inputs };
3873
+ }
3874
+ for (const [nodeId, outputs] of Object.entries(targetOutputs)) {
3875
+ mergedOutputs[nodeId] = { ...outputs };
3876
+ }
3857
3877
  for (const [oldId, inputs] of Object.entries(sourceInputs)) {
3858
3878
  const newId = nodeIdMap[oldId];
3859
3879
  if (newId) {
3860
3880
  const transformedInputs = {};
3861
3881
  const nodeTypeId = nodeTypeMap?.get(oldId);
3882
+ // Ensure mergedInputs[newId] exists
3883
+ if (!mergedInputs[newId]) {
3884
+ mergedInputs[newId] = {};
3885
+ }
3862
3886
  for (const [handleId, value] of Object.entries(inputs)) {
3863
3887
  const handleDataType = handleTypeMap?.get(oldId)?.get(handleId);
3864
- transformedInputs[handleId] = converter
3888
+ const convertedValue = converter
3865
3889
  ? converter({
3866
3890
  nodeId: newId,
3867
3891
  handleId,
@@ -3871,10 +3895,23 @@ function mergeInputsOutputs(targetInputs, targetOutputs, sourceInputs, sourceOut
3871
3895
  handleDataType,
3872
3896
  })
3873
3897
  : value;
3898
+ // If converter returns null, delete this input
3899
+ if (convertedValue === null) {
3900
+ delete mergedInputs[newId][handleId];
3901
+ }
3902
+ else {
3903
+ // Otherwise, set the converted value
3904
+ transformedInputs[handleId] = convertedValue;
3905
+ }
3906
+ }
3907
+ // Merge transformed inputs
3908
+ if (Object.keys(transformedInputs).length > 0) {
3909
+ mergedInputs[newId] = { ...mergedInputs[newId], ...transformedInputs };
3910
+ }
3911
+ // Clean up empty node input objects
3912
+ if (Object.keys(mergedInputs[newId]).length === 0) {
3913
+ delete mergedInputs[newId];
3874
3914
  }
3875
- mergedInputs[newId] = mergedInputs[newId]
3876
- ? { ...mergedInputs[newId], ...transformedInputs }
3877
- : transformedInputs;
3878
3915
  }
3879
3916
  }
3880
3917
  for (const [oldId, outputs] of Object.entries(sourceOutputs)) {
@@ -3882,12 +3919,16 @@ function mergeInputsOutputs(targetInputs, targetOutputs, sourceInputs, sourceOut
3882
3919
  if (newId) {
3883
3920
  const transformedOutputs = {};
3884
3921
  const nodeTypeId = nodeTypeMap?.get(oldId);
3922
+ // Ensure mergedOutputs[newId] exists
3923
+ if (!mergedOutputs[newId]) {
3924
+ mergedOutputs[newId] = {};
3925
+ }
3885
3926
  for (const [handleId, value] of Object.entries(outputs)) {
3886
3927
  const handleDataType = handleTypeMap?.get(oldId)?.get(handleId);
3887
3928
  const runtimeTypeId = isTypedOutput(value)
3888
3929
  ? getTypedOutputTypeId(value)
3889
3930
  : undefined;
3890
- transformedOutputs[handleId] = converter
3931
+ const convertedValue = converter
3891
3932
  ? converter({
3892
3933
  nodeId: newId,
3893
3934
  handleId,
@@ -3898,10 +3939,26 @@ function mergeInputsOutputs(targetInputs, targetOutputs, sourceInputs, sourceOut
3898
3939
  runtimeTypeId,
3899
3940
  })
3900
3941
  : value;
3942
+ // If converter returns null, delete this output
3943
+ if (convertedValue === null) {
3944
+ delete mergedOutputs[newId][handleId];
3945
+ }
3946
+ else {
3947
+ // Otherwise, set the converted value
3948
+ transformedOutputs[handleId] = convertedValue;
3949
+ }
3950
+ }
3951
+ // Merge transformed outputs
3952
+ if (Object.keys(transformedOutputs).length > 0) {
3953
+ mergedOutputs[newId] = {
3954
+ ...mergedOutputs[newId],
3955
+ ...transformedOutputs,
3956
+ };
3957
+ }
3958
+ // Clean up empty node output objects
3959
+ if (Object.keys(mergedOutputs[newId]).length === 0) {
3960
+ delete mergedOutputs[newId];
3901
3961
  }
3902
- mergedOutputs[newId] = mergedOutputs[newId]
3903
- ? { ...mergedOutputs[newId], ...transformedOutputs }
3904
- : transformedOutputs;
3905
3962
  }
3906
3963
  }
3907
3964
  return { mergedInputs, mergedOutputs };
@@ -4020,10 +4077,14 @@ function buildValueConverter(config) {
4020
4077
  }
4021
4078
  }
4022
4079
  if (changed && newValue !== matchValue) {
4080
+ // If mapped to null, set null at the path (which may delete nested property)
4023
4081
  setValueAtPath(transformedInner, match.path, newValue);
4024
4082
  }
4025
4083
  }
4026
4084
  }
4085
+ // If the entire typed output should be deleted (all paths mapped to null),
4086
+ // we'd need to check if the whole inner value is null/empty, but for now
4087
+ // we'll return the transformed value or original
4027
4088
  return changed ? typed(typedTypeId, transformedInner) : value;
4028
4089
  }
4029
4090
  }
@@ -4033,6 +4094,10 @@ function buildValueConverter(config) {
4033
4094
  if (mapping.valueMap instanceof Map) {
4034
4095
  if (mapping.valueMap.has(innerValue)) {
4035
4096
  newValue = mapping.valueMap.get(innerValue);
4097
+ // If mapped to null, return null to delete the output
4098
+ if (newValue === null) {
4099
+ return null;
4100
+ }
4036
4101
  return typed(typedTypeId, newValue);
4037
4102
  }
4038
4103
  }
@@ -4041,6 +4106,10 @@ function buildValueConverter(config) {
4041
4106
  typeof innerValue === "number") {
4042
4107
  if (innerValue in mapping.valueMap) {
4043
4108
  newValue = mapping.valueMap[innerValue];
4109
+ // If mapped to null, return null to delete the output
4110
+ if (newValue === null) {
4111
+ return null;
4112
+ }
4044
4113
  return typed(typedTypeId, newValue);
4045
4114
  }
4046
4115
  }