diff --git a/packages/core/src/lib/pseudopattern_hunter.js b/packages/core/src/lib/pseudopattern_hunter.js index 42e241aca..e5dcaf781 100644 --- a/packages/core/src/lib/pseudopattern_hunter.js +++ b/packages/core/src/lib/pseudopattern_hunter.js @@ -67,9 +67,14 @@ pseudopattern_hunter.prototype.find_pseudopatterns = function( (objValue, srcValue) => { if ( _.isArray(objValue) && + // If the parameter is not available after updating pattern lab but + // not the patternlab-config it should not override arrays. + patternlab.config.hasOwnProperty('patternMergeVariantArrays') && !patternlab.config.patternMergeVariantArrays ) { return srcValue; + } else if (_.isArray(objValue)) { + return objValue.concat(srcValue); } // Lodash will only check for "undefined" and eslint needs a consistent // return so do not remove diff --git a/packages/core/test/files/_patterns/00-test/475-variant-test.json b/packages/core/test/files/_patterns/00-test/475-variant-test.json new file mode 100644 index 000000000..9d371748a --- /dev/null +++ b/packages/core/test/files/_patterns/00-test/475-variant-test.json @@ -0,0 +1,9 @@ +{ + "a": 1, + "b": [2, 3], + "c": { + "d": [4, 5], + "e": 8, + "f": {"a": ["a"], "b": ["b"], "c": ["c"]} + } +} \ No newline at end of file diff --git a/packages/core/test/files/_patterns/00-test/475-variant-test.mustache b/packages/core/test/files/_patterns/00-test/475-variant-test.mustache new file mode 100644 index 000000000..fe4dd1f58 --- /dev/null +++ b/packages/core/test/files/_patterns/00-test/475-variant-test.mustache @@ -0,0 +1 @@ +{{a}} \ No newline at end of file diff --git a/packages/core/test/files/_patterns/00-test/475-variant-test~merge.json b/packages/core/test/files/_patterns/00-test/475-variant-test~merge.json new file mode 100644 index 000000000..c60d0974c --- /dev/null +++ b/packages/core/test/files/_patterns/00-test/475-variant-test~merge.json @@ -0,0 +1,8 @@ +{ + "a": 2, + "b": [8], + "c": { + "d": [6, 7], + "f": {"b": ["x"]} + } +} \ No newline at end of file diff --git a/packages/core/test/pseudopattern_hunter_tests.js b/packages/core/test/pseudopattern_hunter_tests.js index 1464f28b4..fed26b16c 100644 --- a/packages/core/test/pseudopattern_hunter_tests.js +++ b/packages/core/test/pseudopattern_hunter_tests.js @@ -133,3 +133,72 @@ tap.test( }); } ); + +tap.test('pseudo pattern variant data should merge arrays', function(test) { + const pl = stubPatternlab(); + pl.config.patternMergeVariantArrays = true; + + const pattern = loadPattern('00-test/475-variant-test.mustache', pl); + + addPattern(pattern, pl); + + return pph.find_pseudopatterns(pattern, pl).then(() => { + test.equals(pl.patterns[1].patternPartial, 'test-variant-test-merge'); + test.equals( + JSON.stringify(pl.patterns[1].jsonFileData), + JSON.stringify({ + a: 2, + b: [2, 3, 8], + c: { d: [4, 5, 6, 7], e: 8, f: { a: ['a'], b: ['b', 'x'], c: ['c'] } }, + }) + ); + }); +}); + +tap.test( + 'pseudo pattern variant data should merge arrays if config "patternMergeVariantArrays" is not available as default behavior', + function(test) { + const pl = stubPatternlab(); + + const pattern = loadPattern('00-test/475-variant-test.mustache', pl); + + addPattern(pattern, pl); + + return pph.find_pseudopatterns(pattern, pl).then(() => { + test.equals(pl.patterns[1].patternPartial, 'test-variant-test-merge'); + test.equals( + JSON.stringify(pl.patterns[1].jsonFileData), + JSON.stringify({ + a: 2, + b: [2, 3, 8], + c: { + d: [4, 5, 6, 7], + e: 8, + f: { a: ['a'], b: ['b', 'x'], c: ['c'] }, + }, + }) + ); + }); + } +); + +tap.test('pseudo pattern variant data should override arrays', function(test) { + const pl = stubPatternlab(); + pl.config.patternMergeVariantArrays = false; + + const pattern = loadPattern('00-test/475-variant-test.mustache', pl); + + addPattern(pattern, pl); + + return pph.find_pseudopatterns(pattern, pl).then(() => { + test.equals(pl.patterns[1].patternPartial, 'test-variant-test-merge'); + test.equals( + JSON.stringify(pl.patterns[1].jsonFileData), + JSON.stringify({ + a: 2, + b: [8], + c: { d: [6, 7], e: 8, f: { a: ['a'], b: ['x'], c: ['c'] } }, + }) + ); + }); +});