diff --git a/README.md b/README.md index 124612b35438ad6c63fe9ba13df922244afcc819..7388bf49df8676f014b9d8a99edd95745faada02 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,6 @@ When adding or changing a service [please add tests][service-tests]. This project has quite a backlog of suggestions! If you're new to the project, maybe you'd like to open a pull request to address one of them: -[](https://github.com/badges/shields/issues?q=is%3Aopen+is%3Aissue+label%3Ahacktoberfest) [](https://github.com/badges/shields/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) You can read a [tutorial on how to add a badge][tutorial]. 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 c1619983bf6d8a7fd85fd533271a2bf1f22b176c..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') + } + }) }) }) diff --git a/core/server/server.js b/core/server/server.js index d957f97e0455c9302959141b9b3c5b82c1a07733..aefe9f9ce1195e41c07a94e0d0a336965daa6a37 100644 --- a/core/server/server.js +++ b/core/server/server.js @@ -323,12 +323,6 @@ class Server { const { apiProvider: githubApiProvider } = this.githubConstellation suggest.setRoutes(allowedOrigin, githubApiProvider, camp) - // https://github.com/badges/shields/issues/3273 - camp.handle((req, res, next) => { - res.setHeader('Access-Control-Allow-Origin', '*') - next() - }) - this.registerErrorHandlers() this.registerRedirects() this.registerServices() diff --git a/core/server/server.spec.js b/core/server/server.spec.js index 929f3bc6f7114922e165233f2f67da47a227a0ac..53acc855bc9e6c49363e67f9352aa92be0a54051 100644 --- a/core/server/server.spec.js +++ b/core/server/server.spec.js @@ -151,10 +151,4 @@ describe('The server', function() { .and.to.include('410') .and.to.include('jpg no longer available') }) - - it('should return cors header for the request', async function() { - const { statusCode, headers } = await got(`${baseUrl}npm/v/express.svg`) - expect(statusCode).to.equal(200) - expect(headers['access-control-allow-origin']).to.equal('*') - }) }) diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md index ac5679237864157673946bd6b576ec00a816d338..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:  @@ -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/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/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/package-lock.json b/package-lock.json index af9bee02160ac48d41c4c2bc1a771437a74d07db..41e1592ba8a82eed1288366bd4d0a353c2888551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", - "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", + "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.4", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.4", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.3", - "@babel/types": "^7.6.3", - "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.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "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.3", + "@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.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "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.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "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.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", + "@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.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "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", @@ -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,16 +783,139 @@ } }, "@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==", + "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-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-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/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-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.7.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.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": { @@ -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.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "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.3", + "@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.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "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.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "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.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", + "@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.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "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": { @@ -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": { @@ -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" + }, + "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.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", - "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", + "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": { - "regexpu-core": "^4.6.0" + "@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" @@ -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.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", - "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", + "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.3", - "@babel/plugin-transform-classes": "^7.5.5", + "@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.3", + "@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.3", + "@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,20 +2152,217 @@ "semver": "^5.5.0" }, "dependencies": { - "@babel/plugin-transform-block-scoping": { - "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==", + "@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-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.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/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.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "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", @@ -1531,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", @@ -1574,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": { @@ -2048,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" }, @@ -2075,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", @@ -2107,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", @@ -2136,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", @@ -2200,46 +3127,46 @@ } }, "@sentry/core": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.7.0.tgz", - "integrity": "sha512-gQel0d7LBSWJGHc7gfZllYAu+RRGD9GcYGmkRfemurmDyDGQDf/sfjiBi8f9QxUc2iFTHnvIR5nMTyf0U3yl3Q==", - "requires": { - "@sentry/hub": "5.7.0", - "@sentry/minimal": "5.7.0", - "@sentry/types": "5.7.0", - "@sentry/utils": "5.7.0", + "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.7.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.7.0.tgz", - "integrity": "sha512-qNdYheJ6j4P9Sk0eqIINpJohImmu/+trCwFb4F8BGLQth5iGMVQD6D0YUrgjf4ZaQwfhw9tv4W6VEfF5tyASoA==", + "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.7.0", - "@sentry/utils": "5.7.0", + "@sentry/types": "5.7.1", + "@sentry/utils": "5.7.1", "tslib": "^1.9.3" } }, "@sentry/minimal": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.7.0.tgz", - "integrity": "sha512-0sizE2prS9nmfLyVUKmVzFFFqRNr9iorSCCejwnlRe3crqKqjf84tuRSzm6NkZjIyYj9djuuo9l9XN12NLQ/4A==", + "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.7.0", - "@sentry/types": "5.7.0", + "@sentry/hub": "5.7.1", + "@sentry/types": "5.7.1", "tslib": "^1.9.3" } }, "@sentry/node": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.7.0.tgz", - "integrity": "sha512-iqQbGAJDBlpQkp1rl9RkDCIfnukr4cOtHPgJPmLY19m/KXIHD2cdKhvbqoCvIPBTIAeSGQIvDT9jD5zT46eoqQ==", - "requires": { - "@sentry/core": "5.7.0", - "@sentry/hub": "5.7.0", - "@sentry/types": "5.7.0", - "@sentry/utils": "5.7.0", + "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", @@ -2271,16 +3198,16 @@ } }, "@sentry/types": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.7.0.tgz", - "integrity": "sha512-bFRVortg713dE2yJXNFgNe6sNBVVSkpoELLkGPatdVQi0dYc6OggIIX4UZZvkynFx72GwYqO1NOrtUcJY2gmMg==" + "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.7.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.7.0.tgz", - "integrity": "sha512-XmwQpLqea9mj8x1N7P/l4JvnEb0Rn5Py5OtBgl0ctk090W+GB1uM8rl9mkMf6698o1s1Z8T/tI/QY0yFA5uZXg==", + "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.7.0", + "@sentry/types": "5.7.1", "tslib": "^1.9.3" } }, @@ -2344,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": { @@ -2489,9 +3416,9 @@ "dev": true }, "@types/node": { - "version": "12.7.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.11.tgz", - "integrity": "sha512-Otxmr2rrZLKRYIybtdG/sgeO+tHY20GxeDjcGmUnmmlCWyEnv2a2x1ZXBo3BTec4OiTXMQCiazB8NMBf0iRlFw==", + "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": { @@ -2527,36 +3454,36 @@ } }, "@types/react-dom": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.1.tgz", - "integrity": "sha512-1S/akvkKr63qIUWVu5IKYou2P9fHLb/P2VAwyxVV85JGaGZTcUniMiTuIqM3lXFB25ej6h+CYEQ27ERVwi6eGA==", + "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.11", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.11.tgz", - "integrity": "sha512-id9DjHp/+Cm+x3etN+EWs5OP76PPpz8jXw+iN9xcXltssF0KHNjAzlan///ASXegEewaItlw5FhFnoLxRUJQ9g==", + "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.5", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-3.0.5.tgz", - "integrity": "sha512-BodHwzj9WU1EWC1j8zx1iyAMDCrTURwdvMpOVvVFwDVU7fvs8Ks9fPTkUY3+BgYbpOJFr21bR3Jib/GonwanAQ==", + "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": "*", @@ -2573,6 +3500,12 @@ "@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", @@ -2979,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", @@ -2993,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", @@ -3005,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 } } @@ -3282,25 +4248,97 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "array.prototype.find": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "array.prototype.find": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", + "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.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" + } + }, + "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" + } + }, + "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 + } + } + }, + "array.prototype.flat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", + "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.10.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.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", @@ -3358,29 +4396,42 @@ } } }, - "array.prototype.flat": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "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.2", - "es-abstract": "^1.10.0", + "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.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "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-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": { @@ -3570,37 +4621,52 @@ } }, "autoprefixer": { - "version": "9.6.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.4.tgz", - "integrity": "sha512-Koz2cJU9dKOxG8P1f8uVaBntOv9lP4yz9ffWvWaicv9gHBPhpQB22nGijwd8gqW9CNT+UdkbQOQNLVI8jN1ZfQ==", + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", "dev": true, "requires": { - "browserslist": "^4.7.0", - "caniuse-lite": "^1.0.30000998", + "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.18", + "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.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.30000999", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000999.tgz", - "integrity": "sha512-1CUyKyecPeksKwXZvYw0tEoaMCo/RwBlXmEtN5vVnabvO0KPd9RQLcaAuR9/1F+KDMv6esmOFWlsXuzDk+8rxg==", + "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-value-parser": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", @@ -4003,9 +5069,9 @@ } }, "babel-plugin-remove-graphql-queries": { - "version": "2.7.11", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.11.tgz", - "integrity": "sha512-w3PNFlgtn2HIiEb4/67Q1WkRUCPm9o0czT6Ow98E92PtOfeervUgF8z+As66iWXj8snhQCA5nckGzcJ1NEOCsw==", + "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": { @@ -4080,9 +5146,9 @@ } }, "babel-preset-gatsby": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.18.tgz", - "integrity": "sha512-shJDlx0Fgof1mb8jHM1EOgAcf/k7utMBiQYp+6me8L5J6DNLjJqfNUoHroqwSZjGLvr7cF0siKF9pxVrQ5J2uA==", + "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", @@ -4279,9 +5345,9 @@ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", + "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": { @@ -4522,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" @@ -4648,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": { @@ -4711,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", @@ -5107,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" } } } @@ -5307,19 +6396,19 @@ } }, "chokidar": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.2.1.tgz", - "integrity": "sha512-/j5PPkb5Feyps9e+jo07jUZGvkB5Aj953NrI4s8xSVScrAo/RHeILrtdb4uzR7N6aaFFxxJ+gt8mA8HfNpw76w==", + "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.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.0", + "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.1.3" + "readdirp": "~3.2.0" }, "dependencies": { "anymatch": { @@ -5357,9 +6446,9 @@ } }, "fsevents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.0.tgz", - "integrity": "sha512-+iXhW3LuDQsno8dOIrCIT/CBjeBWuP7PXe8w9shnj9Lebny/Gx1ZjVBYwexLz36Ri2jKuXMNpV6CYNh8lHHgrQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.1.tgz", + "integrity": "sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw==", "dev": true, "optional": true }, @@ -5403,9 +6492,9 @@ "dev": true }, "readdirp": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.3.tgz", - "integrity": "sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q==", + "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" @@ -5870,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": { @@ -5997,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", @@ -6027,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": { @@ -6169,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", @@ -6226,9 +7306,9 @@ } }, "config": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/config/-/config-3.2.3.tgz", - "integrity": "sha512-pditxQzO+SkKX/2gs99YnUGEjmBVkTj2o/hGOgC0oYEU7QgLnVVDYmcSL6HiGels/8QtFJpFzi5iKYv4D0dalg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/config/-/config-3.2.4.tgz", + "integrity": "sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw==", "requires": { "json5": "^1.0.1" } @@ -6260,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", @@ -6390,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 } } }, @@ -6984,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", @@ -7017,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" }, @@ -7298,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", @@ -7351,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" @@ -7399,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", @@ -7746,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": { @@ -7957,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", @@ -8176,9 +9238,9 @@ "dev": true }, "ws": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", - "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "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" @@ -8448,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" }, @@ -8473,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": { @@ -8540,38 +9607,151 @@ } }, "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.15.0", + "function.prototype.name": "^1.1.1", + "object.assign": "^4.1.0", + "object.fromentries": "^2.0.1", + "prop-types": "^15.7.2", + "semver": "^5.7.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" + } + }, + "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": { - "airbnb-prop-types": "^2.13.2", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.2", - "semver": "^5.6.0" + "has": "^1.0.3", + "object-is": "^1.0.1" }, "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 + "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" + } } } }, @@ -8837,21 +10017,21 @@ } }, "eslint-config-prettier": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.4.0.tgz", - "integrity": "sha512-YrKucoFdc7SEko5Sxe4r6ixqXPDP1tunGw91POeZTTRKItf/AMFYt/YLEQtZMkR2LVpAVhcAcZgcWpm1oGPW7w==", + "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": { @@ -8928,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": { @@ -9100,14 +10280,14 @@ } }, "eslint-plugin-jsdoc": { - "version": "15.9.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-15.9.9.tgz", - "integrity": "sha512-gN1Dp9xaZSNAyxyahUpsnK8hubE5rYSxPSSN3wG8ZuzfMnIhp5Qm54GTdhXrK2/SjS4rNJ+C6EZFmOPSfyRcTA==", + "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.1.0", + "jsdoctypeparser": "^5.1.1", "lodash": "^4.17.15", "object.entries-ponyfill": "^1.0.1", "regextras": "^0.6.1" @@ -9159,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" @@ -9340,9 +10520,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.1.2.tgz", - "integrity": "sha512-ZR+AyesAUGxJAyTFlF3MbzeVHAcQTFQt1fFVe5o0dzY/HFoj1dgQDMoIkiM+ltN/HhlHBYX4JpJwYonjxsyQMA==", + "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": { @@ -9358,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", @@ -10003,9 +11183,9 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-xml-parser": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.13.0.tgz", - "integrity": "sha512-XYXC39VjE9dH6jpp5Gm5gsuR8Z4bMz44qMpT1PmqR+iyOJMhC0LcsN81asYkHP4OkEX8TTR8d6V/caCmy8Q8jQ==" + "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", @@ -11162,15 +12342,21 @@ "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.36", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.15.36.tgz", - "integrity": "sha512-2e2QggkfWYqUbvZ4Y40biPZeVEuboEJG/l/o1vyK49C346oAAMaWUSMu+RaRPy6ocd7wnbyOH/EKoIIYAWoOhQ==", + "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.3", - "@babel/parser": "^7.6.3", + "@babel/core": "^7.6.4", + "@babel/parser": "^7.6.4", "@babel/polyfill": "^7.6.0", "@babel/runtime": "^7.6.3", "@babel/traverse": "^7.6.3", @@ -11179,40 +12365,41 @@ "@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.4", + "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.11", - "babel-preset-gatsby": "^0.2.18", + "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.7.0", + "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.2.1", + "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.1.0", @@ -11228,17 +12415,17 @@ "flat": "^4.1.0", "fs-exists-cached": "1.0.0", "fs-extra": "^8.1.0", - "gatsby-cli": "^2.7.58", - "gatsby-core-utils": "^1.0.13", - "gatsby-graphiql-explorer": "^0.2.23", - "gatsby-link": "^2.2.20", - "gatsby-plugin-page-creator": "^2.1.25", - "gatsby-react-router-scroll": "^2.1.12", - "gatsby-telemetry": "^1.1.30", - "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.8", - "graphql-compose": "^6.3.5", + "graphql-compose": "^6.3.7", "graphql-playground-middleware-express": "^1.7.12", "invariant": "^2.2.4", "is-relative": "^1.0.0", @@ -11248,13 +12435,13 @@ "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", @@ -11291,9 +12478,9 @@ "util.promisify": "^1.0.0", "uuid": "^3.3.3", "v8-compile-cache": "^1.1.2", - "webpack": "~4.41.0", + "webpack": "~4.41.2", "webpack-dev-middleware": "^3.7.2", - "webpack-dev-server": "^3.8.2", + "webpack-dev-server": "^3.9.0", "webpack-hot-middleware": "^2.25.0", "webpack-merge": "^4.2.2", "webpack-stats-plugin": "^0.3.0", @@ -11311,53 +12498,84 @@ } }, "@babel/generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "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.3", + "@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.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==", + "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.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "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.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "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.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", + "@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" @@ -11375,9 +12593,9 @@ } }, "@babel/types": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "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", @@ -11403,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", @@ -11438,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", @@ -11459,20 +12768,22 @@ } }, "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": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-random-string": { @@ -11496,36 +12807,197 @@ "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" } }, + "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.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "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": { @@ -11549,28 +13021,28 @@ } }, "gatsby-cli": { - "version": "2.7.58", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.7.58.tgz", - "integrity": "sha512-f4Nu3DwRux4jXI/ZhI5HhhXmlqgI9Sq3u6CSCySPIYSeAO6NqZy60rPUqDSiya6LWwGsWuKd05N4J6CFwUNwYQ==", + "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.3", "@hapi/joi": "^15.1.1", "better-opn": "^0.1.4", - "bluebird": "^3.7.0", + "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.1.0", "fs-exists-cached": "^1.0.0", "fs-extra": "^8.1.0", - "gatsby-telemetry": "^1.1.30", + "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", @@ -11583,9 +13055,11 @@ "pretty-error": "^2.1.1", "progress": "^2.0.3", "prompts": "^2.2.1", - "react": "^16.10.2", + "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", @@ -11618,37 +13092,6 @@ } } }, - "gatsby-page-utils": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.25.tgz", - "integrity": "sha512-SJSBNg+wHi7xSYdE8Dme6faM26S7M6cO7pCVtxPSuEZvoXy1DTHRcfOAJzCdL9N2r+yYd/bMoqMX3llJjl1OoA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3", - "bluebird": "^3.7.0", - "chokidar": "3.2.1", - "fs-exists-cached": "^1.0.0", - "glob": "^7.1.4", - "lodash": "^4.17.15", - "micromatch": "^3.1.10", - "slash": "^3.0.0" - } - }, - "gatsby-plugin-page-creator": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.25.tgz", - "integrity": "sha512-YfxA1rTjZKXry8NGqxrHXnJJj/zgRnckUeLA0sG7EWDse+n+WktKPRAaQF/A25q4uI9O9/wyYj9UM7UG0XrG3g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.6.3", - "bluebird": "^3.7.0", - "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.0.25", - "glob": "^7.1.4", - "lodash": "^4.17.15", - "micromatch": "^3.1.10" - } - }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -11658,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", @@ -11692,9 +13144,9 @@ } }, "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": { @@ -11712,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", @@ -11727,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", @@ -11828,6 +13326,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "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": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", @@ -11846,6 +13350,14 @@ "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": { @@ -11868,19 +13380,6 @@ "mem": "^4.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==", - "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" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -11925,36 +13424,6 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -11988,12 +13457,6 @@ "p-limit": "^2.0.0" } }, - "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 - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -12023,21 +13486,22 @@ "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-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", @@ -12050,6 +13514,17 @@ "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", @@ -12059,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", @@ -12068,19 +13564,10 @@ "crypto-random-string": "^2.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" - } - }, "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", @@ -12119,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": { @@ -12134,24 +13654,35 @@ } }, "gatsby-core-utils": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.0.13.tgz", - "integrity": "sha512-vRbsebZxQASxUNfWqoSP3i8r87ibgpksKCqdCkoQBXJwjVKd8VM2dfScheaHE2OuxFZa2AEA0uyCGSiaF6yzUA==", - "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.23", - "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.23.tgz", - "integrity": "sha512-aX5dIQxmGGeUfvQx+sLvogq2I7+C/s1AZmgRgkeu+1XLC47g+SsulD92hyVI91Z7xLHTE0YX2OCGZfO7w/lm2A==", + "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.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==", + "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" @@ -12166,9 +13697,9 @@ } }, "gatsby-link": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.2.20.tgz", - "integrity": "sha512-giAmg+s6s8IZ14U+fSdWFEQ85hvGxL2Ar9kl5h6+lRctu0D0h7VFGJddSdteIcLUspuZNdSk1VT9atTSO2bxQw==", + "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.3", @@ -12177,9 +13708,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "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" @@ -12194,36 +13725,30 @@ } }, "gatsby-page-utils": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.0.24.tgz", - "integrity": "sha512-dZk5JFOUL2OVMsZaAU7++39P3aCSWxWBEaUdD6dIFreiBkqojJDoAd+cmkdBf4TupgcaVY32v7oouHkBiwA8xQ==", + "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.7.0", - "chokidar": "3.2.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" } }, - "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", - "dev": true - }, "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", @@ -12233,19 +13758,19 @@ } }, "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" @@ -12266,35 +13791,29 @@ } }, "gatsby-plugin-page-creator": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.1.24.tgz", - "integrity": "sha512-Vx4kVeiracaduxd3IOX9jJasloKqh3/WRHilVqrZauEbv5TALCTG/SKV6fSZt9hdlVYWP1D/eEnZpzzUOeWOwg==", + "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.7.0", + "@babel/runtime": "^7.6.3", + "bluebird": "^3.7.1", "fs-exists-cached": "^1.0.0", - "gatsby-page-utils": "^0.0.24", - "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" } }, - "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", - "dev": true - }, "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", @@ -12304,9 +13823,9 @@ } }, "gatsby-plugin-react-helmet": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.1.11.tgz", - "integrity": "sha512-obVj6fzH0Hr6UdmQGaIYz29a1+h89pI+vKgIb2MwXCCDESCYgVYTcDmtBzYTZVLXupW6fqGlybFQwUKxEI0ZAQ==", + "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.3" @@ -12330,9 +13849,9 @@ } }, "gatsby-plugin-remove-trailing-slashes": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/gatsby-plugin-remove-trailing-slashes/-/gatsby-plugin-remove-trailing-slashes-2.1.10.tgz", - "integrity": "sha512-bIMvR8M7/1xo+/Js/b22op/cGu7GDgYz8nnfK9kXI+pt5Iu4fCY1aY4vH8wbBEW1TP71tm1/WN20QauY93pzlQ==", + "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.3" @@ -12356,18 +13875,18 @@ } }, "gatsby-plugin-styled-components": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/gatsby-plugin-styled-components/-/gatsby-plugin-styled-components-3.1.8.tgz", - "integrity": "sha512-TtCGZWO1+XeiwHuZx8hCEYZUOwdoh4wdQAH4/UYJuf0ZrpufdcOCfyZr0fHwQuvYm/G8EKD50u6WS2sm5s3/5w==", + "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.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" @@ -12382,29 +13901,29 @@ } }, "gatsby-plugin-typescript": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-2.1.11.tgz", - "integrity": "sha512-IcUblbq1TF1V5w7AbR0ygVbjotQFh+Z+B+SI5J73OtNFKgehS3cPLEE/6+PMDTmBRYdEJx+ajAMOuIIPn5Jn4w==", + "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.2", - "babel-plugin-remove-graphql-queries": "^2.7.10" + "@babel/runtime": "^7.6.3", + "babel-plugin-remove-graphql-queries": "^2.7.14" }, "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" } }, "babel-plugin-remove-graphql-queries": { - "version": "2.7.10", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.7.10.tgz", - "integrity": "sha512-J/4xsXYXlWwSuA/hktGx9xtWb+oKMhocwl3ztb17XB6S+x9XEIGKQnOj9nGh/Tr4x04unM/wa12UszzMXbwR+w==", + "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": { @@ -12416,9 +13935,9 @@ } }, "gatsby-react-router-scroll": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.1.12.tgz", - "integrity": "sha512-2uB7PrSiPUbHj9hcv3XHlNyG4s/wm+lHiqHbTHGsU0LwbeQjRQ7hW0sCHGKq2tSvrLudkiCARB2KtS+4hECX7Q==", + "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.3", @@ -12427,9 +13946,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "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" @@ -12444,19 +13963,19 @@ } }, "gatsby-telemetry": { - "version": "1.1.30", - "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.1.30.tgz", - "integrity": "sha512-q2Mzcn9wk2iRlk1iDdrCFnWOw2tfzuiCnNEM+x/gsjtU4FWwDiCdcV0QIxwcPc5wDVxBB3dKrCh1EfZ7hHX9sg==", + "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.3", - "bluebird": "^3.7.0", + "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", @@ -12478,20 +13997,14 @@ } }, "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "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" } }, - "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 - }, "configstore": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", @@ -12513,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" @@ -12533,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 } } @@ -12577,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", @@ -12757,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", @@ -13021,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", @@ -13556,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", @@ -13615,20 +15128,20 @@ "dev": true }, "husky": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.8.tgz", - "integrity": "sha512-HFOsgcyrX3qe/rBuqyTt+P4Gxn5P0seJmr215LAZ/vnwK3jWB3r0ck7swbzGRUbufCf9w/lgHPVbF/YXQALgfQ==", + "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" }, @@ -13692,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", @@ -15704,9 +17208,9 @@ } }, "lint-staged": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.4.1.tgz", - "integrity": "sha512-zFRbo1bAJEVf1m33paTTjDVfy2v3lICCqHfmQSgNoI+lWpi7HPG5y/R2Y7Whdce+FKxlZYs/U1sDSx8+nmQdDA==", + "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", @@ -15735,22 +17239,20 @@ } }, "commander": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", - "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", + "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 }, "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": { @@ -15763,12 +17265,12 @@ } }, "execa": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.5.tgz", - "integrity": "sha512-SwmwZZyJjflcqLSgllk4EQlMLst2p9muyzwNugKGFlpAz6rZ7M+s2nBR97GAq4Vzjwx2y9rcMcmqzojwN+xwNA==", + "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", @@ -15853,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": { @@ -15878,10 +17372,25 @@ "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 }, "to-regex-range": { @@ -15892,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" + } } } }, @@ -16383,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": { @@ -17044,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": { @@ -17086,9 +18604,9 @@ } }, "mocha": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.1.tgz", - "integrity": "sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A==", + "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", @@ -17756,9 +19274,9 @@ } }, "nock": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-11.4.0.tgz", - "integrity": "sha512-UrVEbEAvhyDoUttrS0fv3znhZ5nEJvlxqgmrC6Gb2Mf9cFci65RMK17e6EjDDQB57g5iwZw1TFnVvyeL0eUlhQ==", + "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", @@ -18016,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": { @@ -18044,18 +19554,18 @@ "dev": true }, "nodemon": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.3.tgz", - "integrity": "sha512-TBNKRmJykEbxpTniZBusqRrUTHIEqa2fpecbTQDQj1Gxjth7kKAPP296ztR0o5gPUWsiYbuEbt73/+XMYab1+w==", + "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" @@ -18090,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", @@ -18107,6 +19623,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "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" + } } } }, @@ -19783,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": { @@ -19820,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", @@ -19879,14 +21430,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" } } } @@ -20033,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": { @@ -20093,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" } } } @@ -20323,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" } } } @@ -20389,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" } } } @@ -20892,9 +22548,9 @@ } }, "react": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.10.2.tgz", - "integrity": "sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw==", + "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", @@ -21098,21 +22754,21 @@ } }, "react-dom": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.10.2.tgz", - "integrity": "sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw==", + "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.16.2" + "scheduler": "^0.17.0" }, "dependencies": { "scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==", + "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", @@ -21146,11 +22802,12 @@ } }, "react-hot-loader": { - "version": "4.12.15", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.15.tgz", - "integrity": "sha512-sgkN6g+tgPE6xZzD0Ysqll7KUFYJbMX0DrczT5OxD6S7hZlSnmqSC3ceudwCkiDd65ZTtm+Ayk4Y9k5xxCvpOw==", + "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", @@ -21191,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", @@ -21278,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 } } @@ -21633,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": { @@ -22079,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", @@ -22328,9 +23985,9 @@ "dev": true }, "simple-icons": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-1.18.0.tgz", - "integrity": "sha512-zarcqLq6DL96q7rSHeh/bM/xlflp1Uil7lyz7KHK4bg+92vcA+BJ1CpjA62Xe1KnfeOSEmTXHR6ftaFYiaSaNQ==" + "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", @@ -22469,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", @@ -22528,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", @@ -22543,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": { @@ -23147,12 +24804,12 @@ "integrity": "sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg==" }, "start-server-and-test": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.5.tgz", - "integrity": "sha512-3cErmnxyzLaMy460btq0ohGDJcq8G7o16Ijnmgw5Tu59aTa2pkfGR5I8M6p584kDFTxmGvV1OsmV3eWMFC6Obw==", + "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.7.0", + "bluebird": "3.7.1", "check-more-types": "2.24.0", "debug": "4.1.1", "execa": "2.1.0", @@ -23162,9 +24819,9 @@ }, "dependencies": { "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", + "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": { @@ -23754,9 +25411,9 @@ } }, "styled-components": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.0.tgz", - "integrity": "sha512-xQ6vTI/0zNjZ1BBDRxyjvBddrxhQ3DxjeCdaLM1lSn5FDnkTOQgRkmWvcUiTajqc5nJqKVl+7sUioMqktD0+Zw==", + "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", @@ -23775,9 +25432,9 @@ }, "dependencies": { "@emotion/is-prop-valid": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.3.tgz", - "integrity": "sha512-We7VBiltAJ70KQA0dWkdPMXnYoizlxOXpvtjmu5/MBnExd+u0PGgV27WCYanmLAbCwAU30Le/xA0CQs/F/Otig==", + "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.3" @@ -23830,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.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": { @@ -24091,9 +25769,9 @@ } }, "terser": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", - "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", + "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", @@ -24333,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": { @@ -24682,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": { @@ -24926,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", @@ -25220,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": { @@ -25251,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 } } @@ -25333,9 +27017,9 @@ "optional": true }, "webpack": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.1.tgz", - "integrity": "sha512-ak7u4tUu/U63sCVxA571IuPZO/Q0pZ9cEXKg+R/woxkDzVovq57uB6L2Hlg/pC8LCU+TWpvtcYwsstivQwMJmw==", + "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", @@ -25381,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", @@ -25434,9 +27128,9 @@ } }, "webpack-dev-server": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz", - "integrity": "sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ==", + "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", @@ -25457,7 +27151,7 @@ "loglevel": "^1.6.4", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.24", + "portfinder": "^1.0.25", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", @@ -25896,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", @@ -26555,9 +28249,9 @@ "dev": true }, "figures": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", - "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "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" diff --git a/package.json b/package.json index 1a11ce4f7455e949122b7f4a76c016edc1709eb0..68a87d32f5accf9e50b9215001e3fdd00d93fb7d 100644 --- a/package.json +++ b/package.json @@ -23,23 +23,23 @@ }, "dependencies": { "@hapi/joi": "^16.1.7", - "@sentry/node": "^5.7.0", + "@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.3", + "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.13.0", + "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.18.0", + "simple-icons": "1.19.1", "xmldom": "~0.1.27", "xpath": "~0.0.27" }, @@ -144,29 +144,29 @@ ] }, "devDependencies": { - "@babel/core": "^7.6.4", - "@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.3", - "@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.11", - "@types/react-helmet": "^5.0.11", - "@types/react-modal": "^3.8.3", - "@types/react-select": "^3.0.5", + "@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.18", + "babel-preset-gatsby": "^0.2.20", "caller": "^1.0.1", "chai": "^4.1.2", "chai-datetime": "^1.5.0", @@ -174,70 +174,70 @@ "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.4.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.9", - "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.16.0", - "eslint-plugin-react-hooks": "^2.1.2", + "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.36", - "gatsby-plugin-catch-links": "^2.1.12", - "gatsby-plugin-page-creator": "^2.1.24", - "gatsby-plugin-react-helmet": "^3.1.11", - "gatsby-plugin-remove-trailing-slashes": "^2.1.10", - "gatsby-plugin-styled-components": "^3.1.8", - "gatsby-plugin-typescript": "^2.1.11", + "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.8", + "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.1", + "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.1", + "mocha": "^6.2.2", "mocha-env-reporter": "^4.0.0", "mocha-junit-reporter": "^1.23.1", "mocha-yaml-loader": "^1.0.3", - "nock": "11.4.0", + "nock": "11.7.0", "node-mocks-http": "^1.8.0", - "nodemon": "^1.19.3", + "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.10.2", - "react-dom": "^16.10.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-modal": "^3.11.1", "react-pose": "^4.0.9", "react-select": "^3.0.8", "read-all-stdin-sync": "^1.0.5", @@ -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.5", - "styled-components": "^4.4.0", + "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 a36f43a8a8b22fe066003abc6e74f5b29b1bdcbc..604db37bcbe7a84e0d276a418ffdedd66f0176f0 100644 --- a/services/aur/aur.service.js +++ b/services/aur/aur.service.js @@ -63,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' }), }, ] } diff --git a/services/aur/aur.tester.js b/services/aur/aur.tester.js index 5b78f795b1daefa11eeeaa547abaf031e4f07ff7..c6b4d8d9d4e9957c3c2f4d6f1e732d58fe449ecf 100644 --- a/services/aur/aur.tester.js +++ b/services/aur/aur.tester.js @@ -49,7 +49,7 @@ 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 (no license)') 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/github/github-common-fetch.js b/services/github/github-common-fetch.js index b016a535c8ddf39a875e6b5e658624762d2eb92e..fefd786176cc96d9e0f08b44eeccb42f7a081ebe 100644 --- a/services/github/github-common-fetch.js +++ b/services/github/github-common-fetch.js @@ -45,10 +45,11 @@ async function fetchRepoContent( throw new InvalidResponse({ prettyMessage: 'undecodable content' }) } } else { - return serviceInstance._request({ + const { buffer } = await serviceInstance._request({ url: `https://raw.githubusercontent.com/${user}/${repo}/${branch}/${filename}`, errorMessages, }) + return buffer } } @@ -96,6 +97,7 @@ async function fetchLatestRelease(serviceInstance, { user, repo }) { module.exports = { fetchIssue, + fetchRepoContent, fetchJsonFromRepo, fetchLatestRelease, releaseInfoSchema, 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 index bfbc5aa0a9472f730adf0084095137d7efddb605..0192793a3904773f32dc1d2804671f2e8180aaba 100644 --- a/services/github/github-hacktoberfest.service.js +++ b/services/github/github-hacktoberfest.service.js @@ -120,7 +120,14 @@ module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Ser // 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 @@ -140,7 +147,7 @@ module.exports = class GithubHacktoberfestCombinedStatus extends GithubAuthV4Ser : '', ] .filter(Boolean) - .join(', ') || 'is done!' + .join(', ') || 'is over!' return { message } } 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 index 532ecfbe3684fc4decde562f185018bf4d279fb2..51eb74c164840d911be7d2846e9996d9ddecdcde 100644 --- a/services/github/github-hacktoberfest.tester.js +++ b/services/github/github-hacktoberfest.tester.js @@ -3,15 +3,27 @@ const Joi = require('@hapi/joi') const t = (module.exports = require('../tester').createServiceTester()) -const isHactoberfestCombinedStatus = Joi.string().regex( +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: isHactoberfestCombinedStatus, + message: isHacktoberfestStatus, }) t.create('GitHub Hacktoberfest combined status (suggestion label override)') @@ -22,5 +34,5 @@ t.create('GitHub Hacktoberfest combined status (suggestion label override)') ) .expectBadge({ label: 'hacktoberfest', - message: isHactoberfestCombinedStatus, + message: isHacktoberfestStatus, }) 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-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/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/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/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/version.js b/services/version.js index 3c6cdb6cf284ac915c8cc35eb1a2c869cfeabee1..e13623f3fb26d081ff12028005f2a3ca75834167 100644 --- a/services/version.js +++ b/services/version.js @@ -84,12 +84,12 @@ function latest(versions, { pre = false } = {}) { try { // coerce to string then lowercase otherwise alpha > RC version = versions.sort((a, b) => - semver.compareBuild( + semver.rcompare( `${a}`.toLowerCase(), `${b}`.toLowerCase(), /* loose */ true ) - )[versions.length - 1] + )[0] } catch (e) { version = latestDottedVersion(versions) } diff --git a/services/version.spec.js b/services/version.spec.js index cb93aea00b0405a9eccaf16604b36256720fdcc5..29903adbe10ed7ad0a426cf66838b3aec4678b1b 100644 --- a/services/version.spec.js +++ b/services/version.spec.js @@ -102,9 +102,6 @@ describe('Version helpers', function() { given(['1.0.0', '1.0.2', '1.1', '1.0', 'notaversion2', '12bcde4']).expect( '1.1' ) - - // build qualifiers - https://github.com/badges/shields/issues/4172 - given(['0.3.9', '0.4.0+1', '0.4.0+9']).expect('0.4.0+9') }) test(slice, () => { 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, + })