From 86cde4a2034e1d719a63617c44103b6504d0413e Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 20:38:25 -0700 Subject: [PATCH 01/17] chore: allowing variables in config target --- src/util/config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/config.js b/src/util/config.js index 44bb8c89..bc9bf870 100644 --- a/src/util/config.js +++ b/src/util/config.js @@ -57,6 +57,7 @@ module.exports.loadConfig = (configName, variables) => { if (typeof config.target === 'string') { // load and merge config snippets into config const snippetDir = path.join(__dirname, '..', 'configs', configName.split('/')[0], 'snippets'); + config.target = populateVars([config.target], variables, true)[0]; config.toWrite = deepmerge.all(config.snippets .map(m => (typeof m === 'string' ? [m, {}] : [m.name, m.variables])) .map(([snippetName, snippetVars]) => [snippetName, populateVars(snippetVars, variables, true)]) From aee0edf016c57776b67bf1b6a7db85cf84e502a1 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 20:39:12 -0700 Subject: [PATCH 02/17] chore: added xml-merge.js utility --- src/util/xml-merge.js | 36 +++++++++++++++++++ test/util/xml-merge.spec.js | 18 ++++++++++ .../xml-merge/header-replace/changeset.xml | 1 + test/util/xml-merge/header-replace/result.xml | 2 ++ test/util/xml-merge/header-replace/target.xml | 2 ++ .../nested-insert-unchanged/changeset.xml | 7 ++++ .../nested-insert-unchanged/result.xml | 13 +++++++ .../nested-insert-unchanged/target.xml | 13 +++++++ .../nested-insert-updated/changeset.xml | 7 ++++ .../nested-insert-updated/result.xml | 13 +++++++ .../nested-insert-updated/target.xml | 12 +++++++ 11 files changed, 124 insertions(+) create mode 100644 src/util/xml-merge.js create mode 100644 test/util/xml-merge.spec.js create mode 100644 test/util/xml-merge/header-replace/changeset.xml create mode 100644 test/util/xml-merge/header-replace/result.xml create mode 100644 test/util/xml-merge/header-replace/target.xml create mode 100644 test/util/xml-merge/nested-insert-unchanged/changeset.xml create mode 100644 test/util/xml-merge/nested-insert-unchanged/result.xml create mode 100644 test/util/xml-merge/nested-insert-unchanged/target.xml create mode 100644 test/util/xml-merge/nested-insert-updated/changeset.xml create mode 100644 test/util/xml-merge/nested-insert-updated/result.xml create mode 100644 test/util/xml-merge/nested-insert-updated/target.xml diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js new file mode 100644 index 00000000..56180b64 --- /dev/null +++ b/src/util/xml-merge.js @@ -0,0 +1,36 @@ +const objectDeepContain = require('object-deep-contain'); + +const mergeRec = (target, changeset) => Object + .entries(target || {}) + .map(([attr, elements]) => { + const changesetElements = changeset[attr]; + + if (!Array.isArray(elements)) { + if (changesetElements !== undefined) { + return [attr, changesetElements]; + } + return [attr, elements]; + } + + let next = 0; + for (let idx = 0, len = elements.length; idx < len && next < changesetElements.length; idx += 1) { + const targetElement = elements[idx]; + const toInsert = changesetElements[next]; + + if (objectDeepContain( + targetElement, + Object + .entries(toInsert) + .reduce((p, [k, v]) => Object.assign(p, k === 'elements' ? {} : { [k]: v }), {}) + )) { + // eslint-disable-next-line no-param-reassign + elements[idx] = mergeRec(targetElement, toInsert); + next += 1; + } + } + elements.push(...changesetElements.slice(next)); + return [attr, elements]; + }) + .reduce((p, [k, v]) => Object.assign(p, { [k]: v }), {}); + +module.exports = (target, changeset) => Object.assign(target, { data: mergeRec(target.data, changeset.data) }); diff --git a/test/util/xml-merge.spec.js b/test/util/xml-merge.spec.js new file mode 100644 index 00000000..d9097c80 --- /dev/null +++ b/test/util/xml-merge.spec.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const path = require('path'); +const expect = require('chai').expect; +const sfs = require('smart-fs'); +const xmlMerge = require('../../src/util/xml-merge'); + +describe('Integration xml-merge.js', () => { + fs.readdirSync(path.join(__dirname, 'xml-merge')) + .forEach((f) => { + it(`Testing '${f}'`, () => { + const result = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'result.xml')); + const target = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'target.xml')); + const changeset = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'changeset.xml')); + const merged = xmlMerge(target, changeset); + expect(result).to.deep.equal(merged); + }); + }); +}); diff --git a/test/util/xml-merge/header-replace/changeset.xml b/test/util/xml-merge/header-replace/changeset.xml new file mode 100644 index 00000000..575dbaa0 --- /dev/null +++ b/test/util/xml-merge/header-replace/changeset.xml @@ -0,0 +1 @@ + diff --git a/test/util/xml-merge/header-replace/result.xml b/test/util/xml-merge/header-replace/result.xml new file mode 100644 index 00000000..d1e9c86c --- /dev/null +++ b/test/util/xml-merge/header-replace/result.xml @@ -0,0 +1,2 @@ + + diff --git a/test/util/xml-merge/header-replace/target.xml b/test/util/xml-merge/header-replace/target.xml new file mode 100644 index 00000000..800c39c1 --- /dev/null +++ b/test/util/xml-merge/header-replace/target.xml @@ -0,0 +1,2 @@ + + diff --git a/test/util/xml-merge/nested-insert-unchanged/changeset.xml b/test/util/xml-merge/nested-insert-unchanged/changeset.xml new file mode 100644 index 00000000..1c81dfbf --- /dev/null +++ b/test/util/xml-merge/nested-insert-unchanged/changeset.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/nested-insert-unchanged/result.xml b/test/util/xml-merge/nested-insert-unchanged/result.xml new file mode 100644 index 00000000..91696c31 --- /dev/null +++ b/test/util/xml-merge/nested-insert-unchanged/result.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/util/xml-merge/nested-insert-unchanged/target.xml b/test/util/xml-merge/nested-insert-unchanged/target.xml new file mode 100644 index 00000000..91696c31 --- /dev/null +++ b/test/util/xml-merge/nested-insert-unchanged/target.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/util/xml-merge/nested-insert-updated/changeset.xml b/test/util/xml-merge/nested-insert-updated/changeset.xml new file mode 100644 index 00000000..1c81dfbf --- /dev/null +++ b/test/util/xml-merge/nested-insert-updated/changeset.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/nested-insert-updated/result.xml b/test/util/xml-merge/nested-insert-updated/result.xml new file mode 100644 index 00000000..2b2f638c --- /dev/null +++ b/test/util/xml-merge/nested-insert-updated/result.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/util/xml-merge/nested-insert-updated/target.xml b/test/util/xml-merge/nested-insert-updated/target.xml new file mode 100644 index 00000000..97d2c07a --- /dev/null +++ b/test/util/xml-merge/nested-insert-updated/target.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + From f1318f0884f8f10889511eb17fd4e29c22620ba4 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 20:41:40 -0700 Subject: [PATCH 03/17] amend: minor restruct --- src/util/xml-merge.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index 56180b64..56072e28 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -6,10 +6,7 @@ const mergeRec = (target, changeset) => Object const changesetElements = changeset[attr]; if (!Array.isArray(elements)) { - if (changesetElements !== undefined) { - return [attr, changesetElements]; - } - return [attr, elements]; + return [attr, changesetElements !== undefined ? changesetElements : elements]; } let next = 0; From 0b95bb2370404b0019c372993fcb9a4ba814d18a Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 20:43:56 -0700 Subject: [PATCH 04/17] chore: added xml-merge strategy --- src/util/strategies.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/util/strategies.js b/src/util/strategies.js index 8fb8a22d..3a3fa8d9 100644 --- a/src/util/strategies.js +++ b/src/util/strategies.js @@ -1,4 +1,5 @@ const assert = require('assert'); +const xmlMerge = require('./xml-merge'); module.exports = { 'merge-below-title': (existing, changeset) => { @@ -32,5 +33,6 @@ module.exports = { return changeset.concat(existing); }, 'merge-shallow': (existing, changeset) => Object.assign(existing, changeset), + 'xml-merge': (existing, changeset) => xmlMerge(existing, changeset), overwrite: (existing, changeset) => changeset }; From a0a1982d97e8ad2794f005946415aab7e4879dd6 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 20:47:06 -0700 Subject: [PATCH 05/17] feat: now managing jetbrains coverage exclude folder injection --- package.json | 1 + src/configs/jetbrains/@common.json | 5 +++++ src/configs/jetbrains/exclude-coverage-folder.json | 12 ++++++++++++ .../snippets/exclude-folder-from-module.iml | 7 +++++++ test/index.spec.js | 6 +++++- yarn.lock | 5 +++++ 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/configs/jetbrains/@common.json create mode 100644 src/configs/jetbrains/exclude-coverage-folder.json create mode 100644 src/configs/jetbrains/snippets/exclude-folder-from-module.iml diff --git a/package.json b/package.json index f3be7656..3c3f31ee 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "joi": "14.3.1", "lodash.clonedeep": "4.5.0", "lodash.difference": "4.5.0", + "object-deep-contain": "1.0.4", "object-scan": "5.0.3", "smart-fs": "1.3.0" } diff --git a/src/configs/jetbrains/@common.json b/src/configs/jetbrains/@common.json new file mode 100644 index 00000000..944c5861 --- /dev/null +++ b/src/configs/jetbrains/@common.json @@ -0,0 +1,5 @@ +{ + "configs": [ + "jetbrains/exclude-coverage-folder" + ] +} diff --git a/src/configs/jetbrains/exclude-coverage-folder.json b/src/configs/jetbrains/exclude-coverage-folder.json new file mode 100644 index 00000000..01b064aa --- /dev/null +++ b/src/configs/jetbrains/exclude-coverage-folder.json @@ -0,0 +1,12 @@ +{ + "target": ".idea/${projectName}.iml", + "strategy": "xml-merge", + "snippets": [ + { + "name": "exclude-folder-from-module", + "variables": { + "folder": "coverage" + } + } + ] +} diff --git a/src/configs/jetbrains/snippets/exclude-folder-from-module.iml b/src/configs/jetbrains/snippets/exclude-folder-from-module.iml new file mode 100644 index 00000000..b52c64f9 --- /dev/null +++ b/src/configs/jetbrains/snippets/exclude-folder-from-module.iml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/index.spec.js b/test/index.spec.js index c33d4994..84851ab9 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -4,10 +4,14 @@ const robo = require('../src/index'); it('Executing Configuration', () => { expect(robo({ - configs: ['assorted/@npm-opensource'], + configs: [ + 'assorted/@npm-opensource', + 'jetbrains/@common' + ], variables: { repoKey: 'blackflux/robo-config', repoName: 'robo-config', + projectName: 'robo-config', owner: 'simlu', authorName: 'Lukas Siemon', mergeBot: 'MrsFlux' diff --git a/yarn.lock b/yarn.lock index 2761ed70..1502f86a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4847,6 +4847,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-deep-contain@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object-deep-contain/-/object-deep-contain-1.0.4.tgz#67aff0a661f9d3fbf2a5222af7341a9d0f22d75f" + integrity sha512-DvaKKA6M32cSkt3nWmLTbmThdr0Z6YjM9orEkXYWlk/RBiGJbWXBjrrn9PfkWxedItgXiBTYh6RsJfzsVtHHew== + object-keys@^1.0.11, object-keys@^1.0.12: version "1.1.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" From 3b94488607bab1256601e92a5643b829f732d26e Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 21:31:17 -0700 Subject: [PATCH 06/17] amend: improved xml-merge --- src/util/xml-merge.js | 12 +++++++++--- .../changeset.xml | 0 .../result.xml | 0 .../target.xml | 0 .../nested-insert-into-second-node/changeset.xml | 7 +++++++ .../nested-insert-into-second-node/result.xml | 8 ++++++++ .../nested-insert-into-second-node/target.xml | 6 ++++++ 7 files changed, 30 insertions(+), 3 deletions(-) rename test/util/xml-merge/{nested-insert-updated => nested-insert-basic}/changeset.xml (100%) rename test/util/xml-merge/{nested-insert-updated => nested-insert-basic}/result.xml (100%) rename test/util/xml-merge/{nested-insert-updated => nested-insert-basic}/target.xml (100%) create mode 100644 test/util/xml-merge/nested-insert-into-second-node/changeset.xml create mode 100644 test/util/xml-merge/nested-insert-into-second-node/result.xml create mode 100644 test/util/xml-merge/nested-insert-into-second-node/target.xml diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index 56072e28..9e879b4c 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -1,11 +1,14 @@ const objectDeepContain = require('object-deep-contain'); const mergeRec = (target, changeset) => Object - .entries(target || {}) + .entries(Object.assign(target.type === 'element' ? { elements: [] } : {}, target)) .map(([attr, elements]) => { const changesetElements = changeset[attr]; - if (!Array.isArray(elements)) { + if ( + changesetElements === undefined + || !Array.isArray(elements) + ) { return [attr, changesetElements !== undefined ? changesetElements : elements]; } @@ -28,6 +31,9 @@ const mergeRec = (target, changeset) => Object elements.push(...changesetElements.slice(next)); return [attr, elements]; }) - .reduce((p, [k, v]) => Object.assign(p, { [k]: v }), {}); + .reduce((p, [k, v]) => Object.assign( + p, + k === 'elements' && target.elements === undefined && v.length === 0 ? {} : { [k]: v } + ), {}); module.exports = (target, changeset) => Object.assign(target, { data: mergeRec(target.data, changeset.data) }); diff --git a/test/util/xml-merge/nested-insert-updated/changeset.xml b/test/util/xml-merge/nested-insert-basic/changeset.xml similarity index 100% rename from test/util/xml-merge/nested-insert-updated/changeset.xml rename to test/util/xml-merge/nested-insert-basic/changeset.xml diff --git a/test/util/xml-merge/nested-insert-updated/result.xml b/test/util/xml-merge/nested-insert-basic/result.xml similarity index 100% rename from test/util/xml-merge/nested-insert-updated/result.xml rename to test/util/xml-merge/nested-insert-basic/result.xml diff --git a/test/util/xml-merge/nested-insert-updated/target.xml b/test/util/xml-merge/nested-insert-basic/target.xml similarity index 100% rename from test/util/xml-merge/nested-insert-updated/target.xml rename to test/util/xml-merge/nested-insert-basic/target.xml diff --git a/test/util/xml-merge/nested-insert-into-second-node/changeset.xml b/test/util/xml-merge/nested-insert-into-second-node/changeset.xml new file mode 100644 index 00000000..45d954be --- /dev/null +++ b/test/util/xml-merge/nested-insert-into-second-node/changeset.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/nested-insert-into-second-node/result.xml b/test/util/xml-merge/nested-insert-into-second-node/result.xml new file mode 100644 index 00000000..a594f5c1 --- /dev/null +++ b/test/util/xml-merge/nested-insert-into-second-node/result.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test/util/xml-merge/nested-insert-into-second-node/target.xml b/test/util/xml-merge/nested-insert-into-second-node/target.xml new file mode 100644 index 00000000..7d3f8f6d --- /dev/null +++ b/test/util/xml-merge/nested-insert-into-second-node/target.xml @@ -0,0 +1,6 @@ + + + + + + From 5a44583da1b39f0bf18acdfd6cd81e02285e07bc Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 21:34:53 -0700 Subject: [PATCH 07/17] feat: now allowing custom format in config definition --- .idea/robo-config.iml | 2 +- package.json | 2 +- .../jetbrains/exclude-coverage-folder.json | 1 + src/util/config.js | 9 +- yarn.lock | 125 ++++++++++++------ 5 files changed, 92 insertions(+), 47 deletions(-) diff --git a/.idea/robo-config.iml b/.idea/robo-config.iml index 6c3da9e9..91696c31 100644 --- a/.idea/robo-config.iml +++ b/.idea/robo-config.iml @@ -10,4 +10,4 @@ - \ No newline at end of file + diff --git a/package.json b/package.json index 3c3f31ee..4f6edb5a 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "babel-eslint": "10.0.1", "chai": "4.2.0", "coveralls": "3.0.3", - "js-gardener": "1.38.2", + "js-gardener": "1.38.3", "nyc": "13.3.0", "semantic-release": "15.13.3", "tmp": "0.0.33" diff --git a/src/configs/jetbrains/exclude-coverage-folder.json b/src/configs/jetbrains/exclude-coverage-folder.json index 01b064aa..0dd941fd 100644 --- a/src/configs/jetbrains/exclude-coverage-folder.json +++ b/src/configs/jetbrains/exclude-coverage-folder.json @@ -1,5 +1,6 @@ { "target": ".idea/${projectName}.iml", + "format": "xml", "strategy": "xml-merge", "snippets": [ { diff --git a/src/util/config.js b/src/util/config.js index bc9bf870..cb7b0d02 100644 --- a/src/util/config.js +++ b/src/util/config.js @@ -10,6 +10,7 @@ const strategies = require('./strategies'); const configSchema = Joi.object().keys({ target: Joi.string(), + format: Joi.string().allow(null), strategy: Joi.string().valid(...Object.keys(strategies)), snippets: Joi.array().items( Joi.string(), @@ -20,7 +21,7 @@ const configSchema = Joi.object().keys({ ).min(1), configs: Joi.array().items(Joi.string()) }) - .and('target', 'strategy', 'snippets') + .and('target', 'strategy', 'snippets', 'format') .xor('target', 'configs') .unknown(false) .required(); @@ -34,7 +35,7 @@ const loadSnippet = (snippetDir, snippetName, config, snippetVars) => { const fileName = sls.guessFile(path.join(snippetDir, snippetName)); assert(fileName !== null, `Invalid Snippet File Name: ${snippetName}`); - const snippet = sls.smartRead(fileName); + const snippet = sls.smartRead(fileName, { treatAs: config.format }); return populateVars(snippet, snippetVars, false); }; @@ -50,6 +51,9 @@ module.exports.loadConfig = (configName, variables) => { return null; } const config = sls.smartRead(configFilePath); + if (config.target !== undefined) { + config.format = config.format || null; + } assert(Joi.validate(config, configSchema).error === null, `Invalid Config Detected: ${configName}`); assert(configName.includes('/@') === (config.configs !== undefined), `Invalid Config Name Detected: ${configName}`); @@ -74,6 +78,7 @@ module.exports.applyConfig = (config, projectRoot) => { const target = path.join(projectRoot, config.target); return sls.smartWrite(target, config.toWrite, { + treatAs: config.format, mergeStrategy: strategies[config.strategy] }); }; diff --git a/yarn.lock b/yarn.lock index 1502f86a..64dd45db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -213,22 +213,22 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== -"@octokit/endpoint@^3.1.1": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.1.3.tgz#f6e9c2521b83b74367600e474b24efec2b0471c4" - integrity sha512-vAWzeoj9Lzpl3V3YkWKhGzmDUoMfKpyxJhpq74/ohMvmLXDoEuAGnApy/7TRi3OmnjyX2Lr+e9UGGAD0919ohA== +"@octokit/endpoint@^3.2.0": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.2.3.tgz#bd9aea60cd94ce336656b57a5c9cb7f10be8f4f3" + integrity sha512-yUPCt4vMIOclox13CUxzuKiPJIFo46b/6GhUnUTw5QySczN1L0DtSxgmIZrZV4SAb9EyAqrceoyrWoYVnfF2AA== dependencies: deepmerge "3.2.0" is-plain-object "^2.0.4" universal-user-agent "^2.0.1" url-template "^2.0.8" -"@octokit/request@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.4.1.tgz#98c4d6870e4abe3ccdd2b9799034b4ae3f441c30" - integrity sha512-nN8W24ZXEpJQJoVgMsGZeK9FOzxkc39Xn9ykseUpPpPMNEDFSvqfkCeqqKrjUiXRm72ubGLWG1SOz0aJPcgGww== +"@octokit/request@2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.4.2.tgz#87c36e820dd1e43b1629f4f35c95b00cd456320b" + integrity sha512-lxVlYYvwGbKSHXfbPk5vxEA8w4zHOH1wobado4a9EfsyD3Cbhuhus1w0Ye9Ro0eMubGO8kNy5d+xNFisM3Tvaw== dependencies: - "@octokit/endpoint" "^3.1.1" + "@octokit/endpoint" "^3.2.0" deprecation "^1.0.1" is-plain-object "^2.0.4" node-fetch "^2.3.0" @@ -236,17 +236,19 @@ universal-user-agent "^2.0.1" "@octokit/rest@^16.13.1": - version "16.17.0" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.17.0.tgz#3a8c0ff5290e25a48b11f6957aa90791c672c91e" - integrity sha512-1RB7e4ptR/M+1Ik3Qn84pbppbSadBaCtpgFqgqsXn6s4ZVE6hqW9SOm6UW5yd3KT7ObVfdYUkhMlgR937oKyDw== + version "16.18.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.18.1.tgz#e6cbf111a8afc3d5ad44c98edf264124f1568ea0" + integrity sha512-ozKUH4KCusmPQ6xHxF2q1IDVM5tPbmmAUP69yRLd98BH16mqOVwMkm6zLCUJPD03IVhG+YNHShJDc077CTkIWg== dependencies: - "@octokit/request" "2.4.1" + "@octokit/request" "2.4.2" before-after-hook "^1.4.0" btoa-lite "^1.0.0" + deprecation "^1.0.1" lodash.get "^4.4.2" lodash.set "^4.3.2" lodash.uniq "^4.5.0" octokit-pagination-methods "^1.1.0" + once "^1.4.0" universal-user-agent "^2.0.0" url-template "^2.0.8" @@ -342,9 +344,9 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "11.11.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.1.tgz#9ee55ffce20f72e141863b0036a6e51c6fc09a1f" - integrity sha512-2azXFP9n4aA2QNLkKm/F9pzKxgYj1SMawZ5Eh9iC21RH3XNcFsivLVU2NhpMgQm7YobSByvIol4c42ZFusXFHQ== + version "11.11.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.3.tgz#7c6b0f8eaf16ae530795de2ad1b85d34bf2f5c58" + integrity sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg== JSONStream@^1.0.4, JSONStream@^1.3.4: version "1.3.5" @@ -612,9 +614,9 @@ astral-regex@^1.0.0: integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" + integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== async@^2.5.0: version "2.6.2" @@ -1552,7 +1554,7 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debuglog@^1.0.1: +debuglog@*, debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -2286,12 +2288,12 @@ find-cache-dir@^1.0.0: pkg-dir "^2.0.0" find-cache-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" - integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: commondir "^1.0.1" - make-dir "^1.0.0" + make-dir "^2.0.0" pkg-dir "^3.0.0" find-npm-prefix@^1.0.2: @@ -2942,7 +2944,7 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -3477,10 +3479,10 @@ joi@14.3.1: isemail "3.x.x" topo "3.x.x" -js-gardener@1.38.2: - version "1.38.2" - resolved "https://registry.yarnpkg.com/js-gardener/-/js-gardener-1.38.2.tgz#5986df5d1f722765d7fe439ff19b611a5726e233" - integrity sha512-Bd/dlqM2OvZat7sbCZxC1TNf2pa4TaAZa0wGj4X2wcZZZvKviJ4DRd6lxMwOKNgEJVPhYWJhkY58YEcfaE6I3w== +js-gardener@1.38.3: + version "1.38.3" + resolved "https://registry.yarnpkg.com/js-gardener/-/js-gardener-1.38.3.tgz#0c60e3526ab56ec445789c603ec9cd907addbfac" + integrity sha512-yj2+DM0dPmtVrft7BPQ84e7XlrmzOEyUYCwsWCU4utUtglK0DExuGb9c8cLUz7AOkuS/i7NZOEVX+UGeEhwTPg== dependencies: chalk "2.4.2" eslint "5.15.1" @@ -3782,6 +3784,11 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" + integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -3790,11 +3797,33 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= + +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= + dependencies: + lodash._getnative "^3.0.0" + lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -3875,6 +3904,11 @@ lodash.omit@4.5.0: resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + lodash.set@4.3.2, lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -4075,12 +4109,12 @@ mem@^1.1.0: mimic-fn "^1.0.0" mem@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" - integrity sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025" + integrity sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA== dependencies: map-age-cleaner "^0.1.1" - mimic-fn "^1.0.0" + mimic-fn "^2.0.0" p-is-promise "^2.0.0" meow@^3.7.0: @@ -4167,6 +4201,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-fn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" + integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA== + "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -4331,9 +4370,9 @@ mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.9.2: - version "2.12.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" - integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + version "2.13.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" + integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== nanomatch@^1.2.9: version "1.2.13" @@ -5476,9 +5515,9 @@ qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^6.1.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.3.0.tgz#41ae8a61e1213c80b182d5db6cf129e05af89fc5" - integrity sha512-jkpCkoHiAA2BYZvni5GieU3x860QDfkh2+M6bPnrYUywqOWbGwPq5VzntTS06ixX4GVHEiq2ZhlmGy/e9LQ3zA== + version "6.4.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.4.0.tgz#1566c0cec3a2da2d82c222ed3f9e2a921dba5e6a" + integrity sha512-Werid2I41/tJTqOGPJ3cC3vwrIh/8ZupBQbp7BSsqXzr+pTin3aMJ/EZb8UEuk7ZO3VqQFvq2qck/ihc6wqIdw== dependencies: decode-uri-component "^0.2.0" strict-uri-encode "^2.0.0" @@ -5650,7 +5689,7 @@ readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= @@ -6198,9 +6237,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.9: - version "0.5.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + version "0.5.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" + integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" From a28555c8bb77b03a2382d272692350e50565e1b9 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Thu, 14 Mar 2019 21:39:05 -0700 Subject: [PATCH 08/17] amend: added missing peer dep --- .depunusedignore | 1 + package.json | 1 + yarn.lock | 38 +++----------------------------------- 3 files changed, 5 insertions(+), 35 deletions(-) create mode 100644 .depunusedignore diff --git a/.depunusedignore b/.depunusedignore new file mode 100644 index 00000000..9096200b --- /dev/null +++ b/.depunusedignore @@ -0,0 +1 @@ +eslint diff --git a/package.json b/package.json index 4f6edb5a..eacbdc52 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "babel-eslint": "10.0.1", "chai": "4.2.0", "coveralls": "3.0.3", + "eslint": "5.15.1", "js-gardener": "1.38.3", "nyc": "13.3.0", "semantic-release": "15.13.3", diff --git a/yarn.lock b/yarn.lock index 64dd45db..9d622722 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1554,7 +1554,7 @@ debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -2944,7 +2944,7 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -3784,11 +3784,6 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -3797,33 +3792,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -3904,11 +3877,6 @@ lodash.omit@4.5.0: resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.set@4.3.2, lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -5689,7 +5657,7 @@ readable-stream@~1.1.10: isarray "0.0.1" string_decoder "~0.10.x" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" integrity sha1-n6+jfShr5dksuuve4DDcm19AZ0c= From 848054efe6998a4cb80d2a884bf835f5c680ca09 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 15:09:25 -0700 Subject: [PATCH 09/17] amend: restruct --- src/util/xml-merge.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index 9e879b4c..a1a5e6d7 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -13,7 +13,7 @@ const mergeRec = (target, changeset) => Object } let next = 0; - for (let idx = 0, len = elements.length; idx < len && next < changesetElements.length; idx += 1) { + for (let idx = 0; idx < elements.length && next < changesetElements.length; idx += 1) { const targetElement = elements[idx]; const toInsert = changesetElements[next]; From 5791fde3208491952087205ee998680ec69d7d8f Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 15:10:01 -0700 Subject: [PATCH 10/17] amend: restruct --- src/util/xml-merge.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index a1a5e6d7..0a162395 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -5,10 +5,7 @@ const mergeRec = (target, changeset) => Object .map(([attr, elements]) => { const changesetElements = changeset[attr]; - if ( - changesetElements === undefined - || !Array.isArray(elements) - ) { + if (changesetElements === undefined || !Array.isArray(elements)) { return [attr, changesetElements !== undefined ? changesetElements : elements]; } From e8c992359b98d8d7cfa6715b53f53fe87c5461ea Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 15:25:45 -0700 Subject: [PATCH 11/17] amend: simplified tests --- .../xml-merge/nested-insert-basic/changeset.xml | 6 +++--- .../xml-merge/nested-insert-basic/result.xml | 16 +++++----------- .../xml-merge/nested-insert-basic/target.xml | 13 +++---------- .../nested-insert-unchanged/changeset.xml | 6 +++--- .../nested-insert-unchanged/result.xml | 17 ++++++----------- .../nested-insert-unchanged/target.xml | 17 ++++++----------- 6 files changed, 26 insertions(+), 49 deletions(-) diff --git a/test/util/xml-merge/nested-insert-basic/changeset.xml b/test/util/xml-merge/nested-insert-basic/changeset.xml index 1c81dfbf..ce2b005b 100644 --- a/test/util/xml-merge/nested-insert-basic/changeset.xml +++ b/test/util/xml-merge/nested-insert-basic/changeset.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/test/util/xml-merge/nested-insert-basic/result.xml b/test/util/xml-merge/nested-insert-basic/result.xml index 2b2f638c..6cdcd370 100644 --- a/test/util/xml-merge/nested-insert-basic/result.xml +++ b/test/util/xml-merge/nested-insert-basic/result.xml @@ -1,13 +1,7 @@ - - - - - - - - - - - + + + + + diff --git a/test/util/xml-merge/nested-insert-basic/target.xml b/test/util/xml-merge/nested-insert-basic/target.xml index 97d2c07a..4decb2c1 100644 --- a/test/util/xml-merge/nested-insert-basic/target.xml +++ b/test/util/xml-merge/nested-insert-basic/target.xml @@ -1,12 +1,5 @@ - - - - - - - - - - + + + diff --git a/test/util/xml-merge/nested-insert-unchanged/changeset.xml b/test/util/xml-merge/nested-insert-unchanged/changeset.xml index 1c81dfbf..45d954be 100644 --- a/test/util/xml-merge/nested-insert-unchanged/changeset.xml +++ b/test/util/xml-merge/nested-insert-unchanged/changeset.xml @@ -1,7 +1,7 @@ - - - + + + diff --git a/test/util/xml-merge/nested-insert-unchanged/result.xml b/test/util/xml-merge/nested-insert-unchanged/result.xml index 91696c31..a594f5c1 100644 --- a/test/util/xml-merge/nested-insert-unchanged/result.xml +++ b/test/util/xml-merge/nested-insert-unchanged/result.xml @@ -1,13 +1,8 @@ - - - - - - - - - - - + + + + + + diff --git a/test/util/xml-merge/nested-insert-unchanged/target.xml b/test/util/xml-merge/nested-insert-unchanged/target.xml index 91696c31..a594f5c1 100644 --- a/test/util/xml-merge/nested-insert-unchanged/target.xml +++ b/test/util/xml-merge/nested-insert-unchanged/target.xml @@ -1,13 +1,8 @@ - - - - - - - - - - - + + + + + + From 535bb4f00ec78352223b6f7431879a1233206214 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 15:44:48 -0700 Subject: [PATCH 12/17] amend: added more tests --- test/util/xml-merge.spec.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/test/util/xml-merge.spec.js b/test/util/xml-merge.spec.js index d9097c80..fe6b8d4b 100644 --- a/test/util/xml-merge.spec.js +++ b/test/util/xml-merge.spec.js @@ -1,6 +1,7 @@ const fs = require('fs'); const path = require('path'); const expect = require('chai').expect; +const tmp = require('tmp'); const sfs = require('smart-fs'); const xmlMerge = require('../../src/util/xml-merge'); @@ -8,11 +9,35 @@ describe('Integration xml-merge.js', () => { fs.readdirSync(path.join(__dirname, 'xml-merge')) .forEach((f) => { it(`Testing '${f}'`, () => { - const result = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'result.xml')); const target = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'target.xml')); const changeset = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'changeset.xml')); + const result = sfs.smartRead(path.join(__dirname, 'xml-merge', f, 'result.xml')); const merged = xmlMerge(target, changeset); expect(result).to.deep.equal(merged); }); }); }); + +describe('Unit xml-merge.js', () => { + let dir; + beforeEach(() => { + dir = tmp.dirSync({ keep: false, unsafeCleanup: true }).name; + }); + + const executeTest = (target, changeset, result) => { + fs.writeFileSync(path.join(dir, 'target.xml'), target); + fs.writeFileSync(path.join(dir, 'changeset.xml'), changeset); + fs.writeFileSync(path.join(dir, 'result.xml'), result); + + const merged = xmlMerge( + sfs.smartRead(path.join(dir, 'target.xml')), + sfs.smartRead(path.join(dir, 'changeset.xml')) + ); + expect(merged).to.deep.equal(sfs.smartRead(path.join(dir, 'result.xml'))); + }; + + it('Test Simple Merge', () => { + executeTest('', '', ''); + executeTest('', '', ''); + }); +}); From 289800570f9b30513565cb6066d8276e2c8bed14 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 17:01:13 -0700 Subject: [PATCH 13/17] fix: now deepmerging attributes --- src/util/xml-merge.js | 9 +++++++++ test/util/xml-merge.spec.js | 8 ++++++++ test/util/xml-merge/header-replace/result.xml | 2 +- test/util/xml-merge/header-replace/target.xml | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index 0a162395..f33ef522 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -1,3 +1,4 @@ +const deepmerge = require('deepmerge'); const objectDeepContain = require('object-deep-contain'); const mergeRec = (target, changeset) => Object @@ -6,6 +7,14 @@ const mergeRec = (target, changeset) => Object const changesetElements = changeset[attr]; if (changesetElements === undefined || !Array.isArray(elements)) { + if ( + elements instanceof Object + && changesetElements instanceof Object + && !Array.isArray(elements) + && !Array.isArray(changesetElements) + ) { + return [attr, deepmerge(elements, changesetElements)]; + } return [attr, changesetElements !== undefined ? changesetElements : elements]; } diff --git a/test/util/xml-merge.spec.js b/test/util/xml-merge.spec.js index fe6b8d4b..5d7e24e4 100644 --- a/test/util/xml-merge.spec.js +++ b/test/util/xml-merge.spec.js @@ -40,4 +40,12 @@ describe('Unit xml-merge.js', () => { executeTest('', '', ''); executeTest('', '', ''); }); + + it('Test Header Merge', () => { + executeTest( + '', + '', + '' + ); + }); }); diff --git a/test/util/xml-merge/header-replace/result.xml b/test/util/xml-merge/header-replace/result.xml index d1e9c86c..800c39c1 100644 --- a/test/util/xml-merge/header-replace/result.xml +++ b/test/util/xml-merge/header-replace/result.xml @@ -1,2 +1,2 @@ - + diff --git a/test/util/xml-merge/header-replace/target.xml b/test/util/xml-merge/header-replace/target.xml index 800c39c1..bba4e4b5 100644 --- a/test/util/xml-merge/header-replace/target.xml +++ b/test/util/xml-merge/header-replace/target.xml @@ -1,2 +1,2 @@ - + From ba5ef5697e62b72d7918628603ca4eaa6e426f33 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 18:41:50 -0700 Subject: [PATCH 14/17] amend: rename --- test/util/xml-merge/{header-replace => header}/changeset.xml | 0 test/util/xml-merge/{header-replace => header}/result.xml | 0 test/util/xml-merge/{header-replace => header}/target.xml | 0 .../xml-merge/{nested-insert-basic => no-change}/changeset.xml | 0 .../xml-merge/{nested-insert-unchanged => no-change}/result.xml | 0 .../xml-merge/{nested-insert-unchanged => no-change}/target.xml | 0 .../{nested-insert-unchanged => target-first}/changeset.xml | 0 .../xml-merge/{nested-insert-basic => target-first}/result.xml | 0 .../xml-merge/{nested-insert-basic => target-first}/target.xml | 0 .../changeset.xml | 0 .../{nested-insert-into-second-node => target-second}/result.xml | 0 .../{nested-insert-into-second-node => target-second}/target.xml | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename test/util/xml-merge/{header-replace => header}/changeset.xml (100%) rename test/util/xml-merge/{header-replace => header}/result.xml (100%) rename test/util/xml-merge/{header-replace => header}/target.xml (100%) rename test/util/xml-merge/{nested-insert-basic => no-change}/changeset.xml (100%) rename test/util/xml-merge/{nested-insert-unchanged => no-change}/result.xml (100%) rename test/util/xml-merge/{nested-insert-unchanged => no-change}/target.xml (100%) rename test/util/xml-merge/{nested-insert-unchanged => target-first}/changeset.xml (100%) rename test/util/xml-merge/{nested-insert-basic => target-first}/result.xml (100%) rename test/util/xml-merge/{nested-insert-basic => target-first}/target.xml (100%) rename test/util/xml-merge/{nested-insert-into-second-node => target-second}/changeset.xml (100%) rename test/util/xml-merge/{nested-insert-into-second-node => target-second}/result.xml (100%) rename test/util/xml-merge/{nested-insert-into-second-node => target-second}/target.xml (100%) diff --git a/test/util/xml-merge/header-replace/changeset.xml b/test/util/xml-merge/header/changeset.xml similarity index 100% rename from test/util/xml-merge/header-replace/changeset.xml rename to test/util/xml-merge/header/changeset.xml diff --git a/test/util/xml-merge/header-replace/result.xml b/test/util/xml-merge/header/result.xml similarity index 100% rename from test/util/xml-merge/header-replace/result.xml rename to test/util/xml-merge/header/result.xml diff --git a/test/util/xml-merge/header-replace/target.xml b/test/util/xml-merge/header/target.xml similarity index 100% rename from test/util/xml-merge/header-replace/target.xml rename to test/util/xml-merge/header/target.xml diff --git a/test/util/xml-merge/nested-insert-basic/changeset.xml b/test/util/xml-merge/no-change/changeset.xml similarity index 100% rename from test/util/xml-merge/nested-insert-basic/changeset.xml rename to test/util/xml-merge/no-change/changeset.xml diff --git a/test/util/xml-merge/nested-insert-unchanged/result.xml b/test/util/xml-merge/no-change/result.xml similarity index 100% rename from test/util/xml-merge/nested-insert-unchanged/result.xml rename to test/util/xml-merge/no-change/result.xml diff --git a/test/util/xml-merge/nested-insert-unchanged/target.xml b/test/util/xml-merge/no-change/target.xml similarity index 100% rename from test/util/xml-merge/nested-insert-unchanged/target.xml rename to test/util/xml-merge/no-change/target.xml diff --git a/test/util/xml-merge/nested-insert-unchanged/changeset.xml b/test/util/xml-merge/target-first/changeset.xml similarity index 100% rename from test/util/xml-merge/nested-insert-unchanged/changeset.xml rename to test/util/xml-merge/target-first/changeset.xml diff --git a/test/util/xml-merge/nested-insert-basic/result.xml b/test/util/xml-merge/target-first/result.xml similarity index 100% rename from test/util/xml-merge/nested-insert-basic/result.xml rename to test/util/xml-merge/target-first/result.xml diff --git a/test/util/xml-merge/nested-insert-basic/target.xml b/test/util/xml-merge/target-first/target.xml similarity index 100% rename from test/util/xml-merge/nested-insert-basic/target.xml rename to test/util/xml-merge/target-first/target.xml diff --git a/test/util/xml-merge/nested-insert-into-second-node/changeset.xml b/test/util/xml-merge/target-second/changeset.xml similarity index 100% rename from test/util/xml-merge/nested-insert-into-second-node/changeset.xml rename to test/util/xml-merge/target-second/changeset.xml diff --git a/test/util/xml-merge/nested-insert-into-second-node/result.xml b/test/util/xml-merge/target-second/result.xml similarity index 100% rename from test/util/xml-merge/nested-insert-into-second-node/result.xml rename to test/util/xml-merge/target-second/result.xml diff --git a/test/util/xml-merge/nested-insert-into-second-node/target.xml b/test/util/xml-merge/target-second/target.xml similarity index 100% rename from test/util/xml-merge/nested-insert-into-second-node/target.xml rename to test/util/xml-merge/target-second/target.xml From ffa5d2ab586520eb64616b1ddd91998d2ce29c88 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 18:50:02 -0700 Subject: [PATCH 15/17] amend: test rework --- test/util/xml-merge/append/changeset.xml | 5 +++++ test/util/xml-merge/append/result.xml | 8 ++++++++ test/util/xml-merge/append/target.xml | 5 +++++ test/util/xml-merge/no-change/changeset.xml | 2 +- test/util/xml-merge/target-first/changeset.xml | 2 +- 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/util/xml-merge/append/changeset.xml create mode 100644 test/util/xml-merge/append/result.xml create mode 100644 test/util/xml-merge/append/target.xml diff --git a/test/util/xml-merge/append/changeset.xml b/test/util/xml-merge/append/changeset.xml new file mode 100644 index 00000000..c96de081 --- /dev/null +++ b/test/util/xml-merge/append/changeset.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/test/util/xml-merge/append/result.xml b/test/util/xml-merge/append/result.xml new file mode 100644 index 00000000..82896496 --- /dev/null +++ b/test/util/xml-merge/append/result.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test/util/xml-merge/append/target.xml b/test/util/xml-merge/append/target.xml new file mode 100644 index 00000000..b25f125e --- /dev/null +++ b/test/util/xml-merge/append/target.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/test/util/xml-merge/no-change/changeset.xml b/test/util/xml-merge/no-change/changeset.xml index ce2b005b..45d954be 100644 --- a/test/util/xml-merge/no-change/changeset.xml +++ b/test/util/xml-merge/no-change/changeset.xml @@ -1,6 +1,6 @@ - + diff --git a/test/util/xml-merge/target-first/changeset.xml b/test/util/xml-merge/target-first/changeset.xml index 45d954be..6cdcd370 100644 --- a/test/util/xml-merge/target-first/changeset.xml +++ b/test/util/xml-merge/target-first/changeset.xml @@ -1,6 +1,6 @@ - + From 6b705b3e90202f8ab189475dd32892ef5386423a Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 18:58:37 -0700 Subject: [PATCH 16/17] amend: rework --- src/util/xml-merge.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index f33ef522..5a4603af 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -6,18 +6,24 @@ const mergeRec = (target, changeset) => Object .map(([attr, elements]) => { const changesetElements = changeset[attr]; - if (changesetElements === undefined || !Array.isArray(elements)) { - if ( + if (changesetElements === undefined) { + return [attr, elements]; + } + + // merge non-arrays + if (!Array.isArray(elements) || !Array.isArray(changesetElements)) { + return [ + attr, elements instanceof Object && changesetElements instanceof Object && !Array.isArray(elements) && !Array.isArray(changesetElements) - ) { - return [attr, deepmerge(elements, changesetElements)]; - } - return [attr, changesetElements !== undefined ? changesetElements : elements]; + ? deepmerge(elements, changesetElements) + : changesetElements + ]; } + // merge arrays recursively let next = 0; for (let idx = 0; idx < elements.length && next < changesetElements.length; idx += 1) { const targetElement = elements[idx]; @@ -35,6 +41,7 @@ const mergeRec = (target, changeset) => Object } } elements.push(...changesetElements.slice(next)); + return [attr, elements]; }) .reduce((p, [k, v]) => Object.assign( From 210846d8780e86fb78845641d8ae1ad172447473 Mon Sep 17 00:00:00 2001 From: Lukas Siemon Date: Fri, 15 Mar 2019 19:17:52 -0700 Subject: [PATCH 17/17] amend: refactor --- src/util/xml-merge.js | 56 ++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js index 5a4603af..5ee61eed 100644 --- a/src/util/xml-merge.js +++ b/src/util/xml-merge.js @@ -1,33 +1,20 @@ -const deepmerge = require('deepmerge'); const objectDeepContain = require('object-deep-contain'); -const mergeRec = (target, changeset) => Object - .entries(Object.assign(target.type === 'element' ? { elements: [] } : {}, target)) - .map(([attr, elements]) => { - const changesetElements = changeset[attr]; +const mergeRec = (target, changeset) => { + if (changeset === undefined) { + return target; + } - if (changesetElements === undefined) { - return [attr, elements]; - } - - // merge non-arrays - if (!Array.isArray(elements) || !Array.isArray(changesetElements)) { - return [ - attr, - elements instanceof Object - && changesetElements instanceof Object - && !Array.isArray(elements) - && !Array.isArray(changesetElements) - ? deepmerge(elements, changesetElements) - : changesetElements - ]; - } + const isArray = Array.isArray(target); + if (isArray !== Array.isArray(changeset)) { + return changeset; + } - // merge arrays recursively + if (isArray) { let next = 0; - for (let idx = 0; idx < elements.length && next < changesetElements.length; idx += 1) { - const targetElement = elements[idx]; - const toInsert = changesetElements[next]; + for (let idx = 0; idx < target.length && next < changeset.length; idx += 1) { + const targetElement = target[idx]; + const toInsert = changeset[next]; if (objectDeepContain( targetElement, @@ -36,17 +23,20 @@ const mergeRec = (target, changeset) => Object .reduce((p, [k, v]) => Object.assign(p, k === 'elements' ? {} : { [k]: v }), {}) )) { // eslint-disable-next-line no-param-reassign - elements[idx] = mergeRec(targetElement, toInsert); + target[idx] = mergeRec(targetElement, toInsert); next += 1; } } - elements.push(...changesetElements.slice(next)); + target.push(...changeset.slice(next)); + return target; + } + + if (target instanceof Object && changeset instanceof Object) { + return [...new Set(Object.keys(target).concat(Object.keys(changeset)))] + .reduce((p, k) => Object.assign(p, { [k]: mergeRec(target[k], changeset[k]) }), {}); + } - return [attr, elements]; - }) - .reduce((p, [k, v]) => Object.assign( - p, - k === 'elements' && target.elements === undefined && v.length === 0 ? {} : { [k]: v } - ), {}); + return changeset; +}; module.exports = (target, changeset) => Object.assign(target, { data: mergeRec(target.data, changeset.data) });