diff --git a/packages/express/src/snapshot/zod/v1/dtos/mappers.ts b/packages/express/src/snapshot/zod/v1/dtos/mappers.ts index 60e55e7..05cfcdb 100644 --- a/packages/express/src/snapshot/zod/v1/dtos/mappers.ts +++ b/packages/express/src/snapshot/zod/v1/dtos/mappers.ts @@ -42,10 +42,12 @@ export function mapFromAllMapsDto(dto: dtos.AllMapsDto): types.AllMaps { export function mapFromComplexKeyMapADto( dto: dtos.ComplexKeyMapADto, ): types.ComplexKeyMapA { - return Object.keys(dto).reduce((acc, key) => { + const result: types.ComplexKeyMapA = {}; + for (const key of Object.keys(dto)) { const value = dto[key]; - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as types.ComplexKeyMapA); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromCreateWidgetBodyDto( @@ -159,13 +161,15 @@ export function mapFromMixedMapDDto(dto: dtos.MixedMapDDto): types.MixedMapD { } export function mapFromPureMapADto(dto: dtos.PureMapADto): types.PureMapA { - return Object.keys(dto).reduce((acc, key) => { + const result: types.PureMapA = {}; + for (const key of Object.keys(dto)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromExampleMapValueDto(dto[key] as dtos.ExampleMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as types.PureMapA); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromPureMapBDto(dto: dtos.PureMapBDto): types.PureMapB { @@ -176,13 +180,15 @@ export function mapFromPureMapBDto(dto: dtos.PureMapBDto): types.PureMapB { objBuzz: mapFromExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: types.PureMapB = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromExampleMapValueDto(dto[key] as dtos.ExampleMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as types.PureMapB); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromPureMapCDto(dto: dtos.PureMapCDto): types.PureMapC { @@ -193,13 +199,15 @@ export function mapFromPureMapCDto(dto: dtos.PureMapCDto): types.PureMapC { objBuzz: mapFromExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: types.PureMapC = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromExampleMapValueDto(dto[key] as dtos.ExampleMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as types.PureMapC); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromPureMapDDto(dto: dtos.PureMapDDto): types.PureMapD { @@ -228,10 +236,12 @@ export function mapToAllMapsDto(obj: types.AllMaps): dtos.AllMapsDto { export function mapToComplexKeyMapADto( obj: types.ComplexKeyMapA, ): dtos.ComplexKeyMapADto { - return Object.keys(obj).reduce((acc, key) => { + const result: dtos.ComplexKeyMapADto = {}; + for (const key of Object.keys(obj)) { const value = obj[key]; - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as dtos.ComplexKeyMapADto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToExampleMapValueDto( @@ -346,13 +356,15 @@ export function mapToMixedMapDDto(obj: types.MixedMapD): dtos.MixedMapDDto { } export function mapToPureMapADto(obj: types.PureMapA): dtos.PureMapADto { - return Object.keys(obj).reduce((acc, key) => { + const result: dtos.PureMapADto = {}; + for (const key of Object.keys(obj)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToExampleMapValueDto(obj[key] as types.ExampleMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as dtos.PureMapADto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToPureMapBDto(obj: types.PureMapB): dtos.PureMapBDto { @@ -363,13 +375,15 @@ export function mapToPureMapBDto(obj: types.PureMapB): dtos.PureMapBDto { 'obj-buzz': mapToExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: dtos.PureMapBDto = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToExampleMapValueDto(obj[key] as types.ExampleMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as dtos.PureMapBDto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToPureMapCDto(obj: types.PureMapC): dtos.PureMapCDto { @@ -380,13 +394,15 @@ export function mapToPureMapCDto(obj: types.PureMapC): dtos.PureMapCDto { 'obj-buzz': mapToExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: dtos.PureMapCDto = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToExampleMapValueDto(obj[key] as types.ExampleMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as dtos.PureMapCDto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToPureMapDDto(obj: types.PureMapD): dtos.PureMapDDto { @@ -419,13 +435,15 @@ export function mapToWidgetDataDto(obj: types.WidgetData): dtos.WidgetDataDto { buzz: mapToGizmoMapValueDto(buzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: dtos.WidgetDataDto = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToGizmoMapValueDto(obj[key] as types.GizmoMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as dtos.WidgetDataDto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToWidgetFooDto(obj: types.WidgetFoo): dtos.WidgetFooDto { diff --git a/packages/http-client/src/snapshot/zod/v1/dtos/mappers.ts b/packages/http-client/src/snapshot/zod/v1/dtos/mappers.ts index 842446c..e4561da 100644 --- a/packages/http-client/src/snapshot/zod/v1/dtos/mappers.ts +++ b/packages/http-client/src/snapshot/zod/v1/dtos/mappers.ts @@ -42,10 +42,12 @@ export function mapFromAllMapsDto(dto: dtos.AllMapsDto): types.AllMaps { export function mapFromComplexKeyMapADto( dto: dtos.ComplexKeyMapADto, ): types.ComplexKeyMapA { - return Object.keys(dto).reduce((acc, key) => { + const result: types.ComplexKeyMapA = {}; + for (const key of Object.keys(dto)) { const value = dto[key]; - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as types.ComplexKeyMapA); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromExampleMapValueDto( @@ -177,13 +179,15 @@ export function mapFromMixedMapDDto(dto: dtos.MixedMapDDto): types.MixedMapD { } export function mapFromPureMapADto(dto: dtos.PureMapADto): types.PureMapA { - return Object.keys(dto).reduce((acc, key) => { + const result: types.PureMapA = {}; + for (const key of Object.keys(dto)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromExampleMapValueDto(dto[key] as dtos.ExampleMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as types.PureMapA); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromPureMapBDto(dto: dtos.PureMapBDto): types.PureMapB { @@ -194,13 +198,15 @@ export function mapFromPureMapBDto(dto: dtos.PureMapBDto): types.PureMapB { objBuzz: mapFromExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: types.PureMapB = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromExampleMapValueDto(dto[key] as dtos.ExampleMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as types.PureMapB); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromPureMapCDto(dto: dtos.PureMapCDto): types.PureMapC { @@ -211,13 +217,15 @@ export function mapFromPureMapCDto(dto: dtos.PureMapCDto): types.PureMapC { objBuzz: mapFromExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: types.PureMapC = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromExampleMapValueDto(dto[key] as dtos.ExampleMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as types.PureMapC); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromPureMapDDto(dto: dtos.PureMapDDto): types.PureMapD { @@ -253,13 +261,15 @@ export function mapFromWidgetDataDto( buzz: mapFromGizmoMapValueDto(buzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: types.WidgetData = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof dto[key] === 'undefined' ? dto[key] : mapFromGizmoMapValueDto(dto[key] as dtos.GizmoMapValueDto); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as types.WidgetData); + if (value !== undefined) result[key] = value; + } + return result; } export function mapFromWidgetFooDto(dto: dtos.WidgetFooDto): types.WidgetFoo { @@ -286,10 +296,12 @@ export function mapToAllMapsDto(obj: types.AllMaps): dtos.AllMapsDto { export function mapToComplexKeyMapADto( obj: types.ComplexKeyMapA, ): dtos.ComplexKeyMapADto { - return Object.keys(obj).reduce((acc, key) => { + const result: dtos.ComplexKeyMapADto = {}; + for (const key of Object.keys(obj)) { const value = obj[key]; - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as dtos.ComplexKeyMapADto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToCreateWidgetBodyDto( @@ -386,13 +398,15 @@ export function mapToMixedMapDDto(obj: types.MixedMapD): dtos.MixedMapDDto { } export function mapToPureMapADto(obj: types.PureMapA): dtos.PureMapADto { - return Object.keys(obj).reduce((acc, key) => { + const result: dtos.PureMapADto = {}; + for (const key of Object.keys(obj)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToExampleMapValueDto(obj[key] as types.ExampleMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, {} as dtos.PureMapADto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToPureMapBDto(obj: types.PureMapB): dtos.PureMapBDto { @@ -403,13 +417,15 @@ export function mapToPureMapBDto(obj: types.PureMapB): dtos.PureMapBDto { 'obj-buzz': mapToExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: dtos.PureMapBDto = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToExampleMapValueDto(obj[key] as types.ExampleMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as dtos.PureMapBDto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToPureMapCDto(obj: types.PureMapC): dtos.PureMapCDto { @@ -420,13 +436,15 @@ export function mapToPureMapCDto(obj: types.PureMapC): dtos.PureMapCDto { 'obj-buzz': mapToExampleMapValueDto(objBuzz), }); - return Object.keys(__rest__).reduce((acc, key) => { + const result: dtos.PureMapCDto = __defined__; + for (const key of Object.keys(__rest__)) { const value = typeof obj[key] === 'undefined' ? obj[key] : mapToExampleMapValueDto(obj[key] as types.ExampleMapValue); - return value === undefined ? acc : { ...acc, [key]: value }; - }, __defined__ as dtos.PureMapCDto); + if (value !== undefined) result[key] = value; + } + return result; } export function mapToPureMapDDto(obj: types.PureMapD): dtos.PureMapDDto { diff --git a/packages/typescript-dtos/src/mapper-factory.ts b/packages/typescript-dtos/src/mapper-factory.ts index bdfdd99..70157eb 100644 --- a/packages/typescript-dtos/src/mapper-factory.ts +++ b/packages/typescript-dtos/src/mapper-factory.ts @@ -243,6 +243,7 @@ export class ExpressMapperFactory extends BaseFactory { mode, ).input; + // TODO: remove O(n²) call to reduce yield ``; yield `return Object.keys(__rest__).reduce((acc, key) => {`; yield `const value = ${this.builder.buildValue(mapProperties.value.value, mode, `${paramName}[key]`, asType)};`; @@ -350,10 +351,12 @@ export class ExpressMapperFactory extends BaseFactory { const initialObj = destructure ? '__defined__' : '{}'; yield ``; - yield `return Object.keys(${sourceName}).reduce((acc, key) => {`; - yield `const value = ${this.builder.buildValue(mapProperties.value.value, mode, `${paramName}[key]`, asType)};`; - yield `return value === undefined ? acc : { ...acc, [key]: value };`; - yield `}, ${initialObj} as ${this.buildTypeNames(type.name.value, mode).output});`; + yield `const result: ${this.buildTypeNames(type.name.value, mode).output} = ${initialObj};`; + yield `for (const key of Object.keys(${sourceName})) {`; + yield ` const value = ${this.builder.buildValue(mapProperties.value.value, mode, `${paramName}[key]`, asType)};`; + yield ` if (value !== undefined) result[key] = value;`; + yield `}`; + yield `return result;`; } } @@ -716,6 +719,7 @@ export class ExpressMapperFactory extends BaseFactory { this._needsCompact = true; } private *buildCompact(): Iterable { + // TODO: remove O(n²) call to reduce if (this._needsCompact) { yield `function compact(obj: T): T { return Object.keys(obj).reduce((acc, key) => {