From ca5246d00a31315f292550add01b7102ce91ac3c Mon Sep 17 00:00:00 2001 From: sigveio <6737410+sigveio@users.noreply.github.com> Date: Tue, 20 Jul 2021 16:08:58 +0200 Subject: [PATCH] refactor(postcss-reduce-initial): refactor and add tests for acquire script (#1169) * refactor(postcss-reduce-initial): make acquire script testable and easier to maintain - Separate main concerns into different files - Replace comments with more readable code - Refactor with testability in mind - Replace dependencies with more up-to-date and lightweight alternatives * test(postcss-reduce-initial): add tests for acquire script * fixup! refactor(postcss-reduce-initial): make acquire script testable and easier to maintain * fixup! test(postcss-reduce-initial): add tests for acquire script Co-authored-by: Ludovico Fischer <43557+ludofischer@users.noreply.github.com> --- jest.config.js | 8 +- package.json | 7 +- packages/postcss-reduce-initial/package.json | 2 +- .../postcss-reduce-initial/src/acquire.mjs | 65 --- .../src/script/__tests__/io.js | 58 +++ .../src/script/__tests__/mdnCssProps.js | 122 ++++++ .../script/__tests__/sampleProperties.json | 121 ++++++ .../src/script/acquire.mjs | 15 + .../src/script/lib/io.mjs | 26 ++ .../src/script/lib/mdnCssProps.mjs | 64 +++ yarn.lock | 398 ++++-------------- 11 files changed, 505 insertions(+), 381 deletions(-) delete mode 100644 packages/postcss-reduce-initial/src/acquire.mjs create mode 100644 packages/postcss-reduce-initial/src/script/__tests__/io.js create mode 100644 packages/postcss-reduce-initial/src/script/__tests__/mdnCssProps.js create mode 100644 packages/postcss-reduce-initial/src/script/__tests__/sampleProperties.json create mode 100644 packages/postcss-reduce-initial/src/script/acquire.mjs create mode 100644 packages/postcss-reduce-initial/src/script/lib/io.mjs create mode 100644 packages/postcss-reduce-initial/src/script/lib/mdnCssProps.mjs diff --git a/jest.config.js b/jest.config.js index 47ff0c8bf..248fb423c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,8 +2,8 @@ module.exports = { testEnvironment: 'node', collectCoverageFrom: [ 'packages/*/src/**/*.js', - '!packages/postcss-colormin/src/generate.js', - '!packages/postcss-reduce-initial/src/acquire.js', + 'packages/postcss-reduce-initial/src/script/lib/io.mjs', + 'packages/postcss-reduce-initial/src/script/lib/mdnCssProps.mjs', '!packages/cssnano/src/__tests__/_processCss.js', '!packages/cssnano/src/__tests__/_webpack.config.js', ], @@ -14,4 +14,8 @@ module.exports = { '_webpack.config.js', ], testTimeout: 30000, + transform: { + '\\.[jt]sx?$': 'babel-jest', + '\\.mjs$': 'babel-jest', + }, }; diff --git a/package.json b/package.json index eb56cde1a..f5022a5ce 100644 --- a/package.json +++ b/package.json @@ -42,12 +42,12 @@ "eslint-plugin-react": "^7.23.2", "fs-extra": "^9.1.0", "glob": "^7.1.4", - "got": "^11.8.1", - "html2plaintext": "^2.1.2", + "html-to-text": "^8.0.0", "jest": "^27.0.1", "jest-junit": "^12.1.0", "lerna": "4.0.0", "mdast-util-heading-range": "^2.1.2", + "node-fetch": "^2.6.1", "pleeease-filters": "^4.0.0", "postcss": "^8.3.0", "postcss-devtools": "^1.1.1", @@ -69,8 +69,7 @@ "toml": "^3.0.0", "tomlify-j0.4": "^3.0.0", "unist-builder": "^2.0.3", - "unist-util-remove": "^2.1.0", - "write-file": "^1.0.0" + "unist-util-remove": "^2.1.0" }, "browserslist": { "chrome58": [ diff --git a/packages/postcss-reduce-initial/package.json b/packages/postcss-reduce-initial/package.json index 75090dd47..3085656ce 100644 --- a/packages/postcss-reduce-initial/package.json +++ b/packages/postcss-reduce-initial/package.json @@ -9,7 +9,7 @@ "LICENSE-MIT" ], "scripts": { - "acquire": "node ./src/acquire.mjs", + "acquire": "node ./src/script/acquire.mjs", "prebuild": "rimraf dist", "build": "cross-env BABEL_ENV=publish babel src --config-file ../../babel.config.json --out-dir dist --ignore '**/__tests__/,src/acquire.mjs'", "prepare": "yarn build" diff --git a/packages/postcss-reduce-initial/src/acquire.mjs b/packages/postcss-reduce-initial/src/acquire.mjs deleted file mode 100644 index 603c42f7c..000000000 --- a/packages/postcss-reduce-initial/src/acquire.mjs +++ /dev/null @@ -1,65 +0,0 @@ -import { join } from 'path'; -import writeFile from 'write-file'; -import got from 'got'; -import plainText from 'html2plaintext'; - -const initialLength = 7; // "initial".length; -const url = - 'https://raw.githubusercontent.com/mdn/data/master/css/properties.json'; - -function err(error) { - if (error) { - throw error; - } -} - -function toJSON(data) { - return `${JSON.stringify(data, null, 2)}\n`; -} - -function writeFiles({ fromInitial, toInitial }) { - writeFile( - join(__dirname, '../data/fromInitial.json'), - toJSON(fromInitial), - err - ); - writeFile(join(__dirname, '../data/toInitial.json'), toJSON(toInitial), err); -} - -got(url, { responseType: 'json' }) - .then(({ body }) => - Object.keys(body).reduce( - (values, key) => { - const { initial, status } = body[key]; - if ( - // Ignore complex syntaxes - typeof initial === 'string' && - key !== '--*' && - // Ignore display as it has different semantics - // depending on the selected element. - key !== 'display' && - // Ignore properties depend on user-agent implementation - initial !== 'dependsOnUserAgent' && - initial !== 'noPracticalInitialValue' && - initial !== 'noneButOverriddenInUserAgentCSS' && - initial !== 'variesFromBrowserToBrowser' && - initial !== 'invertOrCurrentColor' && - initial !== 'startOrNamelessValueIfLTRRightIfRTL' && - initial !== 'autoForSmartphoneBrowsersSupportingInflation' && - // Skip non standard properties, because they can change behaviour at any time - status !== 'nonstandard' - ) { - const value = plainText(initial).trim(); - if (value.length < initialLength) { - values.fromInitial[key] = value; - } else if (value.length > initialLength) { - values.toInitial[key] = value; - } - } - return values; - }, - { fromInitial: {}, toInitial: {} } - ) - ) - // eslint-disable-next-line no-console - .then(writeFiles, (error) => console.warn('errored: ', error.response.body)); diff --git a/packages/postcss-reduce-initial/src/script/__tests__/io.js b/packages/postcss-reduce-initial/src/script/__tests__/io.js new file mode 100644 index 000000000..a30f4a360 --- /dev/null +++ b/packages/postcss-reduce-initial/src/script/__tests__/io.js @@ -0,0 +1,58 @@ +import fetch from 'node-fetch'; +import { handleError, toJSONString, write, generate } from '../lib/io.mjs'; +import testData from './sampleProperties.json'; + +jest.mock('node-fetch'); + +// Selectively bypass mocking to use a real Response obj +const { Response } = jest.requireActual('node-fetch'); + +describe('toJSONString', () => { + const rawData = { + foo: 'bar', + 'baz-qux': 'quux', + quuz: 'corge', + garply: 'waldo', + 'fred-plugh': 'xyzzy-thud', + }; + + test('should produce parsable JSON', () => { + expect(JSON.parse(toJSONString(rawData))).toEqual(rawData); + }); +}); + +describe('Smoke tests', () => { + const data = { + fromInitial: { foo: 'bar', baz: 'qux' }, + toInitial: { qux: 'baz', bar: 'foo' }, + }; + const paths = { fromInitial: '/foo.json', toInitial: '/bar.json' }; + + test.each([ + ['fromInitial', paths.fromInitial, data.fromInitial], + ['toInitial', paths.toInitial, data.toInitial], + ])('should write JSON file based on key (%p)', (key, path, expected) => { + const err = expect.any(Function); + const fileFunc = jest.fn(); + + write(fileFunc, paths, data, key); + + expect(fileFunc).toHaveBeenCalledWith(path, toJSONString(expected), err); + }); + + test('should handle file operation errors', () => { + expect(handleError).not.toThrowError(); + expect(() => handleError(new Error('something went wrong'))).toThrowError(); + }); + + test('should make it through promise chain with sample data and write 2 files', async () => { + const fileFunc = jest.fn(); + fetch.mockReturnValue( + Promise.resolve(new Response(JSON.stringify(testData))) + ); + + await generate(fileFunc, paths, 'https://example.com/properties.json'); + + expect(fileFunc).toHaveBeenCalledTimes(2); + }); +}); diff --git a/packages/postcss-reduce-initial/src/script/__tests__/mdnCssProps.js b/packages/postcss-reduce-initial/src/script/__tests__/mdnCssProps.js new file mode 100644 index 000000000..3fe58ea5b --- /dev/null +++ b/packages/postcss-reduce-initial/src/script/__tests__/mdnCssProps.js @@ -0,0 +1,122 @@ +import { + isUserAgentDependent, + isComplexSyntax, + isUnpredictable, + toPlainText, + reduceInitial, + validate, +} from '../lib/mdnCssProps.mjs'; + +import testData from './sampleProperties.json'; + +describe('should recognise user agent dependent flags', () => { + test.each([ + ['dependsOnUserAgent', true], + ['noPracticalInitialValue', true], + ['noneButOverriddenInUserAgentCSS', true], + ['variesFromBrowserToBrowser', true], + ['invertOrCurrentColor', true], + ['startOrNamelessValueIfLTRRightIfRTL', true], + ['autoForSmartphoneBrowsersSupportingInflation', true], + ['experimental', false], + ['normal', false], + ])('isUserAgentDependent(%p) expected: %p', (flag, expected) => { + expect(isUserAgentDependent(flag)).toBe(expected); + }); +}); + +describe('should recognise properties with complex syntax', () => { + test.each([ + [['foo', 'bar'], 'text-align', true], + [['foo', 'bar'], '--*', true], + ['normal', '--*', true], + ['normal', 'word-wrap', false], + ['100%', 'text-align', false], + ])('isComplexSyntax(%p, %p) expected: %p', (initial, key, expected) => { + expect(isComplexSyntax(initial, key)).toBe(expected); + }); +}); + +describe('should recognise properties with unpredictable behavior', () => { + test.each([ + ['nonstandard', 'align-items', true], + ['nonstandard', 'display', true], + ['standard', 'display', true], + ['standard', 'align-items', false], + ['experimental', 'aspect-ratio', false], + ])('isUnpredictable(%p, %p) expected: %p', (status, key, expected) => { + expect(isUnpredictable(status, key)).toBe(expected); + }); +}); + +describe('should strip HTML, but leave relevant chars and separating spaces', () => { + test.each([ + ['', ''], + ['', ''], + ['Hello & Goodbye', 'Hello & Goodbye'], + ['Eye
glasses', 'Eyeglasses'], + ['Hand

writing

', 'Handwriting'], + ['No space at end ', 'No space at end'], + ['padding-box', 'padding-box'], + ['50% 50% 0', '50% 50% 0'], + ['0% 0%', '0% 0%'], + ['100%', '100%'], + ['auto', 'auto'], + ])('toPlainText(%p) expected: %p', (string, expected) => { + expect(toPlainText(string)).toBe(expected); + }); +}); + +describe('Reduce and validate sample data', () => { + let processedData = ''; + + beforeAll(() => { + processedData = reduceInitial(testData); + }); + + test('should reduce to expected object structure', () => { + expect(processedData).toEqual( + expect.objectContaining({ + fromInitial: expect.any(Object), + toInitial: expect.any(Object), + }) + ); + }); + + test('should reduce to expected number of fromInitial items', () => { + expect(Object.keys(processedData.fromInitial)).toHaveLength(5); + }); + + test('should reduce to expected number of toInitial items', () => { + expect(Object.keys(processedData.toInitial)).toHaveLength(3); + }); + + test('should validate and return sample data as resolved promise', async () => { + expect.assertions(1); + await expect(validate(processedData)).resolves.toEqual(processedData); + }); + + test('should fail validation on missing data', async () => { + expect.assertions(1); + await expect(validate(undefined)).rejects.toThrow(Error); + }); + + test('should fail validation on missing fromInitial', async () => { + const partialData = JSON.parse(JSON.stringify(processedData)); + + delete partialData.fromInitial; + + expect.assertions(1); + await expect(validate(partialData)).rejects.toThrow(Error); + }); + + test('should fail validation on missing toInitial', async () => { + const partialData = JSON.parse(JSON.stringify(processedData)); + + delete partialData.toInitial; + + expect.assertions(1); + await expect(validate(partialData)).rejects.toThrow(Error); + }); +}); diff --git a/packages/postcss-reduce-initial/src/script/__tests__/sampleProperties.json b/packages/postcss-reduce-initial/src/script/__tests__/sampleProperties.json new file mode 100644 index 000000000..f8480515e --- /dev/null +++ b/packages/postcss-reduce-initial/src/script/__tests__/sampleProperties.json @@ -0,0 +1,121 @@ +{ + "--*": { + "comment": "should be ignored due to having complex syntax", + "initial": "seeProse", + "status": "experimental" + }, + "-ms-scrollbar-3dlight-color": { + "comment": "should be ignored due to being user agent dependent", + "initial": "dependsOnUserAgent", + "status": "nonstandard" + }, + "font-family": { + "comment": "should be ignored due to being user agent dependent", + "initial": "dependsOnUserAgent", + "status": "standard" + }, + "display": { + "comment": "should be ignored due to varying semantics based on element", + "initial": "inline", + "status": "standard" + }, + "all": { + "comment": "should be ignored for having no practical initial value", + "initial": "noPracticalInitialValue", + "status": "standard" + }, + "-webkit-appearance": { + "comment": "should be ignored due to being user agent dependent", + "initial": "noneButOverriddenInUserAgentCSS", + "status": "nonstandard" + }, + "-webkit-appearance-std-dummy": { + "comment": "should be ignored due to being user agent dependent", + "initial": "noneButOverriddenInUserAgentCSS", + "status": "standard" + }, + "color": { + "comment": "should be ignored due to being user agent dependent", + "initial": "variesFromBrowserToBrowser", + "status": "standard" + }, + "outline-color": { + "comment": "should be ignored due to being user agent dependent", + "initial": "invertOrCurrentColor", + "status": "standard" + }, + "text-align": { + "comment": "should be ignored due to being user agent dependent", + "initial": "startOrNamelessValueIfLTRRightIfRTL", + "status": "standard" + }, + "text-size-adjust": { + "comment": "should be ignored due to being user agent dependent", + "initial": "autoForSmartphoneBrowsersSupportingInflation", + "status": "experimental" + }, + "border-block-end": { + "comment": "should be ignored due to having complex syntax (multiple initial)", + "initial": [ + "border-top-width", + "border-top-style", + "border-top-color" + ], + "status": "standard" + }, + "box-align": { + "comment": "should be ignored due to being unpredictable / nonstandard", + "initial": "stretch", + "status": "nonstandard" + }, + "animation-delay": { + "comment": "should be included in fromInitial: '0s' is shorter", + "initial": "0s", + "status": "standard" + }, + "mask-border-mode": { + "comment": "should be included in fromInitial: 'alpha' is shorter", + "initial": "alpha", + "status": "standard" + }, + "mix-blend-mode": { + "comment": "should be included in fromInitial: 'normal' is shorter", + "initial": "normal", + "status": "standard" + }, + "offset-position": { + "comment": "should be included in fromInitial: 'auto' is shorter", + "initial": "auto", + "status": "experimental" + }, + "block-overflow": { + "comment": "should be included in fromInitial: 'clip' is shorter", + "initial": "clip", + "status": "experimental" + }, + "background-clip": { + "comment": "should be included in toInitial: 'border-box' is longer", + "initial": "border-box", + "status": "standard" + }, + "background-size": { + "comment": "should be included in toInitial: 'auto auto' is longer", + "initial": "auto auto", + "status": "standard" + }, + "transform-origin": { + "comment": "should be included in toInitial: '50% 50% 0' is longer", + "initial": "50% 50% 0", + "status": "standard" + }, + "border-image-repeat": { + "comment": "should be ignored since 'stretch' is same length as 'initial' (nothing to gain)", + "initial": "stretch", + "status": "standard" + }, + "color-adjust": { + "comment": "should be ignored since 'economy' is same length as 'initial' (nothing to gain)", + "initial": "economy", + "status": "standard" + } +} diff --git a/packages/postcss-reduce-initial/src/script/acquire.mjs b/packages/postcss-reduce-initial/src/script/acquire.mjs new file mode 100644 index 000000000..e96986ab2 --- /dev/null +++ b/packages/postcss-reduce-initial/src/script/acquire.mjs @@ -0,0 +1,15 @@ +import { writeFile } from 'fs'; +import { generate } from './lib/io.mjs'; + +const url = + 'https://raw.githubusercontent.com/mdn/data/master/css/properties.json'; + +const paths = { + fromInitial: new URL('../../data/fromInitial.json', import.meta.url), + toInitial: new URL('../../data/toInitial.json', import.meta.url), +}; + +generate(writeFile, paths, url).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/packages/postcss-reduce-initial/src/script/lib/io.mjs b/packages/postcss-reduce-initial/src/script/lib/io.mjs new file mode 100644 index 000000000..60d179841 --- /dev/null +++ b/packages/postcss-reduce-initial/src/script/lib/io.mjs @@ -0,0 +1,26 @@ +import fetch from 'node-fetch'; +import { reduceInitial, validate } from './mdnCssProps.mjs'; + +export function handleError(error) { + if (error) { + throw error; + } +} + +export function toJSONString(data) { + return `${JSON.stringify(data, null, 2)}\n`; +} + +export function write(fileFunc, filePaths, data, key) { + fileFunc(filePaths[key], toJSONString(data[key]), handleError); + return data; +} + +export async function generate(fileFunc, filePaths, jsonURL) { + return fetch(jsonURL) + .then((result) => result.json()) + .then(reduceInitial) + .then(validate) + .then((data) => write(fileFunc, filePaths, data, 'fromInitial')) + .then((data) => write(fileFunc, filePaths, data, 'toInitial')); +} diff --git a/packages/postcss-reduce-initial/src/script/lib/mdnCssProps.mjs b/packages/postcss-reduce-initial/src/script/lib/mdnCssProps.mjs new file mode 100644 index 000000000..968d97c72 --- /dev/null +++ b/packages/postcss-reduce-initial/src/script/lib/mdnCssProps.mjs @@ -0,0 +1,64 @@ +import { htmlToText } from 'html-to-text'; + +export const userAgentDependentFlag = [ + 'dependsOnUserAgent', + 'noPracticalInitialValue', + 'noneButOverriddenInUserAgentCSS', + 'variesFromBrowserToBrowser', + 'invertOrCurrentColor', + 'startOrNamelessValueIfLTRRightIfRTL', + 'autoForSmartphoneBrowsersSupportingInflation', +]; + +export function isUserAgentDependent(initial) { + return userAgentDependentFlag.includes(initial); +} + +export function isComplexSyntax(initial, key) { + return typeof initial !== 'string' || key === '--*'; +} + +export function isUnpredictable(status, key) { + return status === 'nonstandard' || key === 'display'; +} + +export function toPlainText(value) { + return htmlToText(value, { + wordwrap: false, + }) + .replace(/[\t\r\n\f\u200b]/g, '') + .trim(); +} + +export function reduceInitial(propertyData) { + return Object.keys(propertyData).reduce( + (values, key) => { + const { initial, status } = propertyData[key]; + if ( + !isUserAgentDependent(initial) && + !isComplexSyntax(initial, key) && + !isUnpredictable(status, key) + ) { + const value = toPlainText(initial); + if (value.length < 'initial'.length) { + values.fromInitial[key] = value; + } else if (value.length > 'initial'.length) { + values.toInitial[key] = value; + } + } + return values; + }, + { fromInitial: {}, toInitial: {} } + ); +} + +export function validate(data) { + if ( + data === undefined || + !Object.keys(data.fromInitial || {}).length || + !Object.keys(data.toInitial || {}).length + ) { + return Promise.reject(new Error('"Initial" data is missing or malformed')); + } + return Promise.resolve(data); +} diff --git a/yarn.lock b/yarn.lock index 702c7a50b..54ca6e8e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2013,10 +2013,13 @@ dependencies: "@octokit/openapi-types" "^7.2.3" -"@sindresorhus/is@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" - integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== +"@selderee/plugin-htmlparser2@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz#27e994afd1c2cb647ceb5406a185a5574188069d" + integrity sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA== + dependencies: + domhandler "^4.2.0" + selderee "^0.6.0" "@sinonjs/commons@^1.7.0": version "1.8.3" @@ -2032,13 +2035,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@szmarczak/http-timer@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" - integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== - dependencies: - defer-to-connect "^2.0.0" - "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -2082,16 +2078,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/cacheable-request@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" - integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "*" - "@types/node" "*" - "@types/responselike" "*" - "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -2099,11 +2085,6 @@ dependencies: "@types/node" "*" -"@types/http-cache-semantics@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" - integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -2128,13 +2109,6 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/keyv@*": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" - integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== - dependencies: - "@types/node" "*" - "@types/mdast@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" @@ -2172,13 +2146,6 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== -"@types/responselike@*", "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - "@types/stack-utils@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" @@ -2725,7 +2692,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -2863,24 +2830,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-request@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" - integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^2.0.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -3017,18 +2966,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -cheerio@1.0.0-rc.2: - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" - integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - chokidar@^3.0.0, chokidar@^3.3.0, chokidar@^3.4.0: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" @@ -3133,13 +3070,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -3239,6 +3169,11 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== +commander@^2.19.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -3470,16 +3405,6 @@ css-select@^4.1.3: domutils "^2.6.0" nth-check "^2.0.0" -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - css-tree@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -3488,11 +3413,6 @@ css-tree@^1.1.2: mdn-data "2.0.14" source-map "^0.6.1" -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - css-what@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" @@ -3609,13 +3529,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -3638,11 +3551,6 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -3754,6 +3662,11 @@ directory-fonts-complete@^1.2.0: is-woff "^1.0.1" is-woff2 "^1.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -3768,14 +3681,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^1.0.1: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" @@ -3785,19 +3690,6 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -dom-serializer@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" @@ -3810,37 +3702,14 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domhandler@^4.2.0: +domhandler@^4.0.0, domhandler@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== dependencies: domelementtype "^2.2.0" -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.6.0: +domutils@^2.5.2, domutils@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== @@ -3903,13 +3772,6 @@ encoding@^0.1.12: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -3917,11 +3779,6 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -4604,13 +4461,6 @@ get-stdin@^8.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -4742,23 +4592,6 @@ google-fonts-complete@^2.1.1: dependencies: postcss "^7.0.18" -got@^11.8.1: - version "11.8.2" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" - integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.1" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -4909,7 +4742,7 @@ hast-util-whitespace@^1.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -4960,33 +4793,34 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-to-text@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-8.0.0.tgz#5848681a5a38d657a7bb58cf5006d1c29fe64ce3" + integrity sha512-fEtul1OerF2aMEV+Wpy+Ue20tug134jOY1GIudtdqZi7D0uTudB2tVJBKfVhTL03dtqeJoF8gk8EPX9SyMEvLg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.6.0" + deepmerge "^4.2.2" + he "^1.2.0" + htmlparser2 "^6.1.0" + minimist "^1.2.5" + selderee "^0.6.0" + html-void-elements@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== -html2plaintext@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/html2plaintext/-/html2plaintext-2.1.2.tgz#c20b6be07ca449ff82f0c677fca05c6c19e09b18" - integrity sha512-/7rk161q0RFtQhu0F7oU7MFUtqjm2qBrVfoS8EOaHSdRNt72CNNYSV1/wN+TfO2GhgLQdIjPctmiWPX3oRcNFQ== - dependencies: - cheerio "1.0.0-rc.2" - he "1.2.0" - plumb "0.1.0" - -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== @@ -5009,14 +4843,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -5128,7 +4954,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5253,7 +5079,7 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.2" -is-buffer@^1.1.4, is-buffer@^1.1.5: +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -6119,11 +5945,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - json-fixer@^1.5.1: version "1.6.9" resolved "https://registry.yarnpkg.com/json-fixer/-/json-fixer-1.6.9.tgz#7bb9d45488ba71fbb19b1856265ceaa366ec199a" @@ -6214,13 +6035,6 @@ jsprim@^1.2.2: array-includes "^3.1.2" object.assign "^4.1.2" -keyv@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" - integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== - dependencies: - json-buffer "3.0.1" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6482,7 +6296,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.1.0, lodash@^4.11.2, lodash@^4.15.0, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.1.0, lodash@^4.11.2, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6514,11 +6328,6 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -6901,16 +6710,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7048,6 +6847,11 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moo@^0.5.0, moo@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4" + integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7106,6 +6910,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nearley@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + negotiator@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7229,11 +7043,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - normalize-url@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.0.1.tgz#a4f27f58cf8c7b287b440b8a8201f42d0b00d256" @@ -7351,13 +7160,6 @@ nth-check@^2.0.0: dependencies: boolbase "^1.0.0" -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -7458,7 +7260,7 @@ object.values@^1.1.3, object.values@^1.1.4: define-properties "^1.1.3" es-abstract "^1.18.2" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -7519,11 +7321,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -7727,12 +7524,13 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== +parseley@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.7.0.tgz#9949e3a0ed05c5072adb04f013c2810cf49171a8" + integrity sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw== dependencies: - "@types/node" "*" + moo "^0.5.1" + nearley "^2.20.1" pascalcase@^0.1.1: version "0.1.1" @@ -7887,11 +7685,6 @@ pleeease-filters@^4.0.0: onecolor "^3.0.4" postcss "^6.0.1" -plumb@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/plumb/-/plumb-0.1.0.tgz#4c57790a509692832fdbf10dfaddd7948c5cb574" - integrity sha1-TFd5ClCWkoMv2/EN+t3XlIxctXQ= - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -8159,14 +7952,6 @@ psl@^1.1.28, psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -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@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -8209,10 +7994,18 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234= + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" react-is@^16.8.1: version "16.13.1" @@ -8340,7 +8133,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8633,11 +8426,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-alpn@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.1.2.tgz#30b60cfbb0c0b8dc897940fe13fe255afcdd4d28" - integrity sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA== - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -8676,13 +8464,6 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== - dependencies: - lowercase-keys "^2.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -8778,6 +8559,13 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +selderee@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.6.0.tgz#f3bee66cfebcb6f33df98e4a1df77388b42a96f7" + integrity sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg== + dependencies: + parseley "^0.7.0" + "semver@2 || 3 || 4 || 5", semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -10190,14 +9978,6 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/write-file/-/write-file-1.0.0.tgz#5e2dac7fd40c63164891fa0df060b8104b058069" - integrity sha1-Xi2sf9QMYxZIkfoN8GC4EEsFgGk= - dependencies: - is-buffer "^1.1.4" - mkdirp "^0.5.1" - write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a"