From f5e5c2877b19f2fcd6c6ed4fd7c344c9c9fcc2a1 Mon Sep 17 00:00:00 2001 From: Tim Hudson Date: Tue, 7 May 2019 18:35:10 -0400 Subject: [PATCH 1/4] Add test coverage that triggers Maximum call stack exception --- test/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/index.js b/test/index.js index 4960c87ae..c1b157f5e 100644 --- a/test/index.js +++ b/test/index.js @@ -277,13 +277,15 @@ test('mapProps copies propTypes', t => { test('merge deeply merges', t => { const result = merge( - { hello: { hi: 'beep' } }, - { hello: { hey: 'boop' } }, + { hello: { hi: 'beep', merge: 'me', and: 'me' } }, + { hello: { hey: 'boop', merge: 'me', and: 'all of us' } }, ) t.deepEqual(result, { hello: { hi: 'beep', hey: 'boop', + merge: 'me', + and: 'all of us' } }) }) From 926f9f6c5fb697967c4772ce7eb8e11402270c85 Mon Sep 17 00:00:00 2001 From: Tim Hudson Date: Tue, 7 May 2019 19:06:20 -0400 Subject: [PATCH 2/4] Check that values are objects before merging --- src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 34bd955ca..216373323 100644 --- a/src/index.js +++ b/src/index.js @@ -44,8 +44,10 @@ export const merge = (a, b) => { for (const key in b) { if (!a[key]) { result[key] = b[key] - } else { + } else if (typeof a[key] === 'object') { result[key] = merge(a[key], b[key]) + } else { + result[key] = b[key] } } return result From bc70315e9624da7e37b6570ec3757714ac6ea5f4 Mon Sep 17 00:00:00 2001 From: Tim Hudson Date: Wed, 8 May 2019 06:27:47 -0400 Subject: [PATCH 3/4] Add realistic variant test case --- test/index.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/index.js b/test/index.js index c1b157f5e..15aebefce 100644 --- a/test/index.js +++ b/test/index.js @@ -11,6 +11,7 @@ import { cloneFunction, mapProps, merge, + fontSize, } from '../src' const width = style({ @@ -289,3 +290,27 @@ test('merge deeply merges', t => { } }) }) + +test('variant can be composed', t => { + const system = compose( + variant({ key: 'typography' }), + fontSize, + color + ) + const result = system({ + theme: { + typography: { + primary: { + fontSize: '32px', + color: '#fff' + }, + }, + }, + variant: 'primary', + color: '#111' + }) + t.deepEqual(result, { + fontSize: '32px', + color: '#111' + }) +}) From cc67fbb7cd0f258d740a3a31cacc07c78733df62 Mon Sep 17 00:00:00 2001 From: Tim Hudson Date: Wed, 8 May 2019 10:46:34 -0400 Subject: [PATCH 4/4] Simplify merge conditional --- src/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index 216373323..6b28cfeff 100644 --- a/src/index.js +++ b/src/index.js @@ -42,12 +42,10 @@ export const merge = (a, b) => { result[key] = a[key] } for (const key in b) { - if (!a[key]) { + if (!a[key] || typeof a[key] !== 'object') { result[key] = b[key] - } else if (typeof a[key] === 'object') { - result[key] = merge(a[key], b[key]) } else { - result[key] = b[key] + result[key] = merge(a[key], b[key]) } } return result