diff --git a/.depunusedignore b/.depunusedignore new file mode 100644 index 00000000..9096200b --- /dev/null +++ b/.depunusedignore @@ -0,0 +1 @@ +eslint 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 f3be7656..eacbdc52 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,8 @@ "babel-eslint": "10.0.1", "chai": "4.2.0", "coveralls": "3.0.3", - "js-gardener": "1.38.2", + "eslint": "5.15.1", + "js-gardener": "1.38.3", "nyc": "13.3.0", "semantic-release": "15.13.3", "tmp": "0.0.33" @@ -94,6 +95,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..0dd941fd --- /dev/null +++ b/src/configs/jetbrains/exclude-coverage-folder.json @@ -0,0 +1,13 @@ +{ + "target": ".idea/${projectName}.iml", + "format": "xml", + "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/src/util/config.js b/src/util/config.js index 44bb8c89..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}`); @@ -57,6 +61,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)]) @@ -73,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/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 }; diff --git a/src/util/xml-merge.js b/src/util/xml-merge.js new file mode 100644 index 00000000..5ee61eed --- /dev/null +++ b/src/util/xml-merge.js @@ -0,0 +1,42 @@ +const objectDeepContain = require('object-deep-contain'); + +const mergeRec = (target, changeset) => { + if (changeset === undefined) { + return target; + } + + const isArray = Array.isArray(target); + if (isArray !== Array.isArray(changeset)) { + return changeset; + } + + if (isArray) { + let next = 0; + for (let idx = 0; idx < target.length && next < changeset.length; idx += 1) { + const targetElement = target[idx]; + const toInsert = changeset[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 + target[idx] = mergeRec(targetElement, toInsert); + next += 1; + } + } + 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 changeset; +}; + +module.exports = (target, changeset) => Object.assign(target, { data: mergeRec(target.data, changeset.data) }); 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/test/util/xml-merge.spec.js b/test/util/xml-merge.spec.js new file mode 100644 index 00000000..5d7e24e4 --- /dev/null +++ b/test/util/xml-merge.spec.js @@ -0,0 +1,51 @@ +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'); + +describe('Integration xml-merge.js', () => { + fs.readdirSync(path.join(__dirname, 'xml-merge')) + .forEach((f) => { + it(`Testing '${f}'`, () => { + 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('', '', ''); + }); + + it('Test Header Merge', () => { + executeTest( + '', + '', + '' + ); + }); +}); 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/header/changeset.xml b/test/util/xml-merge/header/changeset.xml new file mode 100644 index 00000000..575dbaa0 --- /dev/null +++ b/test/util/xml-merge/header/changeset.xml @@ -0,0 +1 @@ + diff --git a/test/util/xml-merge/header/result.xml b/test/util/xml-merge/header/result.xml new file mode 100644 index 00000000..800c39c1 --- /dev/null +++ b/test/util/xml-merge/header/result.xml @@ -0,0 +1,2 @@ + + diff --git a/test/util/xml-merge/header/target.xml b/test/util/xml-merge/header/target.xml new file mode 100644 index 00000000..bba4e4b5 --- /dev/null +++ b/test/util/xml-merge/header/target.xml @@ -0,0 +1,2 @@ + + diff --git a/test/util/xml-merge/no-change/changeset.xml b/test/util/xml-merge/no-change/changeset.xml new file mode 100644 index 00000000..45d954be --- /dev/null +++ b/test/util/xml-merge/no-change/changeset.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/no-change/result.xml b/test/util/xml-merge/no-change/result.xml new file mode 100644 index 00000000..a594f5c1 --- /dev/null +++ b/test/util/xml-merge/no-change/result.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test/util/xml-merge/no-change/target.xml b/test/util/xml-merge/no-change/target.xml new file mode 100644 index 00000000..a594f5c1 --- /dev/null +++ b/test/util/xml-merge/no-change/target.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test/util/xml-merge/target-first/changeset.xml b/test/util/xml-merge/target-first/changeset.xml new file mode 100644 index 00000000..6cdcd370 --- /dev/null +++ b/test/util/xml-merge/target-first/changeset.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/target-first/result.xml b/test/util/xml-merge/target-first/result.xml new file mode 100644 index 00000000..6cdcd370 --- /dev/null +++ b/test/util/xml-merge/target-first/result.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/target-first/target.xml b/test/util/xml-merge/target-first/target.xml new file mode 100644 index 00000000..4decb2c1 --- /dev/null +++ b/test/util/xml-merge/target-first/target.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/test/util/xml-merge/target-second/changeset.xml b/test/util/xml-merge/target-second/changeset.xml new file mode 100644 index 00000000..45d954be --- /dev/null +++ b/test/util/xml-merge/target-second/changeset.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/util/xml-merge/target-second/result.xml b/test/util/xml-merge/target-second/result.xml new file mode 100644 index 00000000..a594f5c1 --- /dev/null +++ b/test/util/xml-merge/target-second/result.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/test/util/xml-merge/target-second/target.xml b/test/util/xml-merge/target-second/target.xml new file mode 100644 index 00000000..7d3f8f6d --- /dev/null +++ b/test/util/xml-merge/target-second/target.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/yarn.lock b/yarn.lock index 2761ed70..9d622722 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" @@ -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: @@ -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" @@ -4075,12 +4077,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 +4169,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 +4338,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" @@ -4847,6 +4854,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" @@ -5471,9 +5483,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" @@ -6193,9 +6205,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"