diff --git a/packages/core/src/lib/create-mapper/create-map-for-member.util.ts b/packages/core/src/lib/create-mapper/create-map-for-member.util.ts index f23e61808..ce76f8d0c 100644 --- a/packages/core/src/lib/create-mapper/create-map-for-member.util.ts +++ b/packages/core/src/lib/create-mapper/create-map-for-member.util.ts @@ -64,7 +64,7 @@ export function createMapForMember< // initialize MappingProperty const mappingProperty: MappingProperty = [ [memberPath, sourcePath], - [mapMemberFn, preCond as PreConditionReturn], + [mapMemberFn, false, preCond as PreConditionReturn], ]; // check existProp on mapping diff --git a/packages/core/src/lib/initialize-utils/create-initial-mapping.util.ts b/packages/core/src/lib/initialize-utils/create-initial-mapping.util.ts index 8ffc44ad4..c500b5255 100644 --- a/packages/core/src/lib/initialize-utils/create-initial-mapping.util.ts +++ b/packages/core/src/lib/initialize-utils/create-initial-mapping.util.ts @@ -37,6 +37,7 @@ interface CreateInitialMappingOptions { sourceObj: unknown, sourcePath: string ) => boolean; + isMetadataNullAtKey?: (key: string) => boolean; prePropertiesLoop?: (mapping: Mapping) => void; } @@ -52,6 +53,7 @@ export function createInitialMapping( const { isMultipartSourcePathsInSource = defaultIsMultipartSourcePathsInSource, isDestinationPathOnSource = defaultIsDestinationPathOnSource, + isMetadataNullAtKey = () => false, prePropertiesLoop, } = createInitialMappingOptions ?? {}; const { extends: bases = [], namingConventions: conventions } = options ?? {}; @@ -105,7 +107,13 @@ export function createInitialMapping( mapping[MappingClassId.properties].push([ destinationPath, - [[destinationPath], [mapInitialize(...sourcePaths!)]], + [ + [destinationPath], + [ + mapInitialize(...sourcePaths!), + isMetadataNullAtKey(destinationPath), + ], + ], destinationNestedMetadataAtPath, ]); continue; @@ -118,7 +126,10 @@ export function createInitialMapping( mapping[MappingClassId.properties].push([ destinationPath, - [[destinationPath, sourcePath], [mapInitialize(sourcePath)]], + [ + [destinationPath, sourcePath], + [mapInitialize(sourcePath), isMetadataNullAtKey(destinationPath)], + ], destinationNestedMetadataAtPath, ]); } diff --git a/packages/core/src/lib/map/map.ts b/packages/core/src/lib/map/map.ts index eefa62159..1158b0056 100644 --- a/packages/core/src/lib/map/map.ts +++ b/packages/core/src/lib/map/map.ts @@ -229,6 +229,7 @@ function map< , [ transformationMapFn, + isMetadataNull = false, [ transformationPreCondPredicate, preCondDefaultValue = undefined, @@ -272,17 +273,17 @@ Original error: ${originalError}`; ) { const mapInitializedValue = (transformationMapFn[ MapFnClassId.fn - ] as MapInitializeReturn[1])(sourceObj); + ] as MapInitializeReturn[MapFnClassId.fn])(sourceObj); // if null/undefined - if (mapInitializedValue == null) { - setMember(() => mapInitializedValue); - continue; - } - // if isDate - if (mapInitializedValue instanceof Date) { - setMember(() => new Date(mapInitializedValue)); + // if metadata is null, treat as-is + if ( + mapInitializedValue == null || + mapInitializedValue instanceof Date || + isMetadataNull + ) { + setMember(() => mapInitializedValue); continue; }