diff --git a/.circleci/config.yml b/.circleci/config.yml index 295a7075f15def1108ff4fe517fd5a808bc25de8..fdaade0f3627303f421be140d0749498ef64b054 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -104,7 +104,7 @@ services_steps: &services_steps environment: mocha_reporter: mocha-junit-reporter MOCHA_FILE: junit/services/results.xml - command: npm run test:services:pr:run + command: RETRY_COUNT=3 npm run test:services:pr:run - store_test_results: path: junit diff --git a/.eslintrc.yml b/.eslintrc.yml index 1cbb85fdf260b270ddd2daa69afe9348438b427e..63cdb25b0b33a28d5dfff4851224b23ca3a73534 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -5,6 +5,7 @@ extends: - prettier/@typescript-eslint - prettier/standard - prettier/react + - eslint:recommended parserOptions: # Override eslint-config-standard, which incorrectly sets this to "module", @@ -35,6 +36,7 @@ overrides: - '!frontend/**/*.js' env: node: true + es6: true rules: no-console: 'off' '@typescript-eslint/no-var-requires': off @@ -95,6 +97,8 @@ overrides: - files: - '**/*.spec.@(js|ts|tsx)' - '**/*.integration.js' + - '**/test-helpers.js' + - 'core/service-test-runner/**/*.js' env: mocha: true rules: @@ -114,7 +118,7 @@ rules: '@typescript-eslint/no-var-requires': error # These should be disabled by eslint-config-prettier, but are not. - spaced-comment: 'off' + no-extra-semi: 'off' # Shields additions. no-var: 'error' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e1014e48c951ae31899305189fe19c09407dc131..ea4759213a66ad288a738e5b013cb91897d1b731 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -105,12 +105,11 @@ There are three places to get help: ## Badge URLs - The format of new badges should be of the form - `/SERVICE/NOUN/PARAMETERS/QUALIFIERS.format`. For instance, - `/gitter/room/nwjs/nw.js.svg`. The vendor is gitter, the - badge is for rooms, the parameter is nwjs/nw.js, and the format is svg. -- For services which require a hostname, the badge should be of the form - `/SERVICE/SCHEME/HOST/NOUN/PARAMETERS/QUALIFIERS.format`. For instance, - `/discourse/https/discourse.example.com/topics.svg`. + `/SERVICE/NOUN/PARAMETERS/QUALIFIERS`. For instance, + `/gitter/room/nwjs/nw.js`. The vendor is gitter, the + badge is for rooms, and the parameter is nwjs/nw.js. +- Services which require a url/hostname parameter should use a query parameter to accept that value. For instance, + `/discourse/topics?server=https://meta.discourse.org`. ## Coding guidelines diff --git a/core/base-service/base.js b/core/base-service/base.js index 742272612830f5c894e589b6c93f5833a4f860ee..352314d8363f0188ab5edd73248b5473ece2f7a6 100644 --- a/core/base-service/base.js +++ b/core/base-service/base.js @@ -267,6 +267,12 @@ class BaseService { throw new Error(`Handler not implemented for ${this.constructor.name}`) } + // Making this an instance method ensures debuggability. + // https://github.com/badges/shields/issues/3784 + _validateServiceData(serviceData) { + Joi.assert(serviceData, serviceDataSchema) + } + _handleError(error) { if (error instanceof NotFound || error instanceof InvalidParameter) { trace.logTrace('outbound', emojic.noGoodWoman, 'Handled error', error) @@ -379,7 +385,7 @@ class BaseService { namedParams, transformedQueryParams ) - Joi.assert(serviceData, serviceDataSchema) + serviceInstance._validateServiceData(serviceData) } catch (error) { serviceError = error } diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js index 8964cd0b274b9f2110ff643991dfbaafcff6af18..9acdd90a48587abd0e1c6b38680dee958f8d7c05 100644 --- a/core/base-service/base.spec.js +++ b/core/base-service/base.spec.js @@ -192,7 +192,7 @@ describe('BaseService', function() { }) }) - it('Throws a validation error on invalid data', async function() { + context('On invalid data', function() { class ThrowingService extends DummyService { async handle() { return { @@ -200,19 +200,37 @@ describe('BaseService', function() { } } } - try { - await ThrowingService.invoke( - {}, - { handleInternalErrors: false }, - { namedParamA: 'bar.bar.bar' } - ) - expect.fail('Expected to throw') - } catch (e) { - expect(e.name).to.equal('ValidationError') - expect(e.details.map(({ message }) => message)).to.deep.equal([ - '"message" is required', - ]) - } + + it('Throws a validation error on invalid data', async function() { + try { + await ThrowingService.invoke( + {}, + { handleInternalErrors: false }, + { namedParamA: 'bar.bar.bar' } + ) + expect.fail('Expected to throw') + } catch (e) { + expect(e.name).to.equal('ValidationError') + expect(e.details.map(({ message }) => message)).to.deep.equal([ + '"message" is required', + ]) + } + }) + + // Ensure debuggabillity. + // https://github.com/badges/shields/issues/3784 + it('Includes the service class in the stack trace', async function() { + try { + await ThrowingService.invoke( + {}, + { handleInternalErrors: false }, + { namedParamA: 'bar.bar.bar' } + ) + expect.fail('Expected to throw') + } catch (e) { + expect(e.stack).to.include('ThrowingService._validateServiceData') + } + }) }) }) @@ -316,7 +334,9 @@ describe('BaseService', function() { }) describe('ScoutCamp integration', function() { - const expectedRouteRegex = /^\/foo\/([^/]+?)(|\.svg|\.json)$/ + // TODO Strangly, without the useless escape the regexes do not match in Node 12. + // eslint-disable-next-line no-useless-escape + const expectedRouteRegex = /^\/foo\/([^\/]+?)(|\.svg|\.json)$/ let mockCamp let mockHandleRequest diff --git a/core/base-service/examples.js b/core/base-service/examples.js index cc7d313b3acc26b8f6a8f03a5b5c5a3be44b1937..5f4248ad09056720b9c1fc600e7a92f1017df0ed 100644 --- a/core/base-service/examples.js +++ b/core/base-service/examples.js @@ -2,6 +2,7 @@ const Joi = require('@hapi/joi') const pathToRegexp = require('path-to-regexp') +const categories = require('../../services/categories') const coalesceBadge = require('./coalesce-badge') const { makeFullUrl } = require('./route') @@ -154,7 +155,9 @@ function transformExample(inExample, index, ServiceClass) { style: style === 'flat' ? undefined : style, namedLogo, }, - keywords, + keywords: keywords.concat( + categories.find(c => c.id === ServiceClass.category).keywords + ), documentation: documentation ? { __html: documentation } : undefined, } } diff --git a/core/base-service/examples.spec.js b/core/base-service/examples.spec.js index 3e4d254698c5e297b6aed0466fd0282cebdee5c7..387fec0456d160005da9d63db3e2d3a69e524a28 100644 --- a/core/base-service/examples.spec.js +++ b/core/base-service/examples.spec.js @@ -84,6 +84,7 @@ test(transformExample, function() { defaultBadgeData: { label: 'downloads', }, + category: 'platform-support', } given( @@ -109,7 +110,7 @@ test(transformExample, function() { namedLogo: undefined, style: undefined, }, - keywords: ['hello'], + keywords: ['hello', 'platform'], documentation: undefined, }) @@ -135,7 +136,7 @@ test(transformExample, function() { namedLogo: undefined, style: undefined, }, - keywords: ['hello'], + keywords: ['hello', 'platform'], documentation: undefined, }) @@ -162,7 +163,7 @@ test(transformExample, function() { namedLogo: undefined, style: undefined, }, - keywords: ['hello'], + keywords: ['hello', 'platform'], documentation: undefined, }) }) diff --git a/core/base-service/service-definitions.js b/core/base-service/service-definitions.js index 2128e5a0e7c3f4a5e22ccddc00a33840cb0f5b98..c89f151bc28e24eb89a162123a2fa99ce2ffe1a6 100644 --- a/core/base-service/service-definitions.js +++ b/core/base-service/service-definitions.js @@ -66,6 +66,7 @@ const serviceDefinitionExport = Joi.object({ Joi.object({ id: Joi.string().required(), name: Joi.string().required(), + keywords: arrayOfStrings, }) ) .required(), diff --git a/core/service-test-runner/cli.js b/core/service-test-runner/cli.js index da4629a0d3673b0ebd8f8c3342720fb212860eed..1b7979e15fa9080b1ae6416c0658c582353c54e0 100644 --- a/core/service-test-runner/cli.js +++ b/core/service-test-runner/cli.js @@ -15,6 +15,11 @@ // Run tests on a given instance: // SKIP_INTERCEPTED=TRUE TESTED_SERVER_URL=https://test.shields.io npm run test:services -- // +// Run tests with given number of retries and backoff (in milliseconds): +// RETRY_COUNT=3 RETRY_BACKOFF=100 npm run test:services -- +// Retry option documentation: +// https://github.com/IcedFrisby/IcedFrisby/blob/master/API.md#retrycount-backoff +// // Service tests are run in CI in two cases: scheduled builds and pull // requests. The scheduled builds run _all_ the service tests, whereas the // pull requests run service tests designated in the PR title. In this way, @@ -59,6 +64,9 @@ const Runner = require('./runner') require('../unhandled-rejection.spec') +const retry = {} +retry.count = parseInt(process.env.RETRY_COUNT) || 0 +retry.backoff = parseInt(process.env.RETRY_BACKOFF) || 0 let baseUrl, server if (process.env.TESTED_SERVER_URL) { baseUrl = process.env.TESTED_SERVER_URL @@ -77,7 +85,7 @@ if (process.env.TESTED_SERVER_URL) { } const skipIntercepted = envFlag(process.env.SKIP_INTERCEPTED, false) -const runner = new Runner({ baseUrl, skipIntercepted }) +const runner = new Runner({ baseUrl, skipIntercepted, retry }) runner.prepare() // The server's request cache causes side effects between tests. diff --git a/core/service-test-runner/runner.js b/core/service-test-runner/runner.js index a026b0064b09d4ef0fe4897d294e8965f8cf4af7..44e4718267414c5dfd576aff6c83af421f7326ae 100644 --- a/core/service-test-runner/runner.js +++ b/core/service-test-runner/runner.js @@ -9,9 +9,10 @@ const { loadTesters } = require('../base-service/loader') * Load a collection of ServiceTester objects and register them with Mocha. */ class Runner { - constructor({ baseUrl, skipIntercepted }) { + constructor({ baseUrl, skipIntercepted, retry }) { this.baseUrl = baseUrl this.skipIntercepted = skipIntercepted + this.retry = retry } /** @@ -67,8 +68,8 @@ class Runner { * Register the tests with Mocha. */ toss() { - const { testers, baseUrl, skipIntercepted } = this - testers.forEach(tester => tester.toss({ baseUrl, skipIntercepted })) + const { testers, baseUrl, skipIntercepted, retry } = this + testers.forEach(tester => tester.toss({ baseUrl, skipIntercepted, retry })) } } module.exports = Runner diff --git a/core/service-test-runner/service-tester.js b/core/service-test-runner/service-tester.js index 60dd531427f143570f38f15b4d57ef8a337cddf1..8bc23ba517e9ad736870b29b97d8e61ec62c76aa 100644 --- a/core/service-test-runner/service-tester.js +++ b/core/service-test-runner/service-tester.js @@ -115,8 +115,11 @@ class ServiceTester { * @param {object} attrs Refer to individual attrs * @param {string} attrs.baseUrl base URL for test server * @param {boolean} attrs.skipIntercepted skip tests which intercept requests + * @param {object} attrs.retry retry configuration + * @param {number} attrs.retry.count number of times to retry test + * @param {number} attrs.retry.backoff number of milliseconds to add to the wait between each retry */ - toss({ baseUrl, skipIntercepted }) { + toss({ baseUrl, skipIntercepted, retry }) { const { specs, pathPrefix } = this const testerBaseUrl = `${baseUrl}${pathPrefix}` @@ -129,6 +132,7 @@ class ServiceTester { }` if (!skipIntercepted || !spec.intercepted) { spec.baseUri(testerBaseUrl) + spec.retry(retry.count, retry.backoff) spec.toss() } }) diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md index bebe931170f932238db31c6c43eecc19c7e5ca01..0fc31cc044c2f06e77a286dca06f2aa356daa972 100644 --- a/doc/TUTORIAL.md +++ b/doc/TUTORIAL.md @@ -210,10 +210,9 @@ module.exports = class GemVersion extends BaseJsonService { return { label: 'gem' } } - // (9) - async handle({ gem }) { - const { version } = await this.fetch({ gem }) - return this.constructor.render({ version }) + // (11) + static render({ version }) { + return renderVersionBadge({ version }) } // (10) @@ -224,9 +223,10 @@ module.exports = class GemVersion extends BaseJsonService { }) } - // (11) - static render({ version }) { - return renderVersionBadge({ version }) + // (9) + async handle({ gem }) { + const { version } = await this.fetch({ gem }) + return this.constructor.render({ version }) } } ``` @@ -241,31 +241,31 @@ Description of the code: - [text-formatters.js](https://github.com/badges/shields/blob/master/services/text-formatters.js) - [version.js](https://github.com/badges/shields/blob/master/services/version.js) 3. Our badge will query a JSON API so we will extend `BaseJsonService` instead of `BaseService`. This contains some helpers to reduce the need for boilerplate when calling a JSON API. -4. We perform input validation by defining a schema which we expect the JSON we receive to conform to. This is done using [Joi](https://github.com/hapijs/joi). Defining a schema means we can ensure the JSON we receive meets our expectations and throw an error if we receive unexpected input without having to explicitly code validation checks. The schema also acts as a filter on the JSON object. Any properties we're going to reference need to be validated, otherwise they will be filtered out. In this case our schema declares that we expect to receive an object which must have a property called 'status', which is a string. +4. We perform input validation by defining a schema which we expect the JSON we receive to conform to. This is done using [Joi](https://github.com/hapijs/joi). Defining a schema means we can ensure the JSON we receive meets our expectations and throw an error if we receive unexpected input without having to explicitly code validation checks. The schema also acts as a filter on the JSON object. Any properties we're going to reference need to be validated, otherwise they will be filtered out. In this case our schema declares that we expect to receive an object which must have a property called 'version', which is a string. 5. Our module exports a class which extends `BaseJsonService` 6. Returns the name of the category to sort this badge into (eg. "build"). Used to sort the examples on the main [shields.io](https://shields.io) website. [Here](https://github.com/badges/shields/blob/master/services/categories.js) is the list of the valid categories. See [section 4.4](#44-adding-an-example-to-the-front-page) for more details on examples. 7. As with our previous badge, we need to declare a route. This time we will capture a variable called `gem`. 8. We can use `defaultBadgeData()` to set a default `color`, `logo` and/or `label`. If `handle()` doesn't return any of these keys, we'll use the default. Instead of explicitly setting the label text when we return a badge object, we'll use `defaultBadgeData()` here to define it declaratively. -9. Our badge must implement the `async handle()` function. Because our URL pattern captures a variable called `gem`, our function signature is `async handle({ gem })`. We usually separate the process of generating a badge into 2 stages or concerns: fetch and render. The `fetch()` function is responsible for calling an API endpoint to get data. The `render()` function formats the data for display. In a case where there is a lot of calculation or intermediate steps, this pattern may be thought of as fetch, transform, render and it might be necessary to define some helper functions to assist with the 'transform' step. -10. The `async fetch()` method is responsible for calling an API endpoint to get data. Extending `BaseJsonService` gives us the helper function `_requestJson()`. Note here that we pass the schema we defined in step 4 as an argument. `_requestJson()` will deal with validating the response against the schema and throwing an error if necessary. - -- `_requestJson()` automatically adds an Accept header, checks the status code, parses the response as JSON, and returns the parsed response. -- `_requestJson()` uses [request](https://github.com/request/request) to perform the HTTP request. Options can be passed to request, including method, query string, and headers. If headers are provided they will override the ones automatically set by `_requestJson()`. There is no need to specify json, as the JSON parsing is handled by `_requestJson()`. See the `request` docs for [supported options](https://github.com/request/request#requestoptions-callback). -- Error messages corresponding to each status code can be returned by passing a dictionary of status codes -> messages in `errorMessages`. -- A more complex call to `_requestJson()` might look like this: - ```js - return this._requestJson({ - schema: mySchema, - url, - options: { qs: { branch: 'master' } }, - errorMessages: { - 401: 'private application not supported', - 404: 'application not found', - }, - }) - ``` - -11. The `static render()` method is responsible for formatting the data for display. `render()` is a pure function so we can make it a `static` method. By convention we declare functions which don't reference `this` as `static`. We could explicitly return an object here, as we did in the previous example. In this case, we will hand the version string off to `renderVersionBadge()` which will format it consistently and set an appropriate color. Because `renderVersionBadge()` doesn't return a `label` key, the default label we defined in `defaultBadgeData()` will be used when we generate the badge. +9. We now jump to the bottom of the example code to the function all badges must implement: `async handle()`. This is the function the server will invoke to handle an incoming request. Because our URL pattern captures a variable called `gem`, our function signature is `async handle({ gem })`. We usually separate the process of generating a badge into 2 stages or concerns: fetch and render. The `fetch()` function is responsible for calling an API endpoint to get data. The `render()` function formats the data for display. In a case where there is a lot of calculation or intermediate steps, this pattern may be thought of as fetch, transform, render and it might be necessary to define some helper functions to assist with the 'transform' step. +10. Working our way upward, the `async fetch()` method is responsible for calling an API endpoint to get data. Extending `BaseJsonService` gives us the helper function `_requestJson()`. Note here that we pass the schema we defined in step 4 as an argument. `_requestJson()` will deal with validating the response against the schema and throwing an error if necessary. + + - `_requestJson()` automatically adds an Accept header, checks the status code, parses the response as JSON, and returns the parsed response. + - `_requestJson()` uses [request](https://github.com/request/request) to perform the HTTP request. Options can be passed to request, including method, query string, and headers. If headers are provided they will override the ones automatically set by `_requestJson()`. There is no need to specify json, as the JSON parsing is handled by `_requestJson()`. See the `request` docs for [supported options](https://github.com/request/request#requestoptions-callback). + - Error messages corresponding to each status code can be returned by passing a dictionary of status codes -> messages in `errorMessages`. + - A more complex call to `_requestJson()` might look like this: + ```js + return this._requestJson({ + schema: mySchema, + url, + options: { qs: { branch: 'master' } }, + errorMessages: { + 401: 'private application not supported', + 404: 'application not found', + }, + }) + ``` + +11. Upward still, the `static render()` method is responsible for formatting the data for display. `render()` is a pure function so we can make it a `static` method. By convention we declare functions which don't reference `this` as `static`. We could explicitly return an object here, as we did in the previous example. In this case, we will hand the version string off to `renderVersionBadge()` which will format it consistently and set an appropriate color. Because `renderVersionBadge()` doesn't return a `label` key, the default label we defined in `defaultBadgeData()` will be used when we generate the badge. This code allows us to call this URL <https://img.shields.io/gem/v/formatador> to generate this badge:  @@ -324,7 +324,7 @@ module.exports = class GemVersion extends BaseJsonService { - `namedParams`: Provide a valid example of params we can substitute into the pattern. In this case we need a valid ruby gem, so we've picked [formatador](https://rubygems.org/gems/formatador). - `staticPreview`: On the index page we want to show an example badge, but for performance reasons we want that example to be generated without making an API call. `staticPreview` should be populated by calling our `render()` method with some valid data. - - `keywords`: If we want to provide additional keywords other than the title, we can add them here. This helps users to search for relevant badges. + - `keywords`: If we want to provide additional keywords other than the title and the category, we can add them here. This helps users to search for relevant badges. Save, run `npm start`, and you can see it [locally](http://127.0.0.1:3000/). @@ -339,7 +339,7 @@ should be included. They serve several purposes: 1. They speed up future contributors when they are debugging or improving a badge. -2. If a contributors like to change your badge, chances are, they forget +2. If the contributors would like to change your badge, chances are, they forget edge cases and break your code. Tests may give hints in such cases. 3. The contributor and reviewer can easily verify the code works as @@ -352,7 +352,7 @@ Please follow it to include tests on your pull-request. ### (4.6) Update the Docs -If your submission require an API token or authentication credentials, please +If your submission requires an API token or authentication credentials, please update [server-secrets.md](./server-secrets.md). You should explain what the token or credentials are for and how to obtain them. diff --git a/doc/self-hosting.md b/doc/self-hosting.md index ae2ab7d48595efdabaf24fa01fb68a080cc29bd1..23b64f43c8b24fe73b1dd07ea2a8b98b4589a6e5 100644 --- a/doc/self-hosting.md +++ b/doc/self-hosting.md @@ -69,7 +69,7 @@ Successfully built 4471b442c220 ``` Optionally, create a file called `shields.env` that contains the needed -configuration. See [server-secrets.md](server-secrets.md) and [../config/custom-environment-variables.yml](config/custom-environment-variables.yml) for examples. +configuration. See [server-secrets.md](server-secrets.md) and [config/custom-environment-variables.yml](/config/custom-environment-variables.yml) for examples. Then run the container: diff --git a/frontend/components/markup-modal/markup-modal-content.tsx b/frontend/components/markup-modal/markup-modal-content.tsx index deebd06ac7fa0c6cd26a5cbcd46a71d0ed03a089..65e83a4399b611859df695e502dfecdb8ecf28e9 100644 --- a/frontend/components/markup-modal/markup-modal-content.tsx +++ b/frontend/components/markup-modal/markup-modal-content.tsx @@ -11,6 +11,7 @@ import Customizer from '../customizer/customizer' const Documentation = styled.div` max-width: 800px; margin: 35px auto 20px; + text-align: left; ` export function MarkupModalContent({ diff --git a/frontend/components/usage.tsx b/frontend/components/usage.tsx index d2390459379c9fead691fea591b2275ea6185264..cde5bb723346086c796285c545ed800a321e1f43 100644 --- a/frontend/components/usage.tsx +++ b/frontend/components/usage.tsx @@ -327,7 +327,7 @@ export default function Usage({ baseUrl }: { baseUrl: string }) { <QueryParam documentation={ <span> - Insert one of the named logos from ({<NamedLogos />}) or{' '} + Insert one of the named logos from (<NamedLogos />) or{' '} <a href="https://simpleicons.org/" rel="noopener noreferrer" @@ -414,16 +414,16 @@ export default function Usage({ baseUrl }: { baseUrl: string }) { </QueryParamTable> <p> - We support <code>.svg</code> and <code>.json</code>. The default is + We support <code>.svg</code> and <code>.json</code>. The default is{' '} <code>.svg</code>, which can be omitted from the URL. </p> <p> - While we highly recommend using SVG, we also support <code>.png</code> + While we highly recommend using SVG, we also support <code>.png</code>{' '} for use cases where SVG will not work. These requests should be made to our raster server <code>https://raster.shields.io</code>. For example, - the raster equivalent of - <code>https://img.shields.io/v/npm/express</code> is + the raster equivalent of{' '} + <code>https://img.shields.io/v/npm/express</code> is{' '} <code>https://raster.shields.io/v/npm/express</code>. For backward compatibility, the badge server will redirect <code>.png</code> badges to the raster server. diff --git a/frontend/lib/redirect-legacy-routes.ts b/frontend/lib/redirect-legacy-routes.ts index 44eea5f11dfdb97dde88a4f561c6abd9fcb95c38..aebf7269c9d013d32c38c32a506d705717fa30e6 100644 --- a/frontend/lib/redirect-legacy-routes.ts +++ b/frontend/lib/redirect-legacy-routes.ts @@ -4,8 +4,12 @@ export default function redirectLegacyRoutes() { const { hash } = window.location if (hash && hash.startsWith('#/examples/')) { const category = hash.replace('#/examples/', '') - navigate(`category/${category}`) + navigate(`category/${category}`, { + replace: true, + }) } else if (hash === '#/endpoint') { - navigate('endpoint') + navigate('endpoint', { + replace: true, + }) } } diff --git a/frontend/lib/service-definitions/index.spec.ts b/frontend/lib/service-definitions/index.spec.ts index 035037a4d1851cd93c5126651c5e080f32147969..b83c603b9b667970a8e675a3ebcdae626d8318c9 100644 --- a/frontend/lib/service-definitions/index.spec.ts +++ b/frontend/lib/service-definitions/index.spec.ts @@ -4,7 +4,7 @@ import { findCategory, getDefinitionsForCategory } from '.' describe('Service definition helpers', function() { test(findCategory, () => { - given('build').expect({ id: 'build', name: 'Build' }) + given('build').expect({ id: 'build', name: 'Build', keywords: ['build'] }) given('foo').expect(undefined) }) diff --git a/frontend/lib/service-definitions/index.ts b/frontend/lib/service-definitions/index.ts index 23d5b0314eed0412ff28696d3dbbc74fe60a880c..a962c74910e8004f9e86ee062a368ddfa78ddf51 100644 --- a/frontend/lib/service-definitions/index.ts +++ b/frontend/lib/service-definitions/index.ts @@ -5,6 +5,7 @@ import definitions from '../../../service-definitions.yml' export interface Category { id: string name: string + keywords: string[] } export interface ExampleSignature { diff --git a/package-lock.json b/package-lock.json index d105444e3ffc8735defc0622660b24f064ea3962..41e1592ba8a82eed1288366bd4d0a353c2888551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.2.tgz", - "integrity": "sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", + "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.2", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0", - "convert-source-map": "^1.1.0", + "@babel/generator": "^7.7.2", + "@babel/helpers": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.7.2", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", "lodash": "^4.17.13", @@ -45,64 +45,84 @@ } }, "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "dev": true, "requires": { - "@babel/types": "^7.6.0", + "@babel/types": "^7.7.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", "dev": true }, "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -110,6 +130,15 @@ "to-fast-properties": "^2.0.0" } }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -120,9 +149,9 @@ } }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -173,13 +202,26 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", + "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-explode-assignable-expression": "^7.7.0", + "@babel/types": "^7.7.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-react-jsx": { @@ -277,50 +319,173 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", - "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", + "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0" }, "dependencies": { + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", "dev": true, "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" + } + }, + "@babel/parser": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", + "dev": true + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + } } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", + "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, "@babel/helper-define-map": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", @@ -346,13 +511,125 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", + "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/parser": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", + "dev": true + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/helper-function-name": { @@ -407,9 +684,9 @@ }, "dependencies": { "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -506,83 +783,206 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", + "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-wrap-function": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, - "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "@babel/helper-annotate-as-pure": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", + "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", "dev": true, "requires": { - "@babel/types": "^7.5.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "@babel/types": "^7.7.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", "dev": true, "requires": { - "@babel/types": "^7.5.5" + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", "dev": true }, - "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", "@babel/generator": "^7.5.5", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.4.4", @@ -641,91 +1041,212 @@ } }, "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", + "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "@babel/helper-function-name": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" }, "dependencies": { + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/parser": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", + "dev": true + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + } + } + }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, "@babel/helpers": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", - "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", "dev": true, "requires": { - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0" + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" }, "dependencies": { "@babel/generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.2.tgz", - "integrity": "sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "dev": true, "requires": { - "@babel/types": "^7.6.0", + "@babel/types": "^7.7.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", "dev": true }, "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/traverse": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.2.tgz", - "integrity": "sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.2", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -743,9 +1264,9 @@ } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -796,30 +1317,30 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", + "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/helper-remap-async-to-generator": "^7.7.0", "@babel/plugin-syntax-async-generators": "^7.2.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz", + "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-create-class-features-plugin": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", + "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -857,14 +1378,13 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", + "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-async-generators": { @@ -895,9 +1415,9 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz", + "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -939,6 +1459,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz", + "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-syntax-typescript": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", @@ -958,14 +1487,36 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", + "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-remap-async-to-generator": "^7.7.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { @@ -978,9 +1529,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz", - "integrity": "sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1044,14 +1595,13 @@ } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", + "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-duplicate-keys": { @@ -1074,9 +1624,9 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", - "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.6.3.tgz", + "integrity": "sha512-l0ETkyEofkqFJ9LS6HChNIKtVJw2ylKbhYMlJ5C6df+ldxxaLIyXY4yOdDQQspfFpV8/vDiaWoJlvflstlYNxg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1166,16 +1716,36 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", + "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-hoist-variables": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" }, "dependencies": { + "@babel/helper-hoist-variables": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", + "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "babel-plugin-dynamic-import-node": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", @@ -1188,22 +1758,94 @@ } }, "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", + "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", - "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", - "dev": true, - "requires": { - "regexpu-core": "^4.6.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", + "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-simple-access": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", + "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "dev": true, + "requires": { + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/parser": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", + "dev": true + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", + "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0" } }, "@babel/plugin-transform-new-target": { @@ -1286,9 +1928,9 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", + "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" @@ -1333,9 +1975,9 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -1371,9 +2013,9 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.0.tgz", - "integrity": "sha512-yzw7EopOOr6saONZ3KA3lpizKnWRTe+rfBqg4AmQbSow7ik7fqmzrfIqt053osLwLE2AaTqGinLM2tl6+M/uog==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.3.tgz", + "integrity": "sha512-aiWINBrPMSC3xTXRNM/dfmyYuPNKY/aexYqBgh0HBI5Y+WO5oRAqW/oROYeYHrF4Zw12r9rK4fMk/ZlAmqx/FQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.6.0", @@ -1405,9 +2047,9 @@ } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", + "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1418,20 +2060,19 @@ } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", + "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/polyfill": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.6.0.tgz", - "integrity": "sha512-q5BZJI0n/B10VaQQvln1IlDK3BTBJFbADx7tv+oXDPIDZuTo37H5Adb9jhlXm/fEN4Y7/64qD9mnrJJG7rmaTw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.7.0.tgz", + "integrity": "sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ==", "dev": true, "requires": { "core-js": "^2.6.5", @@ -1439,9 +2080,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", "dev": true }, "regenerator-runtime": { @@ -1453,56 +2094,57 @@ } }, "@babel/preset-env": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.2.tgz", - "integrity": "sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", + "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.0", + "@babel/plugin-proposal-dynamic-import": "^7.7.0", "@babel/plugin-proposal-json-strings": "^7.2.0", "@babel/plugin-proposal-object-rest-spread": "^7.6.2", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", "@babel/plugin-syntax-async-generators": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-syntax-top-level-await": "^7.7.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-async-to-generator": "^7.7.0", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.2", - "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.7.0", "@babel/plugin-transform-computed-properties": "^7.2.0", "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.6.2", + "@babel/plugin-transform-dotall-regex": "^7.7.0", "@babel/plugin-transform-duplicate-keys": "^7.5.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.7.0", "@babel/plugin-transform-literals": "^7.2.0", "@babel/plugin-transform-member-expression-literals": "^7.2.0", "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.6.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2", + "@babel/plugin-transform-modules-commonjs": "^7.7.0", + "@babel/plugin-transform-modules-systemjs": "^7.7.0", + "@babel/plugin-transform-modules-umd": "^7.7.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", "@babel/plugin-transform-new-target": "^7.4.4", "@babel/plugin-transform-object-super": "^7.5.5", "@babel/plugin-transform-parameters": "^7.4.4", "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-regenerator": "^7.7.0", "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.6.2", "@babel/plugin-transform-sticky-regex": "^7.2.0", "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.6.2", - "@babel/types": "^7.6.0", + "@babel/plugin-transform-unicode-regex": "^7.7.0", + "@babel/types": "^7.7.1", "browserslist": "^4.6.0", "core-js-compat": "^3.1.1", "invariant": "^2.2.2", @@ -1510,39 +2152,217 @@ "semver": "^5.5.0" }, "dependencies": { - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz", - "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==", + "@babel/helper-annotate-as-pure": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", + "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", + "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/types": "^7.7.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", + "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0", "lodash": "^4.17.13" } }, - "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "@babel/helper-optimise-call-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", + "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "dev": true, + "requires": { + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/parser": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", + "dev": true + }, + "@babel/plugin-transform-classes": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", + "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-define-map": "^7.7.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", + "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", "dev": true, "requires": { + "@babel/helper-function-name": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", + "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.7.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + } + } + }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1550,17 +2370,53 @@ "to-fast-properties": "^2.0.0" } }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "ms": "^2.1.1" } }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1570,9 +2426,9 @@ } }, "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.6.3.tgz", + "integrity": "sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1593,16 +2449,56 @@ } }, "@babel/register": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.6.2.tgz", - "integrity": "sha512-xgZk2LRZvt6i2SAUWxc7ellk4+OYRgS3Zpsnr13nMS1Qo25w21Uu8o6vTOAqNaxiqrnv30KTYzh9YWY2k21CeQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.7.0.tgz", + "integrity": "sha512-HV3GJzTvSoyOMWGYn2TAh6uL6g+gqKTgEZ99Q3+X9UURT1VPT/WcU46R61XftIc5rXytcOHZ4Z0doDlsjPomIg==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", "lodash": "^4.17.13", - "mkdirp": "^0.5.1", + "make-dir": "^2.1.0", "pirates": "^4.0.0", - "source-map-support": "^0.5.9" + "source-map-support": "^0.5.16" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } } }, "@babel/runtime": { @@ -1837,9 +2733,9 @@ } }, "@emotion/core": { - "version": "10.0.17", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.17.tgz", - "integrity": "sha512-gykyjjr0sxzVuZBVTVK4dUmYsorc2qLhdYgSiOVK+m7WXgcYTKZevGWZ7TLAgTZvMelCTvhNq8xnf8FR1IdTbg==", + "version": "10.0.20", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.20.tgz", + "integrity": "sha512-Vwzx/fcIHoaUzZSzYs75T1qaMrhpkvZwKfbRKBExu296t0CDUJ4RX3UMSiUB+nbHEF1cftz6bop0DXv1NXQt4Q==", "dev": true, "requires": { "@babel/runtime": "^7.5.5", @@ -1900,12 +2796,6 @@ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.3.tgz", "integrity": "sha512-2Md9mH6mvo+ygq1trTeVp2uzAKwE2P7In0cRpD/M9Q70aH8L+rxMLbb3JCN2JoSWsV2O+DdFjfbbXoMoLBczow==", "dev": true - }, - "@emotion/unitless": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz", - "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==", - "dev": true } } }, @@ -1922,9 +2812,9 @@ "dev": true }, "@emotion/unitless": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.3.tgz", - "integrity": "sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz", + "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==", "dev": true }, "@emotion/utils": { @@ -1961,116 +2851,39 @@ "relay-runtime": "2.0.0", "signedsource": "^1.0.0", "yargs": "^9.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "@hapi/address": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz", - "integrity": "sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==" - }, - "@hapi/hoek": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz", - "integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow==" - }, - "@hapi/joi": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.4.tgz", - "integrity": "sha512-m7ctezhxjob+dSpXnCNlgAj6rrEpdSsaWu3GWL3g1AybQCU36mlAo9IwGFJwIxD+oHgdO6mYyviYlaejX+qN6g==", - "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + } + }, + "@hapi/address": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.1.tgz", + "integrity": "sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/formula": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", + "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==" + }, + "@hapi/hoek": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.4.tgz", + "integrity": "sha512-Ze5SDNt325yZvNO7s5C4fXDscjJ6dcqLFXJQ/M7dZRQCewuDj2iDUuBi6jLQt+APbW9RjjVEvLr35FXuOEqjow==" + }, + "@hapi/joi": { + "version": "16.1.7", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.7.tgz", + "integrity": "sha512-anaIgnZhNooG3LJLrTFzgGALTiO97zRA1UkvQHm9KxxoSiIzCozB3RCNCpDnfhTJD72QlrHA8nwGmNgpFFCIeg==", + "requires": { + "@hapi/address": "^2.1.2", + "@hapi/formula": "^1.2.0", + "@hapi/hoek": "^8.2.4", + "@hapi/pinpoint": "^1.0.2", + "@hapi/topo": "^3.1.3" }, "dependencies": { "@hapi/address": { @@ -2150,11 +2963,12 @@ } }, "@octokit/endpoint": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.3.6.tgz", - "integrity": "sha512-XuerByak8H+jW9J/rVMEdBXfI4UTsDWUwAKgIP/uhQjXIUVdPRwt2Zg+SmbWQ+WY7pRkw/hFVES8C4G/Kle7oA==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz", + "integrity": "sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg==", "dev": true, "requires": { + "@octokit/types": "^2.0.0", "is-plain-object": "^3.0.0", "universal-user-agent": "^4.0.0" }, @@ -2177,13 +2991,14 @@ } }, "@octokit/request": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.1.0.tgz", - "integrity": "sha512-I15T9PwjFs4tbWyhtFU2Kq7WDPidYMvRB7spmxoQRZfxSmiqullG+Nz+KbSmpkfnlvHwTr1e31R5WReFRKMXjg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.1.tgz", + "integrity": "sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==", "dev": true, "requires": { - "@octokit/endpoint": "^5.1.0", + "@octokit/endpoint": "^5.5.0", "@octokit/request-error": "^1.0.1", + "@octokit/types": "^2.0.0", "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", @@ -2209,22 +3024,23 @@ } }, "@octokit/request-error": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.0.4.tgz", - "integrity": "sha512-L4JaJDXn8SGT+5G0uX79rZLv0MNJmfGa4vb4vy1NnpjSnWDLJRy6m90udGwvMmavwsStgbv2QNkPzzTCMmL+ig==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.0.tgz", + "integrity": "sha512-DNBhROBYjjV/I9n7A8kVkmQNkqFAMem90dSxqvPq57e2hBr7mNTX98y3R2zDpqMQHVRpBDjsvsfIGgBzy+4PAg==", "dev": true, "requires": { + "@octokit/types": "^2.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/rest": { - "version": "16.30.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.30.1.tgz", - "integrity": "sha512-1n2QzTbbaBXNLpx7WHlcsSMdJvxSdKmerXQm+bMYlKDbQM19uq446ZpGs7Ynq5SsdLj1usIfgJ9gJf4LtcWkDw==", + "version": "16.34.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.34.1.tgz", + "integrity": "sha512-JUoS12cdktf1fv86rgrjC/RvYLuL+o7p57W7zX1x7ANFJ7OvdV8emvUNkFlcidEaOkYrxK3SoWgQFt3FhNmabA==", "dev": true, "requires": { - "@octokit/request": "^5.0.0", + "@octokit/request": "^5.2.0", "@octokit/request-error": "^1.0.2", "atob-lite": "^2.0.0", "before-after-hook": "^2.0.0", @@ -2238,6 +3054,15 @@ "universal-user-agent": "^4.0.0" } }, + "@octokit/types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.0.1.tgz", + "integrity": "sha512-YDYgV6nCzdGdOm7wy43Ce8SQ3M5DMKegB8E5sTB/1xrxOdo2yS/KgUgML2N2ZGD621mkbdrAglwTyA4NDOlFFA==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + }, "@pieh/friendly-errors-webpack-plugin": { "version": "1.7.0-chalk-2", "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", @@ -2257,15 +3082,15 @@ "dev": true }, "@popmotion/popcorn": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@popmotion/popcorn/-/popcorn-0.3.4.tgz", - "integrity": "sha512-pAp8qZT7Mjoutt3eH+wIyb0P8fINO1JNU16OdYcgST6FgX7+AG7vNic4SDDLnkSt60BuEYkZ9V0IQq3PnItx0Q==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@popmotion/popcorn/-/popcorn-0.4.2.tgz", + "integrity": "sha512-wu0tEwK3KUZ9BoqfcqC3DfdfRDws/oHXwZKJMVtuhXSrF/PtqvilsPjAk93nh8M+orAnbe8ZyxQmop9+4oJs2g==", "dev": true, "requires": { "@popmotion/easing": "^1.0.1", "framesync": "^4.0.1", - "hey-listen": "^1.0.5", - "style-value-types": "^3.1.0" + "hey-listen": "^1.0.8", + "style-value-types": "^3.1.6" } }, "@reach/router": { @@ -2302,49 +3127,49 @@ } }, "@sentry/core": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.6.2.tgz", - "integrity": "sha512-grbjvNmyxP5WSPR6UobN2q+Nss7Hvz+BClBT8QTr7VTEG5q89TwNddn6Ej3bGkaUVbct/GpVlI3XflWYDsnU6Q==", - "requires": { - "@sentry/hub": "5.6.1", - "@sentry/minimal": "5.6.1", - "@sentry/types": "5.6.1", - "@sentry/utils": "5.6.1", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.7.1.tgz", + "integrity": "sha512-AOn3k3uVWh2VyajcHbV9Ta4ieDIeLckfo7UMLM+CTk2kt7C89SayDGayJMSsIrsZlL4qxBoLB9QY4W2FgAGJrg==", + "requires": { + "@sentry/hub": "5.7.1", + "@sentry/minimal": "5.7.1", + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", "tslib": "^1.9.3" } }, "@sentry/hub": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.6.1.tgz", - "integrity": "sha512-m+OhkIV5yTAL3R1+XfCwzUQka0UF/xG4py8sEfPXyYIcoOJ2ZTX+1kQJLy8QQJ4RzOBwZA+DzRKP0cgzPJ3+oQ==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.7.1.tgz", + "integrity": "sha512-evGh323WR073WSBCg/RkhlUmCQyzU0xzBzCZPscvcoy5hd4SsLE6t9Zin+WACHB9JFsRQIDwNDn+D+pj3yKsig==", "requires": { - "@sentry/types": "5.6.1", - "@sentry/utils": "5.6.1", + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", "tslib": "^1.9.3" } }, "@sentry/minimal": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.6.1.tgz", - "integrity": "sha512-ercCKuBWHog6aS6SsJRuKhJwNdJ2oRQVWT2UAx1zqvsbHT9mSa8ZRjdPHYOtqY3DoXKk/pLUFW/fkmAnpdMqRw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.7.1.tgz", + "integrity": "sha512-nS/Dg+jWAZtcxQW8wKbkkw4dYvF6uyY/vDiz/jFCaux0LX0uhgXAC9gMOJmgJ/tYBLJ64l0ca5LzpZa7BMJQ0g==", "requires": { - "@sentry/hub": "5.6.1", - "@sentry/types": "5.6.1", + "@sentry/hub": "5.7.1", + "@sentry/types": "5.7.1", "tslib": "^1.9.3" } }, "@sentry/node": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.6.2.tgz", - "integrity": "sha512-A9CELco6SjF4zt8iS1pO3KdUVI2WVhtTGhSH6X04OVf2en1fimPR+Vs8YVY/04udwd7o+3mI6byT+rS9+/Qzow==", - "requires": { - "@sentry/core": "5.6.2", - "@sentry/hub": "5.6.1", - "@sentry/types": "5.6.1", - "@sentry/utils": "5.6.1", - "cookie": "0.3.1", - "https-proxy-agent": "2.2.1", - "lru_map": "0.3.3", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.7.1.tgz", + "integrity": "sha512-hVM10asFStrOhYZzMqFM7V1lrHkr1ydc2n/SFG0ZmIQxfTjCVElyXV/BJASIdqadM1fFIvvtD/EfgkTcZmub1g==", + "requires": { + "@sentry/core": "5.7.1", + "@sentry/hub": "5.7.1", + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", + "cookie": "^0.3.1", + "https-proxy-agent": "^3.0.0", + "lru_map": "^0.3.3", "tslib": "^1.9.3" }, "dependencies": { @@ -2357,11 +3182,11 @@ } }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.0.tgz", + "integrity": "sha512-y4jAxNEihqvBI5F3SaO2rtsjIOnnNA8sEbuiP+UhJZJHeM2NRm6c09ax2tgqme+SgUUvjao2fJXF4h3D6Cb2HQ==", "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" } }, @@ -2373,16 +3198,16 @@ } }, "@sentry/types": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.6.1.tgz", - "integrity": "sha512-Kub8TETefHpdhvtnDj3kKfhCj0u/xn3Zi2zIC7PB11NJHvvPXENx97tciz4roJGp7cLRCJsFqCg4tHXniqDSnQ==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.7.1.tgz", + "integrity": "sha512-tbUnTYlSliXvnou5D4C8Zr+7/wJrHLbpYX1YkLXuIJRU0NSi81bHMroAuHWILcQKWhVjaV/HZzr7Y/hhWtbXVQ==" }, "@sentry/utils": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.6.1.tgz", - "integrity": "sha512-rfgha+UsHW816GqlSRPlniKqAZylOmQWML2JsujoUP03nPu80zdN43DK9Poy/d9OxBxv0gd5K2n+bFdM2kqLQQ==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.7.1.tgz", + "integrity": "sha512-nhirUKj/qFLsR1i9kJ5BRvNyzdx/E2vorIsukuDrbo8e3iZ11JMgCOVrmC8Eq9YkHBqgwX4UnrPumjFyvGMZ2Q==", "requires": { - "@sentry/types": "5.6.1", + "@sentry/types": "5.7.1", "tslib": "^1.9.3" } }, @@ -2446,9 +3271,9 @@ } }, "@types/chai": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.3.tgz", - "integrity": "sha512-VRw2xEGbll3ZiTQ4J02/hUjNqZoue1bMhoo2dgM2LXjDdyaq4q80HgBDHwpI0/VKlo4Eg+BavyQMv/NYgTetzA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.4.tgz", + "integrity": "sha512-7qvf9F9tMTzo0akeswHPGqgUx/gIaJqrOEET/FCD8CFRkSUHlygQiM5yB6OvjrtdxBVLSyw7COJubsFYs0683g==", "dev": true }, "@types/chai-enzyme": { @@ -2530,9 +3355,9 @@ "dev": true }, "@types/invariant": { - "version": "2.2.29", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.29.tgz", - "integrity": "sha512-lRVw09gOvgviOfeUrKc/pmTiRZ7g7oDOU6OAutyuSHpm1/o2RaBQvRhgK8QEdu+FFuw/wnWb29A/iuxv9i8OpQ==", + "version": "2.2.30", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz", + "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag==", "dev": true }, "@types/json-schema": { @@ -2591,9 +3416,9 @@ "dev": true }, "@types/node": { - "version": "12.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", - "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==", + "version": "12.12.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.6.tgz", + "integrity": "sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA==", "dev": true }, "@types/normalize-package-data": { @@ -2609,9 +3434,9 @@ "dev": true }, "@types/reach__router": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.4.tgz", - "integrity": "sha512-a+MFhebeSGi0LwHZ0UhH/ke77rWtNQnt8YmaHnquSaY3HmyEi+BPQi3GhPcUPnC9X5BLw/qORw3BPxGb1mCtEw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.6.tgz", + "integrity": "sha512-Oh5DAVr/L2svBvubw6QEFpXGu295Y406BPs4i9t1n2pp7M+q3pmCmhzb9oZV5wncR41KCD3NHl1Yhi7uKnTPsA==", "dev": true, "requires": { "@types/history": "*", @@ -2629,36 +3454,36 @@ } }, "@types/react-dom": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.0.tgz", - "integrity": "sha512-OL2lk7LYGjxn4b0efW3Pvf2KBVP0y1v3wip1Bp7nA79NkOpElH98q3WdCEdDj93b2b0zaeBG9DvriuKjIK5xDA==", + "version": "16.9.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.3.tgz", + "integrity": "sha512-FUuZKXPr9qlzUT9lhuzrZgLjH63TvNn28Ch3MvKG4B+F52zQtO8DtE0Opbncy3xaucNZM2WIPfuNTgkbKx5Brg==", "dev": true, "requires": { "@types/react": "*" } }, "@types/react-helmet": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.10.tgz", - "integrity": "sha512-wGr0J7yncqwOS4ae+yYeMd4L3Gh43CgYcbq9bXEeSozB4d/+Z/XLT9wyMUwfWImWtOLCFLP6Xnt7w5P6+02gZg==", + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.14.tgz", + "integrity": "sha512-Q73FFg7+LjblfSQUNbnjrwy2T1avBP8yevEgNrkDjyz1rBbnXkuOQcEV7I5wvmAic9FLUk0CnkLieEDej84Zkw==", "dev": true, "requires": { "@types/react": "*" } }, "@types/react-modal": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.8.3.tgz", - "integrity": "sha512-UBSa21GApA6Jly7ll9OQnZmEDttEJ8joy2TrfIEdf5bK6Sr8VTb3zHX0sPx7FTFDFdM9NpG4X0s5Dd2OXVTRhg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.10.0.tgz", + "integrity": "sha512-HOBSGwtaZXACvYI2kdhOiAG+CtwCxq62TwayFxtsGDtOvBxE4vxKCQI7LnhrihoDchVarqvnH7GKZ8xXHjs+yg==", "dev": true, "requires": { "@types/react": "*" } }, "@types/react-select": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.4.tgz", - "integrity": "sha512-Po4P/ZbUHXGx5ivdF84q8rxL4MPdjCy5ikaS5l9/e+cGfhFzrJi0ahCu+gJZndsWKf8uYFq3WpC4M8klFQb8lg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.8.tgz", + "integrity": "sha512-0763TXYZc8bTiHM+DUnWoy9Rg5mk6PxYWBrEe6Fkjgc0Kv0r1RqjZk9/BrK4wdM0RNjYjixlFPnUhOJb76sMGg==", "dev": true, "requires": { "@types/react": "*", @@ -2667,14 +3492,20 @@ } }, "@types/react-transition-group": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.2.tgz", - "integrity": "sha512-YfoaTNqBwbIqpiJ5NNfxfgg5kyFP1Hqf/jqBtSWNv0E+EkkxmN+3VD6U2fu86tlQvdAc1o0SdWhnWFwcRMTn9A==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz", + "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==", "dev": true, "requires": { "@types/react": "*" } }, + "@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true + }, "@types/styled-components": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-4.1.8.tgz", @@ -3081,13 +3912,13 @@ } }, "airbnb-prop-types": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz", - "integrity": "sha512-2FN6DlHr6JCSxPPi25EnqGaXC4OC3/B3k1lCd6MMYrZ51/Gf/1qDfaR+JElzWa+Tl7cY2aYOlsYJGFeQyVHIeQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", + "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", "dev": true, "requires": { - "array.prototype.find": "^2.0.4", - "function.prototype.name": "^1.1.0", + "array.prototype.find": "^2.1.0", + "function.prototype.name": "^1.1.1", "has": "^1.0.3", "is-regex": "^1.0.4", "object-is": "^1.0.1", @@ -3095,9 +3926,30 @@ "object.entries": "^1.1.0", "prop-types": "^15.7.2", "prop-types-exact": "^1.2.0", - "react-is": "^16.8.6" + "react-is": "^16.9.0" }, "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "function.prototype.name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", + "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1", + "functions-have-names": "^1.1.1", + "is-callable": "^1.1.4" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3107,10 +3959,22 @@ "function-bind": "^1.1.1" } }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", + "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", "dev": true } } @@ -3404,17 +4268,21 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.0", "is-callable": "^1.1.4", "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { @@ -3528,6 +4396,87 @@ } } }, + "array.prototype.flatmap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.2.tgz", + "integrity": "sha512-ZZtPLE74KNE+0XcPv/vQmcivxN+8FhwOLvt2udHauO0aDEpsXDQrmd5HuJGpgPVyaV8HvkDPWnJ2iaem0oCKtA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", @@ -3662,9 +4611,9 @@ "dev": true }, "auto-bind": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-2.1.0.tgz", - "integrity": "sha512-qZuFvkes1eh9lB2mg8/HG18C+5GIO51r+RrCSst/lh+i5B1CtVlkhTE488M805Nr3dKl0sM/pIFKSKUIlg3zUg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-2.1.1.tgz", + "integrity": "sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==", "dev": true, "optional": true, "requires": { @@ -3672,29 +4621,50 @@ } }, "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", "dev": true, "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.17", - "postcss-value-parser": "^4.0.0" + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "semver": "^6.3.0" } }, "postcss-value-parser": { @@ -3726,9 +4696,9 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", "dev": true } } @@ -3886,9 +4856,9 @@ } }, "babel-plugin-emotion": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.19.tgz", - "integrity": "sha512-1pJb5uKN/gx6bi3gGr588Krj49sxARI9KmxhtMUa+NRJb6lR3OfC51mh3NlWRsOqdjWlT4cSjnZpnFq5K3T5ZA==", + "version": "10.0.20", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.20.tgz", + "integrity": "sha512-Lmyc1wk+zdvz9LY0IZub51fwTxsptxdvBR7aGGmPit9PX7suYUtndFcge945TNqcz7MZxbMxlo52RaRxH+3wiw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -4099,9 +5069,9 @@ } }, "babel-plugin-remove-graphql-queries": { - "version": "2.7.7", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.7.tgz", - "integrity": "sha512-/bmTuUkkLtim99qe7Lj3VBTLsOX3nxeuwtkqb4q3ybuynpP2rYuLUUQ3Z5Lq+1sT63ImN49+q8EiP+BMXstEAQ==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.14.tgz", + "integrity": "sha512-GnAZhBChCjAg0NyZMmZureWmBXijbAK7wreEpsoI1oP5hCuHcvWknDU4u5PjoVdLyJ+8ObJ86Y/Y4uzrqcg/qg==", "dev": true }, "babel-plugin-styled-components": { @@ -4141,9 +5111,9 @@ "dev": true }, "babel-preset-fbjs": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz", - "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", @@ -4176,181 +5146,30 @@ } }, "babel-preset-gatsby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.17.tgz", - "integrity": "sha512-6jR7z54Rj1QYUN5UMYOMWYpY0cGNRVyqT9bOgao32c9Fs7AUi5m6mgTDW/jHuhND0HQy8Hfstc1apoXr/D5KQg==", + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.20.tgz", + "integrity": "sha512-vKDeNhszAjTiHpgIyzLOxf9NCY9Jbw7k2yi6m4i9b9uPySCU19b/oRifYA0bC5cRj76vfoicSjykFGuwjj0Tyw==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.5.5", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-runtime": "^7.6.2", "@babel/plugin-transform-spread": "^7.6.2", - "@babel/preset-env": "^7.6.2", - "@babel/preset-react": "^7.0.0", - "@babel/runtime": "^7.6.2", + "@babel/preset-env": "^7.6.3", + "@babel/preset-react": "^7.6.3", + "@babel/runtime": "^7.6.3", "babel-plugin-dynamic-import-node": "^1.2.0", "babel-plugin-macros": "^2.6.1", "babel-plugin-transform-react-remove-prop-types": "^0.4.24" }, "dependencies": { - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz", - "integrity": "sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", - "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", - "dev": true, - "requires": { - "regexpu-core": "^4.6.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", - "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" - } - }, - "@babel/preset-env": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.2.tgz", - "integrity": "sha512-Ru7+mfzy9M1/YTEtlDS8CD45jd22ngb9tXnn64DvQK3ooyqSw9K4K9DUWmYknTTVk4TqygL9dqCrZgm1HMea/Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-dynamic-import": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.6.2", - "@babel/plugin-transform-classes": "^7.5.5", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.6.2", - "@babel/plugin-transform-duplicate-keys": "^7.5.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.6.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.2", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.5.5", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.6.2", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.6.2", - "@babel/types": "^7.6.0", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" - } - }, - "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "regenerator-runtime": "^0.13.2" } }, "regenerator-runtime": { @@ -4358,12 +5177,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true } } }, @@ -4532,9 +5345,9 @@ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", "dev": true }, "bn.js": { @@ -4775,9 +5588,9 @@ } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -4901,9 +5714,9 @@ }, "dependencies": { "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "lru-cache": { @@ -4931,9 +5744,9 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } @@ -4964,9 +5777,9 @@ } }, "cache-manager": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.10.0.tgz", - "integrity": "sha512-IuPx05r5L0uZyBDYicB2Llld1o+/1WYjoHUnrC0TNQejMAnkoYxYS9Y8Uwr+lIBytDiyu7dwwmBCup2M9KugwQ==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.10.1.tgz", + "integrity": "sha512-bk17v9IkLqNcbCzggEh82LEJhjHp+COnL57L7a0ESbM/cOuXIIBatdVjD/ps7vOsofI48++zAC14Ye+8v50flg==", "dev": true, "requires": { "async": "1.5.2", @@ -5360,14 +6173,37 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + } + } + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "semver": "^6.3.0" } } } @@ -5560,25 +6396,25 @@ } }, "chokidar": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", - "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.3.tgz", + "integrity": "sha512-GtrxGuRf6bzHQmXWRepvsGnXpkQkVU+D2/9a7dAe4a7v1NhrfZOZ2oKf76M3nOs46fFYL8D+Q8JYA4GYeJ8Cjw==", "dev": true, "requires": { - "anymatch": "^3.0.1", - "braces": "^3.0.2", - "fsevents": "^2.0.6", - "glob-parent": "^5.0.0", - "is-binary-path": "^2.1.0", - "is-glob": "^4.0.1", - "normalize-path": "^3.0.0", - "readdirp": "^3.1.1" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" }, "dependencies": { "anymatch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz", - "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -5610,16 +6446,16 @@ } }, "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz", + "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==", "dev": true, "optional": true }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -5656,9 +6492,9 @@ "dev": true }, "readdirp": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", - "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, "requires": { "picomatch": "^2.0.4" @@ -5676,9 +6512,9 @@ } }, "chownr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", - "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true }, "chrome-trace-event": { @@ -5839,12 +6675,6 @@ } } }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", - "dev": true - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -6129,9 +6959,9 @@ "dev": true }, "comment-parser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.6.2.tgz", - "integrity": "sha512-Wdms0Q8d4vvb2Yk72OwZjwNWtMklbC5Re7lD9cjCP/AG1fhocmc0TrxGBBAXPLy8fZQPrfHGgyygwI0lA7pbzA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.0.tgz", + "integrity": "sha512-m0SGP0RFO4P3hIBlIor4sBFPe5Y4HUeGgo/UZK/1Zdea5eUiqxroQ3lFqBDDSfWo9z9Q6LLnt2u0JqwacVEd/A==", "dev": true }, "common-tags": { @@ -6171,9 +7001,9 @@ }, "dependencies": { "mime-db": { - "version": "1.41.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.41.0.tgz", - "integrity": "sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw==", + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", "dev": true } } @@ -6256,13 +7086,13 @@ } }, "concurrently": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", - "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.0.tgz", + "integrity": "sha512-1yDvK8mduTIdxIxV9C60KoiOySUl/lfekpdbI+U5GXaPrgdffEavFa9QZB3vh68oWOpbCC+TuvxXV9YRPMvUrA==", "dev": true, "requires": { "chalk": "^2.4.2", - "date-fns": "^1.30.1", + "date-fns": "^2.0.1", "lodash": "^4.17.15", "read-pkg": "^4.0.1", "rxjs": "^6.5.2", @@ -6286,9 +7116,9 @@ } }, "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.5.1.tgz", + "integrity": "sha512-ZBrQmuaqH9YqIejbgu8f09ki7wdD2JxWsRTZ/+HnnLNmkI56ty0evnWzKY+ihLT0xX5VdUX0vDNZCxJJGKX2+Q==", "dev": true }, "decamelize": { @@ -6428,15 +7258,6 @@ "pify": "^3.0.0" } }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -6485,9 +7306,9 @@ } }, "config": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/config/-/config-3.2.2.tgz", - "integrity": "sha512-rOsfIOAcG82AWouK4/vBS/OKz3UPl2T/kP0irExmXJJOoWg2CmdfPLdx56bCoMUMFNh+7soQkQWCUC8DyemiwQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/config/-/config-3.2.4.tgz", + "integrity": "sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw==", "requires": { "json5": "^1.0.1" } @@ -6507,9 +7328,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", - "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", "dev": true }, "connect-history-api-fallback": { @@ -6519,13 +7340,10 @@ "dev": true }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "1.0.0", @@ -6649,48 +7467,37 @@ "dev": true }, "core-js-compat": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.2.1.tgz", - "integrity": "sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.0.tgz", + "integrity": "sha512-pgQUcgT2+v9/yxHgMynYjNj7nmxLRXv3UC39rjCjDwpe63ev2rioQTju1PKLYUBbPCQQvZNWvQC8tBJd65q11g==", "dev": true, "requires": { - "browserslist": "^4.6.6", + "browserslist": "^4.7.2", "semver": "^6.3.0" }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" } }, - "electron-to-chromium": { - "version": "1.3.257", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.257.tgz", - "integrity": "sha512-EcKVmUeHCZelPA0wnIaSmpAN8karKhKBwFb+xLUjSVZ8sGRE1l3fst1zQZ7KJUkyJ7H5edPd4RP94pzC9sG00A==", + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", "dev": true }, - "node-releases": { - "version": "1.1.30", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.30.tgz", - "integrity": "sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==", - "dev": true, - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true } } }, @@ -6710,13 +7517,14 @@ } }, "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { + "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", + "js-yaml": "^3.13.1", "parse-json": "^4.0.0" }, "dependencies": { @@ -6857,9 +7665,9 @@ } }, "cross-env": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.0.tgz", - "integrity": "sha512-G/B6gtkjgthT8AP/xN1wdj5Xe18fVyk58JepK8GxpUbqcz3hyWxegocMbvnZK+KoTslwd0ACZ3woi/DVUdVjyQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", "requires": { "cross-spawn": "^7.0.0" }, @@ -7068,9 +7876,9 @@ } }, "css-to-react-native": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.1.tgz", - "integrity": "sha512-yO+oEx1Lf+hDKasqQRVrAvzMCz825Huh1VMlEEDlRWyAhFb/FWb6I0KpEF1PkyKQ7NEdcx9d5M2ZEWgJAsgPvQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", + "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", "dev": true, "requires": { "camelize": "^1.0.0", @@ -7242,13 +8050,14 @@ "dev": true }, "cypress": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.4.1.tgz", - "integrity": "sha512-1HBS7t9XXzkt6QHbwfirWYty8vzxNMawGj1yI+Fu6C3/VZJ8UtUngMW6layqwYZzLTZV8tiDpdCNBypn78V4Dg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.6.0.tgz", + "integrity": "sha512-ODhbOrH1XZx0DUoYmJSvOSbEQjycNOpFYe7jOnHkT1+sdsn2+uqwAjZ1x982q3H4R/5iZjpSd50gd/iw2bofzg==", "dev": true, "requires": { "@cypress/listr-verbose-renderer": "0.4.1", "@cypress/xvfb": "1.2.4", + "@types/sizzle": "2.3.2", "arch": "2.1.1", "bluebird": "3.5.0", "cachedir": "1.3.0", @@ -7275,6 +8084,7 @@ "request-progress": "3.0.0", "supports-color": "5.5.0", "tmp": "0.1.0", + "untildify": "3.0.3", "url": "0.11.0", "yauzl": "2.10.0" }, @@ -7556,9 +8366,9 @@ "dev": true }, "danger": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/danger/-/danger-9.2.1.tgz", - "integrity": "sha512-kKU/Yo1IZTJ/CrlK6A0VPz7KZnnADFpgDM8557sv61nNN3V44k2fwflpEGpBgzhbHLphKx9R35skObQ7zPS12g==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/danger/-/danger-9.2.4.tgz", + "integrity": "sha512-d8EMe4lBbNM2ks+DMfYTbo7qEu+oKlBE76WzONmVCNb0B1T3Kc7jUeSutcOHH32pOMMlp8tqZmzVaVfqln9RTA==", "dev": true, "requires": { "@babel/polyfill": "^7.2.5", @@ -7609,9 +8419,9 @@ } }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -7657,12 +8467,6 @@ "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7948,9 +8752,9 @@ "dev": true }, "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", "dev": true }, "detect-node": { @@ -8004,9 +8808,9 @@ } }, "@types/node": { - "version": "7.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.7.tgz", - "integrity": "sha512-4I7+hXKyq7e1deuzX9udu0hPIYqSSkdKXtjow6fMnQ3OR9qkxIErGHbGY08YrfZJrCS1ajK8lOuzd0k3n2WM4A==", + "version": "7.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.9.tgz", + "integrity": "sha512-usSpgoUsRtO5xNV5YEPU8PPnHisFx8u0rokj1BPVn/hDF7zwUDzVLiuKZM38B7z8V2111Fj6kd4rGtQFUZpNOw==", "dev": true }, "tmp": { @@ -8215,9 +9019,9 @@ } }, "dotenv": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", - "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, "duplexer": { "version": "0.1.1", @@ -8386,49 +9190,74 @@ } }, "engine.io": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz", - "integrity": "sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz", + "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", + "base64id": "2.0.0", "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~6.1.0" + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" }, "dependencies": { + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", + "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "^1.0.0" } } } }, "engine.io-client": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.2.tgz", - "integrity": "sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz", + "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==", "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", "parseqs": "0.0.5", @@ -8439,14 +9268,33 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "ws": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", @@ -8471,14 +9319,62 @@ } }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "entities": { @@ -8614,17 +9510,18 @@ } }, "enzyme-adapter-react-16": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz", - "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz", + "integrity": "sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA==", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.12.0", + "enzyme-adapter-utils": "^1.12.1", + "enzyme-shallow-equal": "^1.0.0", "has": "^1.0.3", "object.assign": "^4.1.0", "object.values": "^1.1.0", "prop-types": "^15.7.2", - "react-is": "^16.8.6", + "react-is": "^16.10.2", "react-test-renderer": "^16.0.0-0", "semver": "^5.7.0" }, @@ -8639,17 +9536,21 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.0", "is-callable": "^1.1.4", "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { @@ -8706,50 +9607,163 @@ } }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", + "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "enzyme-adapter-utils": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz", - "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz", + "integrity": "sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g==", "dev": true, "requires": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", + "airbnb-prop-types": "^2.15.0", + "function.prototype.name": "^1.1.1", "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", + "object.fromentries": "^2.0.1", "prop-types": "^15.7.2", - "semver": "^5.6.0" + "semver": "^5.7.0" }, "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "eol": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.8.1.tgz", - "integrity": "sha1-3vwyJJkMfspzuzRGGlbPncJHYdA=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "es-abstract": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "function.prototype.name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", + "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1", + "functions-have-names": "^1.1.1", + "is-callable": "^1.1.4" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.fromentries": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", + "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "enzyme-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.0.tgz", + "integrity": "sha512-VUf+q5o1EIv2ZaloNQQtWCJM9gpeux6vudGVH6vLmfPXFLRuxl5+Aq3U260wof9nn0b0i+P5OEUXm1vnxkRpXQ==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object-is": "^1.0.1" + }, + "dependencies": { + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + } + } + }, + "eol": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.8.1.tgz", + "integrity": "sha1-3vwyJJkMfspzuzRGGlbPncJHYdA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { @@ -8766,12 +9780,12 @@ } }, "error-stack-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.3.tgz", - "integrity": "sha512-vRC4rKv87twMZy92X4+TmUdv3iYMsmePbpG/YguHsfzmZ8bYJZYYep7yrXH09yFUaCEPKgNK5X79+Yq7hwLVOA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", + "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", "dev": true, "requires": { - "stackframe": "^1.0.4" + "stackframe": "^1.1.0" } }, "es-abstract": { @@ -9003,21 +10017,21 @@ } }, "eslint-config-prettier": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.3.0.tgz", - "integrity": "sha512-EWaGjlDAZRzVFveh2Jsglcere2KK5CJBhkNSa1xs3KfMUGdRiT7lG089eqPdvlzWHpAqaekubOsOMu8W8Yk71A==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz", + "integrity": "sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ==", "dev": true, "requires": { "get-stdin": "^6.0.0" } }, "eslint-config-react-app": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz", - "integrity": "sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.0.2.tgz", + "integrity": "sha512-VhlESAQM83uULJ9jsvcKxx2Ab0yrmjUt8kDz5DyhTQufqWE0ssAnejlWri5LXv25xoXfdqOyeDPdfJS9dXKagQ==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.7" + "confusing-browser-globals": "^1.0.9" } }, "eslint-config-standard": { @@ -9094,9 +10108,9 @@ } }, "eslint-plugin-chai-friendly": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.4.1.tgz", - "integrity": "sha512-hkpLN7VVoGGsofZjUhcQ+sufC3FgqMJwD0DvAcRfxY1tVRyQyVsqpaKnToPHJQOrRo0FQ0fSEDwW2gr4rsNdGA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.5.0.tgz", + "integrity": "sha512-Pxe6z8C9fP0pn2X2nGFU/b3GBOCM/5FVus1hsMwJsXP3R7RiXFl7g0ksJbsc0GxiLyidTW4mEFk77qsNn7Tk7g==", "dev": true }, "eslint-plugin-cypress": { @@ -9144,9 +10158,9 @@ } }, "eslint-plugin-graphql": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.0.3.tgz", - "integrity": "sha512-hHwLyxSkC5rkakJ/SNTWwOswPdVhvfyMCnEOloevrLQIOHUNVIQBg1ljCaRe9C40HdzgcGUFUdG5BHLCKm8tuw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.1.0.tgz", + "integrity": "sha512-87HGS00aeBqGFiQZQGzSPzk1D59w+124F8CRIDATh3LJqce5RCTuUI4tcIqPeyY95YPBCIKwISksWUuA0nrgNw==", "dev": true, "requires": { "graphql-config": "^2.0.1", @@ -9266,14 +10280,14 @@ } }, "eslint-plugin-jsdoc": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-15.9.4.tgz", - "integrity": "sha512-TGk5HytRmlBA3BQ4Ya1WPzBWsi56XlFtdxDyQHNTpE5WQGphIJp7VbibWWWydU7N6HCsyhqazSSZQuO7SAJnww==", + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-17.1.1.tgz", + "integrity": "sha512-astLOTsj87UIzvDyiuAKbkgQgtChutazTDVxdG254tAtcvIVlWnPmlN7/dLnMYld/aHBhB4SWiUalMuKwTaynQ==", "dev": true, "requires": { - "comment-parser": "^0.6.2", + "comment-parser": "^0.7.0", "debug": "^4.1.1", - "jsdoctypeparser": "5.0.1", + "jsdoctypeparser": "^5.1.1", "lodash": "^4.17.15", "object.entries-ponyfill": "^1.0.1", "regextras": "^0.6.1" @@ -9325,9 +10339,9 @@ } }, "eslint-plugin-mocha": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.1.1.tgz", - "integrity": "sha512-p/otruG425jRYDa28HjbBYYXoFNzq3Qp++gn5dbE44Kz4NvmIsSUKSV1T+RLYUcZOcdJKKAftXbaqkHFqReKoA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.2.1.tgz", + "integrity": "sha512-o3Ibhpczi5MjUVpnlnrpC/+oJYGoHKB5m4bQdRnaAOeFCN3HRkqBisQ2/h0hEuCR4lPxyHP1Qzyjpna8MsOdlA==", "dev": true, "requires": { "ramda": "^0.26.1" @@ -9383,20 +10397,20 @@ "dev": true }, "eslint-plugin-react": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", - "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", + "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", "dev": true, "requires": { "array-includes": "^3.0.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.1.0", + "jsx-ast-utils": "^2.2.1", "object.entries": "^1.1.0", "object.fromentries": "^2.0.0", "object.values": "^1.1.0", "prop-types": "^15.7.2", - "resolve": "^1.10.1" + "resolve": "^1.12.0" }, "dependencies": { "define-properties": { @@ -9418,17 +10432,21 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", + "has-symbols": "^1.0.0", "is-callable": "^1.1.4", "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" } }, "es-to-primitive": { @@ -9502,9 +10520,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.0.1.tgz", - "integrity": "sha512-xir+3KHKo86AasxlCV8AHRtIZPHljqCRRUYgASkbatmt0fad4+5GgC7zkT7o/06hdKM6MIwp8giHVXqBPaarHQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.2.0.tgz", + "integrity": "sha512-jSlnBjV2cmyIeL555H/FbvuSbQ1AtpHjLMHuPrQnt1eVA6lX8yufdygh7AArI2m8ct7ChHGx2uOaCuxq2MUn6g==", "dev": true }, "eslint-plugin-sort-class-members": { @@ -9520,9 +10538,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -9604,9 +10622,9 @@ "dev": true }, "event-source-polyfill": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.8.tgz", - "integrity": "sha512-wC9j5vjH9Xu9s8XhumgBoypdFJswraU1HXykqCCD/b7q+EH4P/avf5fM1e8IiHyHNZOeOiWwrki2775XFTYyeg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.9.tgz", + "integrity": "sha512-+x0BMKTYwZcmGmlkHK0GsXkX1+otfEwqu3QitN0wmWuHaZniw3HeIx1k5OjWX3JUHQHlPS4yONol6eokS1ZAWg==", "dev": true }, "event-stream": { @@ -9631,9 +10649,9 @@ "dev": true }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", "dev": true }, "events": { @@ -10165,12 +11183,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-xml-parser": { - "version": "3.12.20", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.12.20.tgz", - "integrity": "sha512-viadHdefuuqkyJWUhF2r2Ymb5LJ0T7uQhzSRv4OZzYxpoPQnY05KtaX0pLkolabD7tLzIE8q/OytIAEhqPyYbw==", - "requires": { - "nimnjs": "^1.3.2" - } + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.14.0.tgz", + "integrity": "sha512-3SzQnPNtMVqaBVDzYqYt0BTaaLwkd45wTbsUsH1eiE9dnyc4b8mYcm1Q0Rcx9AWkeTj5UZFTTm55Io5yVWS1tg==" }, "fastparse": { "version": "1.1.2", @@ -10622,12 +11637,21 @@ } }, "framesync": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/framesync/-/framesync-4.0.2.tgz", - "integrity": "sha512-hQLD5NURHmzB4Symo6JJ5HDw2TWwhr6T3gw9aChNMsZvkxcD8U8Gcz/hllAOOMGE+HO3ScpRPahpXDQRgF19JQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-4.0.4.tgz", + "integrity": "sha512-mdP0WvVHe0/qA62KG2LFUAOiWLng5GLpscRlwzBxu2VXOp6B8hNs5C5XlFigsMgrfDrr2YbqTsgdWZTc4RXRMQ==", "dev": true, "requires": { - "hey-listen": "^1.0.5" + "hey-listen": "^1.0.8", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + } } }, "fresh": { @@ -11318,65 +12342,72 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "functions-have-names": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz", + "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", + "dev": true + }, "gatsby": { - "version": "2.15.15", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.15.15.tgz", - "integrity": "sha512-mOZJSBoVYd6ObEIB0sHje6BeMd7OQeGAw2XtJCPfetolkwWqYN+fUpYdVlYz5cbztuWmXIQoU6jhrxqsJu/InA==", + "version": "2.17.10", + "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.17.10.tgz", + "integrity": "sha512-xrKfc67UIMAkVtJj4fS3MK0KUiLvkOfuTZBp6GRXVxMZXuREem3uFnnYD//n+vGHSlYk6c0R1NJ9+2lJClTG2Q==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/core": "^7.6.0", - "@babel/parser": "^7.5.5", + "@babel/core": "^7.6.4", + "@babel/parser": "^7.6.4", "@babel/polyfill": "^7.6.0", - "@babel/runtime": "^7.6.0", - "@babel/traverse": "^7.6.0", + "@babel/runtime": "^7.6.3", + "@babel/traverse": "^7.6.3", "@gatsbyjs/relay-compiler": "2.0.0-printer-fix.4", "@hapi/joi": "^15.1.1", "@mikaelkristiansson/domready": "^1.0.9", "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2", "@reach/router": "^1.2.1", - "@typescript-eslint/eslint-plugin": "^1.13.0", - "@typescript-eslint/parser": "^1.13.0", + "@typescript-eslint/eslint-plugin": "^2.6.0", + "@typescript-eslint/parser": "^2.6.0", "address": "1.1.2", - "autoprefixer": "^9.6.1", + "array.prototype.flatmap": "^1.2.2", + "autoprefixer": "^9.7.0", "axios": "^0.19.0", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.3", "babel-loader": "^8.0.6", "babel-plugin-add-module-exports": "^0.3.3", "babel-plugin-dynamic-import-node": "^1.2.0", - "babel-plugin-remove-graphql-queries": "^2.7.7", - "babel-preset-gatsby": "^0.2.13", + "babel-plugin-remove-graphql-queries": "^2.7.14", + "babel-preset-gatsby": "^0.2.20", "better-opn": "1.0.0", "better-queue": "^3.8.10", - "bluebird": "^3.5.5", + "bluebird": "^3.7.1", "browserslist": "3.2.8", "cache-manager": "^2.10.0", "cache-manager-fs-hash": "^0.0.7", "chalk": "^2.4.2", - "chokidar": "3.0.2", + "chokidar": "3.2.3", "common-tags": "^1.8.0", "compression": "^1.7.4", "convert-hrtime": "^2.0.0", "copyfiles": "^1.2.0", - "core-js": "^2.6.9", + "core-js": "^2.6.10", "cors": "^2.8.5", "css-loader": "^1.0.1", "debug": "^3.2.6", "del": "^5.1.0", "detect-port": "^1.3.0", "devcert-san": "^0.3.3", - "dotenv": "^8.1.0", - "eslint": "^5.16.0", - "eslint-config-react-app": "^4.0.1", + "dotenv": "^8.2.0", + "eslint": "^6.6.0", + "eslint-config-react-app": "^5.0.2", "eslint-loader": "^2.2.1", "eslint-plugin-flowtype": "^3.13.0", - "eslint-plugin-graphql": "^3.0.3", + "eslint-plugin-graphql": "^3.1.0", "eslint-plugin-import": "^2.18.2", "eslint-plugin-jsx-a11y": "^6.2.3", - "eslint-plugin-react": "^7.14.3", + "eslint-plugin-react": "^7.16.0", "eslint-plugin-react-hooks": "^1.7.0", - "event-source-polyfill": "^1.0.8", + "event-source-polyfill": "^1.0.9", "express": "^4.17.1", "express-graphql": "^0.9.0", "fast-levenshtein": "^2.0.6", @@ -11384,33 +12415,33 @@ "flat": "^4.1.0", "fs-exists-cached": "1.0.0", "fs-extra": "^8.1.0", - "gatsby-cli": "^2.7.47", - "gatsby-core-utils": "^1.0.8", - "gatsby-graphiql-explorer": "^0.2.15", - "gatsby-link": "^2.2.13", - "gatsby-plugin-page-creator": "^2.1.17", - "gatsby-react-router-scroll": "^2.1.8", - "gatsby-telemetry": "^1.1.23", - "glob": "^7.1.4", + "gatsby-cli": "^2.8.8", + "gatsby-core-utils": "^1.0.17", + "gatsby-graphiql-explorer": "^0.2.26", + "gatsby-link": "^2.2.22", + "gatsby-plugin-page-creator": "^2.1.28", + "gatsby-react-router-scroll": "^2.1.14", + "gatsby-telemetry": "^1.1.35", + "glob": "^7.1.5", "got": "8.3.2", - "graphql": "^14.5.4", - "graphql-compose": "^6.3.5", + "graphql": "^14.5.8", + "graphql-compose": "^6.3.7", "graphql-playground-middleware-express": "^1.7.12", "invariant": "^2.2.4", "is-relative": "^1.0.0", "is-relative-url": "^3.0.0", - "is-wsl": "^2.1.0", + "is-wsl": "^2.1.1", "jest-worker": "^24.9.0", "json-loader": "^0.5.7", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "lokijs": "^1.5.7", + "lokijs": "^1.5.8", "md5": "^2.2.1", "md5-file": "^3.2.3", "micromatch": "^3.1.10", "mime": "^2.4.4", "mini-css-extract-plugin": "^0.8.0", - "mitt": "^1.1.3", + "mitt": "^1.2.0", "mkdirp": "^0.5.1", "moment": "^2.24.0", "name-all-modules-plugin": "^1.0.1", @@ -11428,7 +12459,7 @@ "raw-loader": "^0.5.1", "react-dev-utils": "^4.2.3", "react-error-overlay": "^3.0.0", - "react-hot-loader": "^4.12.13", + "react-hot-loader": "^4.12.15", "redux": "^4.0.4", "redux-thunk": "^2.3.0", "semver": "^5.7.1", @@ -11436,7 +12467,7 @@ "sift": "^5.1.0", "signal-exit": "^3.0.2", "slash": "^3.0.0", - "socket.io": "^2.2.0", + "socket.io": "^2.3.0", "stack-trace": "^0.0.10", "string-similarity": "^1.2.2", "style-loader": "^0.23.1", @@ -11447,9 +12478,9 @@ "util.promisify": "^1.0.0", "uuid": "^3.3.3", "v8-compile-cache": "^1.1.2", - "webpack": "~4.40.1", - "webpack-dev-middleware": "^3.7.1", - "webpack-dev-server": "^3.8.0", + "webpack": "~4.41.2", + "webpack-dev-middleware": "^3.7.2", + "webpack-dev-server": "^3.9.0", "webpack-hot-middleware": "^2.25.0", "webpack-merge": "^4.2.2", "webpack-stats-plugin": "^0.3.0", @@ -11467,45 +12498,84 @@ } }, "@babel/generator": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", - "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "dev": true, "requires": { - "@babel/types": "^7.6.0", + "@babel/types": "^7.7.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "dev": true, + "requires": { + "@babel/types": "^7.7.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/parser": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", - "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.2.tgz", + "integrity": "sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w==", "dev": true }, + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, "@babel/traverse": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", - "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -11523,9 +12593,9 @@ } }, "@babel/types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", - "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -11551,6 +12621,94 @@ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.1.tgz", + "integrity": "sha512-Z0rddsGqioKbvqfohg7BwkFC3PuNLsB+GE9QkFza7tiDzuHoy0y823Y+oGNDzxNZrYyLjqkZtCTl4vCqOmEN4g==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.6.1", + "eslint-utils": "^1.4.2", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.1.tgz", + "integrity": "sha512-EVrrUhl5yBt7fC7c62lWmriq4MIc49zpN3JmrKqfiFXPXCM5ErfEcZYfKOhZXkW6MBjFcJ5kGZqu1b+lyyExUw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.6.1", + "eslint-scope": "^5.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.6.1.tgz", + "integrity": "sha512-PDPkUkZ4c7yA+FWqigjwf3ngPUgoLaGjMlFh6TRtbjhqxFBnkElDfckSjm98q9cMr4xRzZ15VrS/xKm6QHYf0w==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.6.1", + "@typescript-eslint/typescript-estree": "2.6.1", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.1.tgz", + "integrity": "sha512-+sTnssW6bcbDZKE8Ce7VV6LdzkQz2Bxk7jzk1J8H1rovoTxnm6iXvYIyncvNsaB/kBCOM63j/LNJfm27bNdUoA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "glob": "^7.1.4", + "is-glob": "^4.0.1", + "lodash.unescape": "4.0.1", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -11586,11 +12744,14 @@ } } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } }, "configstore": { "version": "5.0.0", @@ -11607,9 +12768,9 @@ } }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", "dev": true }, "cross-spawn": { @@ -11646,28 +12807,143 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dot-prop": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz", - "integrity": "sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "dev": true, "requires": { "is-obj": "^2.0.0" } }, - "eslint-plugin-react-hooks": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", "dev": true }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, "execa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", - "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn": "^6.0.5", + "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", @@ -11676,6 +12952,52 @@ "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" } }, "find-up": { @@ -11699,30 +13021,30 @@ } }, "gatsby-cli": { - "version": "2.7.47", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.7.47.tgz", - "integrity": "sha512-dDVrbTjxzUwugOnnI/MDFZruYie5KW+t+XmLrG2L4ZjKBrAT6G2wsiPS+NwHiConqfTx67xoFAp54++C8+iWXg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.8.8.tgz", + "integrity": "sha512-j8xhEA3G0msqBY5Iu1ddZkBybV+gwiLEVOtO1GwSwv4moJunWkTjWW9tn9sVKOpQdRnEZ11z5ducVY/kBJRENA==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/runtime": "^7.6.0", + "@babel/runtime": "^7.6.3", "@hapi/joi": "^15.1.1", "better-opn": "^0.1.4", - "bluebird": "^3.5.5", + "bluebird": "^3.7.1", "chalk": "^2.4.2", - "ci-info": "^2.0.0", "clipboardy": "^2.1.0", "common-tags": "^1.8.0", "configstore": "^5.0.0", "convert-hrtime": "^2.0.0", - "core-js": "^2.6.9", + "core-js": "^2.6.10", "envinfo": "^5.12.1", - "execa": "^2.0.4", + "execa": "^2.1.0", "fs-exists-cached": "^1.0.0", "fs-extra": "^8.1.0", - "gatsby-telemetry": "^1.1.23", - "hosted-git-info": "^3.0.0", - "ink": "^2.3.0", + "gatsby-core-utils": "^1.0.17", + "gatsby-telemetry": "^1.1.35", + "hosted-git-info": "^3.0.2", + "ink": "^2.5.0", "ink-spinner": "^3.0.1", "is-valid-path": "^0.1.1", "lodash": "^4.17.15", @@ -11733,16 +13055,18 @@ "pretty-error": "^2.1.1", "progress": "^2.0.3", "prompts": "^2.2.1", - "react": "^16.9.0", + "react": "^16.11.0", + "redux": "^4.0.4", "resolve-cwd": "^2.0.0", "semver": "^6.3.0", + "signal-exit": "^3.0.2", "source-map": "0.7.3", "stack-trace": "^0.0.10", "strip-ansi": "^5.2.0", "update-notifier": "^2.5.0", "uuid": "3.3.3", "yargs": "^12.0.5", - "yurnalist": "^1.0.5" + "yurnalist": "^1.1.1" }, "dependencies": { "better-opn": { @@ -11777,6 +13101,15 @@ "pump": "^3.0.0" } }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -11811,15 +13144,15 @@ } }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "hosted-git-info": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.0.tgz", - "integrity": "sha512-zYSx1cP4MLsvKtTg8DF/PI6e6FHZ3wcawcTGsrLU2TM+UfD4jmSrn2wdQT16TFbH3lO4PIdjLG0E+cuYDgFD9g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.2.tgz", + "integrity": "sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw==", "dev": true, "requires": { "lru-cache": "^5.1.1" @@ -11831,6 +13164,37 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -11846,6 +13210,21 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -11859,9 +13238,9 @@ "dev": true }, "is-wsl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.0.tgz", - "integrity": "sha512-pFTjpv/x5HRj8kbZ/Msxi9VrvtOMRBqaDi3OIcbwPI3OuH+r3lLxVWukLITBaOGJIbA/w2+M1eVmVa4XNQlAmQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", "dev": true }, "keyv": { @@ -11947,10 +13326,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "normalize-url": { @@ -12101,18 +13480,51 @@ "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==", "dev": true }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -12122,6 +13534,27 @@ "ansi-regex": "^4.1.0" } }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -12132,9 +13565,9 @@ } }, "write-file-atomic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", - "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -12150,9 +13583,9 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { @@ -12173,6 +13606,39 @@ "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "yargs-parser": { @@ -12188,192 +13654,123 @@ } }, "gatsby-core-utils": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.0.8.tgz", - "integrity": "sha512-080Jl8NamTbCGliKxXpMjEO1XUYU5FAow+VPR/j6hJk+Kl/gFmpE1mqa5QnHRGLZQhBP/h2T0mUwnSJn9m/Jsw==", - "dev": true + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.0.17.tgz", + "integrity": "sha512-5LOderWqZFGaTwwLgqDgad/5Hbf/WFD44ZmodqSJLYUOG8K0wv4PctlQ2/1UO+LZuKYanthYi3jAVgk4OooeSQ==", + "dev": true, + "requires": { + "ci-info": "2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + } + } }, "gatsby-graphiql-explorer": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.15.tgz", - "integrity": "sha512-T4N+q8VDbivREBDRKLoxlersaYhWhEaTBKBLT0rWAd8PfPiFQPno8JIaqFTB1DLgsL421wJo9JSsLy1xPx79yA==", + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.26.tgz", + "integrity": "sha512-gcA7SPpI7jdz4yl8Kvzfg9TZ7Sp5UHt/P+beSdey76NRBpGeywMItyptpF2fSGiOkKngVrjJOUCsb6EfLSiEcA==", "dev": true, "requires": { - "@babel/runtime": "^7.6.0" + "@babel/runtime": "^7.6.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + } } }, "gatsby-link": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.2.13.tgz", - "integrity": "sha512-CghQ+hM5JQONNuQ5tQ383z9B9ngDPr79I1lLhZ8j8IPOfna4VQsdVYYtS/wHkdiuF2Ji8ZADP1YJcUEEAEfhew==", + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.2.22.tgz", + "integrity": "sha512-Cv73tFFFQ98grOhhBhI07bsd/w4g/RklLJmaqBucSU8v7MQ9EQorvOX0snly2dQurbNNSfU2XkNNPFrRBGNb0g==", "dev": true, "requires": { - "@babel/runtime": "^7.6.0", - "@types/reach__router": "^1.2.4", + "@babel/runtime": "^7.6.3", + "@types/reach__router": "^1.2.6", "prop-types": "^15.7.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + } } }, "gatsby-page-utils": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.23.tgz", - "integrity": "sha512-CC1EObDssmTE3MBqrMmiaWIOykiSX32D8196KiGfShIpQ62c15kKEBWFG0C+d4xCt9piR3j9N5VBn8LOHZ18VA==", + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.28.tgz", + "integrity": "sha512-Jk597HFWBWDStgs2Znj09uwXpVsNHi+UwCt+g+qsghXGieiWHR0Cs4shH32p/D2AS9KmCvSuJrNqAL1VamZAZw==", "dev": true, "requires": { - "@babel/runtime": "^7.6.2", - "bluebird": "^3.5.5", - "chokidar": "3.1.1", + "@babel/runtime": "^7.6.3", + "bluebird": "^3.7.1", + "chokidar": "3.2.3", "fs-exists-cached": "^1.0.0", - "glob": "^7.1.4", + "glob": "^7.1.5", "lodash": "^4.17.15", "micromatch": "^3.1.10", "slash": "^3.0.0" }, "dependencies": { "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" } }, - "anymatch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz", - "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.1.1.tgz", - "integrity": "sha512-df4o16uZmMHzVQwECZRHwfguOt5ixpuQVaZHjYMvYisgKhE+JXwcj/Tcr3+3bu/XeOJQ9ycYmzu7Mv8XrGxJDQ==", - "dev": true, - "requires": { - "anymatch": "^3.1.0", - "braces": "^3.0.2", - "fsevents": "^2.0.6", - "glob-parent": "^5.0.0", - "is-binary-path": "^2.1.0", - "is-glob": "^4.0.1", - "normalize-path": "^3.0.0", - "readdirp": "^3.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", - "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "readdirp": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", - "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", - "dev": true, - "requires": { - "picomatch": "^2.0.4" - } - }, "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } } } }, "gatsby-plugin-catch-links": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.1.12.tgz", - "integrity": "sha512-42BGcWaYNJ1fL702A2HZNsQyFL2+0FBdiJkBbizZyWRqhlo3+/YlcIqUCILICrrsCipyGdaR9RLnIlalBczRdg==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.1.15.tgz", + "integrity": "sha512-lQXmRYtaO6BN0QUOqcGD2Zt6bsfJxJ6xANdJCyVebF7DNKJuMyyHN6Y+w/7IIKormwXOUxWSM3BnfbHCgumWYQ==", "dev": true, "requires": { - "@babel/runtime": "^7.6.2", + "@babel/runtime": "^7.6.3", "escape-string-regexp": "^1.0.5" }, "dependencies": { "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" @@ -12394,24 +13791,24 @@ } }, "gatsby-plugin-page-creator": { - "version": "2.1.23", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.23.tgz", - "integrity": "sha512-2DAouJ4HW4kUD4pTtduGyGvbuN3123if5UTVU6zP1G0XxwtgTd0HRZnFSyYjhO7sB/W+eHYWV/KVDPgD+3Rkdg==", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.28.tgz", + "integrity": "sha512-EAKppjDIOvSHWnozQZq93KRXHZdDFH4hAunlrVWexGD1rxmV328506dk/LnU1EZr1FZMjPcnx4bfh3j2mVB3bw==", "dev": true, "requires": { - "@babel/runtime": "^7.6.2", - "bluebird": "^3.5.5", + "@babel/runtime": "^7.6.3", + "bluebird": "^3.7.1", "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.0.23", - "glob": "^7.1.4", + "gatsby-page-utils": "^0.0.28", + "glob": "^7.1.5", "lodash": "^4.17.15", "micromatch": "^3.1.10" }, "dependencies": { "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" @@ -12426,18 +13823,18 @@ } }, "gatsby-plugin-react-helmet": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.1.10.tgz", - "integrity": "sha512-xv3FlZGDPscXkm0jwZJvcwe50T4EcU7t8TnCsf7FC7YBzfil7FQ2k5YUB8LaG4DNEM5Vl35WKS5ad/5eSkmGIA==", + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.1.13.tgz", + "integrity": "sha512-O3Fvxm76t58RPVUz0Fo2tbXeJnXV6vmlLnKBPMz+smr0Mtx8vnGP1Pi6DuWdRepJsnVespNNth/L8n7iucQCYQ==", "dev": true, "requires": { - "@babel/runtime": "^7.6.2" + "@babel/runtime": "^7.6.3" }, "dependencies": { "@babel/runtime": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.2.tgz", - "integrity": "sha512-EXxN64agfUqqIGeEjI5dL5z0Sw0ZwWo1mLTi4mQowCZ42O59b7DRpZAnTC6OqdF28wMBMFKNb/4uFGrVaigSpg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", "dev": true, "requires": { "regenerator-runtime": "^0.13.2" @@ -12452,67 +13849,133 @@ } }, "gatsby-plugin-remove-trailing-slashes": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-2.1.7.tgz", - "integrity": "sha512-8oPAnQoVxPkNe3zIaCD6QoSGCe7PNswa2NEOmrTaKdpvKphpgf/JSGHPIWh4ZYqqpAfUydc9o854ndPTDck83g==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-2.1.12.tgz", + "integrity": "sha512-9xhOMjzVWTxuA3JLJ/+VNgtgCXHJHgrcUC/lzrfPFr+AciDN6bUup2IesH47DBum/3zXhrJ8MzzfLAExaKqf8A==", "dev": true, "requires": { - "@babel/runtime": "^7.6.0" + "@babel/runtime": "^7.6.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + } } }, "gatsby-plugin-styled-components": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-3.1.6.tgz", - "integrity": "sha512-JAvOGuF9y9L3jmTjn9s5YDuAtmdVENH8s2awXdgDN3dnoSa4DM8f7jKn7Sb2p+vw5cHqr7ZRC2izAs6iwvd6bw==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-3.1.11.tgz", + "integrity": "sha512-10RgU3FcXNctDfFHpiAKQOmYBZlbeZSOfG1mqjWjz/BmYqkLoIaQfTwEMmBpH40DGf72pG2PUOGoDVDrikPKOA==", "dev": true, "requires": { - "@babel/runtime": "^7.6.0" + "@babel/runtime": "^7.6.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + } } }, "gatsby-plugin-typescript": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.1.9.tgz", - "integrity": "sha512-g++yoSbMb/4WHdu8Z1Uh4e9qDXWdb1g5xfc63qzabGjRgoNVP5gG3azhUe4Az2E4RGTyW1S6c8flB20+64Lijg==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.1.15.tgz", + "integrity": "sha512-jwN2nkUxVM0y96ha6sR8jsZBJak5dR7SsA7UBSvpiUPJgN6dRtDpYlu+CLYzLOBdyxTr9Uo0LDfeCMDGZ63NNg==", "dev": true, "requires": { "@babel/preset-typescript": "^7.6.0", - "@babel/runtime": "^7.6.0", - "babel-plugin-remove-graphql-queries": "^2.7.8" + "@babel/runtime": "^7.6.3", + "babel-plugin-remove-graphql-queries": "^2.7.14" }, "dependencies": { + "@babel/runtime": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", + "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, "babel-plugin-remove-graphql-queries": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.8.tgz", - "integrity": "sha512-uMEVCaeDQbQBJBev8cMGHInJRGu/oMPdVbIK5sqRXpAgtdfo1WGriyb7OtIKDycSlvHx95l2NjOtwPADI9mG9w==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.14.tgz", + "integrity": "sha512-GnAZhBChCjAg0NyZMmZureWmBXijbAK7wreEpsoI1oP5hCuHcvWknDU4u5PjoVdLyJ+8ObJ86Y/Y4uzrqcg/qg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true } } }, "gatsby-react-router-scroll": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.1.8.tgz", - "integrity": "sha512-h6zjADduO8lBvZozn7E7aijoaex75Thk/dwS8256AgKb5SDQ0ilFQHZKsZPvQHwftGpOuvdoYnks/Mb3nR0cJg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.1.14.tgz", + "integrity": "sha512-UTkapxc+o7tGdoTL+HqrAqMiVtfjuyZUVAqQ42zhugfqA3Vz1yXOnsKgWqHAASlMXOzIPjvAhdR4vrxwuHDLjA==", "dev": true, "requires": { - "@babel/runtime": "^7.6.0", + "@babel/runtime": "^7.6.3", "scroll-behavior": "^0.9.10", "warning": "^3.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + } } }, "gatsby-telemetry": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.1.23.tgz", - "integrity": "sha512-tG1NS1BBIKHUXutGKYvoGFmR3sIC+l9GHd52ko2RNxm+rcnKMQAsrhlCfnKw2yGB+wys/k9YOJ5bZ1da1TFe7A==", + "version": "1.1.35", + "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.1.35.tgz", + "integrity": "sha512-4XisbcM8/qaBd76lG9MayXcIja8kJ6m15Uv+TqiTn7i+pnSCFzza9XY+vZsO/bP/WUjAjlTsCdTngVLR5Ocmjw==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", - "@babel/runtime": "^7.6.0", - "bluebird": "^3.5.5", + "@babel/runtime": "^7.6.3", + "bluebird": "^3.7.1", "boxen": "^3.2.0", - "ci-info": "2.0.0", "configstore": "^5.0.0", "envinfo": "^5.12.1", "fs-extra": "^8.1.0", + "gatsby-core-utils": "^1.0.17", "git-up": "4.0.1", "is-docker": "2.0.0", "lodash": "^4.17.15", @@ -12533,11 +13996,14 @@ "@babel/highlight": "^7.0.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "@babel/runtime": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } }, "configstore": { "version": "5.0.0", @@ -12560,9 +14026,9 @@ "dev": true }, "dot-prop": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.0.tgz", - "integrity": "sha512-n1oC6NBF+KM9oVXtjmen4Yo7HyAVWV2UUl50dCYJdw2924K6dX9bf9TTTWaKtYlRn0FEtxG27KS80ayVLixxJA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -12580,9 +14046,9 @@ }, "dependencies": { "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true } } @@ -12602,10 +14068,10 @@ "semver": "^6.0.0" } }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", "dev": true }, "source-map": { @@ -12624,9 +14090,9 @@ } }, "write-file-atomic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", - "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", + "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -12655,9 +14121,9 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" }, "get-own-enumerable-property-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", - "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz", + "integrity": "sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==", "dev": true }, "get-port": { @@ -12804,9 +14270,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13068,9 +14534,9 @@ } }, "graphql-compose": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-6.3.5.tgz", - "integrity": "sha512-XUpp7JqbaQ+vK/Nw4Jw0CQKs3UU8YFz3wpbBz+6WvPhrMkexco0bIbK4iGW9okQT7+/toAphEdVO4HFqM7lk2w==", + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-6.3.7.tgz", + "integrity": "sha512-OxfhSPZS2Uz+P9U6FUllJmGGY2T4jrKhnX0x5XFcyQO4ubjQeoHQbAgRyqKqePhIKGqQWFwm2w40/HJC0tt7rA==", "dev": true, "requires": { "graphql-type-json": "^0.2.4", @@ -13358,9 +14824,9 @@ "dev": true }, "hey-listen": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.5.tgz", - "integrity": "sha512-O2iCNxBBGb4hOxL9tUdnoPwDYmZhQ29t5xKV74BVZNdvwCDXCpVYTJ4yoaibc1V0I8Yw3K3nwmvDpoyjnCqUaw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", "dev": true }, "hmac-drbg": { @@ -13543,12 +15009,12 @@ "dev": true }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "dev": true, "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } @@ -13603,9 +15069,9 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { "agent-base": "^4.3.0", @@ -13662,20 +15128,20 @@ "dev": true }, "husky": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.5.tgz", - "integrity": "sha512-cKd09Jy9cDyNIvAdN2QQAP/oA21sle4FWXjIMDttailpLAYZuBE7WaPmhrkj+afS8Sj9isghAtFvWSQ0JiwOHg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.9.tgz", + "integrity": "sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg==", "dev": true, "requires": { "chalk": "^2.4.2", + "ci-info": "^2.0.0", "cosmiconfig": "^5.2.1", "execa": "^1.0.0", "get-stdin": "^7.0.0", - "is-ci": "^2.0.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", "please-upgrade-node": "^3.2.0", - "read-pkg": "^5.1.1", + "read-pkg": "^5.2.0", "run-node": "^1.0.0", "slash": "^3.0.0" }, @@ -13686,18 +15152,6 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -13751,15 +15205,6 @@ "pump": "^3.0.0" } }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -13800,13 +15245,15 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, "path-exists": { @@ -13840,20 +15287,6 @@ "normalize-package-data": "^2.5.0", "parse-json": "^5.0.0", "type-fest": "^0.6.0" - }, - "dependencies": { - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - } } }, "resolve": { @@ -13870,12 +15303,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true } } }, @@ -14141,13 +15568,14 @@ "dev": true }, "ink": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-2.3.0.tgz", - "integrity": "sha512-931rgXHAS3hM++8ygWPOBeHOFwTzHh3pDAVZtiBVOUH6tVvJijym43ODUy22ySo2NwYUFeR/Zj3xuWzBEKMiHw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-2.5.0.tgz", + "integrity": "sha512-HUkVglJ11cXK+W1a5cKNoOCxLkDi5hbDMAWSFDcwF2kpNd0eoX+2/cpaTP9BTFaQ8RJk7O59NxKMmyPXkmxo7w==", "dev": true, "optional": true, "requires": { "@types/react": "^16.8.6", + "ansi-escapes": "^4.2.1", "arrify": "^1.0.1", "auto-bind": "^2.0.0", "chalk": "^2.4.1", @@ -14157,8 +15585,8 @@ "lodash.throttle": "^4.1.1", "log-update": "^3.0.0", "prop-types": "^15.6.2", - "react-reconciler": "^0.20.0", - "scheduler": "^0.13.2", + "react-reconciler": "^0.21.0", + "scheduler": "^0.15.0", "signal-exit": "^3.0.2", "slice-ansi": "^1.0.0", "string-length": "^2.0.0", @@ -14168,11 +15596,14 @@ }, "dependencies": { "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", "dev": true, - "optional": true + "optional": true, + "requires": { + "type-fest": "^0.5.2" + } }, "ansi-regex": { "version": "4.1.0", @@ -14229,6 +15660,26 @@ "ansi-escapes": "^3.2.0", "cli-cursor": "^2.1.0", "wrap-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true, + "optional": true + } + } + }, + "scheduler": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", + "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "dev": true, + "optional": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "slice-ansi": { @@ -14251,6 +15702,13 @@ "ansi-regex": "^4.1.0" } }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true, + "optional": true + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -14445,9 +15903,9 @@ "dev": true }, "is-absolute-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.2.tgz", - "integrity": "sha512-+5g/wLlcm1AcxSP7014m6GvbPHswDx980vD/3bZaap8aGV9Yfs7Q6y6tfaupgZ5O74Byzc8dGrSCJ+bFXx0KdA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true }, "is-accessor-descriptor": { @@ -14922,9 +16380,9 @@ } }, "is-what": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.2.3.tgz", - "integrity": "sha512-c4syLgFnjXTH5qd82Fp/qtUIeM0wA69xbI0KH1QpurMIvDaZFrS8UtAa4U52Dc2qSznaMxHit0gErMp6A/Qk1w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.3.1.tgz", + "integrity": "sha512-seFn10yAXy+yJlTRO+8VfiafC+0QJanGLMPTBWLrJm/QPauuchy0UXh8B6H5o9VA8BAzk0iYievt6mNp6gfaqA==", "dev": true }, "is-windows": { @@ -15414,9 +16872,9 @@ } }, "jsdoctypeparser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-5.0.1.tgz", - "integrity": "sha512-dYwcK6TKzvq+ZKtbp4sbQSW9JMo6s+4YFfUs5D/K7bZsn3s1NhEhZ+jmIPzby0HbkbECBe+hNPEa6a+E21o94w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-5.1.1.tgz", + "integrity": "sha512-APGygIJrT5bbz5lsVt8vyLJC0miEbQf/z9ZBfTr4RYvdia8AhWMRlYgivvwHG5zKD/VW3d6qpChCy64hpQET3A==", "dev": true }, "jsdom": { @@ -15714,9 +17172,9 @@ } }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { @@ -15750,9 +17208,9 @@ } }, "lint-staged": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.0.tgz", - "integrity": "sha512-jTu1KoGiGTSffM539wK+3igVqDGVsby3KwDBaXL471YndahkjnavLX+R5Nsk49JwklyMo0ZAXay1BaoyA6d2Jw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.2.tgz", + "integrity": "sha512-OFyGokJSWTn2M6vngnlLXjaHhi8n83VIZZ5/1Z26SULRUWgR3ITWpAEQC9Pnm3MC/EpCxlwts/mQWDHNji2+zA==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -15781,34 +17239,20 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { @@ -15821,12 +17265,12 @@ } }, "execa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", - "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn": "^6.0.5", + "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", @@ -15911,14 +17355,6 @@ "dev": true, "requires": { "path-key": "^3.0.0" - }, - "dependencies": { - "path-key": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", - "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", - "dev": true - } } }, "onetime": { @@ -15936,20 +17372,25 @@ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "shebang-regex": "^3.0.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "to-regex-range": { @@ -15960,6 +17401,15 @@ "requires": { "is-number": "^7.0.0" } + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -16451,15 +17901,15 @@ } }, "loglevel": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", - "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", "dev": true }, "lokijs": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.7.tgz", - "integrity": "sha512-2SqUV6JH4f15Z5/7LVsyadSUwHhZppxhujgy/VhVqiRYMGt5oaocb7fV/3JGjHJ6rTuEIajnpTLGRz9cJW/c3g==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.8.tgz", + "integrity": "sha512-D8E3TBrY35o1ELnonp2MF8b3wKu2tVNl2TqRjvS+95oPMMe7OoIAxNY1qr+5BEZwnWn2V4ErAjVt000DonM+FA==", "dev": true }, "lolex": { @@ -16844,12 +18294,12 @@ } }, "merge-anything": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.2.5.tgz", - "integrity": "sha512-WgZGR7EQ1D8pyh57uKBbkPhUCJZLGdMzbDaxL4MDTJSGsvtpGdm8myr6DDtgJwT46xiFBlHqxbveDRpFBWlKWQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.1.tgz", + "integrity": "sha512-dYOIAl9GFCJNctSIHWOj9OJtarCjsD16P8ObCl6oxrujAG+kOvlwJuOD9/O9iYZ9aTi1RGpGTG9q9etIvuUikQ==", "dev": true, "requires": { - "is-what": "^3.2.3" + "is-what": "^3.3.1" } }, "merge-descriptors": { @@ -17112,9 +18562,9 @@ } }, "mitt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz", - "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "dev": true }, "mixin-deep": { @@ -17154,9 +18604,9 @@ } }, "mocha": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", - "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", + "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -17179,9 +18629,9 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "yargs": "13.3.0", + "yargs-parser": "13.1.1", + "yargs-unparser": "1.6.0" }, "dependencies": { "ansi-regex": { @@ -17190,17 +18640,24 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "debug": { @@ -17224,21 +18681,6 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -17254,15 +18696,6 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -17283,21 +18716,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -17308,44 +18726,16 @@ "path-exists": "^3.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -17366,12 +18756,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -17410,6 +18794,17 @@ "isexe": "^2.0.0" } }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", @@ -17417,28 +18812,27 @@ "dev": true }, "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^13.1.1" } }, "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -17855,25 +19249,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "nimn-date-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nimn-date-parser/-/nimn-date-parser-1.0.0.tgz", - "integrity": "sha512-1Nf+x3EeMvHUiHsVuEhiZnwA8RMeOBVTQWfB1S2n9+i6PYCofHd2HRMD+WOHIHYshy4T4Gk8wQoCol7Hq3av8Q==" - }, - "nimn_schema_builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nimn_schema_builder/-/nimn_schema_builder-1.1.0.tgz", - "integrity": "sha512-DK5/B8CM4qwzG2URy130avcwPev4uO0ev836FbQyKo1ms6I9z/i6EJyiZ+d9xtgloxUri0W+5gfR8YbPq7SheA==" - }, - "nimnjs": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/nimnjs/-/nimnjs-1.3.2.tgz", - "integrity": "sha512-TIOtI4iqkQrUM1tiM76AtTQem0c7e56SkDZ7sj1d1MfUsqRcq2ZWQvej/O+HBTZV7u/VKnwlKTDugK/75IRPPw==", - "requires": { - "nimn-date-parser": "^1.0.0", - "nimn_schema_builder": "^1.0.0" - } - }, "nise": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz", @@ -17899,9 +19274,9 @@ } }, "nock": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/nock/-/nock-11.3.5.tgz", - "integrity": "sha512-6WGeZcWc3RExkBcMSYSrUm/5YukDo52m/jhwniQyrnuiCnKRljBwwje9vTwJyEi4J6m2bq0Aj6C1vzuM6iuaeg==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-11.7.0.tgz", + "integrity": "sha512-7c1jhHew74C33OBeRYyQENT+YXQiejpwIrEjinh6dRurBae+Ei4QjeUaPlkptIF0ZacEiVCnw8dWaxqepkiihg==", "dev": true, "requires": { "chai": "^4.1.2", @@ -17983,9 +19358,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -18003,9 +19378,9 @@ "dev": true }, "node-forge": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.2.tgz", - "integrity": "sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", "dev": true }, "node-int64": { @@ -18159,20 +19534,12 @@ "dev": true }, "node-releases": { - "version": "1.1.30", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.30.tgz", - "integrity": "sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==", + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "semver": "^6.3.0" } }, "node-status-codes": { @@ -18187,18 +19554,18 @@ "dev": true }, "nodemon": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.2.tgz", - "integrity": "sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", "dev": true, "requires": { - "chokidar": "^2.1.5", - "debug": "^3.1.0", + "chokidar": "^2.1.8", + "debug": "^3.2.6", "ignore-by-default": "^1.0.1", "minimatch": "^3.0.4", - "pstree.remy": "^1.1.6", - "semver": "^5.5.0", - "supports-color": "^5.2.0", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.2", "update-notifier": "^2.5.0" @@ -18233,6 +19600,12 @@ "ms": "^2.1.1" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -18251,11 +19624,14 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -19598,9 +20974,9 @@ } }, "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -19902,24 +21278,24 @@ } }, "popmotion": { - "version": "8.6.4", - "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-8.6.4.tgz", - "integrity": "sha512-nXYMlVkzpXG5BvZ7fUbFpXNodTP11y+guw5yRfJWpQ+8MAnTqIOfWqxAlzIKD1n8SmXddDY/PEgMqvKgU5aGXw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-8.7.0.tgz", + "integrity": "sha512-RnJMbWN+TEBT0tgG+3WS0O1i9LAq+senXSAcKw+srGviT1c9G+iKUXrp24D2w6Og0mDd61rEfKz3pFrFCdKn5Q==", "dev": true, "requires": { "@popmotion/easing": "^1.0.1", - "@popmotion/popcorn": "^0.3.2", + "@popmotion/popcorn": "^0.4.0", "framesync": "^4.0.0", "hey-listen": "^1.0.5", - "style-value-types": "^3.1.0", - "stylefire": "2.4.3", + "style-value-types": "^3.1.4", + "stylefire": "^4.1.3", "tslib": "^1.9.1" } }, "popmotion-pose": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/popmotion-pose/-/popmotion-pose-3.4.6.tgz", - "integrity": "sha512-ZlRj4dWlJcZvr/84Xh+P+w9lxZVfTU3pJ+u1TkYu+y7Mq4yDXgPlarjgth2qeI4U5VylvTfWSvzwSjEXy8OPxg==", + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/popmotion-pose/-/popmotion-pose-3.4.8.tgz", + "integrity": "sha512-/dkEhDiTYkbLb15dkrU3Okh58KU5I8z3f18V7kciN/cJmSc8ZD8tWgOc8U9yJf3lUHnf/va5PMCX4/4RnVeUiQ==", "dev": true, "requires": { "@popmotion/easing": "^1.0.1", @@ -19932,14 +21308,40 @@ } }, "portfinder": { - "version": "1.0.24", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz", - "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "pose-core": { @@ -19955,9 +21357,9 @@ }, "dependencies": { "@types/node": { - "version": "10.14.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.17.tgz", - "integrity": "sha512-p/sGgiPaathCfOtqu2fx5Mu1bcjuP8ALFg4xpGgNkcin7LwRyzUKniEHBKdcE1RPsenq5JVPIpMTJSygLboygQ==", + "version": "10.14.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.21.tgz", + "integrity": "sha512-nuFlRdBiqbF+PJIEVxm2jLFcQWN7q7iWEJGsBV4n7v1dbI9qXB8im2pMMKMCUZe092sQb5SQft2DHfuQGK5hqQ==", "dev": true } } @@ -19969,9 +21371,9 @@ "dev": true }, "postcss": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", - "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -20028,24 +21430,45 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" } - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dev": true, - "requires": { + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" } @@ -20182,14 +21605,35 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "semver": "^6.3.0" } }, "postcss-selector-parser": { @@ -20242,14 +21686,35 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "semver": "^6.3.0" } } } @@ -20472,14 +21937,35 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "semver": "^6.3.0" } } } @@ -20538,14 +22024,35 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "semver": "^6.3.0" } } } @@ -21041,9 +22548,9 @@ } }, "react": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", - "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz", + "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -21247,21 +22754,21 @@ } }, "react-dom": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", - "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz", + "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==", "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.15.0" + "scheduler": "^0.17.0" }, "dependencies": { "scheduler": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", - "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", + "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -21271,9 +22778,9 @@ } }, "react-error-overlay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.2.tgz", - "integrity": "sha512-DHRuRk3K4Lg9obI6J4Y+nKvtwjasYRU9CFL3ud42x9YJG1HbQjSNublapC/WBJOA726gNUbqbj0U2df9+uzspQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.3.tgz", + "integrity": "sha512-bOUvMWFQVk5oz8Ded9Xb7WVdEi3QGLC8tH7HmYP0Fdp4Bn3qw0tRFmr5TW6mvahzvmrK4a6bqWGfCevBflP+Xw==", "dev": true }, "react-fast-compare": { @@ -21295,11 +22802,12 @@ } }, "react-hot-loader": { - "version": "4.12.13", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.13.tgz", - "integrity": "sha512-4Byk3aVQhcmTnVCBvDHOEOUnMFMj81r2yRKZQSfLOG2yd/4hm/A3oK15AnCZilQExqSFSsHcK64lIIU+dU2zQQ==", + "version": "4.12.16", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.16.tgz", + "integrity": "sha512-KC33uTBacgdunMtfpZFP2pgPpyvKIcCwuh0XmWESbeFrkWLqUtCFN91zyaTdU5OiAM982+E8xh1gjE5EINumaw==", "dev": true, "requires": { + "@types/react": "^15.0.0 || ^16.0.0", "fast-levenshtein": "^2.0.6", "global": "^4.3.0", "hoist-non-react-statics": "^3.3.0", @@ -21319,9 +22827,9 @@ } }, "react-input-autosize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", - "integrity": "sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", + "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", "dev": true, "requires": { "prop-types": "^15.5.8" @@ -21340,9 +22848,9 @@ "dev": true }, "react-modal": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.10.1.tgz", - "integrity": "sha512-2DKIfdOc8+WY+SYJ/xf/WBwOYMmNAYAyGkYlc4e1TCs9rk1xY4QBz04hB3UHGcrLChh7ce77rHAe6VPNmuLYsQ==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.11.1.tgz", + "integrity": "sha512-8uN744Yq0X2lbfSLxsEEc2UV3RjSRb4yDVxRQ1aGzPo86QjNOwhQSukDb8U8kR+636TRTvfMren10fgOjAy9eA==", "dev": true, "requires": { "exenv": "^1.2.0", @@ -21363,9 +22871,9 @@ } }, "react-pose": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/react-pose/-/react-pose-4.0.8.tgz", - "integrity": "sha512-WN/583nKJZkKmKg5ha+eErOGWF9GV6A5EngC7WHQX5b910X9rTlOlxzdKlUy/dDcsTRMZEtHV0Sy2gLPYsVQCQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/react-pose/-/react-pose-4.0.9.tgz", + "integrity": "sha512-NCAgAIzH8MkNYhW+M6Dnps88lOo8nr08SoKbB7PfZH9ztbql9jRzlJxH9A5x3zLxahya6nsyxjCsi5+qLZV7ng==", "dev": true, "requires": { "@emotion/is-prop-valid": "^0.7.3", @@ -21375,33 +22883,44 @@ } }, "react-reconciler": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.20.4.tgz", - "integrity": "sha512-kxERc4H32zV2lXMg/iMiwQHOtyqf15qojvkcZ5Ja2CPkjVohHw9k70pdDBwrnQhLVetUJBSYyqU3yqrlVTOajA==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.21.0.tgz", + "integrity": "sha512-h4Rl3L3O6G9V4Ff+F+tCXX8ElDVn0Psk/odT+NPWeA55Yk5G7+kHT8D+Q3yE+51C72LbrYcX6OfLmCZ/7Nx9cw==", "dev": true, "optional": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "scheduler": "^0.15.0" + }, + "dependencies": { + "scheduler": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", + "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", + "dev": true, + "optional": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-select": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.0.5.tgz", - "integrity": "sha512-2tBXZ1XSqbk2boMUzSmKXwGl/6W46VkSMSLMy+ShccOVyD1kDTLPwLX7lugISkRMmL0v5BcLtriXOLfYwO0otw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.0.8.tgz", + "integrity": "sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg==", "dev": true, "requires": { "@babel/runtime": "^7.4.4", "@emotion/cache": "^10.0.9", "@emotion/core": "^10.0.9", "@emotion/css": "^10.0.9", - "classnames": "^2.2.5", "memoize-one": "^5.0.0", "prop-types": "^15.6.0", - "raf": "^3.4.0", - "react-input-autosize": "^2.2.1", + "react-input-autosize": "^2.2.2", "react-transition-group": "^2.2.1" } }, @@ -21416,21 +22935,21 @@ } }, "react-test-renderer": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.6.tgz", - "integrity": "sha512-H2srzU5IWYT6cZXof6AhUcx/wEyJddQ8l7cLM/F7gDXYyPr4oq+vCIxJYXVGhId1J706sqziAjuOEjyNkfgoEw==", + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.10.2.tgz", + "integrity": "sha512-k9Qzyev6cTIcIfrhgrFlYQAFxh5EEDO6ALNqYqmKsWVA7Q/rUMTay5nD3nthi6COmYsd4ghVYyi8U86aoeMqYQ==", "dev": true, "requires": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", "react-is": "^16.8.6", - "scheduler": "^0.13.6" + "scheduler": "^0.16.2" }, "dependencies": { "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.10.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", + "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==", "dev": true } } @@ -21771,9 +23290,9 @@ } }, "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", "dev": true }, "regjsparser": { @@ -22217,9 +23736,9 @@ } }, "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==", "dev": true, "requires": { "loose-envify": "^1.1.0", @@ -22252,12 +23771,12 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.6.tgz", - "integrity": "sha512-i3+CeqxL7DpAazgVpAGdKMwHuL63B5nhJMh9NQ7xmChGkA3jNFflq6Jyo1LLJYcr3idWiNOPWHCrm4zMayLG4w==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", "dev": true, "requires": { - "node-forge": "0.8.2" + "node-forge": "0.9.0" } }, "semver": { @@ -22466,9 +23985,9 @@ "dev": true }, "simple-icons": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-1.16.0.tgz", - "integrity": "sha512-uUsVbiN+SMfCElZlHy2SOl4Wr9HbBquFrdGiROCxhCzUFoG1kUrgnxn0MabLrWgrQSlyGD535B74UN+qJV/lWw==" + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-1.19.1.tgz", + "integrity": "sha512-tZpdvsJ98C0lrym8eFtAbXUeMpLbpN/UKek333fGDIZ6CRhPtpMloA3HvDcGTtfOAi4KDev7yJe3H4LI9iLH8g==" }, "simple-swizzle": { "version": "0.2.2", @@ -22607,9 +24126,9 @@ } }, "snap-shot-core": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/snap-shot-core/-/snap-shot-core-10.1.1.tgz", - "integrity": "sha512-xrltUg35pvs+d3VliYUJxe2sma45O4kenSf0i4XUoQtG6KZd/hJufu4OtlMDNCjA8cq12bgHZqy7ok/rRAwW+g==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/snap-shot-core/-/snap-shot-core-10.2.0.tgz", + "integrity": "sha512-FsP+Wd4SCA4bLSm3vi6OVgfmGQcAQkUhwy45zDjZDm/6dZ5SDIgP40ORHg7z6MgMAK2+fj2DmhW7SXyvMU55Vw==", "dev": true, "requires": { "arg": "4.1.0", @@ -22666,9 +24185,9 @@ } }, "snap-shot-it": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/snap-shot-it/-/snap-shot-it-7.8.0.tgz", - "integrity": "sha512-d83qtfNdlYogDF/fti8ya12P1WT/iBRcbHl3IYpIoUtFg6LP+G/QphPwF0zRDpR36SgFVqLvj9XpWDceHiHkmw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/snap-shot-it/-/snap-shot-it-7.9.0.tgz", + "integrity": "sha512-70QaUKgITLCkeo8P7Tz9PfgHLuSPGIbtwSLHI89zOJ5g60pkhY1bV/oW4M4hDKUWeKwW493nwnHxlaIY0sDzYQ==", "dev": true, "requires": { "@bahmutov/data-driven": "1.0.0", @@ -22681,7 +24200,7 @@ "pluralize": "8.0.0", "ramda": "0.26.1", "snap-shot-compare": "2.8.3", - "snap-shot-core": "10.1.1" + "snap-shot-core": "10.2.0" }, "dependencies": { "debug": { @@ -22823,17 +24342,17 @@ } }, "socket.io": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz", - "integrity": "sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "dev": true, "requires": { "debug": "~4.1.0", - "engine.io": "~3.3.1", + "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.2.0", - "socket.io-parser": "~3.3.0" + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" }, "dependencies": { "debug": { @@ -22859,17 +24378,17 @@ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" }, "socket.io-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", - "integrity": "sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.3.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", @@ -22881,34 +24400,74 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } } } }, "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz", + "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==", "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "~3.1.0", + "debug": "~4.1.0", "isarray": "2.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "isarray": { @@ -22916,6 +24475,12 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -23228,9 +24793,9 @@ "dev": true }, "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz", + "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==", "dev": true }, "standard-as-callback": { @@ -23239,31 +24804,35 @@ "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg==" }, "start-server-and-test": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.2.tgz", - "integrity": "sha512-CDJGFi+qlE4KFh7QgDRz51rKn30XGpWRVRuyuuA43tZw5BEh/mkusr7aHqvT0q19xtgChYXW/uhgOq817sb+7w==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.6.tgz", + "integrity": "sha512-Gr/TDePT4JczaoBiKZLZRIWmYgRcoGcFQePtPEHEvZFUuxbdUqTZozx8dqrlKl/67+pipg5OOtBH21U1oJXJIQ==", "dev": true, "requires": { - "bluebird": "3.5.5", + "bluebird": "3.7.1", "check-more-types": "2.24.0", "debug": "4.1.1", - "execa": "2.0.4", + "execa": "2.1.0", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", "wait-on": "3.3.0" }, "dependencies": { + "bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "dev": true + }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { @@ -23276,12 +24845,12 @@ } }, "execa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", - "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn": "^6.0.5", + "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", @@ -23326,14 +24895,6 @@ "dev": true, "requires": { "path-key": "^3.0.0" - }, - "dependencies": { - "path-key": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", - "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", - "dev": true - } } }, "onetime": { @@ -23351,11 +24912,35 @@ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -23684,6 +25269,60 @@ "function-bind": "^1.0.2" } }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -23763,15 +25402,18 @@ } }, "style-value-types": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-3.1.0.tgz", - "integrity": "sha512-7eaMZ8RKWIQUKHPQK7qv3zLYmvZNb2pCmO4WguXdVFymd2Qj9xqSUoo7LQ8Wd8eiLuoSd+uqzsvcodyvD8nn6Q==", - "dev": true - }, - "styled-components": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.3.2.tgz", - "integrity": "sha512-NppHzIFavZ3TsIU3R1omtddJ0Bv1+j50AKh3ZWyXHuFvJq1I8qkQ5mZ7uQgD89Y8zJNx2qRo6RqAH1BmoVafHw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-3.1.6.tgz", + "integrity": "sha512-AxcfUr/06AHyyyxkNB1O8ypvwa8/qK+sxwelxEN5x+jxW+RXutRE2TuHEQbFq9OBY7ym83CPKvVIsGd6lvKb0Q==", + "dev": true, + "requires": { + "hey-listen": "^1.0.8" + } + }, + "styled-components": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.1.tgz", + "integrity": "sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -23790,18 +25432,18 @@ }, "dependencies": { "@emotion/is-prop-valid": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.2.tgz", - "integrity": "sha512-ZQIMAA2kLUWiUeMZNJDTeCwYRx1l8SQL0kHktze4COT22occKpDML1GDUXP5/sxhOMrZO8vZw773ni4H5Snrsg==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.4.tgz", + "integrity": "sha512-QBW8h6wVQgeQ55F52rNaprEJxtVR+/ScOP8/V1ScSpPzKqHdFB9QVqby0Z50sqS8mcaeIl5vR1vQpKwJbIS6NQ==", "dev": true, "requires": { - "@emotion/memoize": "0.7.2" + "@emotion/memoize": "0.7.3" } }, "@emotion/memoize": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.2.tgz", - "integrity": "sha512-hnHhwQzvPCW1QjBWFyBtsETdllOM92BfrKWbUTmh9aeOlcVOiXvlPsK4104xH8NsaKfg86PTFsWkueQeUfMA/w==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.3.tgz", + "integrity": "sha512-2Md9mH6mvo+ygq1trTeVp2uzAKwE2P7In0cRpD/M9Q70aH8L+rxMLbb3JCN2JoSWsV2O+DdFjfbbXoMoLBczow==", "dev": true }, "has-flag": { @@ -23822,14 +25464,15 @@ } }, "stylefire": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/stylefire/-/stylefire-2.4.3.tgz", - "integrity": "sha512-8rckFzuDlVWSyrkmnyTg8avadQavk2t6YkFKUUocsXoj/8NScOjb+/avbB4nrmoPtzD0kN7IyuhKq8jimIBTBQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/stylefire/-/stylefire-4.1.4.tgz", + "integrity": "sha512-bp9nNTTFHdIQp/4szBuF2z85rMAq5oySeAHdpNgPTcVlXDrwsi1FjjOLug/4+yx1p8eMFFGrkAex7b5/M95ivg==", "dev": true, "requires": { + "@popmotion/popcorn": "^0.4.0", "framesync": "^4.0.0", - "hey-listen": "^1.0.4", - "style-value-types": "^3.0.6" + "hey-listen": "^1.0.8", + "style-value-types": "^3.1.4" } }, "stylehacks": { @@ -23844,14 +25487,35 @@ }, "dependencies": { "browserslist": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", - "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "caniuse-lite": { + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==", + "dev": true + }, + "node-releases": { + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", + "dev": true, + "requires": { + "semver": "^6.3.0" } }, "postcss-selector-parser": { @@ -24105,9 +25769,9 @@ } }, "terser": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.1.tgz", - "integrity": "sha512-pnzH6dnFEsR2aa2SJaKb1uSCl3QmIsJ8dEkj0Fky+2AwMMcC9doMqLOQIH6wVTEKaVfKVvLSk5qxPBEZT9mywg==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", + "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -24116,9 +25780,9 @@ }, "dependencies": { "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "source-map": { @@ -24347,9 +26011,9 @@ } }, "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, "timed-out": { @@ -24696,9 +26360,9 @@ } }, "typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz", - "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", "dev": true }, "ua-parser-js": { @@ -24940,6 +26604,12 @@ } } }, + "untildify": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", + "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", + "dev": true + }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", @@ -25234,9 +26904,9 @@ } }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, "wait-on": { @@ -25265,9 +26935,9 @@ } }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", "dev": true } } @@ -25347,9 +27017,9 @@ "optional": true }, "webpack": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.40.2.tgz", - "integrity": "sha512-5nIvteTDCUws2DVvP9Qe+JPla7kWPPIDFZv55To7IycHWZ+Z5qBdaBYPyuXWdhggTufZkQwfIK+5rKQTVovm2A==", + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -25395,6 +27065,16 @@ "uri-js": "^4.2.2" } }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -25427,9 +27107,9 @@ } }, "webpack-dev-middleware": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.1.tgz", - "integrity": "sha512-5MWu9SH1z3hY7oHOV6Kbkz5x7hXbxK56mGHNqHTe6d+ewxOwKUxoUJBs7QIaJb33lPjl9bJZ3X0vCoooUzC36A==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", "dev": true, "requires": { "memory-fs": "^0.4.1", @@ -25448,41 +27128,41 @@ } }, "webpack-dev-server": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz", - "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.6", + "chokidar": "^2.1.8", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", "html-entities": "^1.2.1", - "http-proxy-middleware": "^0.19.1", + "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", - "is-absolute-url": "^3.0.0", + "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.3", + "loglevel": "^1.6.4", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.21", + "portfinder": "^1.0.25", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.4", + "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.3.0", + "sockjs-client": "1.4.0", "spdy": "^4.0.1", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.0", + "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", "yargs": "12.0.5" @@ -25753,9 +27433,9 @@ } }, "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { "debug": "^3.2.5", @@ -25910,9 +27590,9 @@ "dev": true }, "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -26201,28 +27881,55 @@ "js-yaml": "^3.5.2" } }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", "dev": true, "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, "decamelize": { @@ -26231,54 +27938,92 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "execa": { + "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "number-is-nan": "^1.0.0" } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "color-convert": "^1.9.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "pump": "^3.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "locate-path": "^3.0.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -26289,82 +28034,89 @@ "path-exists": "^3.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "p-try": "^2.0.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "os-locale": { + "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "p-try": "^2.0.0" + "ansi-regex": "^4.1.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -26413,32 +28165,41 @@ "optional": true }, "yurnalist": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-1.0.5.tgz", - "integrity": "sha512-EuLjqX3Q15iVM0UtZa5Ju536uRmklKd2kKhdE5D5fIh8RZmh+pJ8c6wj2oGo0TA+T/Ii2o79cIHCTMfciW8jlA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-1.1.1.tgz", + "integrity": "sha512-WMk8SL262zU/3Cr8twpfx/kdhPDAkhWN9HukNeb1U1xVrwU9iIAsCgYI8J5QMZTz+5N3Et/ZKzvOzVCjd/dAWA==", "dev": true, "requires": { "babel-runtime": "^6.26.0", - "chalk": "^2.1.0", + "chalk": "^2.4.2", "cli-table3": "^0.5.1", - "debug": "^4.1.0", - "deep-equal": "^1.0.1", - "detect-indent": "^5.0.0", - "inquirer": "^6.2.0", + "debug": "^4.1.1", + "deep-equal": "^1.1.0", + "detect-indent": "^6.0.0", + "inquirer": "^7.0.0", "invariant": "^2.2.0", "is-builtin-module": "^3.0.0", "is-ci": "^2.0.0", - "leven": "^2.0.0", - "loud-rejection": "^1.2.0", - "node-emoji": "^1.6.1", + "leven": "^3.1.0", + "loud-rejection": "^2.2.0", + "node-emoji": "^1.10.0", "object-path": "^0.11.2", "read": "^1.0.7", - "rimraf": "^2.5.0", - "semver": "^5.1.0", - "strip-ansi": "^5.0.0", - "strip-bom": "^3.0.0" + "rimraf": "^3.0.0", + "semver": "^6.3.0", + "strip-ansi": "^5.2.0", + "strip-bom": "^4.0.0" }, "dependencies": { + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -26457,6 +28218,15 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -26466,6 +28236,48 @@ "ms": "^2.1.1" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, "is-builtin-module": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.0.0.tgz", @@ -26484,26 +28296,69 @@ "ci-info": "^2.0.0" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "loud-rejection": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", + "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.2" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "glob": "^7.1.3" + "mimic-fn": "^2.1.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } }, "strip-ansi": { "version": "5.2.0", @@ -26513,6 +28368,18 @@ "requires": { "ansi-regex": "^4.1.0" } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true } } } diff --git a/package.json b/package.json index 6bd110d3c8fca4be17fba824829e89de13b770a0..68a87d32f5accf9e50b9215001e3fdd00d93fb7d 100644 --- a/package.json +++ b/package.json @@ -22,24 +22,24 @@ "url": "https://github.com/badges/shields" }, "dependencies": { - "@hapi/joi": "^16.1.4", - "@sentry/node": "^5.6.2", + "@hapi/joi": "^16.1.7", + "@sentry/node": "^5.7.1", "bytes": "^3.1.0", "camelcase": "^5.3.1", "camp": "~17.2.4", "chalk": "^2.4.2", "check-node-version": "^4.0.1", "chrome-web-store-item-property": "~1.1.2", - "config": "^3.2.2", - "cross-env": "^6.0.0", + "config": "^3.2.4", + "cross-env": "^6.0.3", "decamelize": "^3.2.0", - "dotenv": "^8.1.0", + "dotenv": "^8.2.0", "emojic": "^1.1.15", "escape-string-regexp": "^2.0.0", - "fast-xml-parser": "^3.12.20", + "fast-xml-parser": "^3.14.0", "fsos": "^1.1.6", "gh-badges": "file:gh-badges", - "glob": "^7.1.4", + "glob": "^7.1.6", "graphql": "^14.5.8", "graphql-tag": "^2.10.1", "ioredis": "4.14.1", @@ -59,7 +59,7 @@ "query-string": "^6.8.3", "request": "~2.88.0", "semver": "~6.3.0", - "simple-icons": "1.16.0", + "simple-icons": "1.19.1", "xmldom": "~0.1.27", "xpath": "~0.0.27" }, @@ -144,29 +144,29 @@ ] }, "devDependencies": { - "@babel/core": "^7.6.2", - "@babel/plugin-proposal-class-properties": "^7.5.5", + "@babel/core": "^7.7.2", + "@babel/plugin-proposal-class-properties": "^7.7.0", "@babel/plugin-proposal-object-rest-spread": "^7.6.2", - "@babel/polyfill": "^7.6.0", - "@babel/preset-env": "^7.6.2", - "@babel/register": "7.6.2", + "@babel/polyfill": "^7.7.0", + "@babel/preset-env": "^7.7.1", + "@babel/register": "7.7.0", "@mapbox/react-click-to-select": "^2.2.0", - "@types/chai": "^4.2.3", + "@types/chai": "^4.2.4", "@types/chai-enzyme": "^0.6.7", "@types/enzyme": "^3.10.3", "@types/lodash.debounce": "^4.0.6", "@types/lodash.groupby": "^4.6.6", "@types/mocha": "^5.2.7", - "@types/node": "^12.7.5", - "@types/react-helmet": "^5.0.10", - "@types/react-modal": "^3.8.3", - "@types/react-select": "^3.0.4", + "@types/node": "^12.12.6", + "@types/react-helmet": "^5.0.14", + "@types/react-modal": "^3.10.0", + "@types/react-select": "^3.0.8", "@types/styled-components": "4.1.8", "@typescript-eslint/eslint-plugin": "^1.13.0", "@typescript-eslint/parser": "^1.13.0", "babel-plugin-inline-react-svg": "^1.1.0", "babel-plugin-istanbul": "^5.2.0", - "babel-preset-gatsby": "^0.2.17", + "babel-preset-gatsby": "^0.2.20", "caller": "^1.0.1", "chai": "^4.1.2", "chai-datetime": "^1.5.0", @@ -174,72 +174,72 @@ "chai-string": "^1.4.0", "child-process-promise": "^2.2.1", "clipboard-copy": "^3.1.0", - "concurrently": "^4.1.2", - "cypress": "^3.4.1", - "danger": "^9.2.1", + "concurrently": "^5.0.0", + "cypress": "^3.6.0", + "danger": "^9.2.4", "danger-plugin-no-test-shortcuts": "^2.0.0", "enzyme": "^3.10.0", - "enzyme-adapter-react-16": "^1.14.0", + "enzyme-adapter-react-16": "^1.15.1", "eslint": "^5.16.0", - "eslint-config-prettier": "^6.3.0", + "eslint-config-prettier": "^6.5.0", "eslint-config-standard": "^12.0.0", "eslint-config-standard-jsx": "^8.1.0", "eslint-config-standard-react": "^9.0.0", - "eslint-plugin-chai-friendly": "^0.4.1", + "eslint-plugin-chai-friendly": "^0.5.0", "eslint-plugin-cypress": "^2.7.0", "eslint-plugin-import": "^2.18.2", - "eslint-plugin-jsdoc": "^15.9.4", - "eslint-plugin-mocha": "^6.1.1", + "eslint-plugin-jsdoc": "^17.1.1", + "eslint-plugin-mocha": "^6.2.1", "eslint-plugin-no-extension-in-require": "^0.2.0", "eslint-plugin-node": "^10.0.0", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-react": "^7.14.3", - "eslint-plugin-react-hooks": "^2.0.1", + "eslint-plugin-react": "^7.16.0", + "eslint-plugin-react-hooks": "^2.2.0", "eslint-plugin-sort-class-members": "^1.6.0", "eslint-plugin-standard": "^4.0.1", "fetch-ponyfill": "^6.1.0", "fs-readfile-promise": "^3.0.1", - "gatsby": "2.15.15", - "gatsby-plugin-catch-links": "^2.1.12", - "gatsby-plugin-page-creator": "^2.1.23", - "gatsby-plugin-react-helmet": "^3.1.10", - "gatsby-plugin-remove-trailing-slashes": "^2.1.7", - "gatsby-plugin-styled-components": "^3.1.6", - "gatsby-plugin-typescript": "^2.1.9", + "gatsby": "2.17.10", + "gatsby-plugin-catch-links": "^2.1.15", + "gatsby-plugin-page-creator": "^2.1.28", + "gatsby-plugin-react-helmet": "^3.1.13", + "gatsby-plugin-remove-trailing-slashes": "^2.1.12", + "gatsby-plugin-styled-components": "^3.1.11", + "gatsby-plugin-typescript": "^2.1.15", "got": "^9.6.0", "humanize-string": "^2.1.0", - "husky": "^3.0.5", + "husky": "^3.0.9", "icedfrisby": "3.0.0", "icedfrisby-nock": "^2.0.0", "is-png": "^2.0.0", "is-svg": "^4.2.0", "js-yaml-loader": "^1.2.2", "jsdoc": "^3.6.3", - "lint-staged": "^9.4.0", + "lint-staged": "^9.4.2", "lodash.debounce": "^4.0.8", "lodash.difference": "^4.5.0", "lodash.groupby": "^4.6.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "mocha": "^6.2.0", + "mocha": "^6.2.2", "mocha-env-reporter": "^4.0.0", "mocha-junit-reporter": "^1.23.1", "mocha-yaml-loader": "^1.0.3", - "nock": "11.3.5", + "nock": "11.7.0", "node-mocks-http": "^1.8.0", - "nodemon": "^1.19.2", + "nodemon": "^1.19.4", "npm-run-all": "^4.1.5", "nyc": "^14.1.1", "opn-cli": "^5.0.0", - "portfinder": "^1.0.24", + "portfinder": "^1.0.25", "prettier": "1.18.2", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-error-overlay": "^6.0.2", + "react": "^16.11.0", + "react-dom": "^16.11.0", + "react-error-overlay": "^6.0.3", "react-helmet": "^5.2.1", - "react-modal": "^3.10.1", - "react-pose": "^4.0.8", - "react-select": "^3.0.5", + "react-modal": "^3.11.1", + "react-pose": "^4.0.9", + "react-select": "^3.0.8", "read-all-stdin-sync": "^1.0.5", "redis-server": "^1.2.2", "require-hacker": "^3.0.1", @@ -247,12 +247,12 @@ "sazerac": "^1.1.0", "sinon": "^7.5.0", "sinon-chai": "^3.3.0", - "snap-shot-it": "^7.8.0", - "start-server-and-test": "^1.10.2", - "styled-components": "^4.3.2", + "snap-shot-it": "^7.9.0", + "start-server-and-test": "^1.10.6", + "styled-components": "^4.4.1", "tmp": "0.1.0", "ts-mocha": "^6.0.0", - "typescript": "^3.6.3", + "typescript": "^3.6.4", "url": "^0.11.0", "walkdir": "0.4.1" }, diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js index 442e386b00fc20224af2aa57ade8b03eb45f65e7..604db37bcbe7a84e0d276a418ffdedd66f0176f0 100644 --- a/services/aur/aur.service.js +++ b/services/aur/aur.service.js @@ -13,7 +13,9 @@ const aurSchema = Joi.object({ .length(0) .required(), Joi.object({ - License: Joi.string().required(), + License: Joi.string() + .required() + .allow(null), NumVotes: nonNegativeInteger, Version: Joi.string().required(), OutOfDate: nonNegativeInteger.allow(null), @@ -61,8 +63,8 @@ class AurLicense extends BaseAurService { return [ { title: 'AUR license', - namedParams: { packageName: 'pac' }, - staticPreview: this.render({ license: 'MIT' }), + namedParams: { packageName: 'android-studio' }, + staticPreview: this.render({ license: 'Apache' }), }, ] } @@ -75,9 +77,19 @@ class AurLicense extends BaseAurService { return { message: license, color: 'blue' } } + transform(json) { + const license = json.results.License + if (!license) { + throw new NotFound({ prettyMessage: 'not specified' }) + } + + return { license } + } + async handle({ packageName }) { const json = await this.fetch({ packageName }) - return this.constructor.render({ license: json.results.License }) + const { license } = this.transform(json) + return this.constructor.render({ license }) } } diff --git a/services/aur/aur.tester.js b/services/aur/aur.tester.js index 7aca54d00dd2e67990cefbfe1dd19faa95dadd0d..c6b4d8d9d4e9957c3c2f4d6f1e732d58fe449ecf 100644 --- a/services/aur/aur.tester.js +++ b/services/aur/aur.tester.js @@ -14,7 +14,7 @@ const t = (module.exports = new ServiceTester({ // version tests t.create('version (valid)') - .get('/version/dropbox.json') + .get('/version/visual-studio-code-bin.json') .expectBadge({ label: 'aur', message: isVPlusDottedVersionNClausesWithOptionalSuffix, @@ -49,9 +49,13 @@ t.create('votes (not found)') // license tests t.create('license (valid)') - .get('/license/pac.json') + .get('/license/vscodium-bin.json') .expectBadge({ label: 'license', message: 'MIT' }) -t.create('license (not found)') +t.create('license (no license)') + .get('/license/dns-zone-blacklist-git.json') + .expectBadge({ label: 'license', message: 'not specified' }) + +t.create('license (package not found)') .get('/license/not-a-package.json') .expectBadge({ label: 'license', message: 'package not found' }) diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js index a610406ec06ce676228acd8842b1634f930a6fc6..b7473c213832033815fe958d5fced28d6ab440e0 100644 --- a/services/bugzilla/bugzilla.service.js +++ b/services/bugzilla/bugzilla.service.js @@ -13,7 +13,9 @@ const schema = Joi.object({ .items( Joi.object({ status: Joi.string().required(), - resolution: Joi.string().required(), + resolution: Joi.string() + .allow('') + .required(), }).required() ) .min(1) diff --git a/services/categories.js b/services/categories.js index 985718576a0906e1b4e34e183a23ef9550a2b616..fc45a33520bd7d39fa6c026f7977d5772b782576 100644 --- a/services/categories.js +++ b/services/categories.js @@ -1,21 +1,25 @@ 'use strict' module.exports = [ - { id: 'build', name: 'Build' }, - { id: 'coverage', name: 'Code Coverage' }, - { id: 'analysis', name: 'Analysis' }, - { id: 'chat', name: 'Chat' }, - { id: 'dependencies', name: 'Dependencies' }, - { id: 'size', name: 'Size' }, - { id: 'downloads', name: 'Downloads' }, - { id: 'funding', name: 'Funding' }, - { id: 'issue-tracking', name: 'Issue Tracking' }, - { id: 'license', name: 'License' }, - { id: 'rating', name: 'Rating' }, - { id: 'social', name: 'Social' }, - { id: 'version', name: 'Version' }, - { id: 'platform-support', name: 'Platform & Version Support' }, - { id: 'monitoring', name: 'Monitoring' }, - { id: 'activity', name: 'Activity' }, - { id: 'other', name: 'Other' }, + { id: 'build', name: 'Build', keywords: ['build'] }, + { id: 'coverage', name: 'Code Coverage', keywords: ['coverage'] }, + { id: 'analysis', name: 'Analysis', keywords: ['analysis'] }, + { id: 'chat', name: 'Chat', keywords: ['chat'] }, + { id: 'dependencies', name: 'Dependencies', keywords: ['dependencies'] }, + { id: 'size', name: 'Size', keywords: ['size'] }, + { id: 'downloads', name: 'Downloads', keywords: ['downloads'] }, + { id: 'funding', name: 'Funding', keywords: ['funding'] }, + { id: 'issue-tracking', name: 'Issue Tracking', keywords: ['issue'] }, + { id: 'license', name: 'License', keywords: ['license'] }, + { id: 'rating', name: 'Rating', keywords: ['rating'] }, + { id: 'social', name: 'Social', keywords: ['social'] }, + { id: 'version', name: 'Version', keywords: ['version'] }, + { + id: 'platform-support', + name: 'Platform & Version Support', + keywords: ['platform'], + }, + { id: 'monitoring', name: 'Monitoring', keywords: ['monitoring'] }, + { id: 'activity', name: 'Activity', keywords: ['activity'] }, + { id: 'other', name: 'Other', keywords: [] }, ] diff --git a/services/codeclimate/codeclimate-analysis.service.js b/services/codeclimate/codeclimate-analysis.service.js index 9d72feb183d267ead890b580501b573bcc78a44f..f1fdb3c5f01b9a4cd1c821920f65937038e7c062 100644 --- a/services/codeclimate/codeclimate-analysis.service.js +++ b/services/codeclimate/codeclimate-analysis.service.js @@ -109,7 +109,7 @@ module.exports = class CodeclimateAnalysis extends BaseJsonService { namedParams: { format: 'maintainability', user: 'angular', - repo: 'angular.js', + repo: 'angular', }, staticPreview: this.render({ variant: 'maintainability', @@ -130,7 +130,7 @@ module.exports = class CodeclimateAnalysis extends BaseJsonService { { title: 'Code Climate technical debt', pattern: 'tech-debt/:user/:repo', - namedParams: { user: 'jekyll', repo: 'jekyll' }, + namedParams: { user: 'angular', repo: 'angular' }, staticPreview: this.render({ variant: 'tech-debt', techDebtPercentage: 3.0, diff --git a/services/codeclimate/codeclimate-analysis.tester.js b/services/codeclimate/codeclimate-analysis.tester.js index 1b2dc6d70a0ba3dadd00fc2248193a0983322ea5..c3f5773b51a74bdd62968f2197d2da15dd08c56c 100644 --- a/services/codeclimate/codeclimate-analysis.tester.js +++ b/services/codeclimate/codeclimate-analysis.tester.js @@ -5,7 +5,7 @@ const { isIntegerPercentage } = require('../test-validators') const t = (module.exports = require('../tester').createServiceTester()) t.create('issues count') - .get('/issues/angular/angular.js.json') + .get('/issues/angular/angular.json') .expectBadge({ label: 'issues', message: Joi.number() @@ -14,21 +14,21 @@ t.create('issues count') }) t.create('technical debt percentage') - .get('/tech-debt/angular/angular.js.json') + .get('/tech-debt/angular/angular.json') .expectBadge({ label: 'technical debt', message: isIntegerPercentage, }) t.create('maintainability percentage') - .get('/maintainability-percentage/angular/angular.js.json') + .get('/maintainability-percentage/angular/angular.json') .expectBadge({ label: 'maintainability', message: isIntegerPercentage, }) t.create('maintainability letter') - .get('/maintainability/angular/angular.js.json') + .get('/maintainability/angular/angular.json') .expectBadge({ label: 'maintainability', message: Joi.equal('A', 'B', 'C', 'D', 'E', 'F'), @@ -49,10 +49,10 @@ t.create('maintainability letter for repo without snapshots') }) t.create('malformed response for outer user repos query') - .get('/maintainability/angular/angular.js.json') + .get('/maintainability/angular/angular.json') .intercept(nock => nock('https://api.codeclimate.com') - .get('/v1/repos?github_slug=angular%2Fangular.js') + .get('/v1/repos?github_slug=angular%2Fangular') .reply(200, { data: [{}], // No relationships in the list of data elements. }) @@ -63,7 +63,7 @@ t.create('malformed response for outer user repos query') }) t.create('malformed response for inner specific repo query') - .get('/maintainability/angular/angular.js.json') + .get('/maintainability/angular/angular.json') .intercept(nock => nock('https://api.codeclimate.com', { allowUnmocked: true }) .get(/\/v1\/repos\/[a-z0-9]+\/snapshots\/[a-z0-9]+/) diff --git a/services/codefactor/codefactor-helpers.js b/services/codefactor/codefactor-helpers.js index 854086a3e0f3edf860045d92fddf767f2f14e244..e27c73c7b1eb72835cf7a627d9bf6666168fd6e1 100644 --- a/services/codefactor/codefactor-helpers.js +++ b/services/codefactor/codefactor-helpers.js @@ -3,7 +3,9 @@ const Joi = require('@hapi/joi') // https://support.codefactor.io/i14-glossary +// https://github.com/badges/shields/issues/4269 const colorMap = { + 'A+': 'brightgreen', A: 'brightgreen', 'A-': 'green', 'B+': 'yellowgreen', diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js index 2552ccc8b455e613677238ae687b6093f7f2e42a..00a5742378426338ea16d17b5b934e4b7f8b40a4 100644 --- a/services/crates/crates-base.js +++ b/services/crates/crates-base.js @@ -9,6 +9,7 @@ const keywords = ['Rust'] const crateSchema = Joi.object({ crate: Joi.object({ downloads: nonNegativeInteger, + recent_downloads: nonNegativeInteger, max_version: Joi.string().required(), }).required(), versions: Joi.array() diff --git a/services/crates/crates-downloads.service.js b/services/crates/crates-downloads.service.js index 4e34e9bcf4f7c57901e41c5881c2d9277e3c213b..0a636b1e3fb6579ab119809116a7e0a6c17cc375 100644 --- a/services/crates/crates-downloads.service.js +++ b/services/crates/crates-downloads.service.js @@ -3,6 +3,7 @@ const { downloadCount: downloadCountColor } = require('../color-formatters') const { metric } = require('../text-formatters') const { BaseCratesService, keywords } = require('./crates-base') +const { InvalidParameter, NotFound } = require('..') module.exports = class CratesDownloads extends BaseCratesService { static get category() { @@ -12,7 +13,7 @@ module.exports = class CratesDownloads extends BaseCratesService { static get route() { return { base: 'crates', - pattern: ':variant(d|dv)/:crate/:version?', + pattern: ':variant(d|dv|dr)/:crate/:version?', } } @@ -20,34 +21,56 @@ module.exports = class CratesDownloads extends BaseCratesService { return [ { title: 'Crates.io', - pattern: ':variant(d|dv)/:crate', - namedParams: { variant: 'd', crate: 'rustc-serialize' }, - staticPreview: this.render({ downloads: 5000000 }), + pattern: 'd/:crate', + namedParams: { + crate: 'rustc-serialize', + }, + staticPreview: this.render({ variant: 'd', downloads: 5000000 }), keywords, }, { - title: 'Crates.io', - pattern: ':variant(d|dv)/:crate/:version', + title: 'Crates.io (latest)', + pattern: 'dv/:crate', + namedParams: { + crate: 'rustc-serialize', + }, + staticPreview: this.render({ variant: 'dv', downloads: 2000000 }), + keywords, + }, + { + title: 'Crates.io (version)', + pattern: 'dv/:crate/:version', namedParams: { - variant: 'd', crate: 'rustc-serialize', version: '0.3.24', }, - staticPreview: this.render({ downloads: 2000000, version: '0.3.24' }), + staticPreview: this.render({ + variant: 'dv', + downloads: 2000000, + version: '0.3.24', + }), + keywords, + }, + { + title: 'Crates.io (recent)', + pattern: 'dr/:crate', + namedParams: { + crate: 'rustc-serialize', + }, + staticPreview: this.render({ variant: 'dr', downloads: 2000000 }), keywords, }, ] } static _getLabel(version, variant) { - if (version) { - return `downloads@${version}` - } else { - if (variant === 'dv') { - return 'downloads@latest' - } else { - return 'downloads' - } + switch (variant) { + case 'dv': + return version ? `downloads@${version}` : 'downloads@latest' + case 'dr': + return 'recent downloads' + default: + return version ? `downloads@${version}` : 'downloads' } } @@ -59,7 +82,27 @@ module.exports = class CratesDownloads extends BaseCratesService { } } + transform({ variant, json }) { + switch (variant) { + case 'dv': + return json.crate ? json.versions[0].downloads : json.version.downloads + case 'dr': + return json.crate.recent_downloads + default: + return json.crate ? json.crate.downloads : json.version.downloads + } + } + async handle({ variant, crate, version }) { + if (variant === 'dr' && version) { + /* crates.io doesn't currently expose + recent download counts for individual + versions */ + throw new InvalidParameter({ + prettyMessage: 'recent downloads not supported for specific versions', + }) + } + const json = await this.fetch({ crate, version }) if (json.errors) { @@ -68,17 +111,11 @@ module.exports = class CratesDownloads extends BaseCratesService { or https://crates.io/api/v1/crates/libc/0.1.76 returns a 200 OK with an errors object */ - return { message: json.errors[0].detail } + throw new NotFound({ prettyMessage: json.errors[0].detail }) } - let downloads - if (variant === 'dv') { - downloads = json.version - ? json.version.downloads - : json.versions[0].downloads - } else { - downloads = json.crate ? json.crate.downloads : json.version.downloads - } + const downloads = this.transform({ variant, json }) + return this.constructor.render({ variant, downloads, version }) } } diff --git a/services/crates/crates-downloads.tester.js b/services/crates/crates-downloads.tester.js index 1f81301dec5f713c38fc86625d83ab7d2a1965fd..b56f956255a8822513787c3444651f2ecd013ed6 100644 --- a/services/crates/crates-downloads.tester.js +++ b/services/crates/crates-downloads.tester.js @@ -34,6 +34,20 @@ t.create('downloads for version (with version)') message: isMetric, }) +t.create('recent downloads') + .get('/dr/libc.json') + .expectBadge({ + label: 'recent downloads', + message: isMetric, + }) + +t.create('recent downloads (with version)') + .get('/dr/libc/0.2.31.json') + .expectBadge({ + label: 'crates.io', + message: 'recent downloads not supported for specific versions', + }) + t.create('downloads (invalid version)') .get('/d/libc/7.json') .expectBadge({ label: 'crates.io', message: 'invalid semver: 7' }) diff --git a/services/discord/discord.service.js b/services/discord/discord.service.js index 3791781be0ae7091cbbea706e797e1756ef91747..61acbe235551a616ea070b2b8b77033903b4b158 100644 --- a/services/discord/discord.service.js +++ b/services/discord/discord.service.js @@ -9,6 +9,22 @@ const discordSchema = Joi.object({ .required(), }).required() +const documentation = ` +<p> + The Discord badge requires the <code>SERVER ID</code> in order access the Discord JSON API. +</p> +<p> + The <code>SERVER ID</code> can be located in the url of the channel that the badge is accessing. +</p> +<img + src="https://user-images.githubusercontent.com/6025893/39329897-b08f8290-4997-11e8-8f8f-7b85ff61882f.png" + alt="SERVER ID is after the channel part at the end of the url" /> +<p> + To use the Discord badge a Discord server admin must enable the widget setting on the server. +</p> +<iframe src="https://player.vimeo.com/video/364220040" width="640" height="210" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe> +` + module.exports = class Discord extends BaseJsonService { static get category() { return 'chat' @@ -27,6 +43,7 @@ module.exports = class Discord extends BaseJsonService { title: 'Discord', namedParams: { serverId: '102860784329052160' }, staticPreview: this.render({ members: 23 }), + documentation, }, ] } diff --git a/services/dynamic/dynamic-xml.service.js b/services/dynamic/dynamic-xml.service.js index d39ad95a36315642d7a9163a648bd6b3e09c90b4..0182024f693c2b3005d12afb7fe5c3ee3b7780cc 100644 --- a/services/dynamic/dynamic-xml.service.js +++ b/services/dynamic/dynamic-xml.service.js @@ -27,18 +27,11 @@ module.exports = class DynamicXml extends BaseService { } } - async handle(namedParams, { url, query: pathExpression, prefix, suffix }) { + transform({ pathExpression, buffer }) { // e.g. //book[2]/@id const pathIsAttr = ( pathExpression.split('/').slice(-1)[0] || '' ).startsWith('@') - - const { buffer } = await this._request({ - url, - options: { headers: { Accept: 'application/xml, text/xml' } }, - errorMessages, - }) - const parsed = new DOMParser().parseFromString(buffer) let values @@ -47,14 +40,50 @@ module.exports = class DynamicXml extends BaseService { } catch (e) { throw new InvalidParameter({ prettyMessage: e.message }) } - values = values.map((node, i) => - pathIsAttr ? node.value : node.firstChild.data - ) + + if ( + typeof values === 'string' || + typeof values === 'number' || + typeof values === 'boolean' + ) { + values = [values] + } else if (Array.isArray(values)) { + values = values.reduce((accum, node) => { + if (pathIsAttr) { + accum.push(node.value) + } else if (node.firstChild) { + accum.push(node.firstChild.data) + } else { + accum.push(node.data) + } + + return accum + }, []) + } else { + throw new InvalidResponse({ + prettyMessage: 'unsupported query', + }) + } if (!values.length) { throw new InvalidResponse({ prettyMessage: 'no result' }) } - return renderDynamicBadge({ value: values, prefix, suffix }) + return { values } + } + + async handle(_namedParams, { url, query: pathExpression, prefix, suffix }) { + const { buffer } = await this._request({ + url, + options: { headers: { Accept: 'application/xml, text/xml' } }, + errorMessages, + }) + + const { values: value } = this.transform({ + pathExpression, + buffer, + }) + + return renderDynamicBadge({ value, prefix, suffix }) } } diff --git a/services/dynamic/dynamic-xml.spec.js b/services/dynamic/dynamic-xml.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..dd0c92c3e0a36c0a1e0ddcc0989053f6c5e8d903 --- /dev/null +++ b/services/dynamic/dynamic-xml.spec.js @@ -0,0 +1,132 @@ +'use strict' + +const { expect } = require('chai') +const sinon = require('sinon') +const xpath = require('xpath') +const { test, given } = require('sazerac') +const DynamicXml = require('./dynamic-xml.service') +const { InvalidResponse } = require('..') + +const exampleXml = `<?xml version="1.0"?> +<catalog> + <book id="bk101"> + <title>XML Developer's Guide</title> + <price>44.95</price> + <genre>Computer</genre> + </book> + <book id="bk102"> + <title>Midnight Rain</title> + <price>5.95</price> + <genre></genre> + </book> +</catalog> +` + +describe('DynamicXml', function() { + describe('transform()', function() { + beforeEach(function() { + sinon.stub(xpath, 'select').returns(undefined) + }) + + afterEach(function() { + sinon.restore() + }) + + it('throws InvalidResponse on unsupported query', function() { + expect(() => + DynamicXml.prototype.transform({ + pathExpression: '//book/title', + buffer: exampleXml, + }) + ) + .to.throw(InvalidResponse) + .with.property('prettyMessage', 'unsupported query') + }) + }) + + test(DynamicXml.prototype.transform, () => { + given({ + pathExpression: '//book[1]/title/text()', + buffer: exampleXml, + }).expect({ + values: ["XML Developer's Guide"], + }) + given({ pathExpression: '//book/title/text()', buffer: exampleXml }).expect( + { + values: ["XML Developer's Guide", 'Midnight Rain'], + } + ) + given({ + pathExpression: 'string(//book[1]/title)', + buffer: exampleXml, + }).expect({ + values: ["XML Developer's Guide"], + }) + given({ + pathExpression: 'string(//book/title)', + buffer: exampleXml, + }).expect({ + values: ["XML Developer's Guide"], + }) + given({ + pathExpression: 'string(//book[1]/@id)', + buffer: exampleXml, + }).expect({ + values: ['bk101'], + }) + given({ + pathExpression: 'substring(//book[1]/title, 5, 9)', + buffer: exampleXml, + }).expect({ + values: ['Developer'], + }) + given({ + pathExpression: 'number(//book[1]/price)', + buffer: exampleXml, + }).expect({ + values: [44.95], + }) + given({ + pathExpression: 'boolean(string(//book[1]/genre))', + buffer: exampleXml, + }).expect({ + values: [true], + }) + given({ + pathExpression: 'boolean(string(//book[2]/genre))', + buffer: exampleXml, + }).expect({ + values: [false], + }) + given({ + pathExpression: 'count(//book)', + buffer: exampleXml, + }).expect({ + values: [2], + }) + given({ + pathExpression: 'floor(//book[1]/price)', + buffer: exampleXml, + }).expect({ + values: [44], + }) + given({ + pathExpression: "//p[lang('en')]", + buffer: '<p xml:lang="en">Midnight Rain</p>', + }).expect({ + values: ['Midnight Rain'], + }) + given({ + pathExpression: 'normalize-space(string(/title))', + buffer: '<title> Midnight Rain </title>', + }).expect({ + values: ['Midnight Rain'], + }) + given({ + pathExpression: '//book[1]/title | //book[1]/price', + buffer: exampleXml, + }).expect({ + values: ["XML Developer's Guide", '44.95'], + }) + }) +}) diff --git a/services/dynamic/dynamic-xml.tester.js b/services/dynamic/dynamic-xml.tester.js index d560bff15939361acf312b5aa5564e2d5035e66a..adca35606b4a6000644d20a51531173735c41160 100644 --- a/services/dynamic/dynamic-xml.tester.js +++ b/services/dynamic/dynamic-xml.tester.js @@ -176,3 +176,45 @@ t.create('request should set Accept header') .reply(200, exampleXml) ) .expectBadge({ label: 'custom badge', message: 'Midnight Rain' }) + +t.create('query with node function') + .get( + `.json?${queryString.stringify({ + url: exampleUrl, + query: '//book[1]/title/text()', + })}` + ) + .intercept(withExampleXml) + .expectBadge({ + label: 'custom badge', + message: "XML Developer's Guide", + color: 'blue', + }) + +t.create('query with type convertion to string') + .get( + `.json?${queryString.stringify({ + url: exampleUrl, + query: 'string(//book[1]/title)', + })}` + ) + .intercept(withExampleXml) + .expectBadge({ + label: 'custom badge', + message: "XML Developer's Guide", + color: 'blue', + }) + +t.create('query with type convertion to number') + .get( + `.json?${queryString.stringify({ + url: exampleUrl, + query: 'number(//book[1]/price)', + })}` + ) + .intercept(withExampleXml) + .expectBadge({ + label: 'custom badge', + message: '44.95', + color: 'blue', + }) diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js index 7defc30804df5c93edf59bdaca63b7798ea73a3e..fefd786176cc96d9e0f08b44eeccb42f7a081ebe 100644 --- a/services/github/github-common-fetch.js +++ b/services/github/github-common-fetch.js @@ -24,37 +24,55 @@ const contentSchema = Joi.object({ encoding: Joi.equal('base64').required(), }).required() -async function fetchJsonFromRepo( +async function fetchRepoContent( serviceInstance, - { schema, user, repo, branch = 'master', filename } + { user, repo, branch = 'master', filename } ) { const errorMessages = errorMessagesFor( `repo not found, branch not found, or ${filename} missing` ) if (serviceInstance.staticAuthConfigured) { - const url = `/repos/${user}/${repo}/contents/${filename}` - const options = { qs: { ref: branch } } const { content } = await serviceInstance._requestJson({ schema: contentSchema, - url, - options, + url: `/repos/${user}/${repo}/contents/${filename}`, + options: { qs: { ref: branch } }, errorMessages, }) - let decoded try { - decoded = Buffer.from(content, 'base64').toString('utf-8') + return Buffer.from(content, 'base64').toString('utf-8') } catch (e) { throw new InvalidResponse({ prettyMessage: 'undecodable content' }) } - const json = serviceInstance._parseJson(decoded) + } else { + const { buffer } = await serviceInstance._request({ + url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`, + errorMessages, + }) + return buffer + } +} + +async function fetchJsonFromRepo( + serviceInstance, + { schema, user, repo, branch = 'master', filename } +) { + if (serviceInstance.staticAuthConfigured) { + const buffer = await fetchRepoContent(serviceInstance, { + user, + repo, + branch, + filename, + }) + const json = serviceInstance._parseJson(buffer) return serviceInstance.constructor._validate(json, schema) } else { - const url = `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}` return serviceInstance._requestJson({ schema, - url, - errorMessages, + url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`, + errorMessages: errorMessagesFor( + `repo not found, branch not found, or ${filename} missing` + ), }) } } @@ -79,6 +97,7 @@ async function fetchLatestRelease(serviceInstance, { user, repo }) { module.exports = { fetchIssue, + fetchRepoContent, fetchJsonFromRepo, fetchLatestRelease, releaseInfoSchema, diff --git a/services/github/github-contributors.tester.js b/services/github/github-contributors.tester.js index 49a669f3625938e2366340d6a4123ea7bb7c31da..bc5cc3ace9887fdf60a59969e8baff1c5acbec82 100644 --- a/services/github/github-contributors.tester.js +++ b/services/github/github-contributors.tester.js @@ -4,14 +4,14 @@ const t = (module.exports = require('../tester').createServiceTester()) const { isMetric } = require('../test-validators') t.create('Contributors') - .get('/contributors/cdnjs/cdnjs.json') + .get('/contributors/badges/shields.json') .expectBadge({ label: 'contributors', message: isMetric, }) t.create('1 contributor') - .get('/contributors/paulmelnikow/local-credential-storage.json') + .get('/contributors/badges/shields-tests.json') .expectBadge({ label: 'contributors', message: '1', diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js index 4b28158250b2fe616893c09f410a83c39e14697d..8c1ea820beceb9ec33eb552390db6b0b1319b2bb 100644 --- a/services/github/github-downloads.service.js +++ b/services/github/github-downloads.service.js @@ -22,8 +22,6 @@ const releaseArraySchema = Joi.alternatives().try( Joi.array().length(0) ) -const keywords = ['github download'] - module.exports = class GithubDownloads extends GithubAuthV3Service { static get category() { return 'downloads' @@ -50,7 +48,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service { downloadCount: 857000, }), documentation, - keywords, }, { title: 'GitHub Releases', @@ -66,7 +63,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service { downloadCount: 27000, }), documentation, - keywords, }, { title: 'GitHub Pre-Releases', @@ -82,7 +78,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service { downloadCount: 2000, }), documentation, - keywords, }, { title: 'GitHub Releases (by Release)', @@ -98,7 +93,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service { downloadCount: 490000, }), documentation, - keywords, }, { title: 'GitHub Releases (by Asset)', @@ -115,7 +109,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service { downloadCount: 3000, }), documentation, - keywords, }, { title: 'GitHub Pre-Releases (by Asset)', @@ -132,7 +125,6 @@ module.exports = class GithubDownloads extends GithubAuthV3Service { downloadCount: 237, }), documentation, - keywords, }, ] } diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js index 65e84f717034dc9d6b01a4ab17b0e7ec864dd005..97a9bcae49b58a8ddc0f88d85b7a910acbf2afa2 100644 --- a/services/github/github-forks.service.js +++ b/services/github/github-forks.service.js @@ -10,9 +10,7 @@ const { documentation, transformErrors } = require('./github-helpers') const schema = Joi.object({ data: Joi.object({ repository: Joi.object({ - forks: Joi.object({ - totalCount: nonNegativeInteger, - }).required(), + forkCount: nonNegativeInteger, }).required(), }).required(), }).required() @@ -78,9 +76,7 @@ module.exports = class GithubForks extends GithubAuthV4Service { query: gql` query($user: String!, $repo: String!) { repository(owner: $user, name: $repo) { - forks { - totalCount - } + forkCount } } `, @@ -91,7 +87,7 @@ module.exports = class GithubForks extends GithubAuthV4Service { return this.constructor.render({ user, repo, - forkCount: json.data.repository.forks.totalCount, + forkCount: json.data.repository.forkCount, }) } } diff --git a/services/github/github-go-mod.service.js b/services/github/github-go-mod.service.js new file mode 100644 index 0000000000000000000000000000000000000000..d8f7f010d09adab1bd18ca8ff7a858eaae952057 --- /dev/null +++ b/services/github/github-go-mod.service.js @@ -0,0 +1,109 @@ +'use strict' + +const Joi = require('@hapi/joi') +const { renderVersionBadge } = require('../version') +const { ConditionalGithubAuthV3Service } = require('./github-auth-service') +const { fetchRepoContent } = require('./github-common-fetch') +const { documentation } = require('./github-helpers') +const { InvalidResponse } = require('..') + +const queryParamSchema = Joi.object({ + filename: Joi.string(), +}).required() + +const goVersionRegExp = new RegExp('^go (.+)$', 'm') + +const keywords = ['golang'] + +module.exports = class GithubGoModGoVersion extends ConditionalGithubAuthV3Service { + static get category() { + return 'version' + } + + static get route() { + return { + base: 'github/go-mod/go-version', + pattern: ':user/:repo/:branch*', + queryParamSchema, + } + } + + static get examples() { + return [ + { + title: 'GitHub go.mod Go version', + pattern: ':user/:repo', + namedParams: { user: 'gohugoio', repo: 'hugo' }, + staticPreview: this.render({ version: '1.12' }), + documentation, + keywords, + }, + { + title: 'GitHub go.mod Go version (branch)', + pattern: ':user/:repo/:branch', + namedParams: { + user: 'gohugoio', + repo: 'hugo', + branch: 'master', + }, + staticPreview: this.render({ version: '1.12', branch: 'master' }), + documentation, + keywords, + }, + { + title: 'GitHub go.mod Go version (subfolder of monorepo)', + pattern: ':user/:repo', + namedParams: { user: 'golang', repo: 'go' }, + queryParams: { filename: 'src/go.mod' }, + staticPreview: this.render({ version: '1.14' }), + documentation, + keywords, + }, + { + title: 'GitHub go.mod Go version (branch & subfolder of monorepo)', + pattern: ':user/:repo/:branch', + namedParams: { user: 'golang', repo: 'go', branch: 'master' }, + queryParams: { filename: 'src/go.mod' }, + staticPreview: this.render({ version: '1.14' }), + documentation, + keywords, + }, + ] + } + + static get defaultBadgeData() { + return { label: 'Go' } + } + + static render({ version, branch }) { + return renderVersionBadge({ + version, + tag: branch, + defaultLabel: 'Go', + }) + } + + static transform(content) { + const match = goVersionRegExp.exec(content) + if (!match) { + throw new InvalidResponse({ + prettyMessage: 'Go version missing in go.mod', + }) + } + + return { + go: match[1], + } + } + + async handle({ user, repo, branch }, { filename = 'go.mod' }) { + const content = await fetchRepoContent(this, { + user, + repo, + branch, + filename, + }) + const { go } = this.constructor.transform(content) + return this.constructor.render({ version: go, branch }) + } +} diff --git a/services/github/github-go-mod.tester.js b/services/github/github-go-mod.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..9780d6c88ce8a46553bc36efc6073fbec2aab28e --- /dev/null +++ b/services/github/github-go-mod.tester.js @@ -0,0 +1,39 @@ +'use strict' + +const { isVPlusDottedVersionAtLeastOne } = require('../test-validators') +const t = (module.exports = require('../tester').createServiceTester()) + +t.create('Go version') + .get('/gohugoio/hugo.json') + .expectBadge({ + label: 'Go', + message: isVPlusDottedVersionAtLeastOne, + }) + +t.create('Go version (from branch)') + .get('/gohugoio/hugo/master.json') + .expectBadge({ + label: 'Go@master', + message: isVPlusDottedVersionAtLeastOne, + }) + +t.create('Go version (mongorepo)') + .get(`/golang/go.json?filename=${encodeURIComponent('src/go.mod')}`) + .expectBadge({ + label: 'Go', + message: isVPlusDottedVersionAtLeastOne, + }) + +t.create('Go version (repo not found)') + .get('/badges/not-existing-repo.json') + .expectBadge({ + label: 'Go', + message: 'repo not found, branch not found, or go.mod missing', + }) + +t.create('Go version (missing Go version in go.mod)') + .get('/calebcartwright/ci-detective.json') + .expectBadge({ + label: 'Go', + message: 'Go version missing in go.mod', + }) diff --git a/services/github/github-hacktoberfest.service.js b/services/github/github-hacktoberfest.service.js new file mode 100644 index 0000000000000000000000000000000000000000..0192793a3904773f32dc1d2804671f2e8180aaba --- /dev/null +++ b/services/github/github-hacktoberfest.service.js @@ -0,0 +1,215 @@ +'use strict' + +const gql = require('graphql-tag') +const Joi = require('@hapi/joi') +const moment = require('moment') +const { metric, maybePluralize } = require('../text-formatters') +const { nonNegativeInteger } = require('../validators') +const { GithubAuthV4Service } = require('./github-auth-service') +const { + documentation: githubDocumentation, + transformErrors, +} = require('./github-helpers') + +const documentation = ` + <p> + This badge is designed for projects hosted on GitHub which are + participating in + <a href="https://hacktoberfest.digitalocean.com">Hacktoberfest</a>, + an initiative to encourage participating in open-source projects. The + badge can be added to the project readme to encourage potential + contributors to review the suggested issues and to celebrate the + contributions that have already been made. + + The badge displays three pieces of information: + <ul> + <li> + The number of suggested issues. By default this will count open + issues with the <strong>hacktoberfest</strong> label, however you + can pick a different label (e.g. + <code>?suggestion_label=good%20first%20issue</code>). + </li> + <li> + The number of pull requests opened in October. This excludes any + PR with the <strong>invalid</strong> label. + </li> + <li>The number of days left of October.</li> + </ul> + + </p> + + ${githubDocumentation} +` + +const schema = Joi.object({ + data: Joi.object({ + repository: Joi.object({ + issues: Joi.object({ + totalCount: nonNegativeInteger, + }).required(), + }).required(), + search: Joi.object({ + issueCount: nonNegativeInteger, + }).required(), + }).required(), +}).required() + +const queryParamSchema = Joi.object({ + suggestion_label: Joi.string(), +}).required() + +module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Service { + static get category() { + return 'issue-tracking' + } + + static get route() { + return { + base: 'github/hacktoberfest/2019', + pattern: ':user/:repo', + queryParamSchema, + } + } + + static get examples() { + return [ + { + title: 'GitHub Hacktoberfest combined status', + namedParams: { + user: 'snyk', + repo: 'snyk', + }, + staticPreview: this.render({ + suggestedIssueCount: 12, + contributionCount: 8, + daysLeft: 15, + }), + documentation, + }, + { + title: + 'GitHub Hacktoberfest combined status (suggestion label override)', + namedParams: { + user: 'tmrowco', + repo: 'tmrowapp-contrib', + }, + queryParams: { + suggestion_label: 'help wanted', + }, + staticPreview: this.render({ + suggestedIssueCount: 12, + contributionCount: 8, + daysLeft: 15, + }), + documentation, + }, + ] + } + + static get defaultBadgeData() { + return { + label: 'hacktoberfest', + color: 'orange', + } + } + + static render({ suggestedIssueCount, contributionCount, daysLeft }) { + if (daysLeft === undefined) { + // The global cutoff time is 11/1 noon UTC. + // https://github.com/badges/shields/pull/4109#discussion_r330782093 + // We want to show "1 day left" on the last day so we add 1. + daysLeft = moment('2019-11-01 12:00:00 Z').diff(moment(), 'days') + 1 + } + if (daysLeft < 0) { + return { + message: `is over! (${metric(contributionCount)} ${maybePluralize( + 'PR', + contributionCount + )} opened)`, + } + } + const message = + [ + suggestedIssueCount + ? `${metric(suggestedIssueCount)} ${maybePluralize( + 'open issue', + suggestedIssueCount + )}` + : '', + contributionCount + ? `${metric(contributionCount)} ${maybePluralize( + 'PR', + contributionCount + )}` + : '', + daysLeft > 0 + ? `${daysLeft} ${maybePluralize('day', daysLeft)} left` + : '', + ] + .filter(Boolean) + .join(', ') || 'is over!' + + return { message } + } + + async fetch({ user, repo, suggestionLabel = 'hacktoberfest' }) { + const isValidOctoberPR = [ + `repo:${user}/${repo}`, + 'is:pr', + 'created:2019-10-01..2019-10-31', + `-label:invalid`, + ] + .filter(Boolean) + .join(' ') + const { + data: { + repository: { + issues: { totalCount: suggestedIssueCount }, + }, + search: { issueCount: contributionCount }, + }, + } = await this._requestGraphql({ + query: gql` + query( + $user: String! + $repo: String! + $suggestionLabel: String! + $isValidOctoberPR: String! + ) { + repository(owner: $user, name: $repo) { + issues(states: [OPEN], labels: [$suggestionLabel]) { + totalCount + } + } + search(query: $isValidOctoberPR, type: ISSUE, last: 0) { + issueCount + } + } + `, + variables: { + user, + repo, + suggestionLabel, + isValidOctoberPR, + }, + schema, + transformErrors, + }) + return { + suggestedIssueCount, + contributionCount, + } + } + + async handle({ user, repo }, { suggestion_label: suggestionLabel }) { + const { suggestedIssueCount, contributionCount } = await this.fetch({ + user, + repo, + suggestionLabel, + }) + return this.constructor.render({ + suggestedIssueCount, + contributionCount, + }) + } +} diff --git a/services/github/github-hacktoberfest.spec.js b/services/github/github-hacktoberfest.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..b62bbe765a61bbd91a6ce571e856010f33ba16be --- /dev/null +++ b/services/github/github-hacktoberfest.spec.js @@ -0,0 +1,22 @@ +'use strict' + +const { test, given } = require('sazerac') +const GitHubHacktoberfest = require('./github-hacktoberfest.service') + +describe('GitHubHacktoberfest', function() { + test(GitHubHacktoberfest.render, () => { + given({ + daysLeft: -1, + contributionCount: 12, + }).expect({ + message: 'is over! (12 PRs opened)', + }) + given({ + daysLeft: 10, + contributionCount: 27, + suggestedIssueCount: 54, + }).expect({ + message: '54 open issues, 27 PRs, 10 days left', + }) + }) +}) diff --git a/services/github/github-hacktoberfest.tester.js b/services/github/github-hacktoberfest.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..51eb74c164840d911be7d2846e9996d9ddecdcde --- /dev/null +++ b/services/github/github-hacktoberfest.tester.js @@ -0,0 +1,38 @@ +'use strict' + +const Joi = require('@hapi/joi') +const t = (module.exports = require('../tester').createServiceTester()) + +const isHacktoberfestNoIssuesStatus = Joi.string().regex( + /^[0-9]+ PRs?(, [0-9]+ days? left)?$/ +) +const isHacktoberfestNoPRsStatus = Joi.string().regex( + /^([0-9]+ open issues?)?[0-9]+ days? left$/ +) +const isHacktoberfestCombinedStatus = Joi.string().regex( + /^[0-9]+ open issues?(, [0-9]+ PRs?)?(, [0-9]+ days? left)?$/ +) +const isHacktoberfestStatus = Joi.alternatives().try( + isHacktoberfestNoIssuesStatus, + isHacktoberfestNoPRsStatus, + isHacktoberfestCombinedStatus, + /^is over! \([0-9]+ PRs? opened\)$/ +) + +t.create('GitHub Hacktoberfest combined status') + .get('/badges/shields.json') + .expectBadge({ + label: 'hacktoberfest', + message: isHacktoberfestStatus, + }) + +t.create('GitHub Hacktoberfest combined status (suggestion label override)') + .get( + `/badges/shields.json?suggestion_label=${encodeURIComponent( + 'good first issue' + )}` + ) + .expectBadge({ + label: 'hacktoberfest', + message: isHacktoberfestStatus, + }) diff --git a/services/github/github-helpers.js b/services/github/github-helpers.js index 18430fdd3a92d45f37a07bd7f782869a6239b2ba..edf44ce9c76461345b218380033f389752d39c56 100644 --- a/services/github/github-helpers.js +++ b/services/github/github-helpers.js @@ -7,10 +7,9 @@ const { InvalidResponse, NotFound } = require('..') const documentation = ` <p> If your GitHub badge errors, it might be because you hit GitHub's rate limits. - <br> You can increase Shields.io's rate limit by - <a href="https://img.shields.io/github-auth">going to this page</a> to add - Shields as a GitHub application on your GitHub account. + <a href="https://img.shields.io/github-auth">adding the Shields GitHub + application</a> using your GitHub account. </p> ` diff --git a/services/github/github-issues.service.js b/services/github/github-issues.service.js index ef5b0064cd937e047d9ab8f4e73da8a91121b538..52e580dfa1bd9a30752c8647941b3d6b3306b576 100644 --- a/services/github/github-issues.service.js +++ b/services/github/github-issues.service.js @@ -1,10 +1,31 @@ 'use strict' +const gql = require('graphql-tag') const Joi = require('@hapi/joi') const { metric } = require('../text-formatters') const { nonNegativeInteger } = require('../validators') -const { GithubAuthV3Service } = require('./github-auth-service') -const { documentation, errorMessagesFor } = require('./github-helpers') +const { GithubAuthV4Service } = require('./github-auth-service') +const { documentation, transformErrors } = require('./github-helpers') + +const issueCountSchema = Joi.object({ + data: Joi.object({ + repository: Joi.object({ + issues: Joi.object({ + totalCount: nonNegativeInteger, + }).required(), + }).required(), + }).required(), +}).required() + +const pullRequestCountSchema = Joi.object({ + data: Joi.object({ + repository: Joi.object({ + pullRequests: Joi.object({ + totalCount: nonNegativeInteger, + }).required(), + }).required(), + }).required(), +}).required() const isPRVariant = { 'issues-pr': true, @@ -16,11 +37,7 @@ const isClosedVariant = { 'issues-pr-closed': true, } -const schema = Joi.object({ - total_count: nonNegativeInteger, -}).required() - -module.exports = class GithubIssues extends GithubAuthV3Service { +module.exports = class GithubIssues extends GithubAuthV4Service { static get category() { return 'issue-tracking' } @@ -223,8 +240,8 @@ module.exports = class GithubIssues extends GithubAuthV3Service { } } - static render({ variant, numIssues, raw, label }) { - const state = isClosedVariant[variant] ? 'closed' : 'open' + static render({ isPR, isClosed, issueCount, raw, label }) { + const state = isClosed ? 'closed' : 'open' let labelPrefix = '' let messageSuffix = '' @@ -238,35 +255,98 @@ module.exports = class GithubIssues extends GithubAuthV3Service { const labelText = label ? `${isGhLabelMultiWord ? `"${label}"` : label} ` : '' - const labelSuffix = isPRVariant[variant] ? 'pull requests' : 'issues' + const labelSuffix = isPR ? 'pull requests' : 'issues' return { label: `${labelPrefix}${labelText}${labelSuffix}`, - message: `${metric(numIssues)} ${messageSuffix}`, - color: numIssues > 0 ? 'yellow' : 'brightgreen', + message: `${metric(issueCount)} ${messageSuffix}`, + color: issueCount > 0 ? 'yellow' : 'brightgreen', } } - async fetch({ variant, user, repo, label }) { - const isPR = isPRVariant[variant] - const isClosed = isClosedVariant[variant] - const query = `repo:${user}/${repo}${isPR ? ' is:pr' : ' is:issue'}${ - isClosed ? ' is:closed' : ' is:open' - }${label ? ` label:"${label}"` : ''}` - const options = { qs: { q: query } } - return this._requestJson({ - url: `/search/issues`, - options, - schema, - errorMessages: errorMessagesFor('repo not found'), - }) + async fetch({ isPR, isClosed, user, repo, label }) { + const commonVariables = { + user, + repo, + labels: label ? [label] : undefined, + } + if (isPR) { + const { + data: { + repository: { + pullRequests: { totalCount }, + }, + }, + } = await this._requestGraphql({ + query: gql` + query( + $user: String! + $repo: String! + $states: [PullRequestState!] + $labels: [String!] + ) { + repository(owner: $user, name: $repo) { + pullRequests(states: $states, labels: $labels) { + totalCount + } + } + } + `, + variables: { + ...commonVariables, + states: isClosed ? ['MERGED', 'CLOSED'] : ['OPEN'], + }, + schema: pullRequestCountSchema, + transformErrors, + }) + return { issueCount: totalCount } + } else { + const { + data: { + repository: { + issues: { totalCount }, + }, + }, + } = await this._requestGraphql({ + query: gql` + query( + $user: String! + $repo: String! + $states: [IssueState!] + $labels: [String!] + ) { + repository(owner: $user, name: $repo) { + issues(states: $states, labels: $labels) { + totalCount + } + } + } + `, + variables: { + ...commonVariables, + states: isClosed ? ['CLOSED'] : ['OPEN'], + }, + schema: issueCountSchema, + transformErrors, + }) + return { issueCount: totalCount } + } } async handle({ variant, raw, user, repo, label }) { - const json = await this.fetch({ variant, user, repo, label }) + const isPR = isPRVariant[variant] + const isClosed = isClosedVariant[variant] + const { issueCount } = await this.fetch({ + isPR, + isClosed, + user, + repo, + label, + }) return this.constructor.render({ - variant, - numIssues: json.total_count, + isPR, + isClosed, + issueCount, raw, label, }) diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js index e7a28983c62ef4930ddb9f49f2fa08dd4fb22abc..499b928a904af2b2ea3987a637a36c0b9b583394 100644 --- a/services/github/github-last-commit.service.js +++ b/services/github/github-last-commit.service.js @@ -6,7 +6,7 @@ const { age: ageColor } = require('../color-formatters') const { GithubAuthV3Service } = require('./github-auth-service') const { documentation, errorMessagesFor } = require('./github-helpers') const commonExampleAttrs = { - keywords: ['activity', 'latest'], + keywords: ['latest'], documentation, } diff --git a/services/github/github-license.service.js b/services/github/github-license.service.js index bd33d1ab0b3be29cb2a51400d5d5aa4bca61bfea..21787c206eab86d7656b8aac9d018ba97b39a47f 100644 --- a/services/github/github-license.service.js +++ b/services/github/github-license.service.js @@ -32,7 +32,6 @@ module.exports = class GithubLicense extends GithubAuthV3Service { message: 'MIT', color: 'green', }, - keywords: ['license'], documentation, }, ] diff --git a/services/github/github-package-json.service.js b/services/github/github-package-json.service.js index a4d81e663dbc49c2560e7e6d18e21634ea154850..36dab5e031be4ea53dffebf36f355aefc56fb409 100644 --- a/services/github/github-package-json.service.js +++ b/services/github/github-package-json.service.js @@ -78,6 +78,10 @@ class GithubPackageJsonVersion extends ConditionalGithubAuthV3Service { } } +const dependencyQueryParamSchema = Joi.object({ + filename: Joi.string(), +}).required() + class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service { static get category() { return 'platform-support' @@ -88,6 +92,7 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service base: 'github/package-json/dependency-version', pattern: ':user/:repo/:kind(dev|peer)?/:scope(@[^/]+)?/:packageName/:branch*', + queryParamSchema: dependencyQueryParamSchema, } } @@ -125,6 +130,24 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service documentation, keywords, }, + { + title: 'GitHub package.json dependency version (subfolder of monorepo)', + pattern: ':user/:repo/:packageName', + namedParams: { + user: 'metabolize', + repo: 'anafanafo', + packageName: 'puppeteer', + }, + queryParams: { + filename: 'packages/char-width-table-builder/package.json', + }, + staticPreview: this.render({ + dependency: 'puppeteer', + range: '^1.14.0', + }), + documentation, + keywords, + }, ] } @@ -142,7 +165,10 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service } } - async handle({ user, repo, kind, branch = 'master', scope, packageName }) { + async handle( + { user, repo, kind, branch = 'master', scope, packageName }, + { filename = 'package.json' } + ) { const { dependencies, devDependencies, @@ -152,7 +178,7 @@ class GithubPackageJsonDependencyVersion extends ConditionalGithubAuthV3Service user, repo, branch, - filename: 'package.json', + filename, }) const wantedDependency = scope ? `${scope}/${packageName}` : packageName diff --git a/services/github/github-package-json.tester.js b/services/github/github-package-json.tester.js index e9548029c4774d47ca3721ce68c28cffb6eb6644..9349b85924831327768d0ae830a704b95b729672 100644 --- a/services/github/github-package-json.tester.js +++ b/services/github/github-package-json.tester.js @@ -60,13 +60,24 @@ t.create('Dev dependency version') message: semverRange, }) -t.create('Prod prod dependency version') +t.create('Prod dependency version') .get('/dependency-version/paulmelnikow/react-boxplot/simple-statistics.json') .expectBadge({ label: 'simple-statistics', message: semverRange, }) +t.create('Prod dependency version (monorepo)') + .get( + `/dependency-version/metabolize/anafanafo/puppeteer.json?filename=${encodeURIComponent( + 'packages/char-width-table-builder/package.json' + )}` + ) + .expectBadge({ + label: 'puppeteer', + message: semverRange, + }) + t.create('Scoped dependency') .get('/dependency-version/badges/shields/dev/@babel/core.json') .expectBadge({ diff --git a/services/github/github-pipenv.service.js b/services/github/github-pipenv.service.js new file mode 100644 index 0000000000000000000000000000000000000000..eeeae1753df23f2deed4ee9734052adc0082cd02 --- /dev/null +++ b/services/github/github-pipenv.service.js @@ -0,0 +1,202 @@ +'use strict' + +const { renderVersionBadge } = require('../version') +const { isLockfile, getDependencyVersion } = require('../pipenv-helpers') +const { addv } = require('../text-formatters') +const { ConditionalGithubAuthV3Service } = require('./github-auth-service') +const { fetchJsonFromRepo } = require('./github-common-fetch') +const { documentation: githubDocumentation } = require('./github-helpers') +const { NotFound } = require('..') + +const keywords = ['pipfile'] + +const documentation = ` +<p> + <a href="https://github.com/pypa/pipenv">Pipenv</a> is a dependency + manager for Python which manages a + <a href="https://virtualenv.pypa.io/en/latest/">virtualenv</a> for + projects. It adds/removes packages from your <code>Pipfile</code> as + you install/uninstall packages and generates the ever-important + <code>Pipfile.lock</code>, which can be checked in to source control + in order to produce deterministic builds. +</p> + +<p> + The GitHub Pipenv badges are intended for applications using Pipenv + which are hosted on GitHub. +</p> + +<p> + When <code>Pipfile.lock</code> is checked in, the <strong>GitHub Pipenv + locked dependency version</strong> badge displays the locked version of + a dependency listed in <code>[packages]</code> or + <code>[dev-packages]</code> (or any of their transitive dependencies). +</p> + +<p> + Usually a Python version is specified in the <code>Pipfile</code>, which + <code>pipenv lock</code> then places in <code>Pipfile.lock</code>. The + <strong>GitHub Pipenv Python version</strong> badge displays that version. +</p> + +${githubDocumentation} +` + +class GithubPipenvLockedPythonVersion extends ConditionalGithubAuthV3Service { + static get category() { + return 'platform-support' + } + + static get route() { + return { + base: 'github/pipenv/locked/python-version', + pattern: ':user/:repo/:branch*', + } + } + + static get examples() { + return [ + { + title: 'GitHub Pipenv locked Python version', + pattern: ':user/:repo', + namedParams: { + user: 'metabolize', + repo: 'rq-dashboard-on-heroku', + }, + staticPreview: this.render({ version: '3.7' }), + documentation, + keywords, + }, + { + title: 'GitHub Pipenv locked Python version (branch)', + pattern: ':user/:repo/:branch', + namedParams: { + user: 'metabolize', + repo: 'rq-dashboard-on-heroku', + branch: 'master', + }, + staticPreview: this.render({ version: '3.7', branch: 'master' }), + documentation, + keywords, + }, + ] + } + + static get defaultBadgeData() { + return { + label: 'python', + } + } + + static render({ version, branch }) { + return renderVersionBadge({ + version, + tag: branch, + defaultLabel: 'python', + }) + } + + async handle({ user, repo, branch }) { + const { + _meta: { + requires: { python_version: version }, + }, + } = await fetchJsonFromRepo(this, { + schema: isLockfile, + user, + repo, + branch, + filename: 'Pipfile.lock', + }) + if (version === undefined) { + throw new NotFound({ prettyMessage: 'version not specified' }) + } + return this.constructor.render({ version, branch }) + } +} + +class GithubPipenvLockedDependencyVersion extends ConditionalGithubAuthV3Service { + static get category() { + return 'dependencies' + } + + static get route() { + return { + base: 'github/pipenv/locked/dependency-version', + pattern: ':user/:repo/:kind(dev)?/:packageName/:branch*', + } + } + + static get examples() { + return [ + { + title: 'GitHub Pipenv locked dependency version', + pattern: ':user/:repo/:kind(dev)?/:packageName', + namedParams: { + user: 'metabolize', + repo: 'rq-dashboard-on-heroku', + packageName: 'flask', + }, + staticPreview: this.render({ + dependency: 'flask', + version: '1.1.1', + }), + documentation, + keywords: ['python', ...keywords], + }, + { + title: 'GitHub Pipenv locked dependency version (branch)', + pattern: ':user/:repo/:kind(dev)?/:packageName/:branch', + namedParams: { + user: 'metabolize', + repo: 'rq-dashboard-on-heroku', + kind: 'dev', + packageName: 'black', + branch: 'master', + }, + staticPreview: this.render({ dependency: 'black', version: '19.3b0' }), + documentation, + keywords: ['python', ...keywords], + }, + ] + } + + static get defaultBadgeData() { + return { + label: 'dependency', + } + } + + static render({ dependency, version, ref }) { + return { + label: dependency, + message: version ? addv(version) : ref, + color: 'blue', + } + } + + async handle({ user, repo, kind, branch, packageName }) { + const lockfileData = await fetchJsonFromRepo(this, { + schema: isLockfile, + user, + repo, + branch, + filename: 'Pipfile.lock', + }) + const { version, ref } = getDependencyVersion({ + kind, + wantedDependency: packageName, + lockfileData, + }) + return this.constructor.render({ + dependency: packageName, + version, + ref, + }) + } +} + +module.exports = [ + GithubPipenvLockedPythonVersion, + GithubPipenvLockedDependencyVersion, +] diff --git a/services/github/github-pipenv.tester.js b/services/github/github-pipenv.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..88019391a8ff5bd0f6668203c1a600822c2d12cb --- /dev/null +++ b/services/github/github-pipenv.tester.js @@ -0,0 +1,93 @@ +'use strict' + +const Joi = require('@hapi/joi') +const { ServiceTester } = require('../tester') +const { + isVPlusDottedVersionAtLeastOne, + isVPlusDottedVersionNClausesWithOptionalSuffix, +} = require('../test-validators') + +// e.g. v19.3b0 +const isBlackVersion = Joi.string().regex(/^v\d+(\.\d+)*(.*)?$/) +const isShortSha = Joi.string().regex(/[0-9a-f]{7}/) + +const t = (module.exports = new ServiceTester({ + id: 'GithubPipenv', + title: 'GithubPipenv', + pathPrefix: '/github/pipenv', +})) + +t.create('Locked Python version') + .get('/locked/python-version/metabolize/rq-dashboard-on-heroku.json') + .expectBadge({ + label: 'python', + message: isVPlusDottedVersionAtLeastOne, + }) + +t.create('Locked Python version (no pipfile.lock)') + .get('/locked/python-version/metabolize/react-flexbox-svg.json') + .expectBadge({ + label: 'python', + message: 'repo not found, branch not found, or Pipfile.lock missing', + }) + +t.create('Locked Python version (pipfile.lock has no python version)') + .get('/locked/python-version/fikovnik/ShiftIt.json') + .expectBadge({ + label: 'python', + message: 'version not specified', + }) + +t.create('Locked version of default dependency') + .get( + '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/rq-dashboard.json' + ) + .expectBadge({ + label: 'rq-dashboard', + message: isVPlusDottedVersionNClausesWithOptionalSuffix, + }) + +t.create('Locked version of default dependency (branch)') + .get( + '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/rq-dashboard/master.json' + ) + .expectBadge({ + label: 'rq-dashboard', + message: isVPlusDottedVersionNClausesWithOptionalSuffix, + }) + +t.create('Locked version of dev dependency') + .get( + '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/dev/black.json' + ) + .expectBadge({ + label: 'black', + message: isBlackVersion, + }) + +t.create('Locked version of dev dependency (branch)') + .get( + '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/dev/black/master.json' + ) + .expectBadge({ + label: 'black', + message: isBlackVersion, + }) + +t.create('Locked version of unknown dependency') + .get( + '/locked/dependency-version/metabolize/rq-dashboard-on-heroku/dev/i-made-this-up.json' + ) + .expectBadge({ + label: 'dependency', + message: 'dev dependency not found', + }) + +t.create('Locked version of VCS dependency') + .get( + '/locked/dependency-version/DemocracyClub/aggregator-api/dc-base-theme.json' + ) + .expectBadge({ + label: 'dc-base-theme', + message: isShortSha, + }) diff --git a/services/github/github-release.service.js b/services/github/github-release.service.js index a61283466786b2cc4189324acb02f98febc476c9..d6e83c2889446798faeb42da9ab809cd92f26116 100644 --- a/services/github/github-release.service.js +++ b/services/github/github-release.service.js @@ -19,9 +19,10 @@ const queryParamSchema = Joi.object({ .default('date'), }).required() -const releaseInfoArraySchema = Joi.array() - .items(releaseInfoSchema) - .required() +const releaseInfoArraySchema = Joi.alternatives().try( + Joi.array().items(releaseInfoSchema), + Joi.array().length(0) +) class GithubRelease extends GithubAuthV3Service { static get category() { @@ -117,13 +118,14 @@ class GithubRelease extends GithubAuthV3Service { ) return { tag_name: latestRelease, prerelease: kvpairs[latestRelease] } } + if (!includePrereleases) { const stableReleases = releases.filter(release => !release.prerelease) if (stableReleases.length > 0) { return stableReleases[0] } - return releases[0] } + return releases[0] } @@ -131,9 +133,8 @@ class GithubRelease extends GithubAuthV3Service { const sort = queryParams.sort const includePrereleases = queryParams.include_prereleases !== undefined - let latestRelease if (!includePrereleases && sort === 'date') { - latestRelease = await fetchLatestRelease(this, { user, repo }) + const latestRelease = await fetchLatestRelease(this, { user, repo }) return this.constructor.render({ version: latestRelease.tag_name, sort, @@ -142,9 +143,10 @@ class GithubRelease extends GithubAuthV3Service { } const releases = await this.fetchReleases({ user, repo }) - if (releases.length === 0) - throw new NotFound({ prettyMessage: 'no releases found' }) - latestRelease = this.constructor.getLatestRelease({ + if (releases.length === 0) { + throw new NotFound({ prettyMessage: 'no releases' }) + } + const latestRelease = this.constructor.getLatestRelease({ releases, sort, includePrereleases, diff --git a/services/github/github-release.tester.js b/services/github/github-release.tester.js index 273f84a80242a513e002624f48a5057b26bac210..f8835542361b7ca7b0f339a6c8aec94390041acc 100644 --- a/services/github/github-release.tester.js +++ b/services/github/github-release.tester.js @@ -28,6 +28,10 @@ t.create('Release (No releases)') .get('/v/release/badges/daily-tests.json') .expectBadge({ label: 'release', message: 'no releases or repo not found' }) +t.create('Prerelease (No releases)') + .get('/v/release/badges/daily-tests.json?include_prereleases') + .expectBadge({ label: 'release', message: 'no releases' }) + t.create('Release (repo not found)') .get('/v/release/badges/helmets.json') .expectBadge({ label: 'release', message: 'no releases or repo not found' }) diff --git a/services/gitlab/gitlab-pipeline-status.service.js b/services/gitlab/gitlab-pipeline-status.service.js index 7d6dee42c5b969ea4217cdea74d94686a0ec10f0..50e75e327ff0683fb81e9d860a4a3d47b3c19805 100644 --- a/services/gitlab/gitlab-pipeline-status.service.js +++ b/services/gitlab/gitlab-pipeline-status.service.js @@ -15,6 +15,25 @@ const queryParamSchema = Joi.object({ gitlab_url: optionalUrl, }).required() +const documentation = ` +<p> + Important: If your project is publicly visible, but the badge is like this: + <img src="https://img.shields.io/badge/build-not found-red" alt="build not found"/> +</p> +<p> + Check if your pipelines are publicly visible as well.<br /> + Navigate to your project settings on GitLab and choose General Pipelines under CI/CD.<br /> + Then tick the setting Public pipelines. +</p> +<p> + Now your settings should look like this: +</p> +<img src="https://user-images.githubusercontent.com/12065866/67156911-e225a180-f324-11e9-93ad-10aafbb3e69e.png" alt="Setting Public pipelines set"/> +<p> + Your badge should be working fine now. +</p> +` + module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService { static get category() { return 'build' @@ -35,6 +54,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService { pattern: ':user/:repo', namedParams: { user: 'gitlab-org', repo: 'gitlab-ce' }, staticPreview: this.render({ status: 'passed' }), + documentation, }, { title: 'Gitlab pipeline status (branch)', @@ -45,6 +65,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService { branch: 'master', }, staticPreview: this.render({ status: 'passed' }), + documentation, }, { title: 'Gitlab pipeline status (self-hosted)', @@ -52,6 +73,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService { namedParams: { user: 'GNOME', repo: 'pango' }, queryParams: { gitlab_url: 'https://gitlab.gnome.org' }, staticPreview: this.render({ status: 'passed' }), + documentation, }, ] } @@ -69,6 +91,7 @@ module.exports = class GitlabPipelineStatus extends BaseSvgScrapingService { url: `${baseUrl}/${user}/${repo}/badges/${branch}/pipeline.svg`, errorMessages: { 401: 'repo not found', + 404: 'repo not found', }, }) if (status === 'unknown') { diff --git a/services/homebrew/homebrew-cask.service.js b/services/homebrew/homebrew-cask.service.js new file mode 100644 index 0000000000000000000000000000000000000000..7fff101127b8521e52d2084ab42a5261f7c16e3b --- /dev/null +++ b/services/homebrew/homebrew-cask.service.js @@ -0,0 +1,48 @@ +'use strict' + +const Joi = require('@hapi/joi') +const { renderVersionBadge } = require('../version') +const { BaseJsonService } = require('..') + +const schema = Joi.object({ + version: Joi.string().required(), +}).required() + +module.exports = class HomebrewCask extends BaseJsonService { + static get category() { + return 'version' + } + + static get route() { + return { + base: 'homebrew/cask/v', + pattern: ':cask', + } + } + + static get examples() { + return [ + { + title: 'homebrew cask', + namedParams: { cask: 'iterm2' }, + staticPreview: renderVersionBadge({ version: 'v3.2.5' }), + }, + ] + } + + static get defaultBadgeData() { + return { label: 'homebrew cask' } + } + + async fetch({ cask }) { + return this._requestJson({ + schema, + url: `https://formulae.brew.sh/api/cask/${cask}.json`, + }) + } + + async handle({ cask }) { + const data = await this.fetch({ cask }) + return renderVersionBadge({ version: data.version }) + } +} diff --git a/services/homebrew/homebrew-cask.tester.js b/services/homebrew/homebrew-cask.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..95deb03812edb9792d71e3c4b6af1ed1b2d8d00a --- /dev/null +++ b/services/homebrew/homebrew-cask.tester.js @@ -0,0 +1,24 @@ +'use strict' + +const { isVPlusTripleDottedVersion } = require('../test-validators') +const t = (module.exports = require('../tester').createServiceTester()) + +t.create('homebrew cask (valid)') + .get('/iterm2.json') + .expectBadge({ + label: 'homebrew cask', + message: isVPlusTripleDottedVersion, + }) + +t.create('homebrew cask (valid)') + .get('/iterm2.json') + .intercept(nock => + nock('https://formulae.brew.sh') + .get('/api/cask/iterm2.json') + .reply(200, { version: '3.3.6' }) + ) + .expectBadge({ label: 'homebrew cask', message: 'v3.3.6' }) + +t.create('homebrew cask (not found)') + .get('/not-a-package.json') + .expectBadge({ label: 'homebrew cask', message: 'not found' }) diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js index 9f30530f2ba37569868c1b30998152e216c92a54..c0d7f8aa2f1c7fb429f0057d9d1df4985ed855d5 100644 --- a/services/jenkins/jenkins-coverage.service.js +++ b/services/jenkins/jenkins-coverage.service.js @@ -21,6 +21,7 @@ const formatMap = { }).required(), treeQueryParam: 'instructionCoverage[percentage]', transform: json => ({ coverage: json.instructionCoverage.percentage }), + pluginSpecificPath: 'jacoco', }, cobertura: { schema: Joi.object({ @@ -47,9 +48,48 @@ const formatMap = { ) return { coverage: lineCoverage.ratio } }, + pluginSpecificPath: 'cobertura', + }, + api: { + schema: Joi.object({ + results: Joi.object({ + elements: Joi.array() + .items( + Joi.object({ + name: Joi.string().required(), + ratio: Joi.number() + .min(0) + .max(100) + .required(), + }) + ) + .has(Joi.object({ name: 'Line' })) + .min(1) + .required(), + }).required(), + }).required(), + treeQueryParam: 'results[elements[name,ratio]]', + transform: json => { + const lineCoverage = json.results.elements.find( + element => element.name === 'Line' + ) + return { coverage: lineCoverage.ratio } + }, + pluginSpecificPath: 'coverage/result', }, } +const documentation = ` +<p> + We support coverage metrics from a variety of Jenkins plugins: + <ul> + <li><a href="https://plugins.jenkins.io/jacoco">JaCoCo</a></li> + <li><a href="https://plugins.jenkins.io/cobertura">Cobertura</a></li> + <li>Any plugin which integrates with the <a href="https://plugins.jenkins.io/code-coverage-api">Code Coverage API</a> (e.g. llvm-cov, Cobertura 1.13+, etc.)</li> + </ul> +</p> +` + module.exports = class JenkinsCoverage extends JenkinsBase { static get category() { return 'coverage' @@ -58,7 +98,8 @@ module.exports = class JenkinsCoverage extends JenkinsBase { static get route() { return { base: 'jenkins/coverage', - pattern: ':format(jacoco|cobertura)/:protocol(http|https)/:host/:job+', + pattern: + ':format(jacoco|cobertura|api)/:protocol(http|https)/:host/:job+', queryParamSchema, } } @@ -73,8 +114,9 @@ module.exports = class JenkinsCoverage extends JenkinsBase { host: 'jenkins.sqlalchemy.org', job: 'job/alembic_coverage', }, - keywords: ['jacoco', 'cobertura'], + keywords: ['jacoco', 'cobertura', 'llvm-cov', 'istanbul'], staticPreview: this.render({ coverage: 95 }), + documentation, }, ] } @@ -91,9 +133,11 @@ module.exports = class JenkinsCoverage extends JenkinsBase { } async handle({ format, protocol, host, job }, { disableStrictSSL }) { - const { schema, transform, treeQueryParam } = formatMap[format] + const { schema, transform, treeQueryParam, pluginSpecificPath } = formatMap[ + format + ] const json = await this.fetch({ - url: buildUrl({ protocol, host, job, plugin: format }), + url: buildUrl({ protocol, host, job, plugin: pluginSpecificPath }), schema, qs: buildTreeParamQueryString(treeQueryParam), disableStrictSSL, diff --git a/services/jenkins/jenkins-coverage.tester.js b/services/jenkins/jenkins-coverage.tester.js index 0c68b9bbcac7f6458771c230f398f89a1429b840..1394407e2341df3650897ee15194bf888890fe74 100644 --- a/services/jenkins/jenkins-coverage.tester.js +++ b/services/jenkins/jenkins-coverage.tester.js @@ -23,3 +23,13 @@ t.create('cobertura: job not found') t.create('cobertura: job found') .get('/cobertura/https/jenkins.sqlalchemy.org/alembic_coverage.json') .expectBadge({ label: 'coverage', message: isIntegerPercentage }) + +t.create('code coverage API: job not found') + .get('/api/https/jenkins.library.illinois.edu/job/does-not-exist.json') + .expectBadge({ label: 'coverage', message: 'job or coverage not found' }) + +t.create('code coverage API: job found') + .get( + '/api/https/jenkins.library.illinois.edu/job/OpenSourceProjects/job/Speedwagon/job/master.json' + ) + .expectBadge({ label: 'coverage', message: isIntegerPercentage }) diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js index a75ca1e3b84c187415e32e1e37e4264068302ce1..5fe1f48bc1c832be6fefa119314f9a3929f36f91 100644 --- a/services/jira/jira-sprint.service.js +++ b/services/jira/jira-sprint.service.js @@ -64,7 +64,6 @@ module.exports = class JiraSprint extends BaseJsonService { numTotalIssues: 28, }), documentation, - keywords: ['issues'], }, ] } diff --git a/services/jsdelivr/jsdelivr-hits-github.tester.js b/services/jsdelivr/jsdelivr-hits-github.tester.js index ec8fd1e9179e7b4a13cfaabfba680d9913987cd7..3c15ff5d0a22d67f80583a7cad9a821a036feb72 100644 --- a/services/jsdelivr/jsdelivr-hits-github.tester.js +++ b/services/jsdelivr/jsdelivr-hits-github.tester.js @@ -28,7 +28,7 @@ t.create('jquery/jquery hits/month') }) t.create('jquery/jquery hits/year') - .timeout(10000) + .timeout(25000) .get('/hy/jquery/jquery.json') .expectBadge({ label: 'jsdelivr', diff --git a/services/jsdelivr/jsdelivr-hits-npm.tester.js b/services/jsdelivr/jsdelivr-hits-npm.tester.js index c35fc44a9c8bdef31a39e1b7c4af61172ecf8868..f1ce84c12e6ae98ba1bcf4bea5387efee4f120a5 100644 --- a/services/jsdelivr/jsdelivr-hits-npm.tester.js +++ b/services/jsdelivr/jsdelivr-hits-npm.tester.js @@ -28,7 +28,7 @@ t.create('jquery hits/month') }) t.create('jquery hits/year') - .timeout(10000) + .timeout(25000) .get('/hy/ky.json') .expectBadge({ label: 'jsdelivr', diff --git a/services/librariesio/librariesio-common.js b/services/librariesio/librariesio-common.js index a56014b92cf9a9b7b743516de11a5098ffd80e44..59b56e346c40f0591cd09fbf829029237c159b15 100644 --- a/services/librariesio/librariesio-common.js +++ b/services/librariesio/librariesio-common.js @@ -11,10 +11,12 @@ const projectSchema = Joi.object({ rank: anyInteger, }).required() -async function fetchProject(serviceInstance, { platform, packageName }) { +async function fetchProject(serviceInstance, { platform, scope, packageName }) { return serviceInstance._requestJson({ schema: projectSchema, - url: `https://libraries.io/api/${platform}/${packageName}`, + url: `https://libraries.io/api/${encodeURIComponent(platform)}/${ + scope ? encodeURIComponent(`${scope}/`) : '' + }${encodeURIComponent(packageName)}`, errorMessages: { 404: 'package not found' }, }) } diff --git a/services/librariesio/librariesio-dependencies.service.js b/services/librariesio/librariesio-dependencies.service.js index c8f36bc4a5e6608c5183845b368b29b994db701e..4eb4f928af7406d73120de7a9f75e967135b0a80 100644 --- a/services/librariesio/librariesio-dependencies.service.js +++ b/services/librariesio/librariesio-dependencies.service.js @@ -30,7 +30,7 @@ class LibrariesIoProjectDependencies extends BaseJsonService { static get route() { return { base: 'librariesio/release', - pattern: ':platform/:packageName/:version?', + pattern: ':platform/:scope(@[^/]+)?/:packageName/:version?', } } @@ -61,13 +61,42 @@ class LibrariesIoProjectDependencies extends BaseJsonService { outdatedCount: 3, }), }, + { + title: + 'Libraries.io dependency status for latest release, scoped npm package', + pattern: ':platform/:scope/:packageName', + namedParams: { + platform: 'npm', + scope: '@babel', + packageName: 'core', + }, + staticPreview: renderDependenciesBadge({ + deprecatedCount: 8, + outdatedCount: 0, + }), + }, + { + title: + 'Libraries.io dependency status for specific release, scoped npm package', + pattern: ':platform/:scope/:packageName/:version', + namedParams: { + platform: 'npm', + scope: '@babel', + packageName: 'core', + version: '7.0.0', + }, + staticPreview: renderDependenciesBadge({ + deprecatedCount: 12, + outdatedCount: 0, + }), + }, ] } - async handle({ platform, packageName, version = 'latest' }) { - const url = `https://libraries.io/api/${encodeURIComponent( - platform - )}/${encodeURIComponent(packageName)}/${encodeURIComponent( + async handle({ platform, scope, packageName, version = 'latest' }) { + const url = `https://libraries.io/api/${encodeURIComponent(platform)}/${ + scope ? encodeURIComponent(`${scope}/`) : '' + }${encodeURIComponent(packageName)}/${encodeURIComponent( version )}/dependencies` const json = await this._requestJson({ diff --git a/services/librariesio/librariesio-dependencies.tester.js b/services/librariesio/librariesio-dependencies.tester.js index 4843f361c22485f1cd3fa8c27a616afa9cdaaab3..45bcabddbe6d72a56bc22ca086ba74116bdd0a46 100644 --- a/services/librariesio/librariesio-dependencies.tester.js +++ b/services/librariesio/librariesio-dependencies.tester.js @@ -9,6 +9,7 @@ const t = (module.exports = new ServiceTester({ })) t.create('dependencies for package (project name contains dot)') + .timeout(10000) .get('/release/nuget/Newtonsoft.Json.json') .expectBadge({ label: 'dependencies', @@ -16,13 +17,31 @@ t.create('dependencies for package (project name contains dot)') }) t.create('dependencies for package with version') + .timeout(10000) .get('/release/hex/phoenix/1.0.3.json') .expectBadge({ label: 'dependencies', message: isDependencyState, }) +t.create('dependencies for scoped npm package') + .timeout(10000) + .get('/release/npm/@babel/core.json') + .expectBadge({ + label: 'dependencies', + message: isDependencyState, + }) + +t.create('dependencies for scoped npm package with version') + .timeout(10000) + .get('/release/npm/@babel/core/7.0.0-rc.0.json') + .expectBadge({ + label: 'dependencies', + message: isDependencyState, + }) + t.create('version not found') + .timeout(10000) .get('/release/hex/phoenix/9.9.99.json') .expectBadge({ label: 'dependencies', @@ -30,6 +49,7 @@ t.create('version not found') }) t.create('package not found') + .timeout(10000) .get('/release/hex/invalid/4.0.4.json') .expectBadge({ label: 'dependencies', @@ -37,6 +57,7 @@ t.create('package not found') }) t.create('dependencies for repo') + .timeout(10000) .get('/github/pyvesb/notepad4e.json') .expectBadge({ label: 'dependencies', @@ -44,6 +65,7 @@ t.create('dependencies for repo') }) t.create('repo not found') + .timeout(10000) .get('/github/foobar/is-not-a-repo.json') .expectBadge({ label: 'dependencies', diff --git a/services/librariesio/librariesio-dependent-repos.service.js b/services/librariesio/librariesio-dependent-repos.service.js index e02e6826b9cb69fd5d5ddf5d79e0ca3a43d79dda..fe363eff2ae694a7788ee6e5b447101ce6aab03c 100644 --- a/services/librariesio/librariesio-dependent-repos.service.js +++ b/services/librariesio/librariesio-dependent-repos.service.js @@ -13,7 +13,7 @@ module.exports = class LibrariesIoDependentRepos extends BaseJsonService { static get route() { return { base: 'librariesio/dependent-repos', - pattern: ':platform/:packageName', + pattern: ':platform/:scope(@[^/]+)?/:packageName', } } @@ -21,12 +21,23 @@ module.exports = class LibrariesIoDependentRepos extends BaseJsonService { return [ { title: 'Dependent repos (via libraries.io)', + pattern: ':platform/:packageName', namedParams: { platform: 'npm', packageName: 'got', }, staticPreview: this.render({ dependentReposCount: 84000 }), }, + { + title: 'Dependent repos (via libraries.io), scoped npm package', + pattern: ':platform/:scope/:packageName', + namedParams: { + platform: 'npm', + scope: '@babel', + packageName: 'core', + }, + staticPreview: this.render({ dependentReposCount: 50 }), + }, ] } @@ -43,11 +54,12 @@ module.exports = class LibrariesIoDependentRepos extends BaseJsonService { } } - async handle({ platform, packageName }) { + async handle({ platform, scope, packageName }) { const { dependent_repos_count: dependentReposCount } = await fetchProject( this, { platform, + scope, packageName, } ) diff --git a/services/librariesio/librariesio-dependent-repos.tester.js b/services/librariesio/librariesio-dependent-repos.tester.js index 7c8e1badabac3fa3b5cf4da4b4e7bf2652bbb719..f15fe079cda71a65c26a7614ece9a7c5408be4c8 100644 --- a/services/librariesio/librariesio-dependent-repos.tester.js +++ b/services/librariesio/librariesio-dependent-repos.tester.js @@ -4,15 +4,24 @@ const { isMetric } = require('../test-validators') const t = (module.exports = require('../tester').createServiceTester()) t.create('dependent repo count') + .timeout(10000) .get('/npm/got.json') .expectBadge({ label: 'dependent repos', message: isMetric, }) +t.create('dependent repo count (scoped npm package)') + .timeout(10000) + .get('/npm/@babel/core.json') + .expectBadge({ + label: 'dependent repos', + message: isMetric, + }) + t.create('dependent repo count (not a package)') - .get('/npm/foobar-is-not-package.json') .timeout(10000) + .get('/npm/foobar-is-not-package.json') .expectBadge({ label: 'dependent repos', message: 'package not found', diff --git a/services/librariesio/librariesio-dependents.service.js b/services/librariesio/librariesio-dependents.service.js index 8d030b36292641c470d4fa137b4d2d9feb4ca59b..978397f852c93d2506b58f743636e4a5a060458d 100644 --- a/services/librariesio/librariesio-dependents.service.js +++ b/services/librariesio/librariesio-dependents.service.js @@ -13,7 +13,7 @@ module.exports = class LibrariesIoDependents extends BaseJsonService { static get route() { return { base: 'librariesio/dependents', - pattern: ':platform/:packageName', + pattern: ':platform/:scope(@[^/]+)?/:packageName', } } @@ -21,12 +21,23 @@ module.exports = class LibrariesIoDependents extends BaseJsonService { return [ { title: 'Dependents (via libraries.io)', + pattern: ':platform/:packageName', namedParams: { platform: 'npm', packageName: 'got', }, staticPreview: this.render({ dependentCount: 2000 }), }, + { + title: 'Dependents (via libraries.io), scoped npm package', + pattern: ':platform/:scope/:packageName', + namedParams: { + platform: 'npm', + scope: '@babel', + packageName: 'core', + }, + staticPreview: this.render({ dependentCount: 94 }), + }, ] } @@ -43,9 +54,10 @@ module.exports = class LibrariesIoDependents extends BaseJsonService { } } - async handle({ platform, packageName }) { + async handle({ platform, scope, packageName }) { const { dependents_count: dependentCount } = await fetchProject(this, { platform, + scope, packageName, }) return this.constructor.render({ dependentCount }) diff --git a/services/librariesio/librariesio-dependents.tester.js b/services/librariesio/librariesio-dependents.tester.js index deeed2174087a2596123955f379efd7c27480251..e5cfcd29c2863c4cc55375bb053f7dda758024f6 100644 --- a/services/librariesio/librariesio-dependents.tester.js +++ b/services/librariesio/librariesio-dependents.tester.js @@ -4,15 +4,24 @@ const { isMetric } = require('../test-validators') const t = (module.exports = require('../tester').createServiceTester()) t.create('dependent count') + .timeout(10000) .get('/npm/got.json') .expectBadge({ label: 'dependents', message: isMetric, }) +t.create('dependent count (scoped npm package)') + .timeout(10000) + .get('/npm/@babel/core.json') + .expectBadge({ + label: 'dependents', + message: isMetric, + }) + t.create('dependent count (nonexistent package)') - .get('/npm/foobar-is-not-package.json') .timeout(10000) + .get('/npm/foobar-is-not-package.json') .expectBadge({ label: 'dependents', message: 'package not found', diff --git a/services/librariesio/librariesio-sourcerank.service.js b/services/librariesio/librariesio-sourcerank.service.js index 0fc732884b5b6a38360c409e7aa45155f115c26e..869ddd00c6a9f23b213971ea666198da0e82182a 100644 --- a/services/librariesio/librariesio-sourcerank.service.js +++ b/services/librariesio/librariesio-sourcerank.service.js @@ -14,7 +14,7 @@ module.exports = class LibrariesIoSourcerank extends BaseJsonService { static get route() { return { base: 'librariesio/sourcerank', - pattern: ':platform/:packageName', + pattern: ':platform/:scope(@[^/]+)?/:packageName', } } @@ -22,12 +22,23 @@ module.exports = class LibrariesIoSourcerank extends BaseJsonService { return [ { title: 'Libraries.io SourceRank', + pattern: ':platform/:packageName', namedParams: { platform: 'npm', packageName: 'got', }, staticPreview: this.render({ rank: 25 }), }, + { + title: 'Libraries.io SourceRank, scoped npm package', + pattern: ':platform/:scope/:packageName', + namedParams: { + platform: 'npm', + scope: '@babel', + packageName: 'core', + }, + staticPreview: this.render({ rank: 3 }), + }, ] } @@ -44,9 +55,10 @@ module.exports = class LibrariesIoSourcerank extends BaseJsonService { } } - async handle({ platform, packageName }) { + async handle({ platform, scope, packageName }) { const { rank } = await fetchProject(this, { platform, + scope, packageName, }) return this.constructor.render({ rank }) diff --git a/services/librariesio/librariesio-sourcerank.tester.js b/services/librariesio/librariesio-sourcerank.tester.js index 9c63dd26bd0b731c6af78ac0b5fbbd4b080842d5..2a8450fa82e37105c2af4752722303fac2a0e568 100644 --- a/services/librariesio/librariesio-sourcerank.tester.js +++ b/services/librariesio/librariesio-sourcerank.tester.js @@ -4,13 +4,23 @@ const { anyInteger } = require('../validators') const t = (module.exports = require('../tester').createServiceTester()) t.create('sourcerank') + .timeout(10000) .get('/npm/got.json') .expectBadge({ label: 'sourcerank', message: anyInteger, }) -t.create('dependent count (not a package)') +t.create('sourcerank (scoped npm package)') + .timeout(10000) + .get('/npm/@babel/core.json') + .expectBadge({ + label: 'sourcerank', + message: anyInteger, + }) + +t.create('sourcerank (not a package)') + .timeout(10000) .get('/npm/foobar-is-not-package.json') .expectBadge({ label: 'sourcerank', diff --git a/services/maven-central/maven-central.tester.js b/services/maven-central/maven-central.tester.js index f41f4cca330422b4b6e1bccdbec60d093208da27..cde5e050cc004a26c28d85025d71733b0a4245dc 100644 --- a/services/maven-central/maven-central.tester.js +++ b/services/maven-central/maven-central.tester.js @@ -50,4 +50,4 @@ t.create('version ending with zero') ` ) ) - .expectBadge({ label: 'maven-central', message: /^v1\.30$/ }) + .expectBadge({ label: 'maven-central', message: 'v1.30' }) diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js index ed37f9fc9d0a0140974f54af70dd667bdd6843fc..b58284123fceb2ceb531b91bf03863d98bc55652 100644 --- a/services/maven-metadata/maven-metadata.service.js +++ b/services/maven-metadata/maven-metadata.service.js @@ -14,9 +14,7 @@ const schema = Joi.object({ versioning: Joi.object({ versions: Joi.object({ version: Joi.array() - .items( - Joi.alternatives(Joi.string().required(), Joi.number().required()) - ) + .items(Joi.string().required()) .single() .required(), }).required(), @@ -56,7 +54,11 @@ module.exports = class MavenMetadata extends BaseXmlService { } async fetch({ metadataUrl }) { - return this._requestXml({ schema, url: metadataUrl }) + return this._requestXml({ + schema, + url: metadataUrl, + parserOptions: { parseNodeValue: false }, + }) } async handle(_namedParams, { metadataUrl }) { diff --git a/services/maven-metadata/maven-metadata.tester.js b/services/maven-metadata/maven-metadata.tester.js index 23c348ed8aa0adf4775501bbc8897c22906b1429..566344fdf5e6478a96f5647a4942038b871c90b5 100644 --- a/services/maven-metadata/maven-metadata.tester.js +++ b/services/maven-metadata/maven-metadata.tester.js @@ -12,6 +12,33 @@ t.create('valid maven-metadata.xml uri') message: isVPlusDottedVersionAtLeastOne, }) +t.create('version ending with zero') + .get( + '/v.json?metadataUrl=http://central.maven.org/maven2/mocked-group-id/mocked-artifact-id/maven-metadata.xml' + ) + .intercept(nock => + nock('http://central.maven.org/maven2') + .get('/mocked-group-id/mocked-artifact-id/maven-metadata.xml') + .reply( + 200, + ` + <metadata> + <groupId>mocked-group-id</groupId> + <artifactId>mocked-artifact-id</artifactId> + <versioning> + <latest>1.30</latest> + <release>1.30</release> + <versions> + <version>1.30</version> + </versions> + <lastUpdated>20190902002617</lastUpdated> + </versioning> + </metadata> + ` + ) + ) + .expectBadge({ label: 'maven', message: 'v1.30' }) + t.create('invalid maven-metadata.xml uri') .get( '/v.json?metadataUrl=http://central.maven.org/maven2/com/google/code/gson/gson/foobar.xml' diff --git a/services/microbadger/microbadger-layers.tester.js b/services/microbadger/microbadger-layers.tester.js index 59bc15314b899b154b86a46b11936349b5e95674..d2fd1a828babb3b41e21d09c38df08f58df6ca0d 100644 --- a/services/microbadger/microbadger-layers.tester.js +++ b/services/microbadger/microbadger-layers.tester.js @@ -1,24 +1,22 @@ 'use strict' -const Joi = require('@hapi/joi') +const { nonNegativeInteger } = require('../validators') const t = (module.exports = require('../tester').createServiceTester()) t.create('layers without a specified tag') .get('/_/alpine.json') + .timeout(150000) .expectBadge({ label: 'layers', - message: Joi.number() - .integer() - .positive(), + message: nonNegativeInteger, }) t.create('layers with a specified tag') .get('/_/alpine/2.7.json') + .timeout(150000) .expectBadge({ label: 'layers', - message: Joi.number() - .integer() - .positive(), + message: nonNegativeInteger, }) t.create('specified tag when repository has only one') diff --git a/services/microbadger/microbadger-size.tester.js b/services/microbadger/microbadger-size.tester.js index e4e84b1447c4b2c52169f1e71329c301cd15ccad..4e6613e6e7f0fcabbe18f66432bfe2b2851608c8 100644 --- a/services/microbadger/microbadger-size.tester.js +++ b/services/microbadger/microbadger-size.tester.js @@ -5,6 +5,7 @@ const t = (module.exports = require('../tester').createServiceTester()) t.create('image size without a specified tag') .get('/fedora/apache.json') + .timeout(150000) .expectBadge({ label: 'image size', message: isFileSize, @@ -12,6 +13,7 @@ t.create('image size without a specified tag') t.create('image size with a specified tag') .get('/fedora/apache/latest.json') + .timeout(150000) .expectBadge({ label: 'image size', message: isFileSize, diff --git a/services/mozilla-observatory/mozilla-observatory.tester.js b/services/mozilla-observatory/mozilla-observatory.tester.js index 8a6f32f43937a4977edff4a066813ff925a1f4a7..d9e6febbd0a438e474f840d566bc0700851562c7 100644 --- a/services/mozilla-observatory/mozilla-observatory.tester.js +++ b/services/mozilla-observatory/mozilla-observatory.tester.js @@ -3,7 +3,6 @@ const Joi = require('@hapi/joi') const t = (module.exports = require('../tester').createServiceTester()) -const validColors = ['brightgreen', 'green', 'yellow', 'orange', 'red'] const isMessage = Joi.alternatives() .try( Joi.string().regex(/^[ABCDEF][+-]? \([0-9]{1,3}\/100\)$/), @@ -11,24 +10,20 @@ const isMessage = Joi.alternatives() ) .required() -const isColor = Joi.string() - .valid(...validColors) - .required() - t.create('request on observatory.mozilla.org') + .timeout(10000) .get('/grade-score/observatory.mozilla.org.json') .expectBadge({ label: 'observatory', message: isMessage, - color: isColor, }) t.create('request on observatory.mozilla.org with inclusion in public results') + .timeout(10000) .get('/grade-score/observatory.mozilla.org.json?publish') .expectBadge({ label: 'observatory', message: isMessage, - color: isColor, }) t.create('grade without score (mock)') diff --git a/services/packagist/packagist-base.js b/services/packagist/packagist-base.js index 3e6c2b87a935c07debe81699566291664a639bf9..ff25c293867317369434fefc795074fab2d6e957 100644 --- a/services/packagist/packagist-base.js +++ b/services/packagist/packagist-base.js @@ -3,26 +3,61 @@ const Joi = require('@hapi/joi') const { BaseJsonService } = require('..') +const packageSchema = Joi.object() + .pattern( + /^/, + Joi.object({ + version: Joi.string(), + require: Joi.object({ + php: Joi.string(), + }), + }).required() + ) + .required() + const allVersionsSchema = Joi.object({ - package: Joi.object({ - versions: Joi.object() - .pattern( - /^/, - Joi.object({ - version: Joi.string(), - require: Joi.object({ - php: Joi.string(), - }), - }) - ) - .required(), - }).required(), + packages: Joi.object() + .pattern(/^/, packageSchema) + .required(), }).required() - const keywords = ['PHP'] class BasePackagistService extends BaseJsonService { + /** + * Default fetch method. + * + * This method utilize composer metadata API which + * "... is the preferred way to access the data as it is always up to date, + * and dumped to static files so it is very efficient on our end." (comment from official documentation). + * For more information please refer to https://packagist.org/apidoc#get-package-data. + * + * @returns {object} Parsed response + */ async fetch({ user, repo, schema, server = 'https://packagist.org' }) { + const url = `${server}/p/${user}/${repo}.json` + + return this._requestJson({ + schema, + url, + }) + } + + /** + * It is highly recommended to use base fetch method! + * + * JSON API includes additional information about downloads, dependents count, github info, etc. + * However, responses from JSON API are cached for twelve hours by packagist servers, + * so data fetch from this method might be outdated. + * For more information please refer to https://packagist.org/apidoc#get-package-data. + * + * @returns {object} Parsed response + */ + async fetchByJsonAPI({ + user, + repo, + schema, + server = 'https://packagist.org', + }) { const url = `${server}/packages/${user}/${repo}.json` return this._requestJson({ @@ -30,14 +65,30 @@ class BasePackagistService extends BaseJsonService { url, }) } + + getPackageName(user, repo) { + return `${user}/${repo}` + } } -const documentation = - 'Note that only network-accessible packagist.org and other self-hosted Packagist instances are supported.' +const customServerDocumentationFragment = ` + <p> + Note that only network-accessible packagist.org and other self-hosted Packagist instances are supported. + </p> + ` + +const cacheDocumentationFragment = ` + <p> + Displayed data may be slightly outdated. + Due to performance reasons, data fetched from packagist JSON API is cached for twelve hours on packagist infrastructure. + For more information please refer to <a target="_blank" href="https://packagist.org/apidoc#get-package-data">official packagist documentation</a>. + </p> + ` module.exports = { allVersionsSchema, keywords, BasePackagistService, - documentation, + customServerDocumentationFragment, + cacheDocumentationFragment, } diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js index f9aac50779d5a8c2f827b063234c262aaaf9bf72..aff7a321d1271b090ab35919d95ee9ce84c31108 100644 --- a/services/packagist/packagist-downloads.service.js +++ b/services/packagist/packagist-downloads.service.js @@ -7,7 +7,8 @@ const { optionalUrl } = require('../validators') const { keywords, BasePackagistService, - documentation, + customServerDocumentationFragment, + cacheDocumentationFragment, } = require('./packagist-base') const periodMap = { @@ -66,6 +67,7 @@ module.exports = class PackagistDownloads extends BasePackagistService { interval: 'dm', }), keywords, + documentation: cacheDocumentationFragment, }, { title: 'Packagist (custom server)', @@ -80,7 +82,8 @@ module.exports = class PackagistDownloads extends BasePackagistService { }), queryParams: { server: 'https://packagist.org' }, keywords, - documentation, + documentation: + customServerDocumentationFragment + cacheDocumentationFragment, }, ] } @@ -101,7 +104,7 @@ module.exports = class PackagistDownloads extends BasePackagistService { async handle({ interval, user, repo }, { server }) { const { package: { downloads }, - } = await this.fetch({ user, repo, schema, server }) + } = await this.fetchByJsonAPI({ user, repo, schema, server }) return this.constructor.render({ downloads: downloads[periodMap[interval].field], diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js index 4842d5ba71b9c142b317a683b995a41076b2655a..ba3e3445ef3a82157135567f1ed8b4d78d7973cb 100644 --- a/services/packagist/packagist-license.service.js +++ b/services/packagist/packagist-license.service.js @@ -6,17 +6,23 @@ const { optionalUrl } = require('../validators') const { keywords, BasePackagistService, - documentation, + customServerDocumentationFragment, } = require('./packagist-base') +const { NotFound } = require('..') + +const packageSchema = Joi.object() + .pattern( + /^/, + Joi.object({ + license: Joi.array().required(), + }).required() + ) + .required() const schema = Joi.object({ - package: Joi.object({ - versions: Joi.object({ - 'dev-master': Joi.object({ - license: Joi.array().required(), - }).required(), - }).required(), - }).required(), + packages: Joi.object() + .pattern(/^/, packageSchema) + .required(), }).required() const queryParamSchema = Joi.object({ @@ -50,7 +56,7 @@ module.exports = class PackagistLicense extends BasePackagistService { queryParams: { server: 'https://packagist.org' }, staticPreview: renderLicenseBadge({ license: 'MIT' }), keywords, - documentation, + documentation: customServerDocumentationFragment, }, ] } @@ -61,13 +67,19 @@ module.exports = class PackagistLicense extends BasePackagistService { } } - transform({ json }) { - return { license: json.package.versions['dev-master'].license } + transform({ json, user, repo }) { + const packageName = this.getPackageName(user, repo) + const branch = json.packages[packageName]['dev-master'] + if (!branch) { + throw new NotFound({ prettyMessage: 'default branch not found' }) + } + const { license } = branch + return { license } } async handle({ user, repo }, { server }) { const json = await this.fetch({ user, repo, schema, server }) - const { license } = this.transform({ json }) + const { license } = this.transform({ json, user, repo }) return renderLicenseBadge({ license }) } } diff --git a/services/packagist/packagist-license.spec.js b/services/packagist/packagist-license.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..7f9f6acf7e9ba8a444b0ba9cb831e872f499029a --- /dev/null +++ b/services/packagist/packagist-license.spec.js @@ -0,0 +1,27 @@ +'use strict' + +const { expect } = require('chai') +const PackagistLicense = require('./packagist-license.service') +const { NotFound } = require('..') + +describe('PackagistLicense', function() { + it('should throw NotFound when default branch is missing', function() { + const json = { + packages: { + 'doctrine/orm': {}, + 'elhadraoui/doctrine-orm': { + 'dev-master': { license: 'MIT' }, + }, + }, + } + expect(() => + PackagistLicense.prototype.transform({ + json, + user: 'doctrine', + repo: 'orm', + }) + ) + .to.throw(NotFound) + .with.property('prettyMessage', 'default branch not found') + }) +}) diff --git a/services/packagist/packagist-php-version.service.js b/services/packagist/packagist-php-version.service.js index c491075dc8b1e8fb085781f3bf63b60bd937573f..ac1e9aae1a3c19e769900046a1904882ee319341 100644 --- a/services/packagist/packagist-php-version.service.js +++ b/services/packagist/packagist-php-version.service.js @@ -5,7 +5,7 @@ const { optionalUrl } = require('../validators') const { allVersionsSchema, BasePackagistService, - documentation, + customServerDocumentationFragment, } = require('./packagist-base') const { NotFound } = require('..') @@ -58,7 +58,7 @@ module.exports = class PackagistPhpVersion extends BasePackagistService { server: 'https://packagist.org', }, staticPreview: this.render({ php: '^7.1.3' }), - documentation, + documentation: customServerDocumentationFragment, }, ] } @@ -84,11 +84,14 @@ module.exports = class PackagistPhpVersion extends BasePackagistService { server, }) - if (!allData.package.versions.hasOwnProperty(version)) { + if ( + !allData.packages[this.getPackageName(user, repo)].hasOwnProperty(version) + ) { throw new NotFound({ prettyMessage: 'invalid version' }) } - const packageVersion = allData.package.versions[version] + const packageVersion = + allData.packages[this.getPackageName(user, repo)][version] if (!packageVersion.require || !packageVersion.require.php) { throw new NotFound({ prettyMessage: 'version requirement not found' }) } diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js index ee1e243fd021a4b46903c59b879bab3a1236c23a..d3b1dc6eb4bfbfd3f7b886b318c9a3d82ef438c3 100644 --- a/services/packagist/packagist-version.service.js +++ b/services/packagist/packagist-version.service.js @@ -8,24 +8,26 @@ const { allVersionsSchema, keywords, BasePackagistService, - documentation, + customServerDocumentationFragment, } = require('./packagist-base') const { NotFound } = require('..') +const packageSchema = Joi.object() + .pattern( + /^/, + Joi.object({ + version: Joi.string(), + extra: Joi.object({ + 'branch-alias': Joi.object().pattern(/^/, Joi.string()), + }), + }).required() + ) + .required() + const schema = Joi.object({ - package: Joi.object({ - versions: Joi.object() - .pattern( - /^/, - Joi.object({ - version: Joi.string().required(), - extra: Joi.object({ - 'branch-alias': Joi.object().pattern(/^/, Joi.string()), - }), - }) - ) - .required(), - }).required(), + packages: Joi.object() + .pattern(/^/, packageSchema) + .required(), }).required() const queryParamSchema = Joi.object({ @@ -79,7 +81,7 @@ module.exports = class PackagistVersion extends BasePackagistService { }, staticPreview: renderVersionBadge({ version: '4.2.2' }), keywords, - documentation, + documentation: customServerDocumentationFragment, }, ] } @@ -97,8 +99,8 @@ module.exports = class PackagistVersion extends BasePackagistService { return renderVersionBadge({ version }) } - transform({ type, json }) { - const versionsData = json.package.versions + transform({ type, json, user, repo }) { + const versionsData = json.packages[this.getPackageName(user, repo)] let versions = Object.keys(versionsData) const aliasesMap = {} versions.forEach(version => { @@ -137,7 +139,7 @@ module.exports = class PackagistVersion extends BasePackagistService { schema: type === 'v' ? allVersionsSchema : schema, server, }) - const { version } = this.transform({ type, json }) + const { version } = this.transform({ type, json, user, repo }) return this.constructor.render({ version }) } } diff --git a/services/packagist/packagist-version.spec.js b/services/packagist/packagist-version.spec.js deleted file mode 100644 index 762acd967b38cc0a87b19fc4ffa6045c1769e6bb..0000000000000000000000000000000000000000 --- a/services/packagist/packagist-version.spec.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -// const { expect } = require('chai') -// const PackagistVersion = require('./packagist-version.service') - -describe('PackagistVersion', function() {}) diff --git a/services/pipenv-helpers.js b/services/pipenv-helpers.js new file mode 100644 index 0000000000000000000000000000000000000000..c77b7babf2e7a30318c1d087be99bfbf9fd6960e --- /dev/null +++ b/services/pipenv-helpers.js @@ -0,0 +1,58 @@ +'use strict' + +const Joi = require('@hapi/joi') +const { InvalidParameter } = require('.') + +const isDependency = Joi.alternatives( + Joi.object({ + version: Joi.string().required(), + }).required(), + Joi.object({ + ref: Joi.string().required(), + }).required() +) + +const isLockfile = Joi.object({ + _meta: Joi.object({ + requires: Joi.object({ + python_version: Joi.string(), + }).required(), + }).required(), + default: Joi.object().pattern(Joi.string().required(), isDependency), + develop: Joi.object().pattern(Joi.string().required(), isDependency), +}).required() + +function getDependencyVersion({ + kind = 'default', + wantedDependency, + lockfileData, +}) { + let dependenciesOfKind + if (kind === 'dev') { + dependenciesOfKind = lockfileData.develop + } else if (kind === 'default') { + dependenciesOfKind = lockfileData.default + } else { + throw Error(`Not very kind: ${kind}`) + } + + if (!(wantedDependency in dependenciesOfKind)) { + throw new InvalidParameter({ + prettyMessage: `${kind} dependency not found`, + }) + } + + const { version, ref } = dependenciesOfKind[wantedDependency] + + if (version) { + // Strip the `==` which is always present. + return { version: version.replace('==', '') } + } else { + return { ref: ref.substring(1, 8) } + } +} + +module.exports = { + isLockfile, + getDependencyVersion, +} diff --git a/services/pypi/pypi-python-versions.tester.js b/services/pypi/pypi-python-versions.tester.js index b55749d8a5e70b5b39e19854b10e33e8b3571d79..25552ab4f2306a481b373cdeebe683682c717971 100644 --- a/services/pypi/pypi-python-versions.tester.js +++ b/services/pypi/pypi-python-versions.tester.js @@ -3,7 +3,6 @@ const Joi = require('@hapi/joi') const t = (module.exports = require('../tester').createServiceTester()) -// These regexes are the same, but declared separately for clarity. const isPipeSeparatedPythonVersions = Joi.string().regex( /^([0-9]+\.[0-9]+(?: \| )?)+$/ ) diff --git a/services/scrutinizer/scrutinizer-base.js b/services/scrutinizer/scrutinizer-base.js index 7f1424f714d358f437c494518f89fc78d65316a1..b2a7c59cab8492f42076cd5f99863a75c7808858 100644 --- a/services/scrutinizer/scrutinizer-base.js +++ b/services/scrutinizer/scrutinizer-base.js @@ -1,6 +1,6 @@ 'use strict' -const { BaseJsonService, NotFound } = require('..') +const { BaseJsonService, NotFound, InvalidResponse } = require('..') module.exports = class ScrutinizerBase extends BaseJsonService { // https://scrutinizer-ci.com/docs/api/#repository-details @@ -30,13 +30,17 @@ module.exports = class ScrutinizerBase extends BaseJsonService { } transformBranchInfoMetricValue({ json, branch, metric }) { + const branchInfo = this.transformBranchInfo({ json, wantedBranch: branch }) + if (!branchInfo.index) { + throw new InvalidResponse({ prettyMessage: 'metrics missing for branch' }) + } const { index: { _embedded: { project: { metric_values: metricValues }, }, }, - } = this.transformBranchInfo({ json, wantedBranch: branch }) + } = branchInfo return { value: metricValues[metric] } } diff --git a/services/scrutinizer/scrutinizer-coverage.service.js b/services/scrutinizer/scrutinizer-coverage.service.js index d8bdeb4445d89ff84d37ac0915105bb6ef057c86..243549b12fd6112873889ce76bc511b46468c37d 100644 --- a/services/scrutinizer/scrutinizer-coverage.service.js +++ b/services/scrutinizer/scrutinizer-coverage.service.js @@ -19,7 +19,7 @@ const schema = Joi.object({ }).required(), }).required(), }).required(), - }).required(), + }), }) ) .required(), diff --git a/services/scrutinizer/scrutinizer-coverage.spec.js b/services/scrutinizer/scrutinizer-coverage.spec.js index ffe58da93a09aad35054ef93178f5641edbd9790..d16d90aef7123798d109446eb3dc4b80ae0a76ec 100644 --- a/services/scrutinizer/scrutinizer-coverage.spec.js +++ b/services/scrutinizer/scrutinizer-coverage.spec.js @@ -3,7 +3,7 @@ const { expect } = require('chai') const { test, given } = require('sazerac') const [ScrutinizerCoverage] = require('./scrutinizer-coverage.service') -const { NotFound } = require('..') +const { InvalidResponse, NotFound } = require('..') describe('ScrutinizerCoverage', function() { test(ScrutinizerCoverage.render, () => { @@ -50,5 +50,24 @@ describe('ScrutinizerCoverage', function() { expect(e.prettyMessage).to.equal('coverage not found') } }) + it('throws InvalidResponse error when branch is missing statistics', function() { + expect(() => + ScrutinizerCoverage.prototype.transform({ + branch: 'gh-pages', + json: { + applications: { + master: { index: {} }, + 'gh-pages': { + build_status: { + status: 'unknown', + }, + }, + }, + }, + }) + ) + .to.throw(InvalidResponse) + .with.property('prettyMessage', 'metrics missing for branch') + }) }) }) diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js index 74f7f4d227da8a45fa8d95edf70de252e9c15989..514351e529af94b2540049f642d41d3e9c4ba30a 100644 --- a/services/scrutinizer/scrutinizer-quality.service.js +++ b/services/scrutinizer/scrutinizer-quality.service.js @@ -18,7 +18,7 @@ const schema = Joi.object({ }).required(), }).required(), }).required(), - }).required(), + }), }) ) .required(), diff --git a/services/security-headers/security-headers.service.js b/services/security-headers/security-headers.service.js index 24e148dc8d059ec65826212019099e1ad7db73ed..f3776bdf25923b68abfc3f85e3482b9c066eb53a 100644 --- a/services/security-headers/security-headers.service.js +++ b/services/security-headers/security-headers.service.js @@ -69,7 +69,7 @@ module.exports = class SecurityHeaders extends BaseService { } } - async handle({}, { url }) { + async handle(namedParams, { url }) { const { res } = await this._request({ url: `https://securityheaders.com`, options: { diff --git a/services/sonar/sonar-base.js b/services/sonar/sonar-base.js index 3c29dbbff16ec80ef861dfb0c9ef93de1bdc1abc..05d0a4ed6623958dc7b1f51deafb56e99fe729b9 100644 --- a/services/sonar/sonar-base.js +++ b/services/sonar/sonar-base.js @@ -2,7 +2,19 @@ const Joi = require('@hapi/joi') const { isLegacyVersion } = require('./sonar-helpers') -const { BaseJsonService } = require('..') +const { BaseJsonService, NotFound } = require('..') + +// It is possible to see HTTP 404 response codes and HTTP 200 responses +// with empty arrays of metric values, with both the legacy (pre v5.3) and modern APIs. +// +// 404 responses can occur with non-existent component keys, as well as unknown/unsupported metrics. +// +// 200 responses with empty arrays can occur when the metric key is valid, but the data +// is unavailable for the specified component, for example using the metric key `tests` with a +// component that is not capturing test results. +// It can also happen when using an older/deprecated +// metric key with a newer version of Sonar, for example using the metric key +// `public_documented_api_density` with SonarQube v7.x or higher const modernSchema = Joi.object({ component: Joi.object({ @@ -14,8 +26,9 @@ const modernSchema = Joi.object({ Joi.number().min(0), Joi.allow('OK', 'ERROR') ).required(), - }).required() + }) ) + .min(0) .required(), }).required(), }).required() @@ -31,7 +44,7 @@ const legacySchema = Joi.array() Joi.number().min(0), Joi.allow('OK', 'ERROR') ).required(), - }).required() + }) ) .required(), }).required() @@ -83,12 +96,22 @@ module.exports = class SonarBase extends BaseJsonService { const metrics = {} if (useLegacyApi) { - json[0].msr.forEach(measure => { + const [{ msr: measures }] = json + if (!measures.length) { + throw new NotFound({ prettyMessage: 'metric not found' }) + } + measures.forEach(measure => { // Most values are numeric, but not all of them. metrics[measure.key] = parseInt(measure.val) || measure.val }) } else { - json.component.measures.forEach(measure => { + const { + component: { measures }, + } = json + if (!measures.length) { + throw new NotFound({ prettyMessage: 'metric not found' }) + } + measures.forEach(measure => { // Most values are numeric, but not all of them. metrics[measure.metric] = parseInt(measure.value) || measure.value }) diff --git a/services/sonar/sonar-coverage.tester.js b/services/sonar/sonar-coverage.tester.js index 1957df8d06223ca558b1858320cc73224b2cfd10..feb31425c22febd0f86452b48ebc201d87e5f92e 100644 --- a/services/sonar/sonar-coverage.tester.js +++ b/services/sonar/sonar-coverage.tester.js @@ -3,10 +3,14 @@ const t = (module.exports = require('../tester').createServiceTester()) const { isIntegerPercentage } = require('../test-validators') +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + t.create('Coverage') - .get( - '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com' - ) + .get('/swellaby%3Aletra.json?server=https://sonarcloud.io') .expectBadge({ label: 'coverage', message: isIntegerPercentage, @@ -16,7 +20,27 @@ t.create('Coverage (legacy API supported)') .get( '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'coverage', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'coverage', + val: 83, + }, + ], + }, + ]) + ) .expectBadge({ label: 'coverage', - message: isIntegerPercentage, + message: '83%', }) diff --git a/services/sonar/sonar-documented-api-density.tester.js b/services/sonar/sonar-documented-api-density.tester.js index e5982f4cbcecfe2cdecef3cc8764c647a2519a11..b879d6f5b10b0c830cf90739f33e6d951ddc5d99 100644 --- a/services/sonar/sonar-documented-api-density.tester.js +++ b/services/sonar/sonar-documented-api-density.tester.js @@ -1,22 +1,78 @@ 'use strict' -const { isIntegerPercentage } = require('../test-validators') const t = (module.exports = require('../tester').createServiceTester()) +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + +// This metric was deprecated in SonarQube 6.2 and dropped in SonarQube 7.x+ +// https://docs.sonarqube.org/6.7/MetricDefinitions.html#src-11634682_MetricDefinitions-Documentation +// https://docs.sonarqube.org/7.0/MetricDefinitions.html +// https://sonarcloud.io/api/measures/component?componentKey=org.sonarsource.sonarqube:sonarqube&metricKeys=public_documented_api_density +t.create('Documented API Density (not found)') + .get( + '/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io' + ) + .expectBadge({ + label: 'public documented api density', + message: 'metric not found', + }) + t.create('Documented API Density') .get( - '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com' + '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.somewhatold.com&sonarVersion=6.1' + ) + .intercept(nock => + nock('http://sonar.somewhatold.com/api') + .get('/measures/component') + .query({ + componentKey: 'org.ow2.petals:petals-se-ase', + metricKeys: 'public_documented_api_density', + }) + .reply(200, { + component: { + measures: [ + { + metric: 'public_documented_api_density', + value: 91, + }, + ], + }, + }) ) .expectBadge({ label: 'public documented api density', - message: isIntegerPercentage, + message: '91%', }) t.create('Documented API Density (legacy API supported)') .get( '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'public_documented_api_density', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'public_documented_api_density', + val: 79, + }, + ], + }, + ]) + ) .expectBadge({ label: 'public documented api density', - message: isIntegerPercentage, + message: '79%', }) diff --git a/services/sonar/sonar-fortify-rating.tester.js b/services/sonar/sonar-fortify-rating.tester.js index ea1fc375eea5a001c390db843d68a8957f46ac1f..760ba28d09f59cab05c671f24a25834d73a02c03 100644 --- a/services/sonar/sonar-fortify-rating.tester.js +++ b/services/sonar/sonar-fortify-rating.tester.js @@ -2,7 +2,13 @@ const t = (module.exports = require('../tester').createServiceTester()) -// The below tests are using a mocked API response because +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + +// The below tests are all using a mocked API response because // neither SonarCloud.io nor any known public SonarQube deployments // have the Fortify plugin installed and in use, so there are no // available live endpoints to hit. @@ -75,3 +81,27 @@ t.create('Fortify Security Rating (nonexistent component)') label: 'fortify-security-rating', message: 'component or metric not found, or legacy API not supported', }) + +t.create('Fortify Security Rating (legacy API metric not found)') + .get( + '/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' + ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'fortify-security-rating', + includeTrends: true, + }) + .reply(200, [ + { + msr: [], + }, + ]) + ) + .expectBadge({ + label: 'fortify-security-rating', + message: 'metric not found', + }) diff --git a/services/sonar/sonar-generic.tester.js b/services/sonar/sonar-generic.tester.js index 65edbef31c9b3476304ebd8bc8a662371bdecb90..3d5bfffd52834d31759b7fef8cfd2ee86231e641 100644 --- a/services/sonar/sonar-generic.tester.js +++ b/services/sonar/sonar-generic.tester.js @@ -4,6 +4,7 @@ const { isMetric } = require('../test-validators') const t = (module.exports = require('../tester').createServiceTester()) t.create('Security Rating') + .timeout(10000) .get( '/security_rating/com.luckybox:luckybox.json?server=https://sonarcloud.io' ) diff --git a/services/sonar/sonar-quality-gate.tester.js b/services/sonar/sonar-quality-gate.tester.js index ce8a66a4d48bf4532c5100eb7c65c6250d7da07e..f7c79b1d83ae0b69da58e559a2c5f5fb4dce91a6 100644 --- a/services/sonar/sonar-quality-gate.tester.js +++ b/services/sonar/sonar-quality-gate.tester.js @@ -5,6 +5,12 @@ const t = (module.exports = require('../tester').createServiceTester()) const isQualityGateStatus = Joi.allow('passed', 'failed') +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + t.create('Quality Gate') .get( '/quality_gate/swellaby%3Aazdo-shellcheck.json?server=https://sonarcloud.io' @@ -18,7 +24,27 @@ t.create('Quality Gate (Alert Status)') .get( '/alert_status/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'alert_status', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'alert_status', + val: 'OK', + }, + ], + }, + ]) + ) .expectBadge({ label: 'quality gate', - message: isQualityGateStatus, + message: 'passed', }) diff --git a/services/sonar/sonar-tech-debt.tester.js b/services/sonar/sonar-tech-debt.tester.js index 0a16cae21d00b03fae1d5dd61edb6d08852ff396..651bc43c8ea23535b9e462ea08c58e97cb091839 100644 --- a/services/sonar/sonar-tech-debt.tester.js +++ b/services/sonar/sonar-tech-debt.tester.js @@ -1,22 +1,48 @@ 'use strict' -const { isIntegerPercentage } = require('../test-validators') +const { isPercentage } = require('../test-validators') const t = (module.exports = require('../tester').createServiceTester()) +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + t.create('Tech Debt') .get( - '/tech_debt/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com' + '/tech_debt/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io' ) .expectBadge({ label: 'tech debt', - message: isIntegerPercentage, + message: isPercentage, }) t.create('Tech Debt (legacy API supported)') .get( '/tech_debt/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'sqale_debt_ratio', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'sqale_debt_ratio', + val: '7', + }, + ], + }, + ]) + ) .expectBadge({ label: 'tech debt', - message: isIntegerPercentage, + message: '7%', }) diff --git a/services/sonar/sonar-tests.tester.js b/services/sonar/sonar-tests.tester.js index 2433ba3df27aa087947eb7877f7a469733be49d0..cc929b0f206e16c9447e7b7c39cd21a00e9301f4 100644 --- a/services/sonar/sonar-tests.tester.js +++ b/services/sonar/sonar-tests.tester.js @@ -21,6 +21,12 @@ const isMetricAllowZero = Joi.alternatives( .required() ) +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + t.create('Tests') .timeout(10000) .get( @@ -32,13 +38,40 @@ t.create('Tests') }) t.create('Tests (legacy API supported)') - .timeout(10000) .get( '/tests/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'tests,test_failures,skipped_tests', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'tests', + val: '71', + }, + { + key: 'test_failures', + val: '2', + }, + { + key: 'skipped_tests', + val: '1', + }, + ], + }, + ]) + ) .expectBadge({ label: 'tests', - message: isDefaultTestTotals, + message: '68 passed, 2 failed, 1 skipped', }) t.create('Tests with compact message') @@ -90,13 +123,32 @@ t.create('Total Test Count') }) t.create('Total Test Count (legacy API supported)') - .timeout(10000) .get( '/total_tests/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'tests', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'tests', + val: '132', + }, + ], + }, + ]) + ) .expectBadge({ label: 'total tests', - message: isMetric, + message: '132', }) t.create('Test Failures Count') @@ -110,13 +162,32 @@ t.create('Test Failures Count') }) t.create('Test Failures Count (legacy API supported)') - .timeout(10000) .get( '/test_failures/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'test_failures', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'test_failures', + val: '2', + }, + ], + }, + ]) + ) .expectBadge({ label: 'test failures', - message: isMetricAllowZero, + message: '2', }) t.create('Test Errors Count') @@ -130,13 +201,32 @@ t.create('Test Errors Count') }) t.create('Test Errors Count (legacy API supported)') - .timeout(10000) .get( '/test_errors/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'test_errors', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'test_errors', + val: '3', + }, + ], + }, + ]) + ) .expectBadge({ label: 'test errors', - message: isMetricAllowZero, + message: '3', }) t.create('Skipped Tests Count') @@ -150,13 +240,32 @@ t.create('Skipped Tests Count') }) t.create('Skipped Tests Count (legacy API supported)') - .timeout(10000) .get( '/skipped_tests/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'skipped_tests', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'skipped_tests', + val: '1', + }, + ], + }, + ]) + ) .expectBadge({ label: 'skipped tests', - message: isMetricAllowZero, + message: '1', }) t.create('Test Success Rate') @@ -170,11 +279,30 @@ t.create('Test Success Rate') }) t.create('Test Success Rate (legacy API supported)') - .timeout(10000) .get( '/test_success_density/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'test_success_density', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'test_success_density', + val: '97', + }, + ], + }, + ]) + ) .expectBadge({ label: 'tests', - message: isIntegerPercentage, + message: '97%', }) diff --git a/services/sonar/sonar-violations.tester.js b/services/sonar/sonar-violations.tester.js index cc9d68be948e023f7045b5098d2e6120aa7a5d8b..dc3d7e9e95eda3e1c5c8a97ad11a3fcf4c1d1e50 100644 --- a/services/sonar/sonar-violations.tester.js +++ b/services/sonar/sonar-violations.tester.js @@ -10,9 +10,16 @@ const isViolationsLongFormMetric = Joi.alternatives( ) ) +// The service tests targeting the legacy SonarQube API are mocked +// because of the lack of publicly accessible, self-hosted, legacy SonarQube instances +// See https://github.com/badges/shields/issues/4221#issuecomment-546611598 for more details +// This is an uncommon scenario Shields has to support for Sonar, and should not be used as a model +// for other service tests. + t.create('Violations') + .timeout(10000) .get( - '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com' + '/violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io' ) .expectBadge({ label: 'violations', @@ -23,14 +30,35 @@ t.create('Violations (legacy API supported)') .get( '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'violations', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'violations', + val: '7', + }, + ], + }, + ]) + ) .expectBadge({ label: 'violations', - message: isMetric, + message: '7', }) t.create('Violations Long Format') + .timeout(10000) .get( - '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&format=long' + '/violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io&format=long' ) .expectBadge({ label: 'violations', @@ -41,14 +69,56 @@ t.create('Violations Long Format (legacy API supported)') .get( '/violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2&format=long' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: + 'violations,blocker_violations,critical_violations,major_violations,minor_violations,info_violations', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'violations', + val: '10', + }, + { + key: 'blocker_violations', + val: '1', + }, + { + key: 'critical_violations', + val: '0', + }, + { + key: 'major_violations', + val: '2', + }, + { + key: 'minor_violations', + val: '0', + }, + { + key: 'info_violations', + val: '7', + }, + ], + }, + ]) + ) .expectBadge({ label: 'violations', - message: isViolationsLongFormMetric, + message: '1 blocker, 2 major, 7 info', }) t.create('Blocker Violations') + .timeout(10000) .get( - '/blocker_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com' + '/blocker_violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io' ) .expectBadge({ label: 'blocker violations', @@ -59,14 +129,35 @@ t.create('Blocker Violations (legacy API supported)') .get( '/blocker_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'blocker_violations', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'blocker_violations', + val: '1', + }, + ], + }, + ]) + ) .expectBadge({ label: 'blocker violations', - message: isMetric, + message: '1', }) t.create('Critical Violations') + .timeout(10000) .get( - '/critical_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com' + '/critical_violations/org.sonarsource.sonarqube%3Asonarqube.json?server=https://sonarcloud.io' ) .expectBadge({ label: 'critical violations', @@ -77,7 +168,27 @@ t.create('Critical Violations (legacy API supported)') .get( '/critical_violations/org.ow2.petals%3Apetals-se-ase.json?server=http://sonar.petalslink.com&sonarVersion=4.2' ) + .intercept(nock => + nock('http://sonar.petalslink.com/api') + .get('/resources') + .query({ + resource: 'org.ow2.petals:petals-se-ase', + depth: 0, + metrics: 'critical_violations', + includeTrends: true, + }) + .reply(200, [ + { + msr: [ + { + key: 'critical_violations', + val: '2', + }, + ], + }, + ]) + ) .expectBadge({ label: 'critical violations', - message: isMetric, + message: '2', }) diff --git a/services/suggest.integration.js b/services/suggest.integration.js index f3c0c82fd9f2c09ddc09390209712d5526160e8f..56c790410bb0f03c3ec27953019e10c84777039d 100644 --- a/services/suggest.integration.js +++ b/services/suggest.integration.js @@ -8,7 +8,7 @@ const got = require('../core/got-test-client') const { setRoutes } = require('./suggest') const GithubApiProvider = require('./github/github-api-provider') -describe('GitHub badge suggestions', function() { +describe('Badge suggestions for', function() { const githubApiBaseUrl = process.env.GITHUB_URL || 'https://api.github.com' let token, apiProvider @@ -46,143 +46,230 @@ describe('GitHub badge suggestions', function() { before(function() { setRoutes([origin], apiProvider, camp) }) - - context('with an existing project', function() { - it('returns the expected suggestions', async function() { - const { statusCode, body } = await got( - `${baseUrl}/$suggest/v1?url=${encodeURIComponent( - 'https://github.com/atom/atom' - )}`, - { - json: true, - } - ) - expect(statusCode).to.equal(200) - expect(body).to.deep.equal({ - suggestions: [ - { - title: 'GitHub issues', - link: 'https://github.com/atom/atom/issues', - example: { - pattern: '/github/issues/:user/:repo', - namedParams: { user: 'atom', repo: 'atom' }, - queryParams: {}, - }, - }, + describe('GitHub', function() { + context('with an existing project', function() { + it('returns the expected suggestions', async function() { + const { statusCode, body } = await got( + `${baseUrl}/$suggest/v1?url=${encodeURIComponent( + 'https://github.com/atom/atom' + )}`, { - title: 'GitHub forks', - link: 'https://github.com/atom/atom/network', - example: { - pattern: '/github/forks/:user/:repo', - namedParams: { user: 'atom', repo: 'atom' }, - queryParams: {}, + json: true, + } + ) + expect(statusCode).to.equal(200) + expect(body).to.deep.equal({ + suggestions: [ + { + title: 'GitHub issues', + link: 'https://github.com/atom/atom/issues', + example: { + pattern: '/github/issues/:user/:repo', + namedParams: { user: 'atom', repo: 'atom' }, + queryParams: {}, + }, }, - }, - { - title: 'GitHub stars', - link: 'https://github.com/atom/atom/stargazers', - example: { - pattern: '/github/stars/:user/:repo', - namedParams: { user: 'atom', repo: 'atom' }, - queryParams: {}, + { + title: 'GitHub forks', + link: 'https://github.com/atom/atom/network', + example: { + pattern: '/github/forks/:user/:repo', + namedParams: { user: 'atom', repo: 'atom' }, + queryParams: {}, + }, }, - }, - { - title: 'GitHub license', - link: 'https://github.com/atom/atom/blob/master/LICENSE.md', - example: { - pattern: '/github/license/:user/:repo', - namedParams: { user: 'atom', repo: 'atom' }, - queryParams: {}, + { + title: 'GitHub stars', + link: 'https://github.com/atom/atom/stargazers', + example: { + pattern: '/github/stars/:user/:repo', + namedParams: { user: 'atom', repo: 'atom' }, + queryParams: {}, + }, }, - }, - { - title: 'Twitter', - link: - 'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fatom%2Fatom', - example: { - pattern: '/twitter/url', - namedParams: {}, - queryParams: { - url: 'https://github.com/atom/atom', + { + title: 'GitHub license', + link: 'https://github.com/atom/atom/blob/master/LICENSE.md', + example: { + pattern: '/github/license/:user/:repo', + namedParams: { user: 'atom', repo: 'atom' }, + queryParams: {}, }, }, - preview: { - style: 'social', + { + title: 'Twitter', + link: + 'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fatom%2Fatom', + example: { + pattern: '/twitter/url', + namedParams: {}, + queryParams: { + url: 'https://github.com/atom/atom', + }, + }, + preview: { + style: 'social', + }, }, - }, - ], + ], + }) }) }) - }) - context('with a non-existent project', function() { - it('returns the expected suggestions', async function() { - this.timeout(5000) + context('with a non-existent project', function() { + it('returns the expected suggestions', async function() { + this.timeout(5000) - const { statusCode, body } = await got( - `${baseUrl}/$suggest/v1?url=${encodeURIComponent( - 'https://github.com/badges/not-a-real-project' - )}`, - { - json: true, - } - ) - expect(statusCode).to.equal(200) - expect(body).to.deep.equal({ - suggestions: [ + const { statusCode, body } = await got( + `${baseUrl}/$suggest/v1?url=${encodeURIComponent( + 'https://github.com/badges/not-a-real-project' + )}`, { - title: 'GitHub issues', - link: 'https://github.com/badges/not-a-real-project/issues', - example: { - pattern: '/github/issues/:user/:repo', - namedParams: { user: 'badges', repo: 'not-a-real-project' }, - queryParams: {}, + json: true, + } + ) + expect(statusCode).to.equal(200) + expect(body).to.deep.equal({ + suggestions: [ + { + title: 'GitHub issues', + link: 'https://github.com/badges/not-a-real-project/issues', + example: { + pattern: '/github/issues/:user/:repo', + namedParams: { user: 'badges', repo: 'not-a-real-project' }, + queryParams: {}, + }, }, - }, - { - title: 'GitHub forks', - link: 'https://github.com/badges/not-a-real-project/network', - example: { - pattern: '/github/forks/:user/:repo', - namedParams: { user: 'badges', repo: 'not-a-real-project' }, - queryParams: {}, + { + title: 'GitHub forks', + link: 'https://github.com/badges/not-a-real-project/network', + example: { + pattern: '/github/forks/:user/:repo', + namedParams: { user: 'badges', repo: 'not-a-real-project' }, + queryParams: {}, + }, }, - }, - { - title: 'GitHub stars', - link: 'https://github.com/badges/not-a-real-project/stargazers', - example: { - pattern: '/github/stars/:user/:repo', - namedParams: { user: 'badges', repo: 'not-a-real-project' }, - queryParams: {}, + { + title: 'GitHub stars', + link: 'https://github.com/badges/not-a-real-project/stargazers', + example: { + pattern: '/github/stars/:user/:repo', + namedParams: { user: 'badges', repo: 'not-a-real-project' }, + queryParams: {}, + }, }, - }, + { + title: 'GitHub license', + link: 'https://github.com/badges/not-a-real-project', + example: { + pattern: '/github/license/:user/:repo', + namedParams: { user: 'badges', repo: 'not-a-real-project' }, + queryParams: {}, + }, + }, + { + title: 'Twitter', + link: + 'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fbadges%2Fnot-a-real-project', + example: { + pattern: '/twitter/url', + namedParams: {}, + queryParams: { + url: 'https://github.com/badges/not-a-real-project', + }, + }, + preview: { + style: 'social', + }, + }, + ], + }) + }) + }) + }) + + describe('GitLab', function() { + context('with an existing project', function() { + it('returns the expected suggestions', async function() { + const { statusCode, body } = await got( + `${baseUrl}/$suggest/v1?url=${encodeURIComponent( + 'https://gitlab.com/gitlab-org/gitlab' + )}`, { - title: 'GitHub license', - link: 'https://github.com/badges/not-a-real-project', - example: { - pattern: '/github/license/:user/:repo', - namedParams: { user: 'badges', repo: 'not-a-real-project' }, - queryParams: {}, + json: true, + } + ) + expect(statusCode).to.equal(200) + expect(body).to.deep.equal({ + suggestions: [ + { + title: 'GitLab pipeline', + link: 'https://gitlab.com/gitlab-org/gitlab/builds', + example: { + pattern: '/gitlab/pipeline/:user/:repo', + namedParams: { user: 'gitlab-org', repo: 'gitlab' }, + queryParams: {}, + }, }, - }, + { + title: 'Twitter', + link: + 'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgitlab.com%2Fgitlab-org%2Fgitlab', + example: { + pattern: '/twitter/url', + namedParams: {}, + queryParams: { + url: 'https://gitlab.com/gitlab-org/gitlab', + }, + }, + preview: { + style: 'social', + }, + }, + ], + }) + }) + }) + + context('with an nonexisting project', function() { + it('returns the expected suggestions', async function() { + const { statusCode, body } = await got( + `${baseUrl}/$suggest/v1?url=${encodeURIComponent( + 'https://gitlab.com/gitlab-org/not-gitlab' + )}`, { - title: 'Twitter', - link: - 'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fbadges%2Fnot-a-real-project', - example: { - pattern: '/twitter/url', - namedParams: {}, - queryParams: { - url: 'https://github.com/badges/not-a-real-project', + json: true, + } + ) + expect(statusCode).to.equal(200) + expect(body).to.deep.equal({ + suggestions: [ + { + title: 'GitLab pipeline', + link: 'https://gitlab.com/gitlab-org/not-gitlab/builds', + example: { + pattern: '/gitlab/pipeline/:user/:repo', + namedParams: { user: 'gitlab-org', repo: 'not-gitlab' }, + queryParams: {}, }, }, - preview: { - style: 'social', + { + title: 'Twitter', + link: + 'https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgitlab.com%2Fgitlab-org%2Fnot-gitlab', + example: { + pattern: '/twitter/url', + namedParams: {}, + queryParams: { + url: 'https://gitlab.com/gitlab-org/not-gitlab', + }, + }, + preview: { + style: 'social', + }, }, - }, - ], + ], + }) }) }) }) diff --git a/services/suggest.js b/services/suggest.js index dd8ebc988ef5c1b51ee0d4db0642625be5971109..ac1c6893939a27273b18977adb12a6c861f954b6 100644 --- a/services/suggest.js +++ b/services/suggest.js @@ -99,18 +99,35 @@ async function githubLicense(githubApiProvider, user, repo) { } } +function gitlabPipeline(user, repo) { + const repoSlug = `${user}/${repo}` + return { + title: 'GitLab pipeline', + link: `https://gitlab.com/${repoSlug}/builds`, + example: { + pattern: '/gitlab/pipeline/:user/:repo', + namedParams: { user, repo }, + queryParams: {}, + }, + } +} + async function findSuggestions(githubApiProvider, url) { let promises = [] - if (url.hostname === 'github.com') { + if (url.hostname === 'github.com' || url.hostname === 'gitlab.com') { const userRepo = url.pathname.slice(1).split('/') const user = userRepo[0] const repo = userRepo[1] - promises = promises.concat([ - githubIssues(user, repo), - githubForks(user, repo), - githubStars(user, repo), - githubLicense(githubApiProvider, user, repo), - ]) + if (url.hostname === 'github.com') { + promises = promises.concat([ + githubIssues(user, repo), + githubForks(user, repo), + githubStars(user, repo), + githubLicense(githubApiProvider, user, repo), + ]) + } else { + promises = promises.concat([gitlabPipeline(user, repo)]) + } } promises.push(twitterPage(url)) diff --git a/services/swagger/swagger-redirect.service.js b/services/swagger/swagger-redirect.service.js new file mode 100644 index 0000000000000000000000000000000000000000..954bd131b03655fee89d740fbfb932ffa3e5ec50 --- /dev/null +++ b/services/swagger/swagger-redirect.service.js @@ -0,0 +1,20 @@ +'use strict' + +const { redirector } = require('..') + +module.exports = [ + redirector({ + category: 'other', + name: 'SwaggerRedirect', + route: { + base: 'swagger/valid/2.0', + pattern: ':scheme(http|https)/:url*', + }, + transformPath: () => `/swagger/valid/3.0`, + transformQueryParams: ({ scheme, url }) => { + const suffix = /(yaml|yml|json)$/.test(url) ? '' : '.json' + return { specUrl: `${scheme}://${url}${suffix}` } + }, + dateAdded: new Date('2019-11-03'), + }), +] diff --git a/services/swagger/swagger-redirect.tester.js b/services/swagger/swagger-redirect.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..34e017f8af7d05f8c405c623b79cec8dcfa46feb --- /dev/null +++ b/services/swagger/swagger-redirect.tester.js @@ -0,0 +1,45 @@ +'use strict' + +const { ServiceTester } = require('../tester') + +const t = (module.exports = new ServiceTester({ + id: 'SwaggerUrlRedirect', + title: 'SwaggerUrlRedirect', + pathPrefix: '/swagger/valid/2.0', +})) + +t.create('swagger json') + .get('/https/example.com/example.json', { + followRedirect: false, + }) + .expectStatus(301) + .expectHeader( + 'Location', + `/swagger/valid/3.0.json?specUrl=${encodeURIComponent( + 'https://example.com/example.json' + )}` + ) + +t.create('swagger yml') + .get('/https/example.com/example.yml', { + followRedirect: false, + }) + .expectStatus(301) + .expectHeader( + 'Location', + `/swagger/valid/3.0.svg?specUrl=${encodeURIComponent( + 'https://example.com/example.yml' + )}` + ) + +t.create('swagger yaml') + .get('/https/example.com/example.yaml', { + followRedirect: false, + }) + .expectStatus(301) + .expectHeader( + 'Location', + `/swagger/valid/3.0.svg?specUrl=${encodeURIComponent( + 'https://example.com/example.yaml' + )}` + ) diff --git a/services/swagger/swagger.service.js b/services/swagger/swagger.service.js index cdeac3eb4d15a45e63d0af4916402c7480b39d3f..636ae1b80d9fbce46b5cf8efb466178c68e3a589 100644 --- a/services/swagger/swagger.service.js +++ b/services/swagger/swagger.service.js @@ -1,9 +1,10 @@ 'use strict' const Joi = require('@hapi/joi') -const { BaseJsonService } = require('..') +const { optionalUrl } = require('../validators') +const { BaseJsonService, NotFound } = require('..') -const validatorSchema = Joi.object() +const schema = Joi.object() .keys({ schemaValidationMessages: Joi.array().items( Joi.object({ @@ -14,6 +15,10 @@ const validatorSchema = Joi.object() }) .required() +const queryParamSchema = Joi.object({ + specUrl: optionalUrl.required(), +}).required() + module.exports = class SwaggerValidatorService extends BaseJsonService { static get category() { return 'other' @@ -21,8 +26,9 @@ module.exports = class SwaggerValidatorService extends BaseJsonService { static get route() { return { - base: 'swagger/valid/2.0', - pattern: ':scheme(http|https)?/:url*', + base: 'swagger/valid', + pattern: '3.0', + queryParamSchema, } } @@ -30,12 +36,11 @@ module.exports = class SwaggerValidatorService extends BaseJsonService { return [ { title: 'Swagger Validator', - pattern: ':scheme/:url', - staticPreview: this.render({ message: 'valid', clr: 'brightgreen' }), - namedParams: { - scheme: 'https', - url: - 'raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json', + staticPreview: this.render({ status: 'valid' }), + namedParams: {}, + queryParams: { + specUrl: + 'https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json', }, }, ] @@ -45,31 +50,45 @@ module.exports = class SwaggerValidatorService extends BaseJsonService { return { label: 'swagger' } } - static render({ message, clr }) { - return { message, color: clr } + static render({ status }) { + if (status === 'valid') { + return { message: status, color: 'brightgreen' } + } else { + return { message: status, color: 'red' } + } } - async fetch({ scheme, urlF }) { - const url = 'http://online.swagger.io/validator/debug' + async fetch({ specUrl }) { return this._requestJson({ - url, - schema: validatorSchema, + url: 'http://validator.swagger.io/validator/debug', + schema, options: { qs: { - url: `${scheme}://${urlF}`, + url: specUrl, }, }, }) } - async handle({ scheme, url }) { - const json = await this.fetch({ scheme, urlF: url }) + transform({ json, specUrl }) { const valMessages = json.schemaValidationMessages - if (!valMessages || valMessages.length === 0) { - return this.constructor.render({ message: 'valid', clr: 'brightgreen' }) - } else { - return this.constructor.render({ message: 'invalid', clr: 'red' }) + return { status: 'valid' } + } else if (valMessages.length === 1) { + const { message, level } = valMessages[0] + if (level === 'error' && message === `Can't read from file ${specUrl}`) { + throw new NotFound({ prettyMessage: 'spec not found or unreadable ' }) + } + } + if (valMessages.every(msg => msg.level === 'warning')) { + return { status: 'valid' } } + return { status: 'invalid' } + } + + async handle(_routeParams, { specUrl }) { + const json = await this.fetch({ specUrl }) + const { status } = this.transform({ json, specUrl }) + return this.constructor.render({ status }) } } diff --git a/services/swagger/swagger.tester.js b/services/swagger/swagger.tester.js index 6e67534c09c23d94eaa74c5e82a2af7bbb1c2af4..3f8749e46ff4ebd16fbd87784857bf1c6b1be9a4 100644 --- a/services/swagger/swagger.tester.js +++ b/services/swagger/swagger.tester.js @@ -1,26 +1,15 @@ 'use strict' -const getURL = '/https/example.com/example.json.json' -const apiURL = 'http://online.swagger.io' +const getURL = '/3.0.json?specUrl=https://example.com/example.json' +const getURLBase = '/3.0.json?specUrl=' +const apiURL = 'http://validator.swagger.io' const apiGetURL = '/validator/debug' -const apiGetQueryParams = { url: 'https://example.com/example.json' } +const apiGetQueryParams = { + url: 'https://example.com/example.json', +} const t = (module.exports = require('../tester').createServiceTester()) -t.create('Valid') - .get(getURL) - .intercept(nock => - nock(apiURL) - .get(apiGetURL) - .query(apiGetQueryParams) - .reply(200, {}) - ) - .expectBadge({ - label: 'swagger', - message: 'valid', - color: 'brightgreen', - }) - t.create('Invalid') .get(getURL) .intercept(nock => @@ -41,3 +30,52 @@ t.create('Invalid') message: 'invalid', color: 'red', }) + +t.create('Valid json 2.0') + .get( + `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v2.0/json/petstore-expanded.json` + ) + .expectBadge({ + label: 'swagger', + message: 'valid', + color: 'brightgreen', + }) + +t.create('Valid yaml 3.0') + .get( + `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v3.0/petstore.yaml` + ) + .expectBadge({ + label: 'swagger', + message: 'valid', + color: 'brightgreen', + }) + +t.create('Valid with warnings') + .get(`${getURLBase}https://petstore3.swagger.io/api/v3/openapi.json`) + .expectBadge({ + label: 'swagger', + message: 'valid', + color: 'brightgreen', + }) + +// Isn't a spec, but valid json +t.create('Invalid') + .get( + `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/schemas/v3.0/schema.json` + ) + .expectBadge({ + label: 'swagger', + message: 'invalid', + color: 'red', + }) + +t.create('Not found') + .get( + `${getURLBase}https://raw.githubusercontent.com/OAI/OpenAPI-Specification/master/examples/v3.0/notFound.yaml` + ) + .expectBadge({ + label: 'swagger', + message: 'spec not found or unreadable', + color: 'red', + }) diff --git a/services/ubuntu/ubuntu.tester.js b/services/ubuntu/ubuntu.tester.js index a919bc3798310ca46d2d7508a728f65a4f4fec0e..8b9371ec4c3749ed6b70c285629a771a155d9195 100644 --- a/services/ubuntu/ubuntu.tester.js +++ b/services/ubuntu/ubuntu.tester.js @@ -1,15 +1,17 @@ 'use strict' -const { - isVPlusDottedVersionNClausesWithOptionalSuffixAndEpoch, -} = require('../test-validators') +const Joi = require('@hapi/joi') const t = (module.exports = require('../tester').createServiceTester()) +const isUbuntuVersion = Joi.string().regex( + /^v(\d+:)?\d+(\.\d+)*([\w\\.]*)?([-+~].*)?$/ +) + t.create('Ubuntu package (default distribution, valid)') .get('/apt.json') .expectBadge({ label: 'ubuntu', - message: isVPlusDottedVersionNClausesWithOptionalSuffixAndEpoch, + message: isUbuntuVersion, }) t.create('Ubuntu package (valid)') diff --git a/services/vaadin-directory/vaadin-directory-rating-count.service.js b/services/vaadin-directory/vaadin-directory-rating-count.service.js index 02aa2b1672ce4749cc66e614659d2e5886c4bd05..496143c1d485516458a8be226b903372f4f3ca8d 100644 --- a/services/vaadin-directory/vaadin-directory-rating-count.service.js +++ b/services/vaadin-directory/vaadin-directory-rating-count.service.js @@ -23,7 +23,7 @@ module.exports = class VaadinDirectoryRatingCount extends BaseVaadinDirectorySer pattern: 'rating-count/:packageName', namedParams: { packageName: 'vaadinvaadin-grid' }, staticPreview: this.render({ ratingCount: 6 }), - keywords: ['vaadin-directory', 'rating-count', 'rating count'], + keywords: ['vaadin-directory', 'rating-count'], }, ] } diff --git a/services/vaadin-directory/vaadin-directory-rating.service.js b/services/vaadin-directory/vaadin-directory-rating.service.js index 5ebfb3c90efac94bf64d001fe6478b0bf3782085..f1a6546fa4d404e5e917eea78b2f567df7232891 100644 --- a/services/vaadin-directory/vaadin-directory-rating.service.js +++ b/services/vaadin-directory/vaadin-directory-rating.service.js @@ -23,7 +23,7 @@ module.exports = class VaadinDirectoryRating extends BaseVaadinDirectoryService pattern: ':format(stars|rating)/:packageName', namedParams: { format: 'rating', packageName: 'vaadinvaadin-grid' }, staticPreview: this.render({ format: 'rating', score: 4.75 }), - keywords: ['vaadin-directory', 'rating'], + keywords: ['vaadin-directory'], }, ] } diff --git a/services/vaadin-directory/vaadin-directory-version.service.js b/services/vaadin-directory/vaadin-directory-version.service.js index 95187b41df04d74ae1a129d56766fab3ec768aa2..bb68f93a37f922b0ac10841e4b36c64f450a8ec9 100644 --- a/services/vaadin-directory/vaadin-directory-version.service.js +++ b/services/vaadin-directory/vaadin-directory-version.service.js @@ -22,7 +22,7 @@ module.exports = class VaadinDirectoryVersion extends BaseVaadinDirectoryService pattern: 'v/:packageName', namedParams: { packageName: 'vaadinvaadin-grid' }, staticPreview: renderVersionBadge({ version: 'v5.3.0-alpha4' }), - keywords: ['vaadin-directory', 'version', 'latest version'], + keywords: ['vaadin-directory', 'latest'], }, ] } diff --git a/services/w3c/w3c-validation-helper.js b/services/w3c/w3c-validation-helper.js new file mode 100644 index 0000000000000000000000000000000000000000..3f0a75f4016db4f23f8aefa335cb01b790d33ed0 --- /dev/null +++ b/services/w3c/w3c-validation-helper.js @@ -0,0 +1,156 @@ +'use strict' + +const html5Expression = + '^HTML\\s?,\\s?SVG\\s?1\\.1\\s?,\\s?MathML\\s?3\\.0(\\s?,\\s?((ITS\\s?2\\.0)|(RDFa\\s?Lite\\s?1\\.1)))?$' +const html4Expression = + '^HTML\\s?4\\.01\\s?(Strict|Transitional|Frameset)\\s?,\\s?URL\\s?\\/\\s?XHTML\\s?1\\.0\\s?(Strict|Transitional|Frameset)\\s?,\\s?URL$' +const xhtmlExpression = + '^(XHTML\\s?,\\s?SVG\\s?1\\.1\\s?,\\s?MathML\\s?3\\.0(\\s?,\\s?RDFa\\s?Lite\\s?1\\.1)?)|(XHTML\\s?1\\.0\\s?Strict\\s?,\\s?URL\\s?,\\s?Ruby\\s?,\\s?SVG\\s?1\\.1\\s?,\\s?MathML\\s?3\\.0)$' +const svgExpression = + '^SVG\\s?1\\.1\\s?,\\s?URL\\s?,\\s?XHTML\\s?,\\s?MathML\\s?3\\.0$' +const presetRegex = new RegExp( + `(${html5Expression})|(${html4Expression})|(${xhtmlExpression})|(${svgExpression})`, + 'i' +) + +const getMessage = messageTypes => { + const messageTypeKeys = Object.keys(messageTypes) + messageTypeKeys.sort() // Sort to make the order error, warning for display + + if (messageTypeKeys.length === 0) { + return 'validated' + } + + const messages = messageTypeKeys.map( + key => `${messageTypes[key]} ${key}${messageTypes[key] > 1 ? 's' : ''}` + ) + return messages.join(', ') +} + +const getColor = messageTypes => { + if ('error' in messageTypes) { + return 'red' + } + + if ('warning' in messageTypes) { + return 'yellow' + } + + return 'brightgreen' +} + +const getSchema = preset => { + if (!preset) return undefined + const decodedPreset = decodeURI(preset) + const schema = [] + if (new RegExp(html4Expression, 'i').test(decodedPreset)) { + if (/Strict/i.test(decodedPreset)) { + schema.push('http://s.validator.nu/xhtml10/xhtml-strict.rnc') + } else if (/Transitional/i.test(decodedPreset)) { + schema.push('http://s.validator.nu/xhtml10/xhtml-transitional.rnc') + } else { + schema.push('http://s.validator.nu/xhtml10/xhtml-frameset.rnc') + } + schema.push('http://c.validator.nu/all-html4/') + } else if (/1\.0 Strict, URL, Ruby, SVG 1\.1/i.test(decodedPreset)) { + schema.push('http://s.validator.nu/xhtml1-ruby-rdf-svg-mathml.rnc') + schema.push('http://c.validator.nu/all-html4/') + } else { + if (new RegExp(html5Expression, 'i').test(decodedPreset)) { + if (/ITS 2\.0/i.test(decodedPreset)) { + schema.push('http://s.validator.nu/html5-its.rnc') + } else if (/RDFa Lite 1\.1/i.test(decodedPreset)) { + schema.push('http://s.validator.nu/html5-rdfalite.rnc') + } else { + schema.push('http://s.validator.nu/html5.rnc') + } + } else if (new RegExp(xhtmlExpression, 'i').test(decodedPreset)) { + if (/RDFa Lite 1\.1/i.test(decodedPreset)) { + schema.push('http://s.validator.nu/xhtml5-rdfalite.rnc') + } else { + schema.push('http://s.validator.nu/xhtml5.rnc') + } + } else if (new RegExp(svgExpression, 'i').test(decodedPreset)) { + schema.push('http://s.validator.nu/svg-xhtml5-rdf-mathml.rnc') + } + schema.push('http://s.validator.nu/html5/assertions.sch') + schema.push('http://c.validator.nu/all/') + } + return schema.map(url => encodeURI(url)).join(' ') +} + +const documentation = ` + <style> + .box { + display: flex; + justify-content: space-between; + } + .note { + font-size: smaller; + text-align: left; + } + </style> + <p> + The W3C validation badge performs validation of the HTML, SVG, MathML, ITS, RDFa Lite, XHTML documents. + The badge uses the type property of each message found in the messages from the validation results to determine to be an error or warning. + The rules are as follows: + <ul class="note"> + <li>info: These messages are counted as warnings</li> + <li>error: These messages are counted as errors</li> + <li>non-document-error: These messages are counted as errors</li> + </ul> + </p> + <p> + This badge relies on the https://validator.nu/ service to perform the validation. Please refer to https://about.validator.nu/ for the full documentation and Terms of service. + The following are required from the consumer for the badge to function. + + <ul class="note"> + <li> + Path: + <ul> + <li> + parser: The parser that is used for validation. This is a passthru value to the service + <ul> + <li>default <i>(This will not pass a parser to the API and make the API choose the parser based on the validated content)</i></li> + <li>html <i>(HTML)</i></li> + <li>xml <i>(XML; don’t load external entities)</i></li> + <li>xmldtd <i>(XML; load external entities)</i></li> + </ul> + </li> + </ul> + </li> + <li> + Query string: + <ul> + <li> + targetUrl (Required): This is the path for the document to be validated + </li> + <li> + preset (Optional can be left as blank): This is used to determine the schema for the document to be valdiated against. + The following are the allowed values + <ul> + <li>HTML, SVG 1.1, MathML 3.0</li> + <li>HTML, SVG 1.1, MathML 3.0, ITS 2.0</li> + <li>HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1</li> + <li>HTML 4.01 Strict, URL / XHTML 1.0 Strict, URL</li> + <li>HTML 4.01 Transitional, URL / XHTML 1.0 Transitional, URL</li> + <li>HTML 4.01 Frameset, URL / XHTML 1.0 Frameset, URL</li> + <li>XHTML, SVG 1.1, MathML 3.0</li> + <li>XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1</li> + <li>XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0</li> + <li>SVG 1.1, URL, XHTML, MathML 3.0</li> + </ul> + </li> + </ul> + </li> + </ul> + </p> +` + +module.exports = { + documentation, + presetRegex, + getColor, + getMessage, + getSchema, +} diff --git a/services/w3c/w3c-validation-helper.spec.js b/services/w3c/w3c-validation-helper.spec.js new file mode 100644 index 0000000000000000000000000000000000000000..b5c98ed85283ff9afce8c9da7f0bbacc74c7ab61 --- /dev/null +++ b/services/w3c/w3c-validation-helper.spec.js @@ -0,0 +1,265 @@ +'use strict' +const { expect } = require('chai') +const { test, given, forCases } = require('sazerac') +const { + presetRegex, + getMessage, + getColor, + getSchema, +} = require('./w3c-validation-helper') + +describe('w3c-validation-helper', function() { + describe('presetRegex', function() { + function testing(preset) { + return presetRegex.test(preset) + } + + test(testing, () => { + forCases([ + given('html,svg 1.1,mathml 3.0'), + given('HTML,SVG 1.1,MathML 3.0'), + given('HTML, SVG 1.1, MathML 3.0'), + given('HTML , SVG 1.1 , MathML 3.0'), + given('HTML,SVG 1.1,MathML 3.0,ITS 2.0'), + given('HTML, SVG 1.1, MathML 3.0, ITS 2.0'), + given('HTML , SVG 1.1 , MathML 3.0 , ITS 2.0'), + given('HTML,SVG 1.1,MathML 3.0,RDFa Lite 1.1'), + given('HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1'), + given('HTML , SVG 1.1 , MathML 3.0 , RDFa Lite 1.1'), + given('HTML 4.01 Strict,URL/XHTML 1.0 Strict,URL'), + given('HTML 4.01 Strict, URL/ XHTML 1.0 Strict, URL'), + given('HTML 4.01 Strict , URL / XHTML 1.0 Strict , URL'), + given('HTML 4.01 Transitional,URL/XHTML 1.0 Transitional,URL'), + given('HTML 4.01 Transitional, URL/ XHTML 1.0 Transitional, URL'), + given('HTML 4.01 Transitional , URL / XHTML 1.0 Transitional , URL'), + given('HTML 4.01 Frameset,URL/XHTML 1.0 Frameset,URL'), + given('HTML 4.01 Frameset, URL/ XHTML 1.0 Frameset, URL'), + given('HTML 4.01 Frameset , URL / XHTML 1.0 Frameset , URL'), + given('XHTML,SVG 1.1,MathML 3.0'), + given('XHTML, SVG 1.1, MathML 3.0'), + given('XHTML , SVG 1.1 , MathML 3.0'), + given('XHTML,SVG 1.1,MathML 3.0,RDFa Lite 1.1'), + given('XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1'), + given('XHTML , SVG 1.1 , MathML 3.0 , RDFa Lite 1.1'), + given('XHTML 1.0 Strict,URL,Ruby,SVG 1.1,MathML 3.0'), + given('XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0'), + given('XHTML 1.0 Strict , URL , Ruby , SVG 1.1 , MathML 3.0'), + given('SVG 1.1,URL,XHTML,MathML 3.0'), + given('SVG 1.1, URL, XHTML, MathML 3.0'), + given('SVG 1.1 , URL , XHTML , MathML 3.0'), + ]).expect(true) + }) + + test(testing, () => { + forCases([ + given(undefined), + given(null), + given(''), + given(' '), + given('HTML'), + ]).expect(false) + }) + }) + + describe('getColor', function() { + it('returns "brightgreen" if no messages are provided', function() { + const messageTypes = {} + + const actualResult = getColor(messageTypes) + + expect(actualResult).to.equal('brightgreen') + }) + + it('returns "yellow" if only warning messages are provided', function() { + const messageTypes = { warning: 1 } + + const actualResult = getColor(messageTypes) + + expect(actualResult).to.equal('yellow') + }) + + it('returns "red" if only error messages are provided', function() { + const messageTypes = { error: 1 } + + const actualResult = getColor(messageTypes) + + expect(actualResult).to.equal('red') + }) + + it('returns "red" if both warning and error messages are provided', function() { + const messageTypes = { warning: 3, error: 4 } + + const actualResult = getColor(messageTypes) + + expect(actualResult).to.equal('red') + }) + }) + + describe('getMessage', function() { + it('returns "validate" if no messages are provided', function() { + const messageTypes = {} + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('validated') + }) + + it('returns "1 error" if 1 error message is provided', function() { + const messageTypes = { error: 1 } + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('1 error') + }) + + it('returns "2 errors" if 2 error messages are provided', function() { + const messageTypes = { error: 2 } + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('2 errors') + }) + + it('returns "1 warning" if 1 warning message is provided', function() { + const messageTypes = { warning: 1 } + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('1 warning') + }) + + it('returns "2 warnings" if 2 warning messages are provided', function() { + const messageTypes = { warning: 2 } + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('2 warnings') + }) + + it('returns "1 error, 1 warning" if 1 error and 1 warning message is provided', function() { + const messageTypes = { warning: 1, error: 1 } + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('1 error, 1 warning') + }) + + it('returns "2 errors, 2 warnings" if 2 error and 2 warning message is provided', function() { + const messageTypes = { error: 2, warning: 2 } + + const actualResult = getMessage(messageTypes) + + expect(actualResult).to.equal('2 errors, 2 warnings') + }) + }) + + describe('getSchema', function() { + function execution(preset) { + return getSchema(preset) + } + + test(execution, () => { + forCases([given(undefined), given(null), given('')]).expect(undefined) + }) + + it('returns 3 schemas associated to the "HTML,SVG 1.1,MathML 3.0" preset', function() { + const preset = 'HTML,SVG 1.1,MathML 3.0' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/html5.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/' + ) + }) + + it('returns 3 schemas associated to the "HTML,SVG 1.1,MathML 3.0,ITS 2.0" preset', function() { + const preset = 'HTML,SVG 1.1,MathML 3.0,ITS 2.0' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/html5-its.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/' + ) + }) + + it('returns 3 schemas associated to the "HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1" preset', function() { + const preset = 'HTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/html5-rdfalite.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/' + ) + }) + + it('returns 3 schemas associated to the "HTML 4.01 Strict, URL/ XHTML 1.0 Strict, URL" preset', function() { + const preset = 'HTML 4.01 Strict, URL/ XHTML 1.0 Strict, URL' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/xhtml10/xhtml-strict.rnc http://c.validator.nu/all-html4/' + ) + }) + + it('returns 3 schemas associated to the "HTML 4.01 Transitional, URL/ XHTML 1.0 Transitional, URL" preset', function() { + const preset = 'HTML 4.01 Transitional, URL/ XHTML 1.0 Transitional, URL' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/xhtml10/xhtml-transitional.rnc http://c.validator.nu/all-html4/' + ) + }) + + it('returns 3 schemas associated to the "HTML 4.01 Frameset, URL/ XHTML 1.0 Frameset, URL" preset', function() { + const preset = 'HTML 4.01 Frameset, URL/ XHTML 1.0 Frameset, URL' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/xhtml10/xhtml-frameset.rnc http://c.validator.nu/all-html4/' + ) + }) + + it('returns 3 schemas associated to the "XHTML, SVG 1.1, MathML 3.0" preset', function() { + const preset = 'XHTML, SVG 1.1, MathML 3.0' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/xhtml5.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/' + ) + }) + + it('returns 3 schemas associated to the "XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1" preset', function() { + const preset = 'XHTML, SVG 1.1, MathML 3.0, RDFa Lite 1.1' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/xhtml5-rdfalite.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/' + ) + }) + + it('returns 3 schemas associated to the "XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0" preset', function() { + const preset = 'XHTML 1.0 Strict, URL, Ruby, SVG 1.1, MathML 3.0' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/xhtml1-ruby-rdf-svg-mathml.rnc http://c.validator.nu/all-html4/' + ) + }) + + it('returns 3 schemas associated to the "SVG 1.1, URL, XHTML, MathML 3.0" preset', function() { + const preset = 'SVG 1.1, URL, XHTML, MathML 3.0' + + const actualResult = getSchema(preset) + + expect(actualResult).to.equal( + 'http://s.validator.nu/svg-xhtml5-rdf-mathml.rnc http://s.validator.nu/html5/assertions.sch http://c.validator.nu/all/' + ) + }) + }) +}) diff --git a/services/w3c/w3c-validation.service.js b/services/w3c/w3c-validation.service.js new file mode 100644 index 0000000000000000000000000000000000000000..474f98295628e9f08972fcea6cc53d5fefa73be1 --- /dev/null +++ b/services/w3c/w3c-validation.service.js @@ -0,0 +1,136 @@ +'use strict' +const Joi = require('@hapi/joi') +const { optionalUrl } = require('../validators') +const { + documentation, + presetRegex, + getColor, + getMessage, + getSchema, +} = require('./w3c-validation-helper') +const { BaseJsonService, NotFound } = require('..') + +const schema = Joi.object({ + url: Joi.string().optional(), + messages: Joi.array() + .required() + .items( + Joi.object({ + type: Joi.string() + .allow('info', 'error', 'non-document-error') + .required(), + subType: Joi.string().optional(), + message: Joi.string().required(), + }) + ), +}).required() + +const queryParamSchema = Joi.object({ + targetUrl: optionalUrl.required(), + preset: Joi.string() + .regex(presetRegex) + .allow(''), +}).required() + +module.exports = class W3cValidation extends BaseJsonService { + static get category() { + return 'analysis' + } + + static get route() { + return { + base: 'w3c-validation', + pattern: ':parser(default|html|xml|xmldtd)', + queryParamSchema, + } + } + + static get examples() { + return [ + { + title: 'W3C Validation', + namedParams: { parser: 'html' }, + queryParams: { + targetUrl: 'https://validator.nu/', + preset: 'HTML, SVG 1.1, MathML 3.0', + }, + staticPreview: this.render({ messageTypes: {} }), + documentation, + }, + ] + } + + static get defaultBadgeData() { + return { + label: 'w3c', + } + } + + static render({ messageTypes }) { + return { + message: getMessage(messageTypes), + color: getColor(messageTypes), + } + } + + async fetch(targetUrl, preset, parser) { + return this._requestJson({ + url: 'https://validator.nu/', + schema, + options: { + qs: { + schema: getSchema(preset), + parser: parser === 'default' ? undefined : parser, + doc: encodeURI(targetUrl), + out: 'json', + }, + }, + }) + } + + transform(url, messages) { + if (messages.length === 1) { + const { subType, type, message } = messages[0] + if (type === 'non-document-error' && subType === 'io') { + let notFound = false + if ( + message === + 'HTTP resource not retrievable. The HTTP status from the remote server was: 404.' + ) { + notFound = true + } else if (message.endsWith('Name or service not known')) { + const domain = message.split(':')[0].trim() + notFound = url.indexOf(domain) !== -1 + } + + if (notFound) { + throw new NotFound({ prettyMessage: 'target url not found' }) + } + } + } + + return messages.reduce((accumulator, message) => { + let { type } = message + if (type === 'info') { + type = 'warning' + } else { + // All messages are suppose to have a type and there can only be info, error or non-document + // If a new type gets introduce this will flag them as errors + type = 'error' + } + + if (!(type in accumulator)) { + accumulator[type] = 0 + } + accumulator[type] += 1 + return accumulator + }, {}) + } + + async handle({ parser }, { targetUrl, preset }) { + const { url, messages } = await this.fetch(targetUrl, preset, parser) + return this.constructor.render({ + messageTypes: this.transform(url, messages), + }) + } +} diff --git a/services/w3c/w3c-validation.tester.js b/services/w3c/w3c-validation.tester.js new file mode 100644 index 0000000000000000000000000000000000000000..b2eff4457c3b4019c4f522e195948b535c08ab40 --- /dev/null +++ b/services/w3c/w3c-validation.tester.js @@ -0,0 +1,100 @@ +'use strict' +const Joi = require('@hapi/joi') +const t = (module.exports = require('../tester').createServiceTester()) + +const isErrorOnly = Joi.string().regex(/^[0-9]+ errors?$/) + +const isWarningOnly = Joi.string().regex(/^[0-9]+ warnings?$/) + +const isErrorAndWarning = Joi.string().regex( + /^[0-9]+ errors?, [0-9]+ warnings?$/ +) + +const isW3CMessage = Joi.alternatives().try( + 'validated', + isErrorOnly, + isWarningOnly, + isErrorAndWarning +) +const isW3CColors = Joi.alternatives().try('brightgreen', 'red', 'yellow') +t.create( + 'W3C Validation page conforms to standards with no preset and parser with brightgreen badge' +) + .get( + '/default.json?targetUrl=https://hsivonen.com/test/moz/messages-types/no-message.html' + ) + .expectBadge({ + label: 'w3c', + message: isW3CMessage, + color: isW3CColors, + }) + +t.create( + 'W3C Validation page conforms to standards with no HTML4 preset and HTML parser with brightgreen badge' +) + .get( + '/html.json?targetUrl=https://hsivonen.com/test/moz/messages-types/no-message.html&preset=HTML,%20SVG%201.1,%20MathML%203.0' + ) + .expectBadge({ + label: 'w3c', + message: isW3CMessage, + color: isW3CColors, + }) + +t.create('W3C Validation target url not found error') + .get( + '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/404.html' + ) + .expectBadge({ + label: 'w3c', + message: 'target url not found', + }) + +t.create('W3C Validation target url host not found error') + .get('/default.json?targetUrl=https://adfasdfasdfasdfadfadfadfasdfadf.com') + .expectBadge({ + label: 'w3c', + message: 'target url not found', + }) + +t.create('W3C Validation page has 1 validation error with red badge') + .get( + '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/warning.html' + ) + .expectBadge({ + label: 'w3c', + message: isW3CMessage, + color: isW3CColors, + }) + +t.create( + 'W3C Validation page has 3 validation error using HTML 4.01 Frameset preset with red badge' +) + .get( + '/html.json?targetUrl=http://hsivonen.com/test/moz/messages-types/warning.html&preset=HTML 4.01 Frameset, URL / XHTML 1.0 Frameset, URL' + ) + .expectBadge({ + label: 'w3c', + message: isW3CMessage, + color: isW3CColors, + }) + +t.create('W3C Validation page has 1 validation warning with yellow badge') + .get( + '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/info.svg' + ) + .expectBadge({ + label: 'w3c', + message: isW3CMessage, + color: isW3CColors, + }) + +t.create('W3C Validation page has multiple of validation errors with red badge') + .get( + '/default.json?targetUrl=http://hsivonen.com/test/moz/messages-types/range-error.html' + ) + .expectBadge({ + label: 'w3c', + message: isW3CMessage, + color: isW3CColors, + }) diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js index 8728caa45f1fdef0f4cd32df5b378e5aa42904bc..f931cf41b09f2e7059663243dd8c99cef21a2e98 100644 --- a/services/wordpress/wordpress-downloads.service.js +++ b/services/wordpress/wordpress-downloads.service.js @@ -4,7 +4,7 @@ const Joi = require('@hapi/joi') const { metric } = require('../text-formatters') const { downloadCount } = require('../color-formatters') const BaseWordpress = require('./wordpress-base') -const { BaseJsonService, NotFound } = require('..') +const { NotFound } = require('..') const dateSchema = Joi.object() .pattern(Joi.date().iso(), Joi.number().integer()) @@ -21,6 +21,29 @@ const extensionData = { }, } +const intervalMap = { + dd: { + limit: 1, + messageSuffix: '/day', + }, + dw: { + limit: 7, + messageSuffix: '/week', + }, + dm: { + limit: 30, + messageSuffix: '/month', + }, + dy: { + limit: 365, + messageSuffix: '/year', + }, + dt: { + limit: null, + messageSuffix: '', + }, +} + function DownloadsForExtensionType(extensionType) { const { capt, exampleSlug } = extensionData[extensionType] @@ -35,8 +58,8 @@ function DownloadsForExtensionType(extensionType) { static get route() { return { - base: `wordpress/${extensionType}/dt`, - pattern: ':slug', + base: `wordpress/${extensionType}`, + pattern: ':interval(dd|dw|dm|dy|dt)/:slug', } } @@ -44,8 +67,8 @@ function DownloadsForExtensionType(extensionType) { return [ { title: `WordPress ${capt} Downloads`, - namedParams: { slug: exampleSlug }, - staticPreview: this.render({ downloads: 200000 }), + namedParams: { interval: 'dm', slug: exampleSlug }, + staticPreview: this.render({ interval: 'dm', downloads: 200000 }), }, ] } @@ -54,19 +77,50 @@ function DownloadsForExtensionType(extensionType) { return { label: 'downloads' } } - static render({ downloads }) { + static render({ interval, downloads }) { + const { messageSuffix } = intervalMap[interval] + return { - message: metric(downloads), + message: `${metric(downloads)}${messageSuffix}`, color: downloadCount(downloads), } } - async handle({ slug }) { - const { downloaded: downloads } = await this.fetch({ - extensionType, - slug, - }) - return this.constructor.render({ downloads }) + async handle({ interval, slug }) { + const { limit } = intervalMap[interval] + let downloads + if (limit === null) { + const { downloaded: _downloads } = await this.fetch({ + extensionType, + slug, + }) + downloads = _downloads + } else { + const ext_type = extensionType === 'plugin' ? 'plugin' : 'themes' + const json = await this._requestJson({ + schema: dateSchema, + url: `https://api.wordpress.org/stats/${ext_type}/1.0/downloads.php`, + options: { + qs: { + slug, + limit, + }, + }, + }) + const size = Object.keys(json).length + downloads = Object.values(json).reduce( + (a, b) => parseInt(a) + parseInt(b) + ) + // This check is for non-existent and brand-new plugins both having new stats. + // Non-Existent plugins results are the same as a brandspanking new plugin with no downloads. + if (downloads <= 0 && size <= 1) { + throw new NotFound({ + prettyMessage: `${extensionType} not found or too new`, + }) + } + } + + return this.constructor.render({ interval, downloads }) } } } @@ -121,100 +175,7 @@ function InstallsForExtensionType(extensionType) { } } -function DownloadsForInterval(interval) { - const { base, messageSuffix = '', query, name } = { - day: { - base: 'wordpress/plugin/dd', - messageSuffix: '/day', - query: 1, - name: 'WordpressDownloadsDay', - }, - week: { - base: 'wordpress/plugin/dw', - messageSuffix: '/week', - query: 7, - name: 'WordpressDownloadsWeek', - }, - month: { - base: 'wordpress/plugin/dm', - messageSuffix: '/month', - query: 30, - name: 'WordpressDownloadsMonth', - }, - year: { - base: 'wordpress/plugin/dy', - messageSuffix: '/year', - query: 365, - name: 'WordpressDownloadsYear', - }, - }[interval] - - return class WordpressDownloads extends BaseJsonService { - static get name() { - return name - } - - static get category() { - return 'downloads' - } - - static get route() { - return { - base, - pattern: ':slug', - } - } - - static get examples() { - return [ - { - title: 'WordPress Plugin Downloads', - namedParams: { slug: 'bbpress' }, - staticPreview: this.render({ downloads: 30000 }), - }, - ] - } - - static get defaultBadgeData() { - return { label: 'downloads' } - } - - static render({ downloads }) { - return { - message: `${metric(downloads)}${messageSuffix}`, - color: downloadCount(downloads), - } - } - - async handle({ slug }) { - const json = await this._requestJson({ - schema: dateSchema, - url: `https://api.wordpress.org/stats/plugin/1.0/downloads.php`, - options: { - qs: { - slug, - limit: query, - }, - }, - }) - const size = Object.keys(json).length - const downloads = Object.values(json).reduce( - (a, b) => parseInt(a) + parseInt(b) - ) - // This check is for non-existent and brand-new plugins both having new stats. - // Non-Existent plugins results are the same as a brandspanking new plugin with no downloads. - if (downloads <= 0 && size <= 1) { - throw new NotFound({ prettyMessage: 'plugin not found or too new' }) - } - return this.constructor.render({ downloads }) - } - } -} - -const intervalServices = ['day', 'week', 'month', 'year'].map( - DownloadsForInterval -) const downloadServices = ['plugin', 'theme'].map(DownloadsForExtensionType) const installServices = ['plugin', 'theme'].map(InstallsForExtensionType) -const modules = [...intervalServices, ...downloadServices, ...installServices] +const modules = [...downloadServices, ...installServices] module.exports = modules diff --git a/services/wordpress/wordpress-downloads.tester.js b/services/wordpress/wordpress-downloads.tester.js index 1bdc79b20bb2b0a4048b80f80469f2e1e6377283..a455dbc8aea751c6f31a3242688f1929eabd9192 100644 --- a/services/wordpress/wordpress-downloads.tester.js +++ b/services/wordpress/wordpress-downloads.tester.js @@ -15,6 +15,7 @@ t.create('Plugin Downloads - Total') label: 'downloads', message: isMetric, }) + t.create('Plugin Downloads - Active') .get('/plugin/installs/akismet.json') .expectBadge({ @@ -43,12 +44,20 @@ t.create('Plugin Downloads - Month') message: isMetricOverTimePeriod, }) +t.create('Plugin Downloads - Year') + .get('/plugin/dy/akismet.json') + .expectBadge({ + label: 'downloads', + message: isMetricOverTimePeriod, + }) + t.create('Theme Downloads - Total') .get('/theme/dt/twentyseventeen.json') .expectBadge({ label: 'downloads', message: isMetric, }) + t.create('Theme Downloads - Active') .get('/theme/installs/twentyseventeen.json') .expectBadge({ @@ -56,12 +65,41 @@ t.create('Theme Downloads - Active') message: isMetric, }) +t.create('Theme Downloads - Day') + .get('/theme/dd/twentyseventeen.json') + .expectBadge({ + label: 'downloads', + message: isMetricOverTimePeriod, + }) + +t.create('Theme Downloads - Week') + .get('/theme/dw/twentyseventeen.json') + .expectBadge({ + label: 'downloads', + message: isMetricOverTimePeriod, + }) + +t.create('Theme Downloads - Month') + .get('/theme/dm/twentyseventeen.json') + .expectBadge({ + label: 'downloads', + message: isMetricOverTimePeriod, + }) + +t.create('Theme Downloads - Year') + .get('/theme/dy/twentyseventeen.json') + .expectBadge({ + label: 'downloads', + message: isMetricOverTimePeriod, + }) + t.create('Plugin Downloads - Total | Not Found') .get('/plugin/dt/100.json') .expectBadge({ label: 'downloads', message: 'not found', }) + t.create('Plugin Downloads - Active | Not Found') .get('/plugin/installs/100.json') .expectBadge({ @@ -90,15 +128,51 @@ t.create('Plugin Downloads - Month | Not Found') message: 'plugin not found or too new', }) +t.create('Plugin Downloads - Year | Not Found') + .get('/plugin/dy/100.json') + .expectBadge({ + label: 'downloads', + message: 'plugin not found or too new', + }) + t.create('Theme Downloads - Total | Not Found') .get('/theme/dt/100.json') .expectBadge({ label: 'downloads', message: 'not found', }) + t.create('Theme Downloads - Active | Not Found') .get('/theme/installs/100.json') .expectBadge({ label: 'active installs', message: 'not found', }) + +t.create('Theme Downloads - Day | Not Found') + .get('/theme/dd/100.json') + .expectBadge({ + label: 'downloads', + message: 'theme not found or too new', + }) + +t.create('Theme Downloads - Week | Not Found') + .get('/theme/dw/100.json') + .expectBadge({ + label: 'downloads', + message: 'theme not found or too new', + }) + +t.create('Theme Downloads - Month | Not Found') + .get('/theme/dm/100.json') + .expectBadge({ + label: 'downloads', + message: 'theme not found or too new', + }) + +t.create('Theme Downloads - Year | Not Found') + .get('/theme/dy/100.json') + .expectBadge({ + label: 'downloads', + message: 'theme not found or too new', + })