diff --git a/packages/util/src/object/spread.spec.ts b/packages/util/src/object/spread.spec.ts index c6f3a08be..539098cfd 100644 --- a/packages/util/src/object/spread.spec.ts +++ b/packages/util/src/object/spread.spec.ts @@ -17,5 +17,17 @@ describe('objectSpread', (): void => { ).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } }); }); - perf('objectSpread', 500_000, [[]], () => objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 })); + it('spreads a Map', (): void => { + const map = new Map([['foo', '123']]); + + expect( + objectSpread({ bar: '123' }, map) + ).toEqual({ + bar: '123', + foo: '123' + }); + }); + + perf('objectSpread', 350_000, [[{}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }]], objectSpread); + perf('objectSpread', 350_000, [[{}, new Map([['a', 1], ['b', 2], ['c', 3]]), new Map([['d', 4], ['e', 5], ['f', 6]])]], objectSpread); }); diff --git a/packages/util/src/object/spread.ts b/packages/util/src/object/spread.ts index 7a00aefb5..042cc3fbf 100644 --- a/packages/util/src/object/spread.ts +++ b/packages/util/src/object/spread.ts @@ -10,7 +10,13 @@ export function objectSpread (dest: object, ...sources: (obje const src = sources[i]; if (src) { - Object.assign(dest, src); + if ((src as Map).entries) { + for (const [key, value] of (src as Map).entries()) { + (dest as Record)[key] = value; + } + } else { + Object.assign(dest, src); + } } } diff --git a/packages/util/src/test/performance.ts b/packages/util/src/test/performance.ts index d28a235f1..6231cf110 100644 --- a/packages/util/src/test/performance.ts +++ b/packages/util/src/test/performance.ts @@ -39,19 +39,23 @@ ${formatFixed(ops).padStart(NUM_PAD + PRE_PAD + 1)} ops/s ${formatFixed(micro).padStart(NUM_PAD + PRE_PAD + 1)} μs/op`; } -export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn): void { +export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn, withLog?: boolean): void { if (process.env.GITHUB_REPOSITORY) { return; } it(`performance: ${name}`, (): void => { - const [time] = loop(count, inputs, exec); + const [time, results] = loop(count, inputs, exec); console.log(` performance run for ${name} completed with ${formatNumber(count)} iterations. ${`${name}:`.padStart(PRE_PAD)} ${time.toFixed(2).padStart(NUM_PAD)} ms${formatOps(count, time)} `); + + if (withLog) { + console.log(results); + } }); }