From 84a6e54b126e402d725d8b09d25ea35b975bf6bd Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Fri, 2 Aug 2019 12:31:26 +0800 Subject: [PATCH] feat: add metricLimit and lru to DimensionAwareMetricsRegistry (#69) The `metricLevel` option allows limiting the number of metrics held by the registry in order to prevent denial of service attacks. The `lru` flag changes the metric dropping strategy from "least recently added" to "least recently used" --- .../DimensionAwareMetricsRegistry.js | 37 ++++- packages/measured-reporting/package.json | 1 + .../test-DimensionAwareMetricsRegistry.js | 50 ++++++ .../test-SelfReportingMetricsRegistry.js | 2 +- yarn.lock | 156 ++---------------- 5 files changed, 97 insertions(+), 149 deletions(-) diff --git a/packages/measured-reporting/lib/registries/DimensionAwareMetricsRegistry.js b/packages/measured-reporting/lib/registries/DimensionAwareMetricsRegistry.js index d8a6b61..0ed1ed1 100644 --- a/packages/measured-reporting/lib/registries/DimensionAwareMetricsRegistry.js +++ b/packages/measured-reporting/lib/registries/DimensionAwareMetricsRegistry.js @@ -1,9 +1,21 @@ +const mapcap = require('mapcap'); + /** * Simple registry that stores Metrics by name and dimensions. */ class DimensionAwareMetricsRegistry { - constructor() { - this._metrics = {}; + /** + * @param {DimensionAwareMetricsRegistryOptions} [options] Configurable options for the Dimension Aware Metrics Registry + */ + constructor(options) { + options = options || {}; + + let metrics = new Map(); + if (options.metricLimit) { + metrics = mapcap(metrics, options.metricLimit, options.lru); + } + + this._metrics = metrics; } /** @@ -15,7 +27,7 @@ class DimensionAwareMetricsRegistry { */ hasMetric(name, dimensions) { const key = this._generateStorageKey(name, dimensions); - return Object.prototype.hasOwnProperty.call(this._metrics, key); + return this._metrics.has(key); } /** @@ -27,7 +39,7 @@ class DimensionAwareMetricsRegistry { */ getMetric(name, dimensions) { const key = this._generateStorageKey(name, dimensions); - return this._metrics[key].metricImpl; + return this._metrics.get(key).metricImpl; } /** @@ -37,7 +49,7 @@ class DimensionAwareMetricsRegistry { * @returns {MetricWrapper} a wrapper object around name, dimension and {@link Metric} */ getMetricWrapperByKey(key) { - return this._metrics[key]; + return this._metrics.get(key); } /** @@ -50,11 +62,11 @@ class DimensionAwareMetricsRegistry { */ putMetric(name, metric, dimensions) { const key = this._generateStorageKey(name, dimensions); - this._metrics[key] = { + this._metrics.set(key, { name: name, metricImpl: metric, dimensions: dimensions || {} - }; + }); return key; } @@ -63,7 +75,7 @@ class DimensionAwareMetricsRegistry { * @return {string[]} all keys of metrics stored in this registry. */ allKeys() { - return Object.keys(this._metrics); + return Array.from(this._metrics.keys()); } /** @@ -88,3 +100,12 @@ class DimensionAwareMetricsRegistry { } module.exports = DimensionAwareMetricsRegistry; + +/** + * Configurable options for the Dimension Aware Metrics Registry + * + * @interface DimensionAwareMetricsRegistryOptions + * @typedef DimensionAwareMetricsRegistryOptions + * @property {Number} metricLimit the maximum number of metrics the registry may hold before dropping metrics + * @property {Boolean} lru switch dropping strategy from "least recently added" to "least recently used" + */ diff --git a/packages/measured-reporting/package.json b/packages/measured-reporting/package.json index cee5a5e..3490efc 100644 --- a/packages/measured-reporting/package.json +++ b/packages/measured-reporting/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "console-log-level": "^1.4.1", + "mapcap": "^1.0.0", "measured-core": "^1.49.0", "optional-js": "^2.0.0" }, diff --git a/packages/measured-reporting/test/unit/registries/test-DimensionAwareMetricsRegistry.js b/packages/measured-reporting/test/unit/registries/test-DimensionAwareMetricsRegistry.js index a008745..5a1bd4f 100644 --- a/packages/measured-reporting/test/unit/registries/test-DimensionAwareMetricsRegistry.js +++ b/packages/measured-reporting/test/unit/registries/test-DimensionAwareMetricsRegistry.js @@ -85,4 +85,54 @@ describe('DimensionAwareMetricsRegistry', () => { assert.equal(key1, key2); }); + + it('metricLimit limits metric count', () => { + const limitedRegistry = new DimensionAwareMetricsRegistry({ + metricLimit: 10 + }); + + const counter = new Counter({ + count: 10 + }); + + const dimensions = { + foo: 'bar' + }; + + for (let i = 0; i < 20; i++) { + limitedRegistry.putMetric(`metric #${i}`, counter, dimensions); + } + + assert.equal(10, limitedRegistry._metrics.size); + assert(!limitedRegistry.hasMetric('metric #0', dimensions)); + }); + + it('lru changes metric dropping strategy', () => { + const limitedRegistry = new DimensionAwareMetricsRegistry({ + metricLimit: 10, + lru: true + }); + + const counter = new Counter({ + count: 10 + }); + + const dimensions = { + foo: 'bar' + }; + + for (let i = 0; i < 10; i++) { + limitedRegistry.putMetric(`metric #${i}`, counter, dimensions); + } + + // Touch the first added metric + limitedRegistry.getMetric('metric #0', dimensions); + + // Put a new metric in to trigger a drop + limitedRegistry.putMetric('metric #11', counter, dimensions); + + // Verify that it dropped metric #1, not metric #0 + assert(limitedRegistry.hasMetric('metric #0', dimensions)); + assert(!limitedRegistry.hasMetric('metric #1', dimensions)); + }); }); diff --git a/packages/measured-reporting/test/unit/registries/test-SelfReportingMetricsRegistry.js b/packages/measured-reporting/test/unit/registries/test-SelfReportingMetricsRegistry.js index eb58383..d082dd0 100644 --- a/packages/measured-reporting/test/unit/registries/test-SelfReportingMetricsRegistry.js +++ b/packages/measured-reporting/test/unit/registries/test-SelfReportingMetricsRegistry.js @@ -40,7 +40,7 @@ describe('SelfReportingMetricsRegistry', () => { selfReportingRegistry.register(metricKey, new Counter(), {}, reportInterval); - assert.equal(1, Object.keys(registry._metrics).length); + assert.equal(1, registry._metrics.size); mockReporter.restore(); mockReporter.verify(); diff --git a/yarn.lock b/yarn.lock index fa89d75..10f2344 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,16 +146,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -args@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/args/-/args-5.0.0.tgz#8a3e376f28550f9fbdfefcb097179f2f75848efe" - integrity sha512-eCZo33yLdQ3DiG/Ko5n11uPonyYofYd9F2cqWID8TKGZwK/Z2ZcUj/oZ1HNMeNL2lgraPnv3JBZumfbUMqmZtg== - dependencies: - camelcase "5.0.0" - chalk "2.4.1" - leven "2.1.0" - mri "1.1.1" - aria-query@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" @@ -797,11 +787,6 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== - camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -835,14 +820,6 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@2.4.1, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -853,10 +830,9 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.3.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1075,6 +1051,11 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" +console-log-level@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/console-log-level/-/console-log-level-1.4.1.tgz#9c5a6bb9ef1ef65b05aba83028b0ff894cdf630a" + integrity sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ== + consolify@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/consolify/-/consolify-2.2.0.tgz#6221db1074a08d840ff30a5c0cbbf3c609a74f8c" @@ -1407,7 +1388,7 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -dateformat@^3.0.0, dateformat@^3.0.3: +dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -1687,13 +1668,6 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== - dependencies: - once "^1.4.0" - entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" @@ -2088,11 +2062,6 @@ fast-diff@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" -fast-json-parse@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" - integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== - fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -2101,16 +2070,6 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -fast-redact@^1.4.2: - version "1.4.4" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-1.4.4.tgz#d29bd1d0cc3ab808a9d4f9870f6e27e85c750db4" - integrity sha512-QOQZ8sDDQPZMJ6x6zlm6hLZ2cjPDqfN3R/AYnAbM+yy8VNPvOnVXdUF/E/xbMv7g44c1krhWuzgjH2u0V5Vhsg== - -fast-safe-stringify@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz#04b26106cc56681f51a044cfc0d76cf0008ac2c2" - integrity sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg== - fbjs@^0.8.16: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" @@ -2211,11 +2170,6 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -flatstr@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.9.tgz#0950d56fec02de1030c1311847ecd58c25690eb9" - integrity sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw== - for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3107,11 +3061,6 @@ jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" -jmespath@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" - integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= - js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -3305,11 +3254,6 @@ lerna@^2.11.0: write-pkg "^3.1.0" yargs "^8.0.2" -leven@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -3479,6 +3423,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mapcap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mapcap/-/mapcap-1.0.0.tgz#e8e29d04a160eaf8c92ec4bcbd2c5d07ed037e5a" + integrity sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g== + marked@~0.3.6: version "0.3.19" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" @@ -3815,11 +3764,6 @@ moment@^2.14.1, moment@^2.6.0: version "2.22.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad" -mri@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.1.tgz#85aa26d3daeeeedf80dc5984af95cc5ca5cad9f1" - integrity sha1-haom09ru7t+A3FmEr5XMXKXK2fE= - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4026,7 +3970,7 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4294,38 +4238,6 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pino-pretty@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-2.5.0.tgz#fade5b6d2acbdbf2c7e77adf220e7b7d89d04437" - integrity sha512-odR4SKdyubhe4aFts0/mBau2/mJLG23Ghyo86a+GZ2/Cev3CRr5nYv2+82V7v1hQL93yRSO004ASrrF7278TNQ== - dependencies: - args "^5.0.0" - chalk "^2.3.2" - dateformat "^3.0.3" - fast-json-parse "^1.0.3" - fast-safe-stringify "^2.0.6" - jmespath "^0.15.0" - pump "^3.0.0" - readable-stream "^3.0.6" - split2 "^3.0.0" - -pino-std-serializers@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.3.0.tgz#34eeaab97c055c28e22c0542ae55978e7e427786" - integrity sha512-klfGoOsP6sJH7ON796G4xoUSx2fkpFgKHO4YVVO2zmz31jR+etzc/QzGJILaOIiCD6HTCFgkPx+XN8nk+ruqPw== - -pino@^5.11.1: - version "5.11.1" - resolved "https://registry.yarnpkg.com/pino/-/pino-5.11.1.tgz#2d6d8edb7ebc7c354be03bfa04fd436352e1d67b" - integrity sha512-NIua0mGb9Adknq35ONvQmvh93LCUVUjp2+1q1EcvIkJmpJnSd3E5rHVKlKNjzMXFl/z3fI+QA0xXCjPEKNiLvQ== - dependencies: - fast-redact "^1.4.2" - fast-safe-stringify "^2.0.6" - flatstr "^1.0.9" - pino-std-serializers "^2.3.0" - quick-format-unescaped "^3.0.0" - sonic-boom "^0.7.1" - pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -4432,14 +4344,6 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -4481,11 +4385,6 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" -quick-format-unescaped@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-3.0.2.tgz#0137e94d8fb37ffeb70040535111c378e75396fb" - integrity sha512-FXTaCkwvpIlkdKeGDNgcq07SXWS383noQUuZjvdE1QcTt+eLuqof6/BDiEPqB59FWLie/l91+HtlJSw7iCViSA== - quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -4611,15 +4510,6 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.0, readable-stream@^3.0.6: - version "3.1.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" - integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -5079,13 +4969,6 @@ sntp@2.x.x: dependencies: hoek "4.x.x" -sonic-boom@^0.7.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-0.7.3.tgz#cbfc18e87c2b8078b00e38ad9475c05fce5ea696" - integrity sha512-A9EyoIeLD+g9vMLYQKjNCatJtAKdBQMW03+L8ZWWX/A6hq+srRCwdqHrBD1R8oSMLXov3oHN13dljtZf12q2Ow== - dependencies: - flatstr "^1.0.9" - sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" @@ -5179,13 +5062,6 @@ split2@^2.0.0: dependencies: through2 "^2.0.2" -split2@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.1.0.tgz#064bbfac70cdb66f77827870d42f159a8b442201" - integrity sha512-ePE1otNQVMnBRyqf3INbZvZwBPGsdBDThgrOWZ6z8zXGNVQNVCSEoOO9aBMTzDN1mXoNSZJ2kHSFH7AA5SPWww== - dependencies: - readable-stream "^3.0.0" - split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -5672,7 +5548,7 @@ use@^3.1.0: dependencies: kind-of "^6.0.2" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"