diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..1c7a003 --- /dev/null +++ b/.babelrc @@ -0,0 +1,13 @@ +{ + "plugins": [ + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-syntax-import-meta", + "@babel/plugin-syntax-numeric-separator", + ["@babel/plugin-transform-runtime", { "useESModules": true }], + ["@babel/plugin-proposal-decorators", { "decoratorsBeforeExport": false }] + ], + "presets": ["@babel/preset-env"], + "sourceType": "module" +} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..8f12175 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,5 @@ +last 1 Chrome versions +last 1 Firefox versions +last 1 Safari versions +last 1 iOS versions +last 1 Edge versions diff --git a/.eslintrc.json b/.eslintrc.json index 9400215..8c29c97 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,15 @@ { "extends": "@apollo-elements", "parser": "babel-eslint", + "plugins": [ + "no-only-tests" + ], + "rules": { + "brace-style": ["error", "1tbs", { "allowSingleLine": true }], + "operator-linebreak": ["error", "after", { "overrides": { "?": "after", ":": "before" } }], + "indent": ["error", 2, { "flatTernaryExpressions": true }], + "no-only-tests/no-only-tests": "error" + }, "globals": { "ShadyCSS": true, "Stripe": true diff --git a/.gitignore b/.gitignore index 1c32e09..c3dcb18 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,13 @@ cc-test-reporter +/StripeBase.js /StripeElements.js +/StripePaymentRequest.js /stripe-elements.js +/stripe-payment-request.js +/shared.js +/*.js.map bower_components/ node_modules/ diff --git a/README.md b/README.md index 05ec33e..d921cdb 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Custom element wrapper for Stripe.js v3 Elements. Creates a `card` element Ć  la [![Published on npm](https://img.shields.io/npm/v/@power-elements/stripe-elements.svg)](https://www.npmjs.com/package/@power-elements/stripe-elements) [![Maintainability](https://api.codeclimate.com/v1/badges/b2205a301b0a8bb82d51/maintainability)](https://codeclimate.com/github/bennypowers/stripe-elements/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/b2205a301b0a8bb82d51/test_coverage)](https://codeclimate.com/github/bennypowers/stripe-elements/test_coverage) -[![CI](https://github.com/bennypowers/stripe-elements/workflows/.github/workflows/release.yml/badge.svg)](https://github.com/bennypowers/stripe-elements/actions) +[![Release](https://github.com/bennypowers/stripe-elements/workflows/Release/badge.svg)](https://github.com/bennypowers/stripe-elements/actions?query=workflow%3ARelease) [![Contact me on Codementor](https://cdn.codementor.io/badges/contact_me_github.svg)](https://www.codementor.io/bennyp?utm_source=github&utm_medium=button&utm_term=bennyp&utm_campaign=github) ## Installation and Usage @@ -95,7 +95,7 @@ const onChange = ({ target: { isComplete, hasError } }) => { document.body.querySelector('button').disabled = !(isComplete && !hasError) } -const onClick = () => document.getElementById('stripe').submit(); +const onClick = () => document.getElementById('stripe').createSource(); const template = html` @@ -120,7 +120,7 @@ In a Polymer Template + onclick="stripe.createSource()"> Get Token @@ -163,39 +163,45 @@ There are 11 properties for each state that you can set which will be read into `` is a community project, not endorsed or affiliated with Stripe. +**Mixins:** LitNotify + ## Properties -| Property | Modifiers | Type | Default | Description | -|------------------|-----------|-------------------|-----------|-----------------------------------------| -| `action` | | `string` | | The action attr of the internal form. | -| `brand` | readonly | | | | -| `card` | readonly | | | | -| `cardData` | | `Object` | {} | Stripe cardData object to submit with | -| `elements` | readonly | | | | -| `error` | readonly | `Error` | | Stripe or validation error | -| `form` | readonly | `HTMLFormElement` | | The internal form element | -| `hasError` | readonly | `Boolean` | | Whether the element has an error | -| `hideIcon` | | `boolean` | false | | -| `hidePostalCode` | | `boolean` | false | | -| `iconStyle` | | `string` | "default" | | -| `isComplete` | readonly | `Boolean` | | Whether the card form is complete | -| `isEmpty` | readonly | `Boolean` | | Whether the card form is empty | -| `source` | readonly | `StripeSource` | | The source returned from `createSource` | -| `stripe` | readonly | `Stripe` | | The Stripe.js object | -| `stripeMount` | readonly | `Element` | | Stripe Element mount point | -| `stripeReady` | readonly | `Boolean` | | Whether Stripe.js has been initialized | -| `token` | readonly | `StripeToken` | | The token returned from `createToken` | -| `value` | | `object` | {} | | +| Property | Attribute | Modifiers | Type | Default | Description | +|------------------|--------------------|-----------|-------------------------------|------------------------|--------------------------------------------------| +| `action` | `action` | | `String` | | The URL to the form action. Example '/charges'.
If blank or undefined will not submit charges immediately. | +| `billingDetails` | | | `stripe.BillingDetails` | | | +| `brand` | `brand` | readonly | `String` | | The card brand detected by Stripe | +| `card` | `card` | readonly | `stripe.Element` | | The Stripe card object. | +| `elements` | `elements` | readonly | `stripe.elements.Elements` | | Stripe Elements instance | +| `error` | `error` | readonly | `Error` | | Stripe or validation error | +| `hasError` | `has-error` | readonly | `Boolean` | | Whether the element has an error | +| `hideIcon` | `hide-icon` | | `Boolean` | false | Whether to hide icons in the Stripe form. | +| `hidePostalCode` | `hide-postal-code` | | `Boolean` | false | Whether or not to hide the postal code field.
Useful when you gather shipping info elsewhere. | +| `iconStyle` | `icon-style` | | `'solid'\|'default'` | "default" | Stripe icon style. 'solid' or 'default'. | +| `isComplete` | `is-complete` | readonly | `Boolean` | | If the form is complete. | +| `isEmpty` | `is-empty` | readonly | `Boolean` | | If the form is empty. | +| `label` | `label` | | `String` | "Credit or Debit Card" | aria-label attribute for the credit card form. | +| `publishableKey` | `publishable-key` | | `String` | | Stripe Publishable Key. EG. `pk_test_XXXXXXXXXXXXXXXXXXXXXXXX` | +| `showError` | `show-error` | | `boolean` | false | Whether to display the error message | +| `source` | `source` | readonly | `stripe.Source` | | Stripe Source | +| `sourceData` | | | `{ owner: stripe.OwnerData }` | | Data passed to stripe.createSource. (optional) | +| `stripe` | `stripe` | readonly | `stripe.Stripe` | | Stripe instance | +| `stripeMount` | | readonly | `Element` | | Stripe Element mount point | +| `stripeReady` | `stripe-ready` | readonly | `Boolean` | | If the stripe element is ready to receive focus. | +| `token` | `token` | readonly | `stripe.Token` | | Stripe Token | +| `tokenData` | | | `stripe.TokenOptions` | | Data passed to stripe.createToken. (optional) | +| `value` | `value` | | `Object` | {} | Prefilled values for form. Example {postalCode: '90210'} | ## Methods -| Method | Type | Description | -|----------------------|---------------------------------------|--------------------------------------------------| -| `createSource` | `(sourceData?: object): Promise` | Submit credit card information to generate a source | -| `createToken` | `(cardData?: object): Promise` | Submit credit card information to generate a token | -| `isPotentiallyValid` | `(): Boolean` | Checks for potential validity. A potentially valid form is one that
is not empty, not complete and has no error. A validated form also counts
as potentially valid. | -| `reset` | `(): void` | Resets the Stripe card. | -| `validate` | `(): Boolean` | Checks if the Stripe form is valid. | +| Method | Type | Description | +|----------------------|--------------------------------------------------|--------------------------------------------------| +| `createSource` | `(sourceData?: { owner: OwnerInfo; } \| undefined): Promise` | Submit credit card information to generate a source | +| `createToken` | `(tokenData?: TokenData): Promise` | Submit credit card information to generate a token | +| `isPotentiallyValid` | `(): Boolean` | Checks for potential validity. A potentially valid form is one that is not empty, not complete and has no error. A validated form also counts as potentially valid. | +| `reset` | `(): void` | Resets the Stripe card. | +| `validate` | `(): Boolean` | Checks if the Stripe form is valid. | ## Events @@ -207,13 +213,18 @@ There are 11 properties for each state that you can set which will be read into | `has-error-changed` | The new value of has-error | | `is-complete-changed` | The new value of is-complete | | `is-empty-changed` | The new value of is-empty | +| `payment-intent-changed` | The new value of payment-intent | +| `payment-method-changed` | The new value of payment-method | | `publishable-key-changed` | The new value of publishable-key | +| `source-changed` | The new value of source | | `stripe-change` | Stripe Element change event | | `stripe-error` | The validation error, or the error returned from stripe.com | +| `stripe-payment-intent` | The PaymentIntent received from stripe.com | +| `stripe-payment-method` | The PaymentMethod received from stripe.com | | `stripe-ready` | Stripe has been initialized and mounted | | `stripe-ready-changed` | The new value of stripe-ready | -| `stripe-source` | The source received from stripe.com | -| `stripe-token` | The token received from stripe.com | +| `stripe-source` | The Source received from stripe.com | +| `stripe-token` | The Token received from stripe.com | | `token-changed` | The new value of token | ## CSS Custom Properties diff --git a/custom-elements.json b/custom-elements.json index 6d58f76..c196a20 100644 --- a/custom-elements.json +++ b/custom-elements.json @@ -3,112 +3,252 @@ "tags": [ { "name": "stripe-elements", - "description": "`stripe-elements`\nCustom element wrapper for Stripe.js v3 Elements\n\n## Usage\n\n```html\n \n \n \n```\n\n## Styling\n\nA word about nomenclature before we list custom properties and mixins.\nStripe v3 Introduces 'Stripe Elements'. These are not custom elements,\nbut rather forms hosted by stripe and injected into your page via an iFrame.\nWhen we refer to the 'Stripe Element' in this document, we are referring\nto the hosted Stripe form, not the `` custom element.\nConfusing? Possibly... but the alternative was to call *this* element ```\n\nThe following custom properties are available for styling the `` component:\n\n| Custom property | Description | Default |\n| --- | --- | --- |\n| `--stripe-elements-width` | Min-width of the stripe-element | `300px` |\n| `--stripe-elements-height` | Min-width of the stripe-element | `50px` |\n| `--stripe-elements-element-padding` | Padding for the stripe-element | `14px`;\n| `--stripe-elements-element-background | Background for the stripe-element | `initial` |\n\nWhen you apply CSS to the custom properties below, they're parsed and sent to Stripe, who should apply them to the Stripe Element they return in the iFrame.\n\n- `base` styles are inherited by all other variants.\n- `complete` styles are applied when the Stripe Element has valid input.\n- `empty` styles are applied when the Stripe Element has no user input.\n- `invalid` styles are applied when the Stripe Element has invalid input.\n\nThere are 11 properties for each state that you can set which will be read into the Stripe Element iFrame:", - "properties": [ + "description": "Custom element wrapper for Stripe.js v3 Elements. Creates a `card` element Ć  la https://stripe.com/docs/elements\n\nšŸ‘Øā€šŸŽØ [Storybook Demo](https://bennypowers.dev/stripe-elements) šŸ‘€\n\n[![made with open-wc](https://img.shields.io/badge/made%20with-open--wc-%23217ff9)](https://open-wc.org)\n[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/bennypowers/stripe-elements)\n[![Published on npm](https://img.shields.io/npm/v/@power-elements/stripe-elements.svg)](https://www.npmjs.com/package/@power-elements/stripe-elements)\n[![Maintainability](https://api.codeclimate.com/v1/badges/b2205a301b0a8bb82d51/maintainability)](https://codeclimate.com/github/bennypowers/stripe-elements/maintainability)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/b2205a301b0a8bb82d51/test_coverage)](https://codeclimate.com/github/bennypowers/stripe-elements/test_coverage)\n[![Release](https://github.com/bennypowers/stripe-elements/workflows/Release/badge.svg)](https://github.com/bennypowers/stripe-elements/actions?query=workflow%3ARelease)\n[![Contact me on Codementor](https://cdn.codementor.io/badges/contact_me_github.svg)](https://www.codementor.io/bennyp?utm_source=github&utm_medium=button&utm_term=bennyp&utm_campaign=github)\n\n ## Installation and Usage\n\n You should make sure to load stripe.js on your app's index.html, as per Stripe's recommendation, before loading ``. If `window.Stripe` is not available when you load up the component, it will fail with a reasonably-polite console warning.\n\n ```html\n \n ```\n\n ```\n npm i -S @power-elements/stripe-elements\n ```\n\n To pre-build, use `@pika/web` and reference the module at `/web_modules/@powers-elements/stripe-elements/stripe-elements.js`;\n\n ```\n npx @pika/web\n ```\n\n ```html\n \n ```\n\n Or load the module from the unpkg CDN\n ```html\n \n ```\n\nThen you can add the element to your page.\n\n```html\n\n\n\n\n\n\n\n\n\n```\n\nIn a lit-html template\n\n```js\nimport { html, render } from '/web_modules/lit-html/lit-html.js';\nimport { PUBLISHABLE_KEY } from './config.js';\nimport '/web_modules/@power-elements/stripe-elements/stripe-elements.js';\n\nconst onChange = ({ target: { isComplete, hasError } }) => {\n document.body.querySelector('button').disabled = !(isComplete && !hasError)\n}\n\nconst onClick = () => document.getElementById('stripe').createSource();\n\nconst template = html`\n \n \n`\nrender(template, document.body)\n```\n\nIn a Polymer Template\n\n```html\n\n\n\n\n\n Get Token\n\n\n\n```\n\n## Styling\n\nA word about nomenclature before we list custom properties and mixins. Stripe v3\nIntroduces 'Stripe Elements'. These are not custom elements, but rather forms\nhosted by stripe and injected into your page via an iFrame. When we refer to the\n'Stripe Element' in this document, we are referring to the hosted Stripe form,\nnot the `` custom element. But when I mentions the 'element', I mean the custom element.\n\nWhen you apply CSS to the custom properties available, they're parsed and sent to Stripe, who should apply them to the Stripe Element they return in the iFrame.\n\n- `base` styles are inherited by all other variants.\n- `complete` styles are applied when the Stripe Element has valid input.\n- `empty` styles are applied when the Stripe Element has no user input.\n- `invalid` styles are applied when the Stripe Element has invalid input.\n\nThere are 11 properties for each state that you can set which will be read into the Stripe Element iFrame:\n\n- `color`\n- `font-family`\n- `font-size`\n- `font-smoothing`\n- `font-variant`\n- `icon-color`\n- `line-height`\n- `letter-spacing`\n- `text-decoration`\n- `text-shadow`\n- `text-transform`\n\n---\n\n`` is a community project, not endorsed or affiliated with Stripe.", + "attributes": [ { - "name": "brand" + "name": "hide-icon", + "description": "Whether to hide icons in the Stripe form.", + "type": "Boolean", + "default": "false" }, { - "name": "card" + "name": "hide-postal-code", + "description": "Whether or not to hide the postal code field.\nUseful when you gather shipping info elsewhere.", + "type": "Boolean", + "default": "false" }, { - "name": "error", - "description": "Stripe or validation error", - "type": "Error" + "name": "icon-style", + "description": "Stripe icon style. 'solid' or 'default'.", + "type": "'solid'|'default'", + "default": "\"default\"" }, { - "name": "hasError", - "description": "Whether the element has an error", - "type": "Boolean" + "name": "label", + "description": "aria-label attribute for the credit card form.", + "type": "String", + "default": "\"Credit or Debit Card\"" }, { - "name": "isComplete", - "description": "Whether the card form is complete", + "name": "value", + "description": "Prefilled values for form. Example {postalCode: '90210'}", + "type": "Object", + "default": "{}" + }, + { + "name": "brand", + "description": "The card brand detected by Stripe", + "type": "String" + }, + { + "name": "card", + "description": "The Stripe card object.", + "type": "stripe.Element" + }, + { + "name": "is-complete", + "description": "If the form is complete.", "type": "Boolean" }, { - "name": "isEmpty", - "description": "Whether the card form is empty", + "name": "is-empty", + "description": "If the form is empty.", "type": "Boolean" }, { - "name": "stripeReady", - "description": "Whether Stripe.js has been initialized", + "name": "stripe-ready", + "description": "If the stripe element is ready to receive focus.", "type": "Boolean" }, { - "name": "token", - "description": "The token returned from `createToken`", - "type": "StripeToken" + "name": "action", + "description": "The URL to the form action. Example '/charges'.\nIf blank or undefined will not submit charges immediately.", + "type": "String" }, { - "name": "source", - "description": "The source returned from `createSource`", - "type": "StripeSource" + "name": "publishable-key", + "description": "Stripe Publishable Key. EG. `pk_test_XXXXXXXXXXXXXXXXXXXXXXXX`", + "type": "String" }, { - "name": "stripe", - "description": "The Stripe.js object", - "type": "Stripe" + "name": "show-error", + "description": "Whether to display the error message", + "type": "boolean", + "default": "false" }, { - "name": "elements" + "name": "elements", + "description": "Stripe Elements instance", + "type": "stripe.elements.Elements" }, { - "name": "stripeMount", - "description": "Stripe Element mount point", - "type": "Element" + "name": "error", + "description": "Stripe or validation error", + "type": "Error" }, { - "name": "form", - "description": "The internal form elementt", - "type": "HTMLFormElement" + "name": "has-error", + "description": "Whether the element has an error", + "type": "Boolean" }, { - "name": "action", - "description": "The action attr of the internal form.", - "type": "string" + "name": "source", + "description": "Stripe Source", + "type": "stripe.Source" }, { - "name": "cardData", - "description": "Stripe cardData object to submit with", - "type": "Object", - "default": "{}" + "name": "stripe", + "description": "Stripe instance", + "type": "stripe.Stripe" }, + { + "name": "token", + "description": "Stripe Token", + "type": "stripe.Token" + } + ], + "properties": [ { "name": "hideIcon", - "type": "boolean", + "attribute": "hide-icon", + "description": "Whether to hide icons in the Stripe form.", + "type": "Boolean", "default": "false" }, { "name": "hidePostalCode", - "type": "boolean", + "attribute": "hide-postal-code", + "description": "Whether or not to hide the postal code field.\nUseful when you gather shipping info elsewhere.", + "type": "Boolean", "default": "false" }, { "name": "iconStyle", - "type": "string", + "attribute": "icon-style", + "description": "Stripe icon style. 'solid' or 'default'.", + "type": "'solid'|'default'", "default": "\"default\"" }, + { + "name": "label", + "attribute": "label", + "description": "aria-label attribute for the credit card form.", + "type": "String", + "default": "\"Credit or Debit Card\"" + }, { "name": "value", - "type": "object", + "attribute": "value", + "description": "Prefilled values for form. Example {postalCode: '90210'}", + "type": "Object", "default": "{}" - } - ], - "events": [ + }, { - "name": "stripe-token", - "description": "The token received from stripe.com" + "name": "brand", + "attribute": "brand", + "description": "The card brand detected by Stripe", + "type": "String" }, { - "name": "stripe-source", - "description": "The source received from stripe.com" + "name": "card", + "attribute": "card", + "description": "The Stripe card object.", + "type": "stripe.Element" }, { - "name": "stripe-error", - "description": "The validation error, or the error returned from stripe.com" + "name": "isComplete", + "attribute": "is-complete", + "description": "If the form is complete.", + "type": "Boolean" + }, + { + "name": "isEmpty", + "attribute": "is-empty", + "description": "If the form is empty.", + "type": "Boolean" }, + { + "name": "stripeReady", + "attribute": "stripe-ready", + "description": "If the stripe element is ready to receive focus.", + "type": "Boolean" + }, + { + "name": "stripeMount", + "description": "Stripe Element mount point", + "type": "Element" + }, + { + "name": "action", + "attribute": "action", + "description": "The URL to the form action. Example '/charges'.\nIf blank or undefined will not submit charges immediately.", + "type": "String" + }, + { + "name": "billingDetails", + "type": "stripe.BillingDetails" + }, + { + "name": "publishableKey", + "attribute": "publishable-key", + "description": "Stripe Publishable Key. EG. `pk_test_XXXXXXXXXXXXXXXXXXXXXXXX`", + "type": "String" + }, + { + "name": "showError", + "attribute": "show-error", + "description": "Whether to display the error message", + "type": "boolean", + "default": "false" + }, + { + "name": "sourceData", + "description": "Data passed to stripe.createSource. (optional)", + "type": "{ owner: stripe.OwnerData }" + }, + { + "name": "tokenData", + "description": "Data passed to stripe.createToken. (optional)", + "type": "stripe.TokenOptions" + }, + { + "name": "elements", + "attribute": "elements", + "description": "Stripe Elements instance", + "type": "stripe.elements.Elements" + }, + { + "name": "error", + "attribute": "error", + "description": "Stripe or validation error", + "type": "Error" + }, + { + "name": "hasError", + "attribute": "has-error", + "description": "Whether the element has an error", + "type": "Boolean" + }, + { + "name": "source", + "attribute": "source", + "description": "Stripe Source", + "type": "stripe.Source" + }, + { + "name": "stripe", + "attribute": "stripe", + "description": "Stripe instance", + "type": "stripe.Stripe" + }, + { + "name": "token", + "attribute": "token", + "description": "Stripe Token", + "type": "stripe.Token" + } + ], + "events": [ { "name": "stripe-change", "description": "Stripe Element change event" @@ -117,6 +257,14 @@ "name": "stripe-ready", "description": "Stripe has been initialized and mounted" }, + { + "name": "brand-changed", + "description": "The new value of brand" + }, + { + "name": "card-changed", + "description": "The new value of card" + }, { "name": "is-complete-changed", "description": "The new value of is-complete" @@ -126,28 +274,52 @@ "description": "The new value of is-empty" }, { - "name": "has-error-changed", - "description": "The new value of has-error" + "name": "stripe-ready-changed", + "description": "The new value of stripe-ready" }, { - "name": "brand-changed", - "description": "The new value of brand" + "name": "error-changed", + "description": "The new value of error" }, { - "name": "card-changed", - "description": "The new value of card" + "name": "has-error-changed", + "description": "The new value of has-error" }, { - "name": "error-changed", - "description": "The new value of error" + "name": "payment-intent-changed", + "description": "The new value of payment-intent" + }, + { + "name": "payment-method-changed", + "description": "The new value of payment-method" }, { "name": "publishable-key-changed", "description": "The new value of publishable-key" }, { - "name": "stripe-ready-changed", - "description": "The new value of stripe-ready" + "name": "source-changed", + "description": "The new value of source" + }, + { + "name": "stripe-error", + "description": "The validation error, or the error returned from stripe.com" + }, + { + "name": "stripe-payment-intent", + "description": "The PaymentIntent received from stripe.com" + }, + { + "name": "stripe-payment-method", + "description": "The PaymentMethod received from stripe.com" + }, + { + "name": "stripe-source", + "description": "The Source received from stripe.com" + }, + { + "name": "stripe-token", + "description": "The Token received from stripe.com" }, { "name": "token-changed", diff --git a/karma.conf.js b/karma.conf.js index b7ae9a8..04e354c 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,19 +1,21 @@ +/* eslint-disable valid-jsdoc */ const { createDefaultConfig } = require('@open-wc/testing-karma'); const merge = require('deepmerge'); +/** + * @param {import('@types/karma').Config} config + * @return {import('@types/karma').Config} + */ module.exports = config => { - config.set( - merge(createDefaultConfig(config), { - files: [ - { pattern: config.grep ? config.grep : 'src/**/*.test.js', type: 'module' }, - ], - esm: { - nodeResolve: true, - babel: true, - }, - }) - ); - + config.set(merge(createDefaultConfig(config), { + ...config.autoWatch ? { mochaReporter: { output: 'autowatch' } } : {}, + files: [{ pattern: config.grep ? config.grep : 'src/**/*.test.js', type: 'module' }], + esm: { + nodeResolve: true, + babel: true, + coverageExclude: ['src/**/*.test.js'], + }, + })); return config; }; diff --git a/package-lock.json b/package-lock.json index 4b08947..59300da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,21 +19,33 @@ "@babel/highlight": "^7.0.0" } }, - "@babel/core": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", - "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", + "@babel/compat-data": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", + "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.7", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.7", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", + "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helpers": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", "json5": "^2.1.0", "lodash": "^4.17.13", "resolve": "^1.3.2", @@ -41,23 +53,111 @@ "source-map": "^0.5.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.8.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, "@babel/parser": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.7.tgz", - "integrity": "sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } } } }, @@ -74,128 +174,571 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", - "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.0.tgz", + "integrity": "sha512-WWj+1amBdowU2g18p3/KUc1Y5kWnaNm1paohq2tT4/RreeMNssYkv6ul9wkE2iIqjwLBwNMZGH4pTGlMSUqMMg==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", - "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.0.tgz", + "integrity": "sha512-KbBloNiBHM3ZyHg1ViDRs4QcnAunwMJ+rLpAEA8l3cWb3Z1xof7ag1iHvX16EwhUfaTG3+YSvTRPv4xHIrseUQ==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-explode-assignable-expression": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-react-jsx": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz", - "integrity": "sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz", + "integrity": "sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.8.0", "esutils": "^2.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-call-delegate": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", - "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.0.tgz", + "integrity": "sha512-Vi8K1LScr8ZgLicfuCNSE7JWUPG/H/9Bw9zn+3vQyy4vA54FEGTCuUTOXCFwmBM93OD6jHfjrQ6ZnivM5U+bHg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-hoist-variables": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.1.tgz", + "integrity": "sha512-Fsrljg8DHSdnKSzC0YFopX7lseRpVfWMYuC1Dnvf7tw972E2KDjZ4XEaqjO9aJL0sLcG4KNRXxowDxHYIcZ+Cw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.1", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "levenary": "^1.1.0", + "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz", - "integrity": "sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", + "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-member-expression-to-functions": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4" + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", - "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.0.tgz", + "integrity": "sha512-vJj2hPbxxLUWJEV86iZiac5curAnC3ZVc+rFmFeWZigUOcuCPpbF+KxoEmxrkmuCGylHFF9t4lkpcDUcxnhQ5g==", "dev": true, "requires": { - "@babel/helper-regex": "^7.4.4", + "@babel/helper-regex": "^7.8.0", "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", - "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.0.tgz", + "integrity": "sha512-Go06lUlZ4YImNEmdyAH5iO38yh5mbpOPSwA2PtV1vyczFhTZfX0OtzkiIL2pACo6AOYf89pLh42nhhDrqgzC3A==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/helper-function-name": "^7.8.0", + "@babel/types": "^7.8.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", - "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", - "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", - "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", - "dev": true, - "requires": { - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", - "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.0.tgz", + "integrity": "sha512-w4mRQqKAh4M7BSLwvDMm8jYFroEzpqMCtXDhFHP+kNjMIQWpbC6b0Q/RUQsJNSf54rIx6XMdci1Stf60DWw+og==", "dev": true, "requires": { - "@babel/types": "^7.7.4" - } - }, - "@babel/helper-member-expression-to-functions": { + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", - "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", "dev": true, "requires": { "@babel/types": "^7.7.4" } }, + "@babel/helper-hoist-variables": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.0.tgz", + "integrity": "sha512-jDl66KvuklTXUADcoXDMur1jDtAZUZZkzLIaQ54+z38ih8C0V0hC56hMaoVoyoxN60MwQmmrHctBwcLqP0c/Lw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", + "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-module-imports": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", @@ -206,76 +749,423 @@ } }, "@babel/helper-module-transforms": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz", - "integrity": "sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.0.tgz", + "integrity": "sha512-fvGhX4FY7YwRdWW/zfddNaKpYl8TaA8hvwONIYhv1/a1ZbgxbTrjsmH6IGWUgUNki7QzbpZ27OEh88sZdft3YA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-simple-access": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4", + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-simple-access": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", - "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", + "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", "dev": true, "requires": { - "@babel/types": "^7.7.4" + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", "dev": true }, "@babel/helper-regex": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", - "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.0.tgz", + "integrity": "sha512-haD8fRsPtyFZkbtxBIaGBBHRtbn0YsyecdYrxNgO0Bl6SlGokJPQX9M2tDuVbeQBYHZVLUPMSwGQn4obHevsMQ==", "dev": true, "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", - "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.0.tgz", + "integrity": "sha512-+aKyBd4oHAaIZgOLq/uLjkUz7ExZ0ppdNBc8Qr72BmtKNAy3A6EJa/ifjj0//CIzQtUDPs3E6HjKM2cV6bnXsQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-wrap-function": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-wrap-function": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", - "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", + "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-simple-access": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", - "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.0.tgz", + "integrity": "sha512-I+7yKZJnxp7VIC2UFzXfVjLiJuU16rYFF59x27c+boINkO/pLETgZcoesCryg9jmU4jxEa0foFueW+2wjc9Gsw==", "dev": true, "requires": { - "@babel/template": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { @@ -288,26 +1178,242 @@ } }, "@babel/helper-wrap-function": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", - "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.0.tgz", + "integrity": "sha512-2j6idN2jt8Y+8nJ4UPN/6AZa53DAkcETMVmroJQh50qZc59PuQKVjgOIIqmrLoQf6Ia9bs90MHRcID1OW5tfag==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/helper-function-name": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helpers": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", - "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", + "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", "dev": true, "requires": { - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4" + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/highlight": { @@ -328,643 +1434,1099 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", - "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.0.tgz", + "integrity": "sha512-8vIQf8JYced7gCeKDsGETNGKE+zdD/JmP1LBlRn+w3UXc1aSpZv2Y330bB/fnOEbUgPbuFv+IEi+gopg+Fu0kQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.4", - "@babel/plugin-syntax-async-generators": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-remap-async-to-generator": "^7.8.0", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", - "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.0.tgz", + "integrity": "sha512-eVGj5NauhKCwABQjKIYncMQh9HtFsBrIcdsxImbTdUIaGnjymsVsBGmDQaDuPL/WCjYn6vPL4d+yvI6zy+VkrQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.0.tgz", + "integrity": "sha512-HKltBhhrRigrHYkDrO/9rg+ZerXSAtZjepm8URUrNxgzTzEfuOb06fUU311chMkahZHSfASNUxWVwRzIwGt/uw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-decorators": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/generator": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", + "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", + "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", + "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", + "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", + "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/traverse": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", + "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", - "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.0.tgz", + "integrity": "sha512-YzMq0AqeTR4Mh2pz3GrCWqhcEV38HgUMMR/56/YR5GPc4Y2p1KJ4Le6j92vMnW8TJqVj+qJz/KDNglpMeww9Yg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", - "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.0.tgz", + "integrity": "sha512-pSpuhwn926vtNeUH2FHx1OzIXaUMgklG0MzlFZJVEg37fB904gOxN572NgBae+KDwFyZDpkLMyEkVA011lBJrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz", - "integrity": "sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.0.tgz", + "integrity": "sha512-cQMI+RQdcK2IyMm13NKKFCYfOSBUtFxEeRBOdFCi2Pubv/CpkrCubc/ikdeKMT6Lu+uQ+lNSDEJvDCOQZkUy0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz", - "integrity": "sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", - "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.0.tgz", + "integrity": "sha512-tHP3eez6TrpPJYttBZ/6uItRbIuXUIDpQ9xwvzKwR+RboWGMJ7WzFC5dDJ3vjLuCx0/DG1tM0MVkmgcBybth9w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.5.tgz", - "integrity": "sha512-sOwFqT8JSchtJeDD+CjmWCaiFoLxY4Ps7NjvwHC/U7l4e9i5pTRNt8nDMIFSOUL+ncFbYSwruHM8WknYItWdXw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz", - "integrity": "sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.0.tgz", + "integrity": "sha512-3oK0Qt5w4arb+es3rWBribDbtc0TYJP7dFZ1dXcYul3cXderqfIOoSx9YUC1oD208nJwJO/++fvrgLmkYSbe8A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", - "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.0.tgz", + "integrity": "sha512-a8w8k7pK8nYhem07rXdAq03T+DlTX8LFojUptrh9JEx80AgLqGiuoFIyQOGTWif39kFnDOQqbzl1s6KQqrfV+A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.7.4.tgz", - "integrity": "sha512-JH3v5ZOeKT0qqdJ9BeBcZTFQiJOMax8RopSr1bH6ASkZKo2qWsvBML7W1mp89sszBRDBBRO8snqcByGdrMTdMg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.0.tgz", + "integrity": "sha512-Ygw7R0yM6MjoqPFG4tlX2/p0ZlPAF7mvSrVASsvsRPi5Exad0quQ5tRPFTQI/2baPHlfeGZp7Qv5SMaWk3Lpyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.0.tgz", + "integrity": "sha512-Qz68qh9jJqQePGWqbNW9PA7vkE2gvnWkYtx32jgPOszpE7u+xObPkRGm3B80oXAjQlBdTa4ktqjkOIRiKRuapw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", + "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", + "dev": true + } } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", - "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz", + "integrity": "sha512-Mx2RzpCHJaBfmFdA2abXDKRHVJdzJ6R0Wqwb6TxCgM7NRR5wcC4cyiAsRL7Ga+lwG8GG1cKvb+4ENjic8y15jA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-flow": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.4.tgz", - "integrity": "sha512-2AMAWl5PsmM5KPkB22cvOkUyWk6MjUaqhHNU5nSPUl/ns3j5qLfw2SuYP5RbVZ0tfLvePr4zUScbICtDP2CUNw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.0.tgz", + "integrity": "sha512-MDK9WdjDccrxzz+4sthpSDnqdf5McJwTtfBYGitOweC/j0Zg6e8wHmP4RGLTeyGYe/IySoRgKC5hvSm6ddrNRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-import-meta": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.7.4.tgz", - "integrity": "sha512-hl6aKgm2IbVB+X9Z2xcKvGObOOS//vbohHPpNvd8iaKA3XQi3Sz/3oOyb3GLes6hY871mkbZQYK7lxriVECRAQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.8.0.tgz", + "integrity": "sha512-970CshtbhzPcoLl6hzfiPhz4I837Xnr1J7VHJCvUREq6OeBTSfy0EdKOsDE0Owa0PwPHqcEo6Zn/lT8EeUE4lg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", - "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.0.tgz", + "integrity": "sha512-LPykaAbH86L5NnDfCRSpNxtEHZk+6GaFzXfWEFU/6R4v69EXQr6GOp7hwH+Uw0QlYVN++s6TukTJ3flFcspahA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", - "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.7.4.tgz", - "integrity": "sha512-XKh/yIRPiQTOeBg0QJjEus5qiSKucKAiApNtO1psqG7D17xmE+X2i5ZqBEuSvo0HRuyPaKaSN/Gy+Ha9KFQolw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz", + "integrity": "sha512-Rv2hnBToN6rbA9hO2a4vtwXZLzNa+TWkoSIMMvUezFz5+D9NPeX7SFrArwtFzzbwndmWiqboTr5rNpzAz0MPpA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.7.4.tgz", - "integrity": "sha512-vmlUUBlLuFnbpaR+1kKIdo62xQEN+THWbtAHSEilo+0rHl2dKKCn6GLUVKpI848wL/T0ZPQgAy8asRJ9yYEjog==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.0.tgz", + "integrity": "sha512-GEYjlQAr/zXMVuce0Nq/boG4wNjJxdIOc4RKcgBEo/r/J3LrghZz8+ZYo8k+OuLJKvvV22k84tBuw1YunnLgCQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", - "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz", + "integrity": "sha512-EIgJVy+u1RvR2gJfX4ReLwAupO/twllUue1wPrRxhu18+eC3bGTEcOSXLQdaE9ya9NG1rE0eQs0GSiloUGFEwg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz", - "integrity": "sha512-2MqYD5WjZSbJdUagnJvIdSfkb/ucOC9/1fRJxm7GAxY6YQLWlUvkfxoNbUPcPLHJyetKUDQ4+yyuUyAoc0HriA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz", + "integrity": "sha512-LV1c+TTAO8Vawe3t+WXBHYWbS7endP8MSlqKPKEZOyWPEJX2akl3jfvFG828/OE7RpyoC3JXfLJDFj/jN7A8hg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", - "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.0.tgz", + "integrity": "sha512-iXR/Cw32fMfWlD1sK2zD/nXtuLStkalRv+xee6VrX84CFrn2LKwb/EOs/4UaDNUpUsws8YZYKeQjPagacFquug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-typescript": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz", - "integrity": "sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.0.tgz", + "integrity": "sha512-LrvVrabb993Ve5fzXsyEkfYCuhpXBwsUFjlvgD8UmXXg3r/8/ceooSdRvjdmtPXXz+lHaqZHZooV1jMWer2qkA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", - "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.0.tgz", + "integrity": "sha512-9KfteDp9d8cF388dxFMOh3Dum41qpOVUPVjQhXGd1kPyQBE05FJgYndiAriML2yhMIbZ2bjgweh2nnvBXDH2MQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", - "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.0.tgz", + "integrity": "sha512-9dvBvJnEdsDWYMrykoMyLNVRPGoub6SFlARtsYgSQ1riTjnyBjhctihSME4XsSku86F59PDeFpC9PCU+9I154w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.7.4" + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-remap-async-to-generator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", - "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.0.tgz", + "integrity": "sha512-bim6gUfHq2kPN+aQst33ZEMeglpaUXAo6PWTZvOA8BOnWpNKgZcUzBvpZhh2ofL6YhZgzGoRwVVfzwynDEf47g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", - "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.0.tgz", + "integrity": "sha512-FKTK4hzg7W950Yu9iqMl12WBixCmusMc5HBt3/ErvpFLnvr3/6mu/EBTZoCEJ0mw/lQUDfU01vTcZY9oEahlMg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-plugin-utils": "^7.8.0", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", - "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-define-map": "^7.7.4", - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-optimise-call-expression": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4", - "@babel/helper-split-export-declaration": "^7.7.4", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.0.tgz", + "integrity": "sha512-18RLDwKtGXCLLbf5V03GojebPH7dKYCmIBqQGhgfZDoYsyEzR9kMZ6IxlJP72K5ROC9ADa4KPI6ywuh7NfQOgQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-define-map": "^7.8.0", + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-optimise-call-expression": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0", + "@babel/helper-split-export-declaration": "^7.8.0", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", + "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", - "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.0.tgz", + "integrity": "sha512-FaODHuQRdnWFVwxLPlTN85Lk/aitfvQBHTXahf58FnatCynfhkeNUO8ID+AqAxY4IJsZjeH6OnKDzcGfgKJcVw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", - "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.0.tgz", + "integrity": "sha512-D+69HT//cE86aBTLULzSBFLC5A7HcPQzJPiny6P4SLHkDF750MylRKO3iWvdgvb+OSp5dOrOxwXajvaxk1ZfYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz", - "integrity": "sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.0.tgz", + "integrity": "sha512-pq/XLkDB4MPvTe9ktHJInfWksalXogrIGRZJUG7RiDXhEfdNrlducoMPbACZQuCFtelVgVpD0VyreiY0l38G7g==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", - "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.0.tgz", + "integrity": "sha512-REtYWvpP4TDw4oVeP01vQJcAeewjgk8/i7tPFP11vUjvarUGGyxJLeq79WEnIdnKPQJirZaoDRT4kEWEdSWkDw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", - "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.0.tgz", + "integrity": "sha512-vaDgF3gPLzVcoe3UZqnra6FA7O797sZc+UCHPd9eQTI34cPtpCA270LzopIXS3Fhc3UmFrijLmre9mHTmUKVgg==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz", - "integrity": "sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.0.tgz", + "integrity": "sha512-yKcww1yWfAHWk4R7OeU0YnrWEIrSodFr1TibfkrP8t0RDXSyGIDnahz8lzXagNT/XlZC3sWpsYXhty9xAU3ULQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-flow": "^7.8.0" } }, "@babel/plugin-transform-for-of": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", - "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.0.tgz", + "integrity": "sha512-9j9g0qViCAo8E5qCBSaQdghymn7A9bRXSfS9jU7oLpYccYFZg9A+1KO8X+HV7fhJYH6mZ+e7MRg4p3sLo+RG6Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", - "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.0.tgz", + "integrity": "sha512-YL8Ol54UKeIyY1uUGfry+B9ppXAB3aVBB1gG9gxqhg/OBCPpV2QUNswmjvfmyXEdaWv8qODssBgX7on792h44w==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", + "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", + "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/highlight": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", + "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "dev": true + }, + "@babel/template": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", + "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", - "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.0.tgz", + "integrity": "sha512-7UDPKG+uVltsZt98Hw+rMbLg772r8fQC6YJ2fNDckcpAXgIWqQbMCmCpfYo0hBNhdhqocM73auk4P/zziQshQw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", - "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.0.tgz", + "integrity": "sha512-lJSdaWR56wmrosCiyqKFRVnLrFYoVAk2mtZAyegt7akeJky/gguv0Rukx9GV3XwHGuM1ZPE06cZMjNlcLp8LrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz", - "integrity": "sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.0.tgz", + "integrity": "sha512-mFr1O3TaDL4XozM3AzNPz9AsxzzjTxwn4aOShYP5TlO+4rufvjagV2KKDTPMZTQm1ZA/C/PxJDsDekEnnUGz5A==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.5", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz", - "integrity": "sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.0.tgz", + "integrity": "sha512-w2g8tmL7NgBYt6alc8YawMcmPiYqnVvvI0kLB++VOUOssqdJMAkfQOMGV+2M8H5uhJYDaAghAVMUYps3s+jMrw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.5", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-simple-access": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", - "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.0.tgz", + "integrity": "sha512-tKF9KLiIsiKyWTVU0yo+NcNAylGn7euggYwXw63/tMxGtDTPsB9Y7Ecqv4EoXEwtoJOJ0Lewf17oaWQtindxIA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-hoist-variables": "^7.8.0", + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", - "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.0.tgz", + "integrity": "sha512-lAwNfXwmfTy7fl2XOyoVpMXnLkJANgH0vdSYNFcS4RuJPBtHfunGA+Y0L7wsHmfPzyVYt8sUglLjaWtdZMNJNg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", - "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.0.tgz", + "integrity": "sha512-kq1rxQ1HviCP13SMGZ4WjBBpdogTGK7yn/g/+p+g1AQledgHOWKVeMY1DwKYGlGJ/grDGTOqpJLF1v3Sb7ghKA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", - "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.0.tgz", + "integrity": "sha512-hH1Afz9Xy/wkcxhoI0vYw48kTBJqYUhMmhp3SLI1p817iByM6ItH4LS8tZatDAIKmAQAXj8d3Ups1BgVJECDrA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", - "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.0.tgz", + "integrity": "sha512-2DYqQ811nRlFVlni6iqfxBVVGqkBgfvEv/lcvmdNu2CaG+EA7zSP1hqYUsqamR+uCdDbsrV7uY6/0rkXbJo5YQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-replace-supers": "^7.8.0" } }, "@babel/plugin-transform-parameters": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz", - "integrity": "sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.0.tgz", + "integrity": "sha512-9R2yykk7H92rntETO0fq52vJ4OFaTcDA49K9s8bQPyoD4o3/SkWEklukArCsQC6fowEuraPkH/umopr9uO539g==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.7.4", - "@babel/helper-get-function-arity": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-call-delegate": "^7.8.0", + "@babel/helper-get-function-arity": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", + "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", - "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.0.tgz", + "integrity": "sha512-vjZaQlojnZIahu5ofEW+hPJfDI5A6r2Sbi5C0RuCaAOFj7viDIR5kOR7ul3Fz5US8V1sVk5Zd2yuPaz7iBeysg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.7.tgz", - "integrity": "sha512-SlPjWPbva2+7/ZJbGcoqjl4LsQaLpKEzxW9hcxU7675s24JmdotJOSJ4cgAbV82W3FcZpHIGmRZIlUL8ayMvjw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.0.tgz", + "integrity": "sha512-r5DgP2ZblaGmW/azRS9rlaf3oY4r/ByXRDA5Lcr3iHUkx3cCfL9RM10gU7AQmzwKymoq8LZ55sHyq9VeQFHwyQ==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.7.4" + "@babel/helper-builder-react-jsx": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-jsx": "^7.8.0" } }, "@babel/plugin-transform-regenerator": { - "version": "7.7.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz", - "integrity": "sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.0.tgz", + "integrity": "sha512-n88GT8PZuOHWxqxCJORW3g1QaYzQhHu5sEslxYeQkHVoewfnfuWN37t7YGaRLaNUdaZUlRPXhDcLGT7zBa/u0g==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", - "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.0.tgz", + "integrity": "sha512-DnshRyDTXZhmAgO2c1QKZI4CfZjoP2t3fSwRsnbCP9P/FSBpf9I7ovnAELswklw5OeY+/D/JIiaGLoUt2II3LA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", + "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", - "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.0.tgz", + "integrity": "sha512-sExhzq63Gl2PMbl7ETpN7Z1A38rLD6GeCT6EEEIIKjTVt9u6dRqJ6nHhaquL7QgR3egj/8fcvq23UvzfPqGAYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", - "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.0.tgz", + "integrity": "sha512-6Zjl0pv6x10YmFVRI0VhwJ/rE++geVHNJ9xwd+UIt3ON2VMRO7qI2lPsyLnzidR5HYNd/JXj47kdU9Rrn4YcnQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", - "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.0.tgz", + "integrity": "sha512-uksok0Bqox8YeIRFhr6RRtlBXeGpN1ogiEVjEd7A7rVLPZBXKGbL7kODpE7MQ+avjDLv5EEKtDCeYuWZK7FF7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/helper-regex": "^7.8.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", - "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.0.tgz", + "integrity": "sha512-EF7Q7LEgeMpogHcvmHMNXBWdLWG1tpA1ErXH3i8zTu3+UEKo6aBn+FldPAJ16UbbbOwSCUCiDP6oZxvVRPhwnQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", - "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.0.tgz", + "integrity": "sha512-rEUBEFzsA9mCS2r7EtXFlM/6GqtzgLdC4WVYM9fIgJX+HcSJ8oMmj8LinfKhbo0ipRauvUM2teE2iNDNqDwO1g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-transform-typescript": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz", - "integrity": "sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.0.tgz", + "integrity": "sha512-RhMZnNWcyvX+rM6mk888MaeoVl5pGfmYP3as709n4+0d15SRedz4r+LPRg2a9s4z+t+DM+gy8uz/rmM3Cb8JBw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.7.4" + "@babel/helper-create-class-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-typescript": "^7.8.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", - "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.0.tgz", + "integrity": "sha512-qDg8wsnE47B/Sj8ZtOndPHrGBxJMssZJ71SzXrItum9n++iVFN7kYuJO+OHhjom7+/or0zzYqvJNzCkUjyNKqg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/preset-env": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", - "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.4", - "@babel/plugin-proposal-dynamic-import": "^7.7.4", - "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", - "@babel/plugin-syntax-async-generators": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-syntax-json-strings": "^7.7.4", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", - "@babel/plugin-syntax-top-level-await": "^7.7.4", - "@babel/plugin-transform-arrow-functions": "^7.7.4", - "@babel/plugin-transform-async-to-generator": "^7.7.4", - "@babel/plugin-transform-block-scoped-functions": "^7.7.4", - "@babel/plugin-transform-block-scoping": "^7.7.4", - "@babel/plugin-transform-classes": "^7.7.4", - "@babel/plugin-transform-computed-properties": "^7.7.4", - "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.7", - "@babel/plugin-transform-duplicate-keys": "^7.7.4", - "@babel/plugin-transform-exponentiation-operator": "^7.7.4", - "@babel/plugin-transform-for-of": "^7.7.4", - "@babel/plugin-transform-function-name": "^7.7.4", - "@babel/plugin-transform-literals": "^7.7.4", - "@babel/plugin-transform-member-expression-literals": "^7.7.4", - "@babel/plugin-transform-modules-amd": "^7.7.5", - "@babel/plugin-transform-modules-commonjs": "^7.7.5", - "@babel/plugin-transform-modules-systemjs": "^7.7.4", - "@babel/plugin-transform-modules-umd": "^7.7.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", - "@babel/plugin-transform-new-target": "^7.7.4", - "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.7", - "@babel/plugin-transform-property-literals": "^7.7.4", - "@babel/plugin-transform-regenerator": "^7.7.5", - "@babel/plugin-transform-reserved-words": "^7.7.4", - "@babel/plugin-transform-shorthand-properties": "^7.7.4", - "@babel/plugin-transform-spread": "^7.7.4", - "@babel/plugin-transform-sticky-regex": "^7.7.4", - "@babel/plugin-transform-template-literals": "^7.7.4", - "@babel/plugin-transform-typeof-symbol": "^7.7.4", - "@babel/plugin-transform-unicode-regex": "^7.7.4", - "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.6.0", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.2.tgz", + "integrity": "sha512-AF2YUl2bGsLWTtFL68upTTB7nDo05aEcKjHmXJE+aXRvsx5K+9yRsHQP3MjnTrLOWe/eFyUr93dfILROsKC4eg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.0", + "@babel/helper-module-imports": "^7.8.0", + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-proposal-async-generator-functions": "^7.8.0", + "@babel/plugin-proposal-dynamic-import": "^7.8.0", + "@babel/plugin-proposal-json-strings": "^7.8.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-proposal-object-rest-spread": "^7.8.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.0", + "@babel/plugin-proposal-optional-chaining": "^7.8.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.0", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.0", + "@babel/plugin-transform-arrow-functions": "^7.8.0", + "@babel/plugin-transform-async-to-generator": "^7.8.0", + "@babel/plugin-transform-block-scoped-functions": "^7.8.0", + "@babel/plugin-transform-block-scoping": "^7.8.0", + "@babel/plugin-transform-classes": "^7.8.0", + "@babel/plugin-transform-computed-properties": "^7.8.0", + "@babel/plugin-transform-destructuring": "^7.8.0", + "@babel/plugin-transform-dotall-regex": "^7.8.0", + "@babel/plugin-transform-duplicate-keys": "^7.8.0", + "@babel/plugin-transform-exponentiation-operator": "^7.8.0", + "@babel/plugin-transform-for-of": "^7.8.0", + "@babel/plugin-transform-function-name": "^7.8.0", + "@babel/plugin-transform-literals": "^7.8.0", + "@babel/plugin-transform-member-expression-literals": "^7.8.0", + "@babel/plugin-transform-modules-amd": "^7.8.0", + "@babel/plugin-transform-modules-commonjs": "^7.8.0", + "@babel/plugin-transform-modules-systemjs": "^7.8.0", + "@babel/plugin-transform-modules-umd": "^7.8.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.0", + "@babel/plugin-transform-new-target": "^7.8.0", + "@babel/plugin-transform-object-super": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.8.0", + "@babel/plugin-transform-property-literals": "^7.8.0", + "@babel/plugin-transform-regenerator": "^7.8.0", + "@babel/plugin-transform-reserved-words": "^7.8.0", + "@babel/plugin-transform-shorthand-properties": "^7.8.0", + "@babel/plugin-transform-spread": "^7.8.0", + "@babel/plugin-transform-sticky-regex": "^7.8.0", + "@babel/plugin-transform-template-literals": "^7.8.0", + "@babel/plugin-transform-typeof-symbol": "^7.8.0", + "@babel/plugin-transform-unicode-regex": "^7.8.0", + "@babel/types": "^7.8.0", + "browserslist": "^4.8.2", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.0", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.0.tgz", + "integrity": "sha512-ylY9J6ZxEcjmJaJ4P6aVs/fZdrZVctCGnxxfYXwCnSMapqd544zT8lWK2qI/vBPjE5gS0o2jILnH+AkpsPauEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.0" + } + }, + "@babel/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", + "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-flow": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.7.4.tgz", - "integrity": "sha512-6LbUqcHD8BcRtXMOp5bc5nJeU8RlKh6q5U8TgZeCrf9ebBdW8Wyy5ujAUnbJfmzQ56Kkq5XtwErC/5+5RHyFYA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.8.0.tgz", + "integrity": "sha512-z10t7ggJjoqdvcOrnXA16PeDhykL+FeJHg8nYg3D+QuKyMyI433o8oNJO+jFrfLa1aQ9ps2eG2QA5I7FWlJlOA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-transform-flow-strip-types": "^7.8.0" } }, "@babel/preset-typescript": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.7.tgz", - "integrity": "sha512-Apg0sCTovsSA+pEaI8efnA44b9x4X/7z4P8vsWMiN8rSUaM4y4+Shl5NMWnMl6njvt96+CEb6jwpXAKYAVCSQA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.0.tgz", + "integrity": "sha512-mvu4OmrLK6qRPiXlOkE4yOeOszHzk9itwe6aiMN0RL9Bc5uAwAotVTy4kKl17evLMd1WsvWT1O3mZltynuqxXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-transform-typescript": "^7.8.0" } }, "@babel/register": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.7.7.tgz", - "integrity": "sha512-S2mv9a5dc2pcpg/ConlKZx/6wXaEwHeqfo7x/QbXsdCAZm+WJC1ekVvL1TVxNsedTs5y/gG63MhJTEsmwmjtiA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.0.tgz", + "integrity": "sha512-i7CPQBzb/uALrZZozm6jXpSoieZvcTSOqonKA9UX4OLEvAYc4Y2VqgW67ZkSz6xfaNP6m1g1oBy0/zMA7YcdJA==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", @@ -975,10 +2537,9 @@ } }, "@babel/runtime": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", - "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", - "dev": true, + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", + "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", "requires": { "regenerator-runtime": "^0.13.2" } @@ -1307,6 +2868,21 @@ "@types/yargs": "^13.0.0" } }, + "@lavadrop/camel-case": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@lavadrop/camel-case/-/camel-case-0.4.0.tgz", + "integrity": "sha512-1h8sU1aQ0Ms1aAenfRxC45AXAvayqtxyTOt/QNB2dpLQnyaTkT3ejJFNdoucBREmCZRZSZtCFU08Wq3QoMyJaQ==" + }, + "@lavadrop/kebab-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lavadrop/kebab-case/-/kebab-case-3.0.0.tgz", + "integrity": "sha512-16m/BEvXl+e37jHUuIkeynwBbxNlsGvnl0CKwPD37A4V7XhPmOyld0XnY302TEx8+N4D/DonjScrXF91D5JzQw==" + }, + "@lavadrop/pick": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@lavadrop/pick/-/pick-0.8.0.tgz", + "integrity": "sha512-yFzy4SvAhb5Tigya8zuF4+vXxrBWfpCTtkn9gGAQWS6SDfb9mmkCLM7+3PEL70V3upBJBRyJOQDamUaNM2Bkaw==" + }, "@material/animation": { "version": "5.0.0-canary.1c494e567.0", "resolved": "https://registry.npmjs.org/@material/animation/-/animation-5.0.0-canary.1c494e567.0.tgz", @@ -1662,6 +3238,24 @@ "semver": "^5.4.1", "source-map": "^0.5.0" } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", + "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } } } }, @@ -1677,15 +3271,10 @@ "integrity": "sha512-OXeOtHO+eN50QlIkm4Vj4vqNGtowv4FH9L21WvcbEM0eeZrb7aANiFTN70lBQEXcucxCMRkd/6IA9LxhotZEQw==", "dev": true }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } + "@morbidick/lit-element-notify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@morbidick/lit-element-notify/-/lit-element-notify-1.0.2.tgz", + "integrity": "sha512-6yffws7SwHnB2RsRBNYAX6toM9YX8gBJdRqYoXYIOaBMRAuBKl440B0n3Gga4TtEchekpydaM+5ENwsyeKC/PQ==" }, "@nodelib/fs.scandir": { "version": "2.1.3", @@ -1705,12 +3294,6 @@ } } }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, "@nodelib/fs.walk": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", @@ -1722,9 +3305,9 @@ } }, "@open-wc/building-rollup": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@open-wc/building-rollup/-/building-rollup-0.19.0.tgz", - "integrity": "sha512-xx8e67pKDaJc+wEZJlk9puKuSjCMj7rqErr2Cjf2ZYJ1xx9j+AuOYP3Q3tODz0vhKGwYHR34pFEL3U3zcje9ug==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@open-wc/building-rollup/-/building-rollup-0.19.1.tgz", + "integrity": "sha512-+08pTPmnd3Imo0p9CjSHvRf88WdCSpxBKIu3NUkac3vqx3lfjaGWEKeNCzW5crX0FH97k7ZpREUxnwj9XeexVg==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -1741,6 +3324,21 @@ "rollup-plugin-index-html": "^1.7.5", "rollup-plugin-terser": "^5.1.0", "rollup-plugin-workbox": "^4.0.0" + }, + "dependencies": { + "@rollup/plugin-node-resolve": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz", + "integrity": "sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.0", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1" + } + } } }, "@open-wc/building-utils": { @@ -1802,28 +3400,27 @@ } }, "@open-wc/demoing-storybook": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@open-wc/demoing-storybook/-/demoing-storybook-1.5.3.tgz", - "integrity": "sha512-gA32gvrY4TMZz1ZJLirYMtu/owhU6vUPx53wM6NbeyL4lpFg971zLIFyEBetBR9pzyD36vhXT8GOw2SqOElySA==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@open-wc/demoing-storybook/-/demoing-storybook-1.6.4.tgz", + "integrity": "sha512-+QUeYOfPG25nQMWnHmGwFVN6SHpVl1KlwBJNM/UGzkBI82Kh20wuypXXTv7/v4tbnyL8Ncys2TaHNjZeBsQYPA==", "dev": true, "requires": { "@babel/core": "^7.7.2", "@babel/plugin-transform-react-jsx": "^7.3.0", "@mdx-js/mdx": "^1.5.1", - "@open-wc/building-rollup": "^0.19.0", - "@open-wc/storybook-prebuilt": "^0.3.0", - "@storybook/addon-docs": "5.3.0-rc.9", + "@open-wc/building-rollup": "^0.19.1", + "@open-wc/storybook-prebuilt": "^0.4.0", + "@storybook/addon-docs": "5.3.1", "command-line-args": "^5.0.2", "command-line-usage": "^6.1.0", "deepmerge": "^3.2.0", - "es-dev-server": "^1.36.1", + "es-dev-server": "^1.36.2", "es-module-lexer": "^0.3.13", "fs-extra": "^8.1.0", "glob": "^7.1.3", "lit-html": "^1.0.0", "magic-string": "^0.25.4", "rollup": "^1.15.6", - "rollup-plugin-cpy": "^1.1.0", "rollup-plugin-index-html": "^1.7.5" }, "dependencies": { @@ -1836,16 +3433,16 @@ } }, "@open-wc/karma-esm": { - "version": "2.12.5", - "resolved": "https://registry.npmjs.org/@open-wc/karma-esm/-/karma-esm-2.12.5.tgz", - "integrity": "sha512-awyeJtIGE7FVgjLrUg1miAk/tzYWJHANjc/6+5icJ9dW3Jf2jR78/60eao92DsxRYi6NAVI+i5vRiIwNSimHNA==", + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/@open-wc/karma-esm/-/karma-esm-2.12.6.tgz", + "integrity": "sha512-Q9wJq1ua5Jk9XXuvseJQ5ioozIizanzfkbh8gzTnTaZjz0gsaN5J+V7YpdThf2RRevWTmhxrGwfsyxh5efXg9Q==", "dev": true, "requires": { "@open-wc/building-utils": "^2.11.0", "babel-plugin-istanbul": "^5.1.4", "chokidar": "^3.0.0", "deepmerge": "^3.2.0", - "es-dev-server": "^1.36.1", + "es-dev-server": "^1.36.2", "minimatch": "^3.0.4", "node-fetch": "^2.6.0", "portfinder": "^1.0.21", @@ -1866,6 +3463,11 @@ } } }, + "@open-wc/lit-helpers": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@open-wc/lit-helpers/-/lit-helpers-0.2.5.tgz", + "integrity": "sha512-YkBOaQLQnJPKwJlLB15ehNSeYQB+u+jlpJmvhgVwI+9s/bgpfNtd/L/pDui7gDbxFiu7hukQgFtVk9FTklIN2Q==" + }, "@open-wc/semantic-dom-diff": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.15.5.tgz", @@ -1873,9 +3475,9 @@ "dev": true }, "@open-wc/storybook-prebuilt": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-wc/storybook-prebuilt/-/storybook-prebuilt-0.3.0.tgz", - "integrity": "sha512-aNCkZ0sfOVNcCFNhmYgHRDAtKQ0gGf4ADOKdQ10r6AyFR4lQoIGbozI62jl/YIo73jAfOsOcLboySqcHWVvRkQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@open-wc/storybook-prebuilt/-/storybook-prebuilt-0.4.0.tgz", + "integrity": "sha512-39Kfm3bsHPZioWIvQBuc05EvFakvqotVloe2lq0JPXD0iWxOWvWb4h8UKSvFdJY9RAv1p06OFhyEjpuhrZB9Jw==", "dev": true }, "@open-wc/testing": { @@ -1905,15 +3507,15 @@ "dev": true }, "@open-wc/testing-karma": { - "version": "3.2.28", - "resolved": "https://registry.npmjs.org/@open-wc/testing-karma/-/testing-karma-3.2.28.tgz", - "integrity": "sha512-9ulg+lsE6rcx2q9RmaB/+o1y4wdKNCnsg/6fwl0icPFUHV35Wp5WVFDHGRN2VWsBjDLDKLJEFuw9nnIqPm/2tQ==", + "version": "3.2.30", + "resolved": "https://registry.npmjs.org/@open-wc/testing-karma/-/testing-karma-3.2.30.tgz", + "integrity": "sha512-z9tpYOxhHcaPtA3muCpfwvDsQunuziwS4HDm2gV4hEsWFQ97WgbMV9wQAtYHaYxzKGQhk5uWcLNQEe10VUxhpg==", "dev": true, "requires": { - "@open-wc/karma-esm": "^2.12.5", + "@open-wc/karma-esm": "^2.12.6", "axe-core": "^3.3.1", "karma": "^4.1.0", - "karma-chrome-launcher": "^2.0.0", + "karma-chrome-launcher": "^3.1.0", "karma-coverage-istanbul-reporter": "^2.0.0", "karma-mocha": "^1.0.0", "karma-mocha-reporter": "^2.0.0", @@ -1923,6 +3525,11 @@ "mocha": "^6.2.2" } }, + "@pacote/memoize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@pacote/memoize/-/memoize-1.1.1.tgz", + "integrity": "sha512-zKrE5isyPJcUrnYsSXNKie/vfoEf63sjmEEyFmhqWV6KDEl/EfbnKMHrVU9zyYc1ToLFvlZ+V0cfKAv/qqGXqg==" + }, "@power-elements/json-viewer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@power-elements/json-viewer/-/json-viewer-1.0.1.tgz", @@ -1942,10 +3549,23 @@ "warning": "^3.0.0" } }, + "@rollup/plugin-commonjs": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.1.tgz", + "integrity": "sha512-SaVUoaLDg3KnIXC5IBNIspr1APTYDzk05VaYcI6qz+0XX3ZlSCwAkfAhNSOxfd5GAdcm/63Noi4TowOY9MpcDg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.0", + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0" + } + }, "@rollup/plugin-node-resolve": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz", - "integrity": "sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.0.0.tgz", + "integrity": "sha512-+vOx2+WMBMFotYKM3yYeDGZxIvcQ7yO4g+SuKDFsjKaq8Lw3EPgfB6qNlp8Z/3ceDCEhHvC9/b+PgBGwDQGbzQ==", "dev": true, "requires": { "@rollup/pluginutils": "^3.0.0", @@ -2001,9 +3621,9 @@ "dev": true }, "@storybook/addon-docs": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-5.3.0-rc.9.tgz", - "integrity": "sha512-mELAnfOa4S5LL3DijaVRxD77Fps1RFlmCH7qNkZMHxgte/WNHHivsY1oBSyEocISf/e29uPX6hRqGfHW8IHPvg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-5.3.1.tgz", + "integrity": "sha512-bT7gcUeqzCLqvzlLuFr7iQjFkwWGvcMf3yzbFKUEnEMQJ5qwV7o2cw/Tsd6juwrwTmc+X8RkbLkWSO8CeAR0Qg==", "dev": true, "requires": { "@babel/generator": "^7.4.0", @@ -2014,13 +3634,14 @@ "@mdx-js/loader": "^1.5.1", "@mdx-js/mdx": "^1.5.1", "@mdx-js/react": "^1.5.1", - "@storybook/addons": "5.3.0-rc.9", - "@storybook/api": "5.3.0-rc.9", - "@storybook/components": "5.3.0-rc.9", + "@storybook/addons": "5.3.1", + "@storybook/api": "5.3.1", + "@storybook/components": "5.3.1", + "@storybook/core-events": "5.3.1", "@storybook/csf": "0.0.1", - "@storybook/postinstall": "5.3.0-rc.9", - "@storybook/source-loader": "5.3.0-rc.9", - "@storybook/theming": "5.3.0-rc.9", + "@storybook/postinstall": "5.3.1", + "@storybook/source-loader": "5.3.1", + "@storybook/theming": "5.3.1", "acorn": "^7.1.0", "acorn-jsx": "^5.1.0", "acorn-walk": "^7.0.0", @@ -2042,48 +3663,50 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/addons": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.3.0-rc.9.tgz", - "integrity": "sha512-SGlhscovGV+naa2JojVslUGNhv5jwtsdmbYRpbbbEro7nKWypAlJCiIJywXwbBpD/NPKU3BLqjpzKG8/H+/Rpw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.3.1.tgz", + "integrity": "sha512-nQ935Xip8RESY07qgkmPGdpOA0oSTmfqaFvtueHXZAQ3bekth5FJveef4dbi1A3QyZyf3gCy73aQqOkAhKn0MA==", "dev": true, "requires": { - "@storybook/api": "5.3.0-rc.9", - "@storybook/channels": "5.3.0-rc.9", - "@storybook/client-logger": "5.3.0-rc.9", - "@storybook/core-events": "5.3.0-rc.9", + "@storybook/api": "5.3.1", + "@storybook/channels": "5.3.1", + "@storybook/client-logger": "5.3.1", + "@storybook/core-events": "5.3.1", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/api": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.3.0-rc.9.tgz", - "integrity": "sha512-ZTD+mSClE4UHU96m8ma4Gi5Yt503UNdJ2sdNNeB62IdgyxlPeQewP6jTwJzRbSENAhxVGBUaGkBvV4NoVomTZg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.3.1.tgz", + "integrity": "sha512-PKfEH6ZlH8X7+SyJ6kch+ZkMRXhSsz9BdVUeXie7shSjnwN+4hSvNuSxoxZflcp89KsdzLdybZJOE6EFQ3ppSA==", "dev": true, "requires": { - "@storybook/channels": "5.3.0-rc.9", - "@storybook/client-logger": "5.3.0-rc.9", - "@storybook/core-events": "5.3.0-rc.9", + "@reach/router": "^1.2.1", + "@storybook/channels": "5.3.1", + "@storybook/client-logger": "5.3.1", + "@storybook/core-events": "5.3.1", "@storybook/csf": "0.0.1", - "@storybook/router": "5.3.0-rc.9", - "@storybook/theming": "5.3.0-rc.9", + "@storybook/router": "5.3.1", + "@storybook/theming": "5.3.1", + "@types/reach__router": "^1.2.3", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -2099,9 +3722,9 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true }, "semver": { @@ -2113,47 +3736,47 @@ } }, "@storybook/channels": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.3.0-rc.9.tgz", - "integrity": "sha512-7Ml6634OzVlP0UqsbdEOEq9Sgnef1SF30CdhMnxpH6DiWsoVw6uFkIf87xujbIBShJr3VJWc+ZEUNIkuCFXy1A==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.3.1.tgz", + "integrity": "sha512-kftIZsMHhn/BVflzH/Q1c4mgQYVc7jEstmy9hYWuphn9Mf3LdpArtTDtU3ebrNgjO52CHM+Rh4NpByXhpR6HvA==", "dev": true, "requires": { "core-js": "^3.0.1" }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/client-logger": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.3.0-rc.9.tgz", - "integrity": "sha512-zBntQyK+qwrUKhFWbOtvjsN2yuAIY4qZ8AZ6FvQlzJDFzuvGCMhpUkzo87Xa3ZRUlfUChb/6wkLwJIUcYs9poQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.3.1.tgz", + "integrity": "sha512-9CaUdzItrjMU8B0G4stBrbU0CytcQY2NMom7A1YLRBuov+XFBrKv1td+bO9SfBGFCSP5Kw2sKpY6t0vJSdfEow==", "dev": true, "requires": { "core-js": "^3.0.1" }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/components": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.3.0-rc.9.tgz", - "integrity": "sha512-pVox8yn6R2CP+8USVFmLFGaCjsZpDrYj/l6cBRI7swbDenLK0S2JmoFH9K+bVmejKN7nGANi06bdksWE55Pejg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.3.1.tgz", + "integrity": "sha512-Ywr4EYk49boBgse07H6emzLWNa5N0v/57XvSlhiTm/BRcwwNztKSIFWcX+77CIdfcCZMie+77Ce/c8R6XPDIhw==", "dev": true, "requires": { - "@storybook/client-logger": "5.3.0-rc.9", - "@storybook/theming": "5.3.0-rc.9", + "@storybook/client-logger": "5.3.1", + "@storybook/theming": "5.3.1", "@types/react-syntax-highlighter": "11.0.2", "@types/react-textarea-autosize": "^4.3.3", "core-js": "^3.0.1", @@ -2176,26 +3799,26 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/core-events": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.3.0-rc.9.tgz", - "integrity": "sha512-cHpkax3qGRY85m+hmwGhEzvwOi6UNYjpKw9BlFc36v22eWFNs78V+RXViWlsH02yy14sgCupXPMcHbvIjPDYVw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.3.1.tgz", + "integrity": "sha512-ewR8jSeBvCBJJifEN2rvGN9ji2PKEM+AFna2zS/lNuX7WlAN1HdLIDeNEqhaZBqsgOx9w7p6CEPhnnoC7CmZjA==", "dev": true, "requires": { "core-js": "^3.0.1" }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } @@ -2210,26 +3833,26 @@ } }, "@storybook/postinstall": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-5.3.0-rc.9.tgz", - "integrity": "sha512-VTTriX8jGbssqv4LtYgq/qI7GraYRFvjSCOJf1n7NqaCjqwPApQqRcDZ6PbJHbYfHCWseUIP+/sn73IiYZbZZg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-5.3.1.tgz", + "integrity": "sha512-peseUMtIGkuAGnJqzBUPeIcn4i+88IhumRI6ID8kV1DIBtFRYdOXAQyqbcSo2oAfRmlWeIWuFD+de31GmAfisw==", "dev": true, "requires": { "core-js": "^3.0.1" }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/router": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.3.0-rc.9.tgz", - "integrity": "sha512-rbnogvdIQrB7cOShDaX7dcSjknMV+C0TsKtO2ZNFCcAXJcdDE2XgAT9AhdJ8nummo2Cw+CtbIyb6oTDCxLaB8w==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.3.1.tgz", + "integrity": "sha512-rjPH9QSIwIw2pJNADnTVTck2Y0kdGqdvowHtU98vug5Vryf6aNCZO+VOiMJC6wH4mYBjPzKU9O5mNjSttVxJSA==", "dev": true, "requires": { "@reach/router": "^1.2.1", @@ -2244,21 +3867,21 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/source-loader": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-5.3.0-rc.9.tgz", - "integrity": "sha512-osMwEBIhrEjQ72pfqiSZWe2zLheW45AbwVXm+1DMzqgYScIitn1y+d4O94yHPp7S56vX7lJA1vrQDHg4hMj+ag==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-5.3.1.tgz", + "integrity": "sha512-LQED6AJcLgvVT03ErVICt8fVoCZd5EM2XzY7rwVfQ02DZn0jDmDwytLWo9uqvxzF9O5BXatiBI4lcuNsr5CGsQ==", "dev": true, "requires": { - "@storybook/addons": "5.3.0-rc.9", - "@storybook/client-logger": "5.3.0-rc.9", + "@storybook/addons": "5.3.1", + "@storybook/client-logger": "5.3.1", "@storybook/csf": "0.0.1", "core-js": "^3.0.1", "estraverse": "^4.2.0", @@ -2270,22 +3893,22 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, "@storybook/theming": { - "version": "5.3.0-rc.9", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.3.0-rc.9.tgz", - "integrity": "sha512-9IZLqU4jYmGlQ2v4KimJtPDFC2jfoVbkkHNWXg8FxdM5VALEJVZIqrvQan1kW3/xAf1nbD7M6znZbajDNzvUEQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.3.1.tgz", + "integrity": "sha512-eh2QTn1BJ+1U6t3idIXMT/gdlXhqWgyxWxLvjNlLnIGWyOJ9v/G7Ycu7R9RN5BHn237I842iq9gkxdA6r9CCxA==", "dev": true, "requires": { "@emotion/core": "^10.0.20", "@emotion/styled": "^10.0.17", - "@storybook/client-logger": "5.3.0-rc.9", + "@storybook/client-logger": "5.3.1", "core-js": "^3.0.1", "deep-object-diff": "^1.1.0", "emotion-theming": "^10.0.19", @@ -2298,13 +3921,18 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } }, + "@typed/curry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@typed/curry/-/curry-1.0.1.tgz", + "integrity": "sha1-VV1GJLDL8J4QGUUybTu5/8q6NlU=" + }, "@types/babel-types": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz", @@ -2320,6 +3948,12 @@ "@types/babel-types": "*" } }, + "@types/bluebird": { + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.29.tgz", + "integrity": "sha512-kmVtnxTuUuhCET669irqQmPAez4KFnFVKvpleVRyfC3g+SHD1hIkFZcWLim9BVcwUBLO59o8VZE4yGCmTif8Yw==", + "dev": true + }, "@types/chai": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.7.tgz", @@ -2347,23 +3981,6 @@ "integrity": "sha512-rIAmXyJlqw4KEBO7+u9gxZZSQHaCNnIzYrnNmYVpgfJhxTqO0brCX0SYpqUTkVI5mwwUwzmtspLBGBKroMeynA==", "dev": true }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, "@types/history": { "version": "4.7.3", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.3.tgz", @@ -2401,6 +4018,17 @@ "@types/istanbul-lib-report": "*" } }, + "@types/karma": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-3.0.5.tgz", + "integrity": "sha512-VSIO/1tJcfBN6jgXF+fIlHoOxxsijeJHoGMNXnrUF+pYMT8ovXGX7s002Dsppkv5Xkv5GjkptSKrOHv5+gwR8g==", + "dev": true, + "requires": { + "@types/bluebird": "*", + "@types/node": "*", + "log4js": "^4.0.0" + } + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -2500,6 +4128,12 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, + "@types/stripe-v3": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@types/stripe-v3/-/stripe-v3-3.1.14.tgz", + "integrity": "sha512-2hT1xOiS4312NsrT1dYuAM7qvoMcegS12wcQ78e7hdRrzetM4d91QJn6IYWP5qWP5v4Rc4acDfoIR9cbhpSgMA==", + "dev": true + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -2522,9 +4156,15 @@ "dev": true }, "@webcomponents/webcomponentsjs": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.0.tgz", - "integrity": "sha512-kEClEz2nu9/i6SvyBJTV4pCc6CyCzMhK7zEeJ6QhiJoulBp4YZ06Zfj2E2HUXfWfHJIjtKriJYMtfhettKEjEg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.4.1.tgz", + "integrity": "sha512-7jxBb+KoWncKb/JGFyTY40PjV4yRx2zd35ZLuvRP+6WndJDL7X32ZIZ7bN3sSQIl+NzJkCo7chfXJyzn+6WZaQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, "accepts": { @@ -2618,6 +4258,42 @@ } } }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "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 + }, + "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" + } + } + } + }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", @@ -2706,21 +4382,6 @@ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -2866,6 +4527,14 @@ "requires": { "@babel/helper-plugin-utils": "7.0.0", "@mdx-js/util": "^1.5.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } } }, "babel-plugin-bundled-import-meta": { @@ -2912,6 +4581,14 @@ "dev": true, "requires": { "@babel/helper-plugin-utils": "7.0.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + } } }, "babel-plugin-istanbul": { @@ -2934,40 +4611,6 @@ "requires": { "locate-path": "^3.0.0" } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true } } }, @@ -3255,6 +4898,60 @@ } } }, + "bound-decorator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bound-decorator/-/bound-decorator-1.1.0.tgz", + "integrity": "sha512-TrOtz8A3/+zeDe7n4ou9Nbvk0HAHmEaF1ZmdTClxxClZjvpbPSnMqxc5j/LObuCcEtbf4EJgIXV8Kb1jGGq7XA==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "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 + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "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" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3281,14 +4978,14 @@ "dev": true }, "browserslist": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", - "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001015", + "caniuse-lite": "^1.0.30001017", "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.42" + "node-releases": "^1.1.44" } }, "browserslist-useragent": { @@ -3335,6 +5032,12 @@ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, + "buffer-crc32": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.1.1.tgz", + "integrity": "sha1-fhENyZU5CKt8MqzccMn5RbHLxSY=", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -3353,6 +5056,23 @@ "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, + "builtins": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-2.0.1.tgz", + "integrity": "sha512-XkkVe5QAb6guWPXTzpSrYpSlN3nqEmrrE2TkAr/tp7idSF6+MONh9WvKrAuR3HiKLvoSgmbs8l1U9IPmMrIoLw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -3386,12 +5106,6 @@ "ylru": "^1.2.0" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", @@ -3414,6 +5128,12 @@ "upper-case": "^1.1.1" } }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -3439,9 +5159,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001016", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz", - "integrity": "sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA==", + "version": "1.0.30001020", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", + "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", "dev": true }, "capture-exit": { @@ -3453,6 +5173,12 @@ "rsvp": "^4.8.4" } }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -3625,6 +5351,34 @@ } } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz", + "integrity": "sha1-OlrnT9drYmevZm5p4q+70B3vNNE=", + "dev": true, + "requires": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.12", + "es6-iterator": "2", + "memoizee": "^0.4.3", + "timers-ext": "0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3814,14 +5568,6 @@ "dev": true, "requires": { "mime-db": ">= 1.43.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true - } } }, "concat-map": { @@ -3830,6 +5576,31 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -3901,6 +5672,12 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, + "cookie-signature": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-0.0.1.tgz", + "integrity": "sha1-E9NgO1z2O++/haiAHjeqkA20aYU=", + "dev": true + }, "cookies": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", @@ -3932,18 +5709,18 @@ "dev": true }, "core-js-bundle": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.6.2.tgz", - "integrity": "sha512-W1a9Uks77ZBboo7gHt7Gytd/zsIj4EL1Zfad01kJyCuodBY350S5v/9aoOEb+2ZDW8lKdcoeiZvx3FrC6GWN5Q==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.6.3.tgz", + "integrity": "sha512-0oVDPxnqlk47a0i/jS3RLj6PK7kR2GtaPYOxgVLMfnfZXKHIe3j//01Ayn8+hRcf7noNMNlAa5SznG5SmDxPvQ==", "dev": true }, "core-js-compat": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.0.tgz", - "integrity": "sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.3.tgz", + "integrity": "sha512-Y3YNGU3bU1yrnzVodop23ghArbKv4IqkZg9MMOWv/h7KT6NRk1/SzHhWDDlubg2+tlcUzAqgj1/GyeJ9fUKMeg==", "dev": true, "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.8.3", "semver": "7.0.0" }, "dependencies": { @@ -3994,45 +5771,13 @@ } } }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "cpy": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-7.3.0.tgz", - "integrity": "sha512-auvDu6h/J+cO1uqV40ymL/VoPM0+qPpNGaNttTzkYVXO/+GeynuyAK/MwFcWgU/P82ezcZw7RaN34CIIWajKLA==", + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "arrify": "^1.0.1", - "cp-file": "^6.1.0", - "globby": "^9.2.0", - "nested-error-stacks": "^2.1.0" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } + "capture-stack-trace": "^1.0.0" } }, "create-react-context": { @@ -4045,6 +5790,12 @@ "gud": "^1.0.0" } }, + "credit-card-type": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/credit-card-type/-/credit-card-type-8.3.0.tgz", + "integrity": "sha512-czfZUpQ7W9CDxZL4yFLb1kFtM/q2lTOY975hL2aO+DC8+GRNDVSXVCHXhVFZPxiUKmQCZbFP8vIhxx5TBQaThw==", + "dev": true + }, "crocks": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.4.tgz", @@ -4070,6 +5821,12 @@ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", "dev": true }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "csstype": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", @@ -4082,6 +5839,16 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -4294,15 +6061,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4385,6 +6143,21 @@ "domelementtype": "1" } }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4402,9 +6175,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.322", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", - "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", + "version": "1.3.332", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", + "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==", "dev": true }, "emoji-regex": { @@ -4587,9 +6360,9 @@ } }, "es-dev-server": { - "version": "1.36.1", - "resolved": "https://registry.npmjs.org/es-dev-server/-/es-dev-server-1.36.1.tgz", - "integrity": "sha512-v4GdhTheVDz3MS5Zp0PBncuHIr8lccWbwSIdrr+Ds7cH34lNv/XQN/zdoSdBsb7OiCTNRYIHqF+pPdcy/jAqJA==", + "version": "1.36.2", + "resolved": "https://registry.npmjs.org/es-dev-server/-/es-dev-server-1.36.2.tgz", + "integrity": "sha512-pWMJcsdUcXXCJPRuqnjI2JNLVSDRfjU4qkBd7EsNG8yn1UnmvJF8wTnHgWzkwyHB3wrg4/b7hQJCAXcYaW2XUw==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -4636,6 +6409,19 @@ "whatwg-url": "^7.0.0" }, "dependencies": { + "@rollup/plugin-node-resolve": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-6.1.0.tgz", + "integrity": "sha512-Cv7PDIvxdE40SWilY5WgZpqfIUEaDxFxs89zCAHjqyRwlTSuql4M5hjIuc5QYJkOH0/vyiyNXKD72O+LhRipGA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.0", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.11.1" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -4688,6 +6474,50 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4821,6 +6651,12 @@ "integrity": "sha1-6B/stOqvSUqSbZyrqafNhNH+3n0=", "dev": true }, + "eslint-plugin-no-only-tests": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.4.0.tgz", + "integrity": "sha512-azP9PwQYfGtXJjW273nIxQH9Ygr+5/UyeW2wEjYoDtVYPI+WPKwbj0+qcAKYUXFZLRumq4HKkFaoDBAwBoXImQ==", + "dev": true + }, "eslint-scope": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", @@ -4905,6 +6741,16 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "eventemitter3": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", @@ -4982,6 +6828,104 @@ } } }, + "express": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/express/-/express-3.0.6.tgz", + "integrity": "sha1-0nT8uGi5V4i/SvYhaNddE/132LQ=", + "dev": true, + "requires": { + "buffer-crc32": "0.1.1", + "commander": "0.6.1", + "connect": "2.7.2", + "cookie": "0.0.5", + "cookie-signature": "0.0.1", + "debug": "*", + "fresh": "0.1.0", + "methods": "0.0.1", + "mkdirp": "0.3.3", + "range-parser": "0.0.4", + "send": "0.1.0" + }, + "dependencies": { + "bytes": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.1.0.tgz", + "integrity": "sha1-xXSBIigSbWNp0VdpJahXnbP45aI=", + "dev": true + }, + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "connect": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.7.2.tgz", + "integrity": "sha1-EXmUY72qr5nV+b7xM78kILJuJoA=", + "dev": true, + "requires": { + "buffer-crc32": "0.1.1", + "bytes": "0.1.0", + "cookie": "0.0.5", + "cookie-signature": "0.0.1", + "debug": "*", + "formidable": "1.0.11", + "fresh": "0.1.0", + "pause": "0.0.1", + "qs": "0.5.1", + "send": "0.1.0" + } + }, + "cookie": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz", + "integrity": "sha1-+az521frdWjJ/MWWJWt7si4wfIE=", + "dev": true + }, + "fresh": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", + "integrity": "sha1-A+SwF4Qk5MLV0ZpU2IFM3JeTSFA=", + "dev": true + }, + "mkdirp": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.3.tgz", + "integrity": "sha1-WV4lHBNww6aLqyE20ONIuBBa3xM=", + "dev": true + }, + "qs": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.1.tgz", + "integrity": "sha1-n2v12axsdjhOldNtFbSJgOXkrdA=", + "dev": true + }, + "range-parser": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "integrity": "sha1-wEJ//vUcEKy6B4KkbJYC50T/Ygs=", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5097,43 +7041,6 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5197,9 +7104,9 @@ } }, "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" @@ -5349,6 +7256,29 @@ } } }, + "find-yarn-workspace-root": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz", + "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==", + "dev": true, + "requires": { + "fs-extra": "^4.0.3", + "micromatch": "^3.1.4" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -5387,9 +7317,9 @@ "dev": true }, "flow-parser": { - "version": "0.115.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.115.0.tgz", - "integrity": "sha512-iasokPUPxp4ojhMaxN215jgp9VFliai+2YVLW3gXN5Yhb/t+QC7Z/CaKBwrrWqainfnl9SH+gr3mSGoq+IXWLQ==", + "version": "0.116.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.116.0.tgz", + "integrity": "sha512-sHiUjYI9U7H94diCN8BdzwYFJIkyCy2GN73UDFbKHTIuLdfROfZZwD6jAv2qWMl7lcPrBK9YAVeArLLbekxVeg==", "dev": true }, "focus-lock": { @@ -5447,6 +7377,12 @@ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", "dev": true }, + "formidable": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.11.tgz", + "integrity": "sha1-aPYzJaA15kS297s9ESQ7l2HeGzA=", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -5462,15 +7398,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -5507,6 +7434,12 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5589,12 +7522,6 @@ "is-glob": "^4.0.1" } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, "global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -5605,36 +7532,21 @@ "process": "^0.11.10" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, "good-listener": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", @@ -5645,6 +7557,33 @@ "delegate": "^3.1.2" } }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -5653,35 +7592,15 @@ }, "growl": { "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", - "dev": true - }, - "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "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 - } - } + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==", + "dev": true }, "har-schema": { "version": "2.0.0", @@ -5919,6 +7838,12 @@ "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, "html-minifier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", @@ -6046,6 +7971,12 @@ } } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6074,6 +8005,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", @@ -6081,9 +8018,9 @@ "dev": true }, "inquirer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.1.tgz", - "integrity": "sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", + "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -6371,12 +8308,28 @@ "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==", "dev": true }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6389,6 +8342,15 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, "is-plain-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz", @@ -6410,6 +8372,12 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, "is-reference": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", @@ -6442,6 +8410,12 @@ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -6494,9 +8468,9 @@ "dev": true }, "isbinaryfile": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.3.tgz", - "integrity": "sha512-GQ9Gjhp3AsEbo8/L/pA+MYl/c4hRm5O/+uCkF4LMx1a556Wh4/d75H13qu9LldmhU4yKnlfNKBmEcCaze3b2Gw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.4.tgz", + "integrity": "sha512-pEutbN134CzcjlLS1myKX/uxNjwU5eBVSprvkpv3+3dqhBHUZLIWJQowC40w5c0Zf19vBY8mrZl88y5J4RAPbQ==", "dev": true }, "isexe": { @@ -6639,12 +8613,12 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0" } }, "jest-haste-map": { @@ -7332,12 +9306,6 @@ } } }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -7587,12 +9555,11 @@ } }, "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "requires": { - "fs-access": "^1.0.0", "which": "^1.2.1" } }, @@ -7606,6 +9573,15 @@ "minimatch": "^3.0.4" } }, + "karma-helpful-reporter": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/karma-helpful-reporter/-/karma-helpful-reporter-0.3.4.tgz", + "integrity": "sha1-FPYdNj/2eK+fgAqAHd4Fxh8x4Cs=", + "dev": true, + "requires": { + "cli-color": "1.2.0" + } + }, "karma-mocha": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", @@ -7649,6 +9625,15 @@ "integrity": "sha1-yv5tJz+pk156rsEvW0W25fJN6oY=", "dev": true }, + "karma-osx-reporter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/karma-osx-reporter/-/karma-osx-reporter-0.2.1.tgz", + "integrity": "sha1-LHVvq9VmqjHfa31ktciXXth1upg=", + "dev": true, + "requires": { + "node-osx-notifier": ">= 0.1.0" + } + }, "karma-snapshot": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/karma-snapshot/-/karma-snapshot-0.6.0.tgz", @@ -7762,6 +9747,15 @@ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, "koa": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/koa/-/koa-2.11.0.tgz", @@ -7910,12 +9904,36 @@ } } }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", + "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -7979,6 +9997,16 @@ } } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -8009,12 +10037,6 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8110,6 +10132,12 @@ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", "dev": true }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lowlight": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.11.0.tgz", @@ -8129,6 +10157,21 @@ "yallist": "^3.0.2" } }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "luhn-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/luhn-js/-/luhn-js-1.1.2.tgz", + "integrity": "sha512-GdINoHY50s4Zkhvmt6Pss/8ZwVxIOLsMHuJCg6EDcT1heSt4hM2V+7aKCihemn8rI0n22+lxqomzgvWDzMyEuQ==", + "dev": true + }, "magic-string": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.5.tgz", @@ -8298,6 +10341,22 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, "memoizerific": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", @@ -8325,6 +10384,12 @@ "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", "dev": true }, + "methods": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", + "integrity": "sha1-J3yQ+L7zlwlkWoNxxRw7bGSOBow=", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -8443,18 +10508,18 @@ "dev": true }, "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", "dev": true }, "mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, "requires": { - "mime-db": "1.42.0" + "mime-db": "1.43.0" } }, "mimic-fn": { @@ -8740,10 +10805,10 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, "nice-try": { @@ -8816,10 +10881,19 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, + "node-osx-notifier": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/node-osx-notifier/-/node-osx-notifier-0.1.0.tgz", + "integrity": "sha1-/OAftXepz4qounLsYApHNjsMzes=", + "dev": true, + "requires": { + "express": "3.0.x" + } + }, "node-releases": { - "version": "1.1.43", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.43.tgz", - "integrity": "sha512-Rmfnj52WNhvr83MvuAWHEqXVoZXCcDQssSOffU4n4XOL9sPrP61mSZ88g25NqmABDvH7PiAlFCzoSCSdzA293w==", + "version": "1.1.45", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", + "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", "dev": true, "requires": { "semver": "^6.3.0" @@ -8877,12 +10951,6 @@ "path-key": "^2.0.0" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9082,6 +11150,42 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -9160,11 +11264,48 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "patch-package": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.0.tgz", + "integrity": "sha512-HWlQflaBBMjLBfOWomfolF8aqsFDeNbSNro1JDUgYqnVvPM5OILJ9DQdwIRiKmGaOsmHvhkl1FYkvv1I9r2ZJw==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^1.2.1", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.0", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } }, "path-exists": { "version": "3.0.0", @@ -9228,6 +11369,12 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -9278,40 +11425,6 @@ "requires": { "locate-path": "^3.0.0" } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true } } }, @@ -9364,6 +11477,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -9377,9 +11496,9 @@ "dev": true }, "prismjs": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.18.0.tgz", - "integrity": "sha512-N0r3i/Cto516V8+GKKamhsPVZSFcO0TMUBtIDW6uq6BVqoC3FNtZVZ+cmH16N2XtGQlgRN+sFUTjOdCsEP51qw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz", + "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==", "dev": true, "requires": { "clipboard": "^2.0.0" @@ -9439,9 +11558,9 @@ "dev": true }, "psl": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", - "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", "dev": true }, "pug": { @@ -9508,23 +11627,6 @@ "uglify-js": "^2.6.1" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -9535,24 +11637,6 @@ "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } } } }, @@ -9691,6 +11775,18 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, "react": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", @@ -9875,6 +11971,27 @@ "path-type": "^3.0.0" } }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -9976,8 +12093,7 @@ "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "dev": true + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" }, "regenerator-transform": { "version": "0.14.1", @@ -10028,6 +12144,25 @@ "unicode-match-property-value-ecmascript": "^1.1.0" } }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, "regjsgen": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", @@ -10119,6 +12254,12 @@ "source-map": "^0.5.0" } }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", @@ -10128,6 +12269,15 @@ "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.7.4" } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", + "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } } } }, @@ -10383,6 +12533,18 @@ "acorn": "^7.1.0" } }, + "rollup-plugin-auto-external": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-auto-external/-/rollup-plugin-auto-external-2.0.0.tgz", + "integrity": "sha512-HQM3ZkZYfSam1uoZtAB9sK26EiAsfs1phrkf91c/YX+S07wugyRXSigBxrIwiLr5EPPilKYmoMxsrnlGBsXnuQ==", + "dev": true, + "requires": { + "builtins": "^2.0.0", + "read-pkg": "^3.0.0", + "safe-resolve": "^1.0.0", + "semver": "^5.5.0" + } + }, "rollup-plugin-babel": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.3.3.tgz", @@ -10393,31 +12555,6 @@ "rollup-pluginutils": "^2.8.1" } }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-cpy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-cpy/-/rollup-plugin-cpy-1.1.0.tgz", - "integrity": "sha512-QfRVnEvf06kYDVwZUYyDInQ8Xjd2Y8EIsazuMsUXskV4g7VKYz2kojJaqs0Ew5qfpyL3J9MjONE5mGfu93q5sw==", - "dev": true, - "requires": { - "chalk": "^2.3.2", - "cpy": "^7.0.1", - "lodash.isobject": "^3.0.2", - "mkdirp": "^0.5.1" - } - }, "rollup-plugin-index-html": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/rollup-plugin-index-html/-/rollup-plugin-index-html-1.7.5.tgz", @@ -10442,30 +12579,27 @@ } } }, - "rollup-plugin-node-resolve": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz", - "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==", + "rollup-plugin-lit-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-lit-css/-/rollup-plugin-lit-css-2.0.0.tgz", + "integrity": "sha512-6mwYmL+WUD7wOi9xuB1CC0dxV1KVcu3gQPBcpARiJurEMwg0w2YRTasCWF3UapTlVU/RKXdsQyqifk1GHmPsNA==", "dev": true, "requires": { - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.11.1", - "rollup-pluginutils": "^2.8.1" + "rollup-pluginutils": "^2.3.3", + "uglifycss": "0.0.29" } }, "rollup-plugin-terser": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.1.3.tgz", - "integrity": "sha512-FuFuXE5QUJ7snyxHLPp/0LFXJhdomKlIx/aK7Tg88Yubsx/UU/lmInoJafXJ4jwVVNcORJ1wRUC5T9cy5yk0wA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.2.0.tgz", + "integrity": "sha512-jQI+nYhtDBc9HFRBz8iGttQg7li9klmzR62RG2W2nN6hJ/FI2K2ItYQ7kJ7/zn+vs+BP1AEccmVRjRN989I+Nw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "jest-worker": "^24.6.0", - "rollup-pluginutils": "^2.8.1", + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", "serialize-javascript": "^2.1.2", - "terser": "^4.1.0" + "terser": "^4.6.2" } }, "rollup-plugin-workbox": { @@ -10509,9 +12643,9 @@ "dev": true }, "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -10532,6 +12666,12 @@ "ret": "~0.1.10" } }, + "safe-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-resolve/-/safe-resolve-1.0.0.tgz", + "integrity": "sha1-/jT40p16O+z9JJ0KqKeZtcPPZVk=", + "dev": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -10599,6 +12739,47 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "send": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.1.0.tgz", + "integrity": "sha1-z7COvTzsm3/Bo32f+eh1qXHPRkA=", + "dev": true, + "requires": { + "debug": "*", + "fresh": "0.1.0", + "mime": "1.2.6", + "range-parser": "0.0.4" + }, + "dependencies": { + "fresh": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", + "integrity": "sha1-A+SwF4Qk5MLV0ZpU2IFM3JeTSFA=", + "dev": true + }, + "mime": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.6.tgz", + "integrity": "sha1-sfhsdowCX6h7SAdfFwnyiuryA2U=", + "dev": true + }, + "range-parser": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "integrity": "sha1-wEJ//vUcEKy6B4KkbJYC50T/Ygs=", + "dev": true + } + } + }, "serialize-javascript": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", @@ -10700,9 +12881,9 @@ }, "dependencies": { "core-js": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.2.tgz", - "integrity": "sha512-hIE5dXkRzRvnZ5vhkRfQxUvDxQZmD9oueA08jDYRBKJHx+VIl/Pne/e0A4x9LObEEthC/TqiZybUoNM4tRgnKg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.3.tgz", + "integrity": "sha512-DOO9b18YHR+Wk5kJ/c5YFbXuUETreD4TrvXb6edzqZE3aAEd0eJIAWghZ9HttMuiON8SVCnU3fqA4rPxRDD1HQ==", "dev": true } } @@ -11342,6 +13523,21 @@ "inline-style-parser": "0.1.1" } }, + "stylelint-config-recommended": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", + "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", + "dev": true + }, + "stylelint-config-standard": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-19.0.0.tgz", + "integrity": "sha512-VvcODsL1PryzpYteWZo2YaA5vU/pWfjqBpOvmeA8iB2MteZ/ZhI1O4hnrWMidsS4vmEJpKtjdhLdfGJmmZm6Cg==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^3.0.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -11433,10 +13629,69 @@ } } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "terser": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.1.tgz", - "integrity": "sha512-w0f2OWFD7ka3zwetgVAhNMeyzEbj39ht2Tb0qKflw9PmW9Qbo5tjTh01QJLkhO9t9RDDQYvk+WXqpECI2C6i2A==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", + "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", "dev": true, "requires": { "commander": "^2.20.0", @@ -11462,61 +13717,6 @@ "minimatch": "^3.0.4", "read-pkg-up": "^4.0.0", "require-main-filename": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - } } }, "text-table": { @@ -11549,6 +13749,22 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", @@ -11738,6 +13954,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -11794,9 +14016,9 @@ "dev": true }, "uglify-js": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.2.tgz", - "integrity": "sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA==", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.5.tgz", + "integrity": "sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg==", "dev": true, "requires": { "commander": "~2.20.3", @@ -11818,6 +14040,12 @@ "dev": true, "optional": true }, + "uglifycss": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/uglifycss/-/uglifycss-0.0.29.tgz", + "integrity": "sha512-J2SQ2QLjiknNGbNdScaNZsXgmMGI0kYNrXaDlr4obnPW9ni1jljb1NeEVWAiTgZ8z+EBWP2ozfT9vpy03rjlMQ==", + "dev": true + }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", @@ -11887,6 +14115,15 @@ "set-value": "^2.0.1" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "unist-builder": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz", @@ -12048,6 +14285,47 @@ } } }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + } + } + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -12069,6 +14347,15 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -12259,9 +14546,9 @@ "dev": true }, "vue-docgen-api": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.4.2.tgz", - "integrity": "sha512-UvEYohFGCpivVb10T3aypu1YGoCtlgrFkSSjoGKTj8vD0McKRE3+NywsE6Wr1dBjyReaBLyh6U0AudJp0P7HXg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.4.3.tgz", + "integrity": "sha512-Js/97zx25SckkkkwLlxWDQ7VCyxn96oCGTnbEnWtL7UcxZ+dmPZ2a30xdgQ4E5OidMLTi423TaZxCS2ns9glZA==", "dev": true, "requires": { "@babel/parser": "7.5.5", @@ -12593,6 +14880,42 @@ } } }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.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 + }, + "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" + } + } + } + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -12624,9 +14947,9 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true }, "wordwrapjs": { @@ -12868,6 +15191,12 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", @@ -12901,6 +15230,31 @@ "@babel/runtime": "^7.6.3" } }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + } + } + }, "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", diff --git a/package.json b/package.json index 42314b9..4746f3f 100644 --- a/package.json +++ b/package.json @@ -4,23 +4,23 @@ "description": "Web Component wrapper for stripe elements", "main": "stripe-elements.js", "module": "stripe-elements.js", - "type": "module", "directories": { "test": "test" }, "scripts": { + "postinstall": "patch-package", "prepare": "npm run build", - "build": "run-p build:*", + "build": "run-p build:**", "build:rollup": "rollup -c", - "build:analyze:json": "wca analyze src/StripeElements.js --outFile custom-elements.json", - "build:analyze:markdown": "wca analyze src/StripeElements.js --outFile README.md", + "build:analyze:json": "wca analyze src/*.js --outFile custom-elements.json", + "build:analyze:markdown": "wca analyze src/*.js --outFile README.md", "test": "karma start --coverage", - "test:watch": "karma start --auto-watch=true --single-run=false", + "test:watch": "karma start --auto-watch=true --single-run=false --reporters mocha,osx", "test:update-snapshots": "karma start --update-snapshots", "test:prune-snapshots": "karma start --prune-snapshots", "site:build": "npm run storybook:build", "storybook": "start-storybook --node-resolve --watch --open --babel", - "storybook:build": "build-storybook", + "storybook:build": "mv .babelrc bak && build-storybook && mv bak .babelrc", "watch": "rollup -cw" }, "repository": { @@ -52,17 +52,28 @@ "homepage": "https://github.com/bennypowers/stripe-elements#readme", "devDependencies": { "@apollo-elements/eslint-config": "^1.1.1", - "@babel/core": "^7.7.7", - "@babel/plugin-proposal-class-properties": "^7.7.4", - "@babel/preset-env": "^7.7.7", + "@babel/core": "^7.8.0", + "@babel/plugin-proposal-class-properties": "^7.8.0", + "@babel/plugin-proposal-decorators": "^7.8.0", + "@babel/plugin-proposal-dynamic-import": "^7.8.0", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-transform-runtime": "^7.8.3", + "@babel/preset-env": "^7.8.2", "@material/mwc-button": "^0.12.0", "@material/mwc-textfield": "^0.12.0", - "@open-wc/demoing-storybook": "^1.5.3", + "@open-wc/demoing-storybook": "^1.6.4", "@open-wc/testing": "^2.5.0", - "@open-wc/testing-karma": "^3.2.28", + "@open-wc/testing-karma": "^3.2.30", "@power-elements/json-viewer": "^1.0.1", + "@rollup/plugin-commonjs": "^11.0.1", + "@rollup/plugin-node-resolve": "^7.0.0", + "@types/karma": "^3.0.5", + "@types/stripe-v3": "^3.1.14", "babel-eslint": "^10.0.3", + "bound-decorator": "^1.1.0", "chai-things": "^0.2.0", + "credit-card-type": "^8.3.0", "crocks": "^0.12.4", "deepmerge": "^4.2.2", "eslint": "^6.8.0", @@ -70,16 +81,29 @@ "eslint-plugin-html": "^6.0.0", "eslint-plugin-json": "^2.0.1", "eslint-plugin-no-loops": "^0.3.0", + "eslint-plugin-no-only-tests": "^2.4.0", + "karma-helpful-reporter": "^0.3.4", + "karma-osx-reporter": "^0.2.1", + "luhn-js": "^1.1.2", "npm-run-all": "^4.1.5", + "patch-package": "^6.2.0", "rollup": "^1.29.0", "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-lit-css": "^2.0.0", "sinon": "^8.0.4", "sinon-chai": "^3.4.0", + "stylelint-config-standard": "^19.0.0", "web-component-analyzer": "^1.0.1" }, "dependencies": { + "@babel/runtime": "^7.8.3", + "@lavadrop/camel-case": "^0.4.0", + "@lavadrop/kebab-case": "^3.0.0", + "@lavadrop/pick": "^0.8.0", + "@morbidick/lit-element-notify": "^1.0.2", + "@open-wc/lit-helpers": "^0.2.5", + "@pacote/memoize": "^1.1.1", + "@typed/curry": "^1.0.1", "lit-element": "^2.2.1" } } diff --git a/patches/@morbidick+lit-element-notify+1.0.2.patch b/patches/@morbidick+lit-element-notify+1.0.2.patch new file mode 100644 index 0000000..c59d897 --- /dev/null +++ b/patches/@morbidick+lit-element-notify+1.0.2.patch @@ -0,0 +1,29 @@ +diff --git a/node_modules/@morbidick/lit-element-notify/notify.js b/node_modules/@morbidick/lit-element-notify/notify.js +index b6790b2..6694eb1 100644 +--- a/node_modules/@morbidick/lit-element-notify/notify.js ++++ b/node_modules/@morbidick/lit-element-notify/notify.js +@@ -1,3 +1,4 @@ ++import { LitElement } from 'lit-element'; + /** + * Returns the event name for the given property. + */ +@@ -25,7 +26,7 @@ export const LitNotify = (baseElement) => class extends baseElement { + static createProperty(name, options) { + super.createProperty(name, options); + +- if (!this.hasOwnProperty('_propertyEventMap')) { ++ if (!this._propertyEventMap) { + this._propertyEventMap = new Map(); + } + +@@ -50,8 +51,8 @@ export const LitNotify = (baseElement) => class extends baseElement { + detail: { + value: this[eventProp], + }, +- bubbles: false, +- composed: true, ++ bubbles: true, ++ composed: false, + })); + } + } diff --git a/patches/bound-decorator+1.1.0.patch b/patches/bound-decorator+1.1.0.patch new file mode 100644 index 0000000..e8b9f8f --- /dev/null +++ b/patches/bound-decorator+1.1.0.patch @@ -0,0 +1,17 @@ +diff --git a/node_modules/bound-decorator/src/bound.js b/node_modules/bound-decorator/src/bound.js +index af3e290..09b6dbc 100644 +--- a/node_modules/bound-decorator/src/bound.js ++++ b/node_modules/bound-decorator/src/bound.js +@@ -1,11 +1,4 @@ +-'use strict' +- +-Object.defineProperty(exports, '__esModule', { +- value: true +-}) +-exports.default = bound +- +-function bound(elementDescriptor) { ++export default function bound(elementDescriptor) { + const { kind, key, descriptor } = elementDescriptor + if (kind !== 'method') { + throw Error('@bound decorator can only be used on methods') diff --git a/patches/credit-card-type+8.3.0.patch b/patches/credit-card-type+8.3.0.patch new file mode 100644 index 0000000..6f39fc8 --- /dev/null +++ b/patches/credit-card-type+8.3.0.patch @@ -0,0 +1,546 @@ +diff --git a/node_modules/credit-card-type/.DS_Store b/node_modules/credit-card-type/.DS_Store +new file mode 100644 +index 0000000..a9a2687 +Binary files /dev/null and b/node_modules/credit-card-type/.DS_Store differ +diff --git a/node_modules/credit-card-type/index.js b/node_modules/credit-card-type/index.js +index f3b5c28..f77a70d 100644 +--- a/node_modules/credit-card-type/index.js ++++ b/node_modules/credit-card-type/index.js +@@ -1,15 +1,13 @@ +-'use strict'; ++import types from './lib/card-types'; ++import clone from './lib/clone'; ++import findBestMatch from './lib/find-best-match'; ++import isValidInputType from './lib/is-valid-input-type'; ++import addMatchingCardsToResults from './lib/add-matching-cards-to-results'; + +-var types = require('./lib/card-types'); +-var clone = require('./lib/clone'); +-var findBestMatch = require('./lib/find-best-match'); +-var isValidInputType = require('./lib/is-valid-input-type'); +-var addMatchingCardsToResults = require('./lib/add-matching-cards-to-results'); ++let testOrder; ++let customCards = {}; + +-var testOrder; +-var customCards = {}; +- +-var cardNames = { ++const cardNames = { + VISA: 'visa', + MASTERCARD: 'mastercard', + AMERICAN_EXPRESS: 'american-express', +@@ -21,10 +19,10 @@ var cardNames = { + ELO: 'elo', + MIR: 'mir', + HIPER: 'hiper', +- HIPERCARD: 'hipercard' ++ HIPERCARD: 'hipercard', + }; + +-var ORIGINAL_TEST_ORDER = [ ++const ORIGINAL_TEST_ORDER = [ + cardNames.VISA, + cardNames.MASTERCARD, + cardNames.AMERICAN_EXPRESS, +@@ -36,7 +34,7 @@ var ORIGINAL_TEST_ORDER = [ + cardNames.ELO, + cardNames.MIR, + cardNames.HIPER, +- cardNames.HIPERCARD ++ cardNames.HIPERCARD, + ]; + + testOrder = clone(ORIGINAL_TEST_ORDER); +@@ -46,24 +44,24 @@ function findType(type) { + } + + function getAllCardTypes() { +- return testOrder.map(function (type) { ++ return testOrder.map(function(type) { + return clone(findType(type)); + }); + } + + function getCardPosition(name, ignoreErrorForNotExisting) { +- var position = testOrder.indexOf(name); ++ const position = testOrder.indexOf(name); + + if (!ignoreErrorForNotExisting && position === -1) { +- throw new Error('"' + name + '" is not a supported card type.'); ++ throw new Error(`"${name}" is not a supported card type.`); + } + + return position; + } + +-function creditCardType(cardNumber) { +- var bestMatch; +- var results = []; ++export default function creditCardType(cardNumber) { ++ let bestMatch; ++ const results = []; + + if (!isValidInputType(cardNumber)) { + return []; +@@ -73,8 +71,8 @@ function creditCardType(cardNumber) { + return getAllCardTypes(testOrder); + } + +- testOrder.forEach(function (type) { +- var cardConfiguration = findType(type); ++ testOrder.forEach(function(type) { ++ const cardConfiguration = findType(type); + + addMatchingCardsToResults(cardNumber, cardConfiguration, results); + }); +@@ -88,18 +86,18 @@ function creditCardType(cardNumber) { + return results; + } + +-creditCardType.getTypeInfo = function (type) { ++export function getTypeInfo(type) { + return clone(findType(type)); + }; + +-creditCardType.removeCard = function (name) { +- var position = getCardPosition(name); ++export function removeCard(name) { ++ const position = getCardPosition(name); + + testOrder.splice(position, 1); + }; + +-creditCardType.addCard = function (config) { +- var existingCardPosition = getCardPosition(config.type, true); ++export function addCard(config) { ++ const existingCardPosition = getCardPosition(config.type, true); + + customCards[config.type] = config; + +@@ -108,12 +106,12 @@ creditCardType.addCard = function (config) { + } + }; + +-creditCardType.updateCard = function (cardType, updates) { +- var clonedCard; +- var originalObject = customCards[cardType] || types[cardType]; ++export function updateCard(cardType, updates) { ++ let clonedCard; ++ const originalObject = customCards[cardType] || types[cardType]; + + if (!originalObject) { +- throw new Error('"' + cardType + '" is not a recognized type. Use `addCard` instead.'); ++ throw new Error(`"${cardType}" is not a recognized type. Use \`addCard\` instead.`); + } + + if (updates.type && originalObject.type !== updates.type) { +@@ -122,7 +120,7 @@ creditCardType.updateCard = function (cardType, updates) { + + clonedCard = clone(originalObject, true); + +- Object.keys(clonedCard).forEach(function (key) { ++ Object.keys(clonedCard).forEach(function(key) { + if (updates[key]) { + clonedCard[key] = updates[key]; + } +@@ -131,18 +129,28 @@ creditCardType.updateCard = function (cardType, updates) { + customCards[clonedCard.type] = clonedCard; + }; + +-creditCardType.changeOrder = function (name, position) { +- var currentPosition = getCardPosition(name); ++export function changeOrder(name, position) { ++ const currentPosition = getCardPosition(name); + + testOrder.splice(currentPosition, 1); + testOrder.splice(position, 0, name); + }; + +-creditCardType.resetModifications = function () { ++export function resetModifications() { + testOrder = clone(ORIGINAL_TEST_ORDER); + customCards = {}; + }; + +-creditCardType.types = cardNames; ++creditCardType.getTypeInfo = getTypeInfo ++ ++creditCardType.removeCard = removeCard ++ ++creditCardType.addCard = addCard + +-module.exports = creditCardType; ++creditCardType.updateCard = updateCard ++ ++creditCardType.changeOrder = changeOrder ++ ++creditCardType.resetModifications = resetModifications ++ ++creditCardType.types = cardNames; +diff --git a/node_modules/credit-card-type/lib/add-matching-cards-to-results.js b/node_modules/credit-card-type/lib/add-matching-cards-to-results.js +index 4b6efae..712d25f 100644 +--- a/node_modules/credit-card-type/lib/add-matching-cards-to-results.js ++++ b/node_modules/credit-card-type/lib/add-matching-cards-to-results.js +@@ -1,10 +1,8 @@ +-'use strict'; ++import clone from './clone'; ++import matches from './matches'; + +-var clone = require('./clone'); +-var matches = require('./matches'); +- +-function addMatchingCardsToResults(cardNumber, cardConfiguration, results) { +- var i, pattern, patternLength, clonedCardConfiguration; ++export default function addMatchingCardsToResults(cardNumber, cardConfiguration, results) { ++ let i; let pattern; let patternLength; let clonedCardConfiguration; + + for (i = 0; i < cardConfiguration.patterns.length; i++) { + pattern = cardConfiguration.patterns[i]; +@@ -29,5 +27,3 @@ function addMatchingCardsToResults(cardNumber, cardConfiguration, results) { + break; + } + } +- +-module.exports = addMatchingCardsToResults; +diff --git a/node_modules/credit-card-type/lib/card-types.js b/node_modules/credit-card-type/lib/card-types.js +index 03480d4..86d94c6 100644 +--- a/node_modules/credit-card-type/lib/card-types.js ++++ b/node_modules/credit-card-type/lib/card-types.js +@@ -1,20 +1,18 @@ +-'use strict'; +- +-var cardTypes = { +- visa: { ++export default { ++ 'visa': { + niceType: 'Visa', + type: 'visa', + patterns: [ +- 4 ++ 4, + ], + gaps: [4, 8, 12], + lengths: [16, 18, 19], + code: { + name: 'CVV', +- size: 3 +- } ++ size: 3, ++ }, + }, +- mastercard: { ++ 'mastercard': { + niceType: 'Mastercard', + type: 'mastercard', + patterns: [ +@@ -23,28 +21,28 @@ var cardTypes = { + [223, 229], + [23, 26], + [270, 271], +- 2720 ++ 2720, + ], + gaps: [4, 8, 12], + lengths: [16], + code: { + name: 'CVC', +- size: 3 +- } ++ size: 3, ++ }, + }, + 'american-express': { + niceType: 'American Express', + type: 'american-express', + patterns: [ + 34, +- 37 ++ 37, + ], + gaps: [4, 10], + lengths: [15], + code: { + name: 'CID', +- size: 4 +- } ++ size: 4, ++ }, + }, + 'diners-club': { + niceType: 'Diners Club', +@@ -53,46 +51,46 @@ var cardTypes = { + [300, 305], + 36, + 38, +- 39 ++ 39, + ], + gaps: [4, 10], + lengths: [14, 16, 19], + code: { + name: 'CVV', +- size: 3 +- } ++ size: 3, ++ }, + }, +- discover: { ++ 'discover': { + niceType: 'Discover', + type: 'discover', + patterns: [ + 6011, + [644, 649], +- 65 ++ 65, + ], + gaps: [4, 8, 12], + lengths: [16, 19], + code: { + name: 'CID', +- size: 3 +- } ++ size: 3, ++ }, + }, +- jcb: { ++ 'jcb': { + niceType: 'JCB', + type: 'jcb', + patterns: [ + 2131, + 1800, +- [3528, 3589] ++ [3528, 3589], + ], + gaps: [4, 8, 12], + lengths: [16, 17, 18, 19], + code: { + name: 'CVV', +- size: 3 +- } ++ size: 3, ++ }, + }, +- unionpay: { ++ 'unionpay': { + niceType: 'UnionPay', + type: 'unionpay', + patterns: [ +@@ -120,16 +118,16 @@ var cardTypes = { + [8110, 8131], + [8132, 8151], + [8152, 8163], +- [8164, 8171] ++ [8164, 8171], + ], + gaps: [4, 8, 12], + lengths: [14, 15, 16, 17, 18, 19], + code: { + name: 'CVN', +- size: 3 +- } ++ size: 3, ++ }, + }, +- maestro: { ++ 'maestro': { + niceType: 'Maestro', + type: 'maestro', + patterns: [ +@@ -139,16 +137,16 @@ var cardTypes = { + [56, 59], + 63, + 67, +- 6 ++ 6, + ], + gaps: [4, 8, 12], + lengths: [12, 13, 14, 15, 16, 17, 18, 19], + code: { + name: 'CVC', +- size: 3 +- } ++ size: 3, ++ }, + }, +- elo: { ++ 'elo': { + niceType: 'Elo', + type: 'elo', + patterns: [ +@@ -176,29 +174,29 @@ var cardTypes = { + [650901, 650978], + [651652, 651679], + [655000, 655019], +- [655021, 655058] ++ [655021, 655058], + ], + gaps: [4, 8, 12], + lengths: [16], + code: { + name: 'CVE', +- size: 3 +- } ++ size: 3, ++ }, + }, +- mir: { ++ 'mir': { + niceType: 'Mir', + type: 'mir', + patterns: [ +- [2200, 2204] ++ [2200, 2204], + ], + gaps: [4, 8, 12], + lengths: [16, 17, 18, 19], + code: { + name: 'CVP2', +- size: 3 +- } ++ size: 3, ++ }, + }, +- hiper: { ++ 'hiper': { + niceType: 'Hiper', + type: 'hiper', + patterns: [ +@@ -206,28 +204,26 @@ var cardTypes = { + 637568, + 637599, + 637609, +- 637612 ++ 637612, + ], + gaps: [4, 8, 12], + lengths: [16], + code: { + name: 'CVC', +- size: 3 +- } ++ size: 3, ++ }, + }, +- hipercard: { ++ 'hipercard': { + niceType: 'Hipercard', + type: 'hipercard', + patterns: [ +- 606282 ++ 606282, + ], + gaps: [4, 8, 12], + lengths: [16], + code: { + name: 'CVC', +- size: 3 +- } +- } ++ size: 3, ++ }, ++ }, + }; +- +-module.exports = cardTypes; +diff --git a/node_modules/credit-card-type/lib/clone.js b/node_modules/credit-card-type/lib/clone.js +index f11062f..bee0c46 100644 +--- a/node_modules/credit-card-type/lib/clone.js ++++ b/node_modules/credit-card-type/lib/clone.js +@@ -1,13 +1,5 @@ +-'use strict'; +- +-function clone(originalObject) { +- var dupe; +- ++export default function clone(originalObject) { + if (!originalObject) { return null; } + +- dupe = JSON.parse(JSON.stringify(originalObject)); +- +- return dupe; ++ return JSON.parse(JSON.stringify(originalObject)); + } +- +-module.exports = clone; +diff --git a/node_modules/credit-card-type/lib/find-best-match.js b/node_modules/credit-card-type/lib/find-best-match.js +index 7319f6d..02dba2a 100644 +--- a/node_modules/credit-card-type/lib/find-best-match.js ++++ b/node_modules/credit-card-type/lib/find-best-match.js +@@ -1,7 +1,5 @@ +-'use strict'; +- + function hasEnoughResultsToDetermineBestMatch(results) { +- var numberOfResultsWithMaxStrengthProperty = results.filter(function (result) { ++ let numberOfResultsWithMaxStrengthProperty = results.filter(function(result) { + return result.matchStrength; + }).length; + +@@ -12,12 +10,12 @@ function hasEnoughResultsToDetermineBestMatch(results) { + numberOfResultsWithMaxStrengthProperty === results.length; + } + +-function findBestMatch(results) { ++export default function findBestMatch(results) { + if (!hasEnoughResultsToDetermineBestMatch(results)) { + return; + } + +- return results.reduce(function (bestMatch, result) { // eslint-disable-line consistent-return ++ return results.reduce(function(bestMatch, result) { // eslint-disable-line consistent-return + if (!bestMatch) { + return result; + } +@@ -31,5 +29,3 @@ function findBestMatch(results) { + return bestMatch; + }); + } +- +-module.exports = findBestMatch; +diff --git a/node_modules/credit-card-type/lib/is-valid-input-type.js b/node_modules/credit-card-type/lib/is-valid-input-type.js +index 793c308..9078321 100644 +--- a/node_modules/credit-card-type/lib/is-valid-input-type.js ++++ b/node_modules/credit-card-type/lib/is-valid-input-type.js +@@ -1,7 +1,3 @@ +-'use strict'; +- +-function isValidInputType(cardNumber) { ++export default function isValidInputType(cardNumber) { + return typeof cardNumber === 'string' || cardNumber instanceof String; + } +- +-module.exports = isValidInputType; +diff --git a/node_modules/credit-card-type/lib/matches.js b/node_modules/credit-card-type/lib/matches.js +index 36ecdcd..5a379c2 100644 +--- a/node_modules/credit-card-type/lib/matches.js ++++ b/node_modules/credit-card-type/lib/matches.js +@@ -1,10 +1,8 @@ +-'use strict'; +- + // Adapted from https://github.com/polvo-labs/card-type/blob/aaab11f80fa1939bccc8f24905a06ae3cd864356/src/cardType.js#L37-L42 + function matchesRange(cardNumber, min, max) { +- var maxLengthToCheck = String(min).length; +- var substr = cardNumber.substr(0, maxLengthToCheck); +- var integerRepresentationOfCardNumber = parseInt(substr, 10); ++ const maxLengthToCheck = String(min).length; ++ const substr = cardNumber.substr(0, maxLengthToCheck); ++ const integerRepresentationOfCardNumber = parseInt(substr, 10); + + min = parseInt(String(min).substr(0, substr.length), 10); + max = parseInt(String(max).substr(0, substr.length), 10); +@@ -18,12 +16,10 @@ function matchesPattern(cardNumber, pattern) { + return pattern.substring(0, cardNumber.length) === cardNumber.substring(0, pattern.length); + } + +-function matches(cardNumber, pattern) { ++export default function matches(cardNumber, pattern) { + if (Array.isArray(pattern)) { + return matchesRange(cardNumber, pattern[0], pattern[1]); + } + + return matchesPattern(cardNumber, pattern); + } +- +-module.exports = matches; diff --git a/patches/luhn-js+1.1.2.patch b/patches/luhn-js+1.1.2.patch new file mode 100644 index 0000000..2f883cc --- /dev/null +++ b/patches/luhn-js+1.1.2.patch @@ -0,0 +1,172 @@ +diff --git a/node_modules/luhn-js/src/luhn.js b/node_modules/luhn-js/src/luhn.js +index 55e48ef..9c612b2 100644 +--- a/node_modules/luhn-js/src/luhn.js ++++ b/node_modules/luhn-js/src/luhn.js +@@ -1,65 +1,65 @@ + 'use strict'; + + const luhn = { +- /** +- * Check requirements. +- * Returns if the Luhn check digit is valid. +- * +- * Requirements: +- * - rawValue must be not `Null` +- * - rawValue must be of type `String` +- * - rawValue must respect format `^[0-9]{2,}$` +- * +- * @param {*} rawValue +- */ +- isValid: function(rawValue) { +- const value = stringifyInput(rawValue); +- +- if (!value.match(FORMAT_ISVALID)) { +- throw new Error('Exception value of format \'' + FORMAT_ISVALID + '\', found: \'' + value + '\''); +- } +- +- return getLuhnRemainder(value) === 0; +- }, +- +- /** +- * Check requirements. +- * Returns the Luhn check digit appended to the value. +- * +- * Requirements: +- * - rawValue must be not `Null` +- * - rawValue must be of type `String` +- * - rawValue must respest format `^[0-9]{1,}$` +- * +- * @param {*} rawValue +- */ +- generate: function(rawValue) { +- const value = stringifyInput(rawValue); +- +- if (!value.match(FORMAT_GENERATE)) { +- throw new Error('Exception value of format \'' + FORMAT_GENERATE + '\', found: \'' + value + '\''); +- } +- +- return value + ((10 - getLuhnRemainder(value + '0')) % 10).toString(); +- }, +- +- /** +- * Does NOT check requirements. +- * Returns the Luhn remainder. +- * Note: +- * `getRemainder(value) === 0` is equivalent to `isValid(value)`. +- * You may want to use this method instead of `isValid` if you ensure argument +- * requirements on your side. +- * +- * Requirements +- * - rawValue must be not `Null` +- * - rawValue must be of type `String` +- * +- * @param {*} rawValue +- */ +- getRemainder: function(rawValue) { +- return getLuhnRemainder(rawValue); ++ /** ++ * Check requirements. ++ * Returns if the Luhn check digit is valid. ++ * ++ * Requirements: ++ * - rawValue must be not `Null` ++ * - rawValue must be of type `String` ++ * - rawValue must respect format `^[0-9]{2,}$` ++ * ++ * @param {*} rawValue ++ */ ++ isValid: function(rawValue) { ++ const value = stringifyInput(rawValue); ++ ++ if (!value.match(FORMAT_ISVALID)) { ++ throw new Error('Exception value of format \'' + FORMAT_ISVALID + '\', found: \'' + value + '\''); + } ++ ++ return getLuhnRemainder(value) === 0; ++ }, ++ ++ /** ++ * Check requirements. ++ * Returns the Luhn check digit appended to the value. ++ * ++ * Requirements: ++ * - rawValue must be not `Null` ++ * - rawValue must be of type `String` ++ * - rawValue must respest format `^[0-9]{1,}$` ++ * ++ * @param {*} rawValue ++ */ ++ generate: function(rawValue) { ++ const value = stringifyInput(rawValue); ++ ++ if (!value.match(FORMAT_GENERATE)) { ++ throw new Error('Exception value of format \'' + FORMAT_GENERATE + '\', found: \'' + value + '\''); ++ } ++ ++ return value + ((10 - getLuhnRemainder(value + '0')) % 10).toString(); ++ }, ++ ++ /** ++ * Does NOT check requirements. ++ * Returns the Luhn remainder. ++ * Note: ++ * `getRemainder(value) === 0` is equivalent to `isValid(value)`. ++ * You may want to use this method instead of `isValid` if you ensure argument ++ * requirements on your side. ++ * ++ * Requirements ++ * - rawValue must be not `Null` ++ * - rawValue must be of type `String` ++ * ++ * @param {*} rawValue ++ */ ++ getRemainder: function(rawValue) { ++ return getLuhnRemainder(rawValue); ++ } + }; + + const FORMAT_ISVALID = /^[0-9]{2,}$/; +@@ -69,28 +69,28 @@ const CHARCODE_0 = '0'.charCodeAt(0); + const MAPPING_EVEN = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]; + + function getLuhnRemainder(value) { +- var length = value.length; +- var accumulator = 0; +- var bit = 0; ++ var length = value.length; ++ var accumulator = 0; ++ var bit = 0; + +- while (length-- > 0) { +- accumulator += (bit ^= 1) ? value.charCodeAt(length) - CHARCODE_0 : MAPPING_EVEN[value.charCodeAt(length) - CHARCODE_0]; +- } ++ while (length-- > 0) { ++ accumulator += (bit ^= 1) ? value.charCodeAt(length) - CHARCODE_0 : MAPPING_EVEN[value.charCodeAt(length) - CHARCODE_0]; ++ } + +- return accumulator % 10; ++ return accumulator % 10; + } + + function stringifyInput(rawValue) { +- if (rawValue !== null && rawValue !== undefined) { +- if (typeof rawValue === 'string') { +- return rawValue; +- +- } ++ if (rawValue !== null && rawValue !== undefined) { ++ if (typeof rawValue === 'string') { ++ return rawValue; + +- throw new Error('Expecting value of type \'string\', found: \'' + (typeof rawValue) + '\''); + } + +- throw new Error('Expecting value of type \'string\', found: \'' + rawValue + '\''); ++ throw new Error('Expecting value of type \'string\', found: \'' + (typeof rawValue) + '\''); ++ } ++ ++ throw new Error('Expecting value of type \'string\', found: \'' + rawValue + '\''); + } + +-module.exports = luhn; ++export default luhn; diff --git a/rollup.config.js b/rollup.config.js index 3d92989..499bc8f 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,30 +1,31 @@ -import resolve from 'rollup-plugin-node-resolve'; -// import litcss from 'rollup-plugin-lit-css'; +import commonjs from '@rollup/plugin-commonjs'; +import litcss from 'rollup-plugin-lit-css'; +import resolve from '@rollup/plugin-node-resolve'; import babel from 'rollup-plugin-babel'; +import pkg from './package.json'; + +const deps = Object.keys(pkg.dependencies); +const external = id => + id !== '@morbidick/lit-element-notify' && + id.startsWith('lit-html') || + id.startsWith('@babel/runtime') || + deps.includes(id); export default { - input: 'src/stripe-elements.js', - external: id => - id.includes('lit-element') || - id.includes('lit-html') || - null, + input: [ + 'src/stripe-elements.js', + ], + external, output: { dir: '.', format: 'es', + chunkFileNames: '[name].js', + sourcemap: true, }, plugins: [ + babel({ externalHelpers: true, runtimeHelpers: true, babelrc: true }), + litcss(), + commonjs(), resolve(), - babel({ - presets: [ - ['@babel/preset-env', { 'targets': { 'browsers': [ - 'last 1 chrome versions', - 'last 1 firefox versions', - 'last 1 safari versions', - ] } }], - ], - plugins: [ - '@babel/plugin-proposal-class-properties', - ], - }), ], }; diff --git a/src/StripeBase.js b/src/StripeBase.js new file mode 100644 index 0000000..fb94d50 --- /dev/null +++ b/src/StripeBase.js @@ -0,0 +1,309 @@ +import { LitElement, property } from 'lit-element'; +import { LitNotify } from '@morbidick/lit-element-notify'; + +import bound from 'bound-decorator'; + +import { camel, dash } from './lib/strings'; +import { isRepresentation } from './lib/predicates'; +import { stripeMethod } from './stripe-method-decorator'; + +/** + * @fires 'error-changed' - The new value of error + * @fires 'has-error-changed' - The new value of has-error + * @fires 'payment-intent-changed' - The new value of payment-intent + * @fires 'payment-method-changed' - The new value of payment-method + * @fires 'publishable-key-changed' - The new value of publishable-key + * @fires 'source-changed' - The new value of source + * @fires 'stripe-error' - The validation error, or the error returned from stripe.com + * @fires 'stripe-payment-intent' - The PaymentIntent received from stripe.com + * @fires 'stripe-payment-method' - The PaymentMethod received from stripe.com + * @fires 'stripe-source' - The Source received from stripe.com + * @fires 'stripe-token' - The Token received from stripe.com + * @fires 'token-changed' - The new value of token + */ +export class StripeBase extends LitNotify(LitElement) { + /* PUBLIC FIELDS */ + + /** + * The URL to the form action. Example '/charges'. + * If blank or undefined will not submit charges immediately. + * @type {String} + */ + @property({ type: String }) action; + + /** + * @type {stripe.BillingDetails} + */ + billingDetails; + + /** + * Stripe Publishable Key. EG. `pk_test_XXXXXXXXXXXXXXXXXXXXXXXX` + * @type {String} + */ + @property({ + type: String, + attribute: 'publishable-key', + reflect: true, + notify: true, + }) publishableKey; + + /** Whether to display the error message */ + @property({ type: Boolean, attribute: 'show-error', reflect: true }) showError = false; + + /** + * Data passed to stripe.createSource. (optional) + * @type {{ owner: stripe.OwnerData }} + */ + sourceData; + + /** + * Data passed to stripe.createToken. (optional) + * @type {stripe.TokenOptions} + */ + tokenData; + + /* READ-ONLY FIELDS */ + + /** + * Stripe Elements instance + * @type {stripe.elements.Elements} + */ + @property({ type: Object }) get elements() { + return this.__elements; + } + + /** + * Stripe or validation error + * @type {Error} + */ + @property({ type: String, notify: true }) get error() { + return this.__error; + } + + /** + * Whether the element has an error + * @type {Boolean} + */ + @property({ type: Boolean, attribute: 'has-error', reflect: true, notify: true }) get hasError() { + return this.__hasError; + } + + /** + * Stripe Source + * @type {stripe.Source} + */ + @property({ type: Object, notify: true }) get source() { + return this.__source; + } + + /** + * Stripe instance + * @type {stripe.Stripe} + */ + @property({ type: Object }) get stripe() { + return this.__stripe; + } + + /** + * Stripe Token + * @type {stripe.Token} + */ + @property({ type: Object, notify: true }) get token() { + return this.__token; + } + + + /* PRIVATE FIELDS */ + + /** + * The id for the stripe mount point + * @type {string} + * @private + */ + stripeMountId; + + /** @type {stripe.elements.Elements} */ + __elements = null; + + /** @type {Error|stripe.Error} */ + __error = null; + + __hasError = false; + + /** @type {stripe.Source} */ + __source = null; + + /** @type {stripe.Stripe} */ + __stripe = null; + + /** @type {stripe.Token} */ + __token = null; + + /* LIFECYCLE */ + + /** @inheritdoc */ + updated(changed) { + if (changed.has('error')) this.errorChanged(); + if (changed.has('publishableKey')) this.init(); + [...changed.keys()].forEach(this.representationChanged); + } + + /* PUBLIC API */ + + /** + * Submit credit card information to generate a source + * @param {{ owner: stripe.OwnerInfo }} [sourceData={}] + * @resolves {stripe.SourceResponse} + */ + @stripeMethod async createSource(sourceData = this.sourceData) { + const element = this.card; + return this.stripe.createSource(element, sourceData); + } + + /** + * Submit credit card information to generate a token + * @param {TokenData} [tokenData=this.tokenData] + * @resolves {stripe.TokenResponse} + */ + @stripeMethod async createToken(tokenData = this.tokenData) { + return this.stripe.createToken(this.card, tokenData); + } + + reset() { + this.resetRepresentations(); + this.set({ error: null }); + } + + /* PRIVATE API */ + + /** @private */ + errorChanged() { + this.resetRepresentations(); + this.fireError(this.error); + } + + /** + * Fires an event. + * @param {String} type event type + * @param {any} detail detail value + * @param {Object} [opts={}] event options + * @private + */ + fire(type, detail, opts = {}) { + this.dispatchEvent(new CustomEvent(type, { detail, ...opts })); + } + + /** + * Fires an Error Event + * @param {Error} error + * @private + */ + fireError(error) { + this.dispatchEvent(new ErrorEvent('stripe-error', { error })); + } + + /** + * Sets the token or error from the response. + * @param {PaymentResponse} response Stripe Response + * @return {PaymentResponse} + * @private + */ + @bound async handleResponse(response) { + const { + error = null, + source = null, + token = null, + } = response; + await this.set({ + error, + source, + token, + }); + if (error) throw error; + else return response; + } + + /** + * Initializes Stripe and elements. + * @private + */ + async initStripe() { + const { publishableKey } = this; + const stripe = (window.Stripe && publishableKey) ? Stripe(publishableKey) : null; + const elements = stripe && stripe.elements(); + const error = stripe ? null : new Error(`<${this.constructor.is}> requires Stripe.js to be loaded first.`); + if (error) console.warn(error.message); // eslint-disable-line no-console + await this.set({ elements, error, stripe }); + } + + /** + * Fires a Polymer-style prop-changed event. + * @param {String} prop camelCased prop name. + * @private + */ + notify(prop) { + const type = `${dash(prop)}-changed`; + const value = this[camel(prop)]; + this.fire(type, { value }); + } + + /** + * @param {String} name + * @private + */ + @bound representationChanged(name) { + if (!isRepresentation(name)) return; + const value = this[name]; + this.notify(name); + if (!value) return; + const eventType = `stripe-${dash(name)}`; + this.fire(eventType, value); + const selector = `[name=${camel(`stripe-${dash(name)}`)}]`; + const formField = this.form.querySelector(selector); + formField.removeAttribute('disabled'); + formField.value = value; + if (this.action) this.form.submit(); + } + + /** @private */ + resetRepresentations() { + this.set({ + paymentIntent: null, + paymentMethod: null, + token: null, + source: null, + setupIntent: null, + }); + } + + /** + * Set read-only properties + * @param {Object} props + * @return {Promise} + * @private + */ + async set(props) { + await Promise.all(Object.entries(props).map(this.setPropEntry)); + return this; + } + + /** + * @return {Promise} + * @private + */ + @bound setPropEntry([name, newVal]) { + const privateName = `__${name}`; + const oldVal = this[privateName]; + this[privateName] = newVal; + if (name === 'error') { + const oldHasError = this.__hasError; + this.__hasError = !!newVal; + this.requestUpdate('hasError', oldHasError); + } + return this.requestUpdate(name, oldVal); + } +} + +/** + * @typedef {stripe.PaymentIntentResponse|stripe.PaymentMethodResponse|stripe.SetupIntentResponse|stripe.TokenResponse|stripe.SourceResponse} PaymentResponse + */ diff --git a/src/StripeElements.js b/src/StripeElements.js index b61fbbd..2c179e1 100644 --- a/src/StripeElements.js +++ b/src/StripeElements.js @@ -1,102 +1,68 @@ -import { LitElement, html, css } from 'lit-element'; -import { render } from 'lit-html'; -import { ifDefined } from 'lit-html/directives/if-defined'; - -const removeEl = el => { - /* istanbul ignore if */ - if (el instanceof Element) el.remove(); -}; - -const MEMOS = new WeakMap(); - -const getCache = f => { - if (!MEMOS.has(f)) MEMOS.set(f, new Map()); - return MEMOS.get(f); -}; - -const memoize1 = f => { - const m = getCache(f); - return x => { - if (m.has(x)) { - return m.get(x); - } else { - const val = f(x); - m.set(x, val); - return val; - } - }; -}; +import { LitNotify } from '@morbidick/lit-element-notify'; +import { html, property } from 'lit-element'; -const camel = memoize1(s => - s.toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, (_, c) => c.toUpperCase())); +import { ifDefined } from 'lit-html/directives/if-defined'; +import { render } from 'lit-html'; +import bound from 'bound-decorator'; -const dash = memoize1(s => - s.replace(/([a-zA-Z])(?=[A-Z])/g, '$1-').toLowerCase()); +import { StripeBase } from './StripeBase'; +import { appendTemplate, remove } from './lib/dom'; +import { dash, generateRandomMountElementId } from './lib/strings'; +import sharedStyles from './shared.css'; +import style from './stripe-elements.css'; /* istanbul ignore next */ const removeAllMounts = host => host.querySelectorAll('[slot="stripe-card"][name="stripe-card"]') - .forEach(removeEl); - -function appendTemplate(template, target) { - const tmp = document.createElement('div'); - render(template, tmp); - const { firstElementChild } = tmp; - target.appendChild(firstElementChild); - tmp.remove(); - return firstElementChild; -} - -const stripeElementsCustomCssProperties = html` - + .StripeElement--webkit-autofill { + background-color: #fefde5 !important; + } + `; -const style = css` -[hidden] { display: none !important; } -:host { - display: block; - min-width: var(--stripe-elements-width, 300px); - min-height: var(--stripe-elements-height, 50px); -} -#error { - font-family: sans-serif; - font-size: 14px; - padding-left: 42px; - padding-bottom: 10px; +function applyCustomCss() { + if (!document.getElementById('stripe-elements-custom-css-properties')) { + document.head.appendChild(stripeElementsCustomCssTemplate.content.cloneNode(true)); + } } -`; -const stripeCardTemplate = ({ action, id, source, token }) => html` -
-
- - -
+const stripeCardTemplate = ({ action, id, label, paymentMethod, source, token }) => html` +
+
+ + + +
`; const allowedStyles = [ @@ -114,17 +80,6 @@ const allowedStyles = [ 'textTransform', ]; -/** - * Generates a random mount point (UUID v4) for Stripe Elements. This will allow multiple - * Elements forms to be embedded on a single page. - * @return {String} mount element id - */ -function generateRandomMountElementId() { - return `stripe-elements-mount-point-${([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) - )}`; -} - /** * Custom element wrapper for Stripe.js v3 Elements. Creates a `card` element Ć  la https://stripe.com/docs/elements * @@ -221,7 +176,7 @@ function generateRandomMountElementId() { * document.body.querySelector('button').disabled = !(isComplete && !hasError) * } * - * const onClick = () => document.getElementById('stripe').submit(); + * const onClick = () => document.getElementById('stripe').createSource(); * * const template = html` * @@ -246,7 +201,7 @@ function generateRandomMountElementId() { * * + * onclick="stripe.createSource()"> * Get Token * * @@ -339,347 +294,155 @@ function generateRandomMountElementId() { * @cssprop [--stripe-elements-invalid-text-transform] - `text-transform` property for the element in its invalid state * * @element stripe-elements - * @extends LitElement + * @extends StripeBase * - * @fires stripe-token - The token received from stripe.com - * @fires stripe-source - The source received from stripe.com - * @fires stripe-error - The validation error, or the error returned from stripe.com - * @fires stripe-change - Stripe Element change event - * @fires stripe-ready - Stripe has been initialized and mounted + * @fires 'stripe-change' - Stripe Element change event + * @fires 'stripe-ready' - Stripe has been initialized and mounted * - * @fires is-complete-changed - The new value of is-complete - * @fires is-empty-changed - The new value of is-empty - * @fires has-error-changed - The new value of has-error - * @fires brand-changed - The new value of brand - * @fires card-changed - The new value of card - * @fires error-changed - The new value of error - * @fires publishable-key-changed - The new value of publishable-key - * @fires stripe-ready-changed - The new value of stripe-ready - * @fires token-changed - The new value of token + * @fires 'brand-changed' - The new value of brand + * @fires 'card-changed' - The new value of card + * @fires 'is-complete-changed' - The new value of is-complete + * @fires 'is-empty-changed' - The new value of is-empty + * @fires 'stripe-ready-changed' - The new value of stripe-ready */ -export class StripeElements extends LitElement { +export class StripeElements extends LitNotify(StripeBase) { static is = 'stripe-elements'; - static properties = { - /** - * The URL to the morm action. Example '/charges'. - * If blank or undefined will not submit charges immediately. - */ - action: { type: String }, - - /** - * The card brand detected by Stripe - * @type {String} - * @readonly - */ - brand: { type: String }, - - /** - * Reference to the Stripe card. - * @type {Card} - * @readonly - */ - card: { type: Object }, - - /** - * Card billing info to be passed to createToken() (optional) - * https://stripe.com/docs/stripe-js/reference#stripe-create-token - * @type {Object} - */ - cardData: { type: Object }, - - /** - * Error message from Stripe. - * @type {String} - * @readonly - */ - error: { type: String }, - - /** - * Whether the form has an error. - * @type {Boolean} - * @readonly - */ - hasError: { type: Boolean, attribute: 'has-error', reflect: true }, - - /** - * If the form is complete. - * @type {Boolean} - * @readonly - */ - isComplete: { type: Boolean, attribute: 'is-complete', reflect: true }, - - /** - * If the form is empty. - * @type {Boolean} - * @readonly - */ - isEmpty: { type: Boolean, attribute: 'is-empty', reflect: true }, - - /** - * Whether to hide icons in the Stripe form. - * @type {Boolean} - */ - hideIcon: { type: Boolean, attribute: 'hide-icon' }, - - /** - * Whether or not to hide the postal code field. - * Useful when you gather shipping info elsewhere. - * @type {Boolean} - */ - hidePostalCode: { type: Boolean, attribute: 'hide-postal-code' }, - - /** - * Stripe icon style. 'solid' or 'default'. - * @type {'solid'|'default'} - */ - iconStyle: { type: String, attribute: 'icon-style' }, - - /** - * Stripe Publishable Key. EG. pk_test_XXXXXXXXXXXXXXXXXXXXXXXX - * @type {String} - */ - publishableKey: { type: String, attribute: 'publishable-key', reflect: true }, - - /** - * Whether to display the error message - * @type {Object} - */ - showError: { type: Boolean, attribute: 'show-error', reflect: true }, - - /** - * True when the stripe element is ready to receive focus. - * @type {Boolean} - * @readonly - */ - stripeReady: { type: Boolean, attribute: 'stripe-ready', reflect: true }, - - /** - * Stripe token - * @type {Object} - * @readonly - */ - token: { type: Object }, - - /** - * Prefilled values for form. Example {postalCode: '90210'} - * @type {Object} - */ - value: { type: Object }, - - /** - * Stripe instance - * @type {Object} - * @readonly - */ - stripe: { type: Object }, - - /** - * Stripe Elements instance - * @type {Object} - * @readonly - */ - elements: { type: Object }, - } - - /** - * Brand of the card - */ - get brand() { - return this.__brand; - } - - __brand = null; - - /** - * Stripe card object - * @type {StripeCard} - */ - get card() { - return this.__card; - } - - __card = null; - - /** - * Stripe or validation error - * @type {Error} - */ - get error() { - return this.__error; - } + static styles = [ + sharedStyles, + style, + ]; - __error = null; + /* PUBLIC FIELDS */ /** - * Whether the element has an error + * Whether to hide icons in the Stripe form. * @type {Boolean} */ - get hasError() { - return this.__hasError; - } - - __hasError = false; + @property({ type: Boolean, attribute: 'hide-icon' }) hideIcon = false; /** - * Whether the card form is complete + * Whether or not to hide the postal code field. + * Useful when you gather shipping info elsewhere. * @type {Boolean} */ - get isComplete() { - return this.__isComplete; - } - - __isComplete = false; + @property({ type: Boolean, attribute: 'hide-postal-code' }) hidePostalCode = false; /** - * Whether the card form is empty - * @type {Boolean} + * Stripe icon style. 'solid' or 'default'. + * @type {'solid'|'default'} */ - get isEmpty() { - return this.__isEmpty; - } - - __isEmpty = true; + @property({ type: String, attribute: 'icon-style' }) iconStyle = 'default'; /** - * Whether Stripe.js has been initialized - * @type {Boolean} + * aria-label attribute for the credit card form. + * @type {String} */ - get stripeReady() { - return this.__stripeReady; - } - - __stripeReady = false; + @property({ type: String }) label = 'Credit or Debit Card'; /** - * The token returned from `createToken` - * @type {StripeToken} + * Prefilled values for form. Example {postalCode: '90210'} + * @type {Object} */ - get token() { - return this.__token; - } + @property({ type: Object }) value = {}; - __token = null; + /* READ ONLY PROPERTIES */ /** - * The source returned from `createSource` - * @type {StripeSource} + * The card brand detected by Stripe + * @type {String} + * @readonly */ - get source() { - return this.__source; - } - - __source = null; + @property({ type: String, notify: true }) + get brand() { return this.__brand; } /** - * The Stripe.js object - * @type {Stripe} + * The Stripe card object. + * @type {stripe.Element} + * @readonly */ - get stripe() { - return this.__stripe; - } - - __stripe = null; + @property({ type: Object, notify: true }) + get card() { return this.__card; } /** - * The Stripe.js Elements instance object - * @type {Elements} + * If the form is complete. + * @type {Boolean} */ - get elements() { - return this.__elements; - } - - __elements = null; + @property({ type: Boolean, attribute: 'is-complete', reflect: true, notify: true }) + get isComplete() { return this.__isComplete; } /** - * Breadcrumbs back up to the document. - * @type {Array} + * If the form is empty. + * @type {Boolean} */ - __shadowHosts = []; + @property({ type: Boolean, attribute: 'is-empty', reflect: true, notify: true }) + get isEmpty() { return this.__isEmpty; } /** - * Mount Point Element id - * @type {String} + * If the stripe element is ready to receive focus. + * @type {Boolean} */ - __stripeMountId = null; + @property({ type: Boolean, attribute: 'stripe-ready', reflect: true, notify: true }) + get stripeReady() { return this.__stripeReady; } + + /* PRIVATE FIELDS */ /** - * Stripe Element mount point - * @type {Element} + * Breadcrumbs back up to the document. + * @type {Node[]} + * @private */ - get stripeMount() { - return document.getElementById(this.__stripeMountId); - } + shadowHosts = []; /** * The internal form element * @type {HTMLFormElement} + * @protected */ get form() { + if (window.ShadyDOM) return this.querySelector('form'); let slot = this.shadowRoot.querySelector('slot'); // eslint-disable-next-line no-loops/no-loops while (slot instanceof HTMLSlotElement && ([slot] = slot.assignedElements())) continue; return slot.querySelector('form'); } - get __tokenFormField() { - return this.form.querySelector('[name="stripeToken"]'); - } - - get __sourceFormField() { - return this.form.querySelector('[name="stripeSource"]'); - } - - static styles = [ - style, - ]; - /** - * The action attr of the internal form. - * @type {string} + * Stripe Element mount point + * @type {Element} */ - action; + get stripeMount() { return document.getElementById(this.stripeMountId); } /** - * Stripe cardData object to submit with - * @type {Object} + * Mount Point Element id + * @type {String} + * @protected */ - cardData = {}; + stripeMountId; - hideIcon = false; + /** @type {stripe.brandType} */ + __brand = null; - hidePostalCode = false; + /** @type {stripe.elements.Element} */ + __card = null; - iconStyle = 'default'; + __isComplete = false; - value = {}; + __isEmpty = true; - /** LIFECYCLE */ + __stripeReady = false; - constructor() { - super(); - this.__handleError = this.__handleError.bind(this); - this.__handleResponse = this.__handleResponse.bind(this); - this.__onReady = this.__onReady.bind(this); - this.__onChange = this.__onChange.bind(this); - } + /* LIFECYCLE */ /** @inheritdoc */ connectedCallback() { super.connectedCallback(); - this.__notify('is-complete'); - this.__notify('is-empty'); - this.__notify('has-error'); - this.__notify('brand'); - this.__notify('card'); - this.__notify('error'); - this.__notify('publishable-key'); - this.__notify('stripe-ready'); - this.__notify('token'); - this.__notify('source'); - if (!document.getElementById('stripe-elements-custom-css-properties')) { - appendTemplate(stripeElementsCustomCssProperties, document.head); - } + applyCustomCss(); + } + + /** @inheritdoc */ + firstUpdated() { + this.resetMount(); } /** @inheritdoc */ @@ -692,35 +455,7 @@ export class StripeElements extends LitElement { `; } - /** @inheritdoc */ - firstUpdated() { - this.__initMountPoints(); - } - - /** @inheritdoc */ - updated(changed) { - if (changed.has('isComplete')) this.__notify('is-complete'); - if (changed.has('isEmpty')) this.__notify('is-empty'); - if (changed.has('hasError')) this.__notify('has-error'); - if (changed.has('brand')) this.__notify('brand'); - if (changed.has('card')) this.__notify('card'); - if (changed.has('stripeReady')) this.__notify('stripe-ready'); - if (changed.has('source')) this.__notify('source'); - if (changed.has('token')) this.__notify('token'); - if (changed.has('publishableKey')) { - this.__notify('publishable-key'); - this.__publishableKeyChanged(this.publishableKey); - } - - if (changed.has('error')) { - this.__setToken(null); - this.__setSource(null); - this.__notify('error'); - this.__fireError(this.error); - } - } - - /** PUBLIC API */ + /* PUBLIC API */ /** * Checks for potential validity. A potentially valid form is one that is not empty, not complete and has no error. A validated form also counts as potentially valid. @@ -734,32 +469,10 @@ export class StripeElements extends LitElement { * Resets the Stripe card. */ reset() { - this.__setError(null); + super.reset(); this.card && this.card.clear(); } - /** - * Submit credit card information to generate a source - * @param {object} [sourceData={}] - */ - async createSource(sourceData = {}) { - if (!this.stripe) throw new Error('Cannot create source before initializing Stripe'); - return this.stripe.createSource(this.__card, sourceData) - .then(this.__handleResponse) - .catch(this.__handleError); - } - - /** - * Submit credit card information to generate a token - * @param {object} [cardData=this.cardData] - */ - async createToken(cardData = this.cardData) { - if (!this.stripe) throw new Error('Cannot create token before initializing Stripe'); - return this.stripe.createToken(this.__card, cardData) - .then(this.__handleResponse) - .catch(this.__handleError); - } - /** * Checks if the Stripe form is valid. * @return {Boolean} true if the Stripe form is valid @@ -767,165 +480,113 @@ export class StripeElements extends LitElement { validate() { const { isComplete, isEmpty, hasError } = this; const isValid = !hasError && isComplete && !isEmpty; - const message = `Credit card information is ${isEmpty ? 'empty' : 'incomplete'}.`; - if (!isValid && !hasError) this.__setError(message); + const error = new Error(`Credit card information is ${isEmpty ? 'empty' : 'incomplete'}.`); + if (!isValid && !hasError) this.set({ error }); return isValid; } - /** - * Fires an event. - * @param {string} type event type - * @param {any} detail detail value - * @param {Object} [opts={}] event options - */ - __fire(type, detail, opts = {}) { - this.dispatchEvent(new CustomEvent(type, { detail, ...opts })); - } - - /** - * Fires an Error Event - * @param {Error} error - */ - __fireError(error) { - this.dispatchEvent(new ErrorEvent('stripe-error', { error })); - } - - /** - * Fires a Polymer-style prop-changed event. - * @param {string} prop camelCased prop name. - */ - __notify(prop) { - const type = `${dash(prop)}-changed`; - const value = this[camel(prop)]; - this.__fire(type, { value }); - } + /* PRIVATE METHODS */ /** * Returns a Stripe-friendly style object computed from CSS custom properties * @return {Object} Stripe Style initialization object. + * @private */ - __getStripeElementsStyles() { + getStripeElementsStyles() { const computedStyle = window.ShadyCSS ? null : getComputedStyle(this); - return allowedStyles.reduce((acc, style) => { - const dashCase = dash(style); + return allowedStyles.reduce((acc, camelCase) => { + const dashCase = dash(camelCase); Object.keys(acc).forEach(prefix => { - acc[prefix][style] = ( - window.ShadyCSS ? - ShadyCSS.getComputedStyleValue(this, `--stripe-elements-${prefix}-${dashCase}`) : - computedStyle.getPropertyValue(`--stripe-elements-${prefix}-${dashCase}`) - ) || undefined; + const customProperty = `--stripe-elements-${prefix}-${dashCase}`; + const propertyValue = + computedStyle ? computedStyle.getPropertyValue(customProperty) + : ShadyCSS.getComputedStyleValue(this, customProperty); + acc[prefix][camelCase] = propertyValue || undefined; }); return acc; }, { base: {}, complete: {}, empty: {}, invalid: {} }); } /** - * Sets the error. - * @param {Object} error - * @protected - */ - async __handleError(error) { - this.__setError(error.message); - await this.updateComplete; - return error; - } - - /** - * Sets the token or error from the response. - * @param {Object} response Response from stripe - * @param {Object} response.error Stripe error - * @param {Object} response.token Stripe token - * @return {Object} - * @protected + * Reinitializes Stripe and mounts the card. + * @inheritdoc */ - async __handleResponse(response) { - const { error, token, source } = response; - if (error) this.__setError(error); - else if (token) this.__setToken(token); - else if (source) this.__setSource(source); - await this.updateComplete; - return response; + async init() { + this.resetMount(); + if (this.card) await this.unmountCard(); + await this.initStripe(); + await this.mountCard(); } - __initMountPoints() { - if (this.stripeMount) return; - else if (window.ShadyDOM) this.__initShadyDomMount(); - else this.__initShadowDomMounts(); + /** @private */ + initMountPoint() { + this.stripeMountId = generateRandomMountElementId(); + if (window.ShadyDOM) this.initShadyDOMMount(); + else this.initShadowDOMMounts(); } - /** Prepares to mount Stripe Elements in light DOM. */ - __initShadowDomMounts() { + /** + * Prepares to mount Stripe Elements in light DOM. + * @private + */ + initShadowDOMMounts() { // trace each shadow boundary between us and the document let host = this; - this.__shadowHosts = [this]; - while (host = host.getRootNode().host) this.__shadowHosts.push(host); // eslint-disable-line prefer-destructuring, no-loops/no-loops + this.shadowHosts = [this]; + while (host = host.getRootNode().host) this.shadowHosts.push(host); // eslint-disable-line prefer-destructuring, no-loops/no-loops + + const { shadowHosts, stripeMountId: id, action, label, token } = this; + + // Prepare the shallowest breadcrumb slot at document level + const hosts = [...shadowHosts]; + const root = hosts.pop(); + if (!root.querySelector('[slot="stripe-card"]')) { + const element = document.createElement('div'); + element.slot = 'stripe-card'; + root.appendChild(element); + } + const container = root.querySelector('[slot="stripe-card"]'); - // append mount point to first shadow host under document (as light child) - // and slot breadcrumbs to each shadowroot in turn, until our shadow host. + // hedge against shenanigans + const isDomCorrupt = container.querySelector('form') && !container.querySelector(`#${this.stripeMountId}`); + const renderTemplate = isDomCorrupt ? render : appendTemplate; - const { action, token } = this; - this.__stripeMountId = generateRandomMountElementId(); - const id = this.__stripeMountId; - const mountTemplate = stripeCardTemplate({ action, id, token }); - const slotTemplate = - html``; + // Render the form to the document, so that Stripe.js can mount + renderTemplate(stripeCardTemplate({ action, id, token, label }), container); - const root = this.__shadowHosts.pop(); - let container = root.querySelector('[slot="stripe-card"]'); - if (!container) { - container = document.createElement('div'); - container.slot = 'stripe-card'; - root.appendChild(container); - } - appendTemplate(mountTemplate, container); - this.__shadowHosts.forEach(host => appendTemplate(slotTemplate, host)); + // Append breadcrumb slots to each shadowroot in turn, + // from the document down to the instance. + hosts.forEach(appendTemplate(slotTemplate)); } - /** Creates a mounting div for the shady dom stripe elements container */ - __initShadyDomMount() { - const { action, token } = this; - this.__stripeMountId = generateRandomMountElementId(); - const id = this.__stripeMountId; - const mountTemplate = stripeCardTemplate({ action, id, token }); + /** + * Creates a mounting div for the shady dom stripe elements container + * @private + */ + initShadyDOMMount() { + const { action, token, label } = this; + const id = this.stripeMountId; + const mountTemplate = stripeCardTemplate({ action, id, label, token }); appendTemplate(mountTemplate, this); } /** - * Initializes Stripe and elements. + * Creates and mounts Stripe Elements card. + * @private */ - __initStripe() { - const oldStripe = this.__stripe; - const oldElements = this.__elements; - if (this.__stripe) this.__stripe = null; - if (!window.Stripe) { - const message = ` requires Stripe.js to be loaded first.`; - this.__setError({ message }); - console.warn(message); // eslint-disable-line no-console - } else if (this.publishableKey) { - this.__stripe = Stripe(this.publishableKey); - this.__elements = this.__stripe.elements(); - } else { - this.__elements = null; - } - this.requestUpdate('stripe', oldStripe); - this.requestUpdate('elements', oldElements); - } - - /** Creates and mounts Stripe Elements card. */ - __mountCard() { + async mountCard() { + if (!this.stripe) return; const { hidePostalCode, hideIcon, iconStyle, value } = this; - const style = this.__getStripeElementsStyles(); - - const card = - this.__elements.create('card', { hideIcon, hidePostalCode, iconStyle, style, value }); + const style = this.getStripeElementsStyles(); - this.__setCard(card); + const card = this.elements + .create('card', { hideIcon, hidePostalCode, iconStyle, style, value }); - this.__card.mount(this.stripeMount); - this.__card.addEventListener('ready', this.__onReady); - this.__card.addEventListener('change', this.__onChange); - this.__setIsComplete(false); - this.__setIsEmpty(true); + await this.set({ card }); + this.card.mount(this.stripeMount); + this.card.addEventListener('ready', this.onReady); + this.card.addEventListener('change', this.onChange); + await this.set({ isComplete: false, isEmpty: true }); } /** @@ -936,113 +597,42 @@ export class StripeElements extends LitElement { * @param {String} event.brand brand of the card being entered e.g. 'visa' or 'amex' * @param {Object} event.error The current validation error, if any. * @param {String|Object} event.value Value of the form. Only non-sensitive information e.g. postalCode is present. + * @private */ - __onChange(event) { - const { empty, complete, brand, error } = event; - this.__setError(error); - this.__setBrand(brand); - this.__setIsComplete(complete); - this.__setIsEmpty(empty); - this.__fire('stripe-change', event); + @bound async onChange(event) { + const { brand, complete: isComplete, empty: isEmpty, error = null } = event; + await this.set({ error, brand, isComplete, isEmpty }); + this.fire('stripe-change', event); } /** * Sets the stripeReady property when the stripe element is ready to receive focus. * @param {Event} event + * @private */ - __onReady(event) { - this.__setStripeReady(true); - this.__fire('stripe-ready', event); + @bound async onReady(event) { + await this.set({ stripeReady: true }); + this.fire('stripe-ready', event); } - /** - * Reinitializes Stripe and mounts the card. - * @param {String} publishableKey Stripe publishable key - */ - __publishableKeyChanged(publishableKey) { - this.__unmountCard(); - this.__setStripeReady(false); - if (!this.stripeMount || !this.form) this.__resetMount(); - this.__initStripe(); - if (publishableKey && this.stripe) this.__mountCard(); - } - - __removeMountPoints() { - this.__shadowHosts.forEach(removeAllMounts); - removeEl(this.stripeMount); - } - - __resetMount() { - this.__removeMountPoints(); - this.__initMountPoints(); - } - - /** Unmounts and nullifies the card. */ - __unmountCard() { - if (this.card) this.card.unmount(); - this.__setCard(null); - } - - /** READONLY SETTERS */ - - __setBrand(newVal) { - const oldBrand = this.__brand; - this.__brand = newVal; - this.requestUpdate('brand', oldBrand); + /** @private */ + removeStripeMounts() { + this.shadowHosts.forEach(removeAllMounts); + if (this.stripeMount) this.stripeMount.remove(); } - __setCard(newVal) { - const oldCard = this.__card; - this.__card = newVal; - this.requestUpdate('card', oldCard); + /** @private */ + resetMount() { + this.removeStripeMounts(); + this.initMountPoint(); } - __setError(newVal) { - const oldError = this.__error; - this.__error = newVal; - this.requestUpdate('error', oldError); - const oldHasError = this.__hasError; - this.__hasError = !!newVal; - this.requestUpdate('hasError', oldHasError); - } - - __setIsComplete(newVal) { - const oldIsComplete = this.__isComplete; - this.__isComplete = newVal; - this.requestUpdate('isComplete', oldIsComplete); - } - - __setIsEmpty(newVal) { - const oldIsEmpty = this.__isEmpty; - this.__isEmpty = newVal; - this.requestUpdate('isEmpty', oldIsEmpty); - } - - __setStripeReady(newVal) { - const oldStripeReady = this.__stripeReady; - this.__stripeReady = newVal; - this.requestUpdate('stripeReady', oldStripeReady); - } - - __setSource(newVal) { - const oldSource = this.__source; - this.__source = newVal; - this.requestUpdate('source', oldSource); - if (!newVal) return; - this.__fire('stripe-source', newVal); - this.__sourceFormField.removeAttribute('disabled'); - this.__sourceFormField.value = newVal; - if (this.action) this.form.submit(); - } - - __setToken(newVal) { - const oldToken = this.__token; - this.__token = newVal; - this.requestUpdate('token', oldToken); - if (!newVal) return; - this.__fire('stripe-token', newVal); - this.__tokenFormField.removeAttribute('disabled'); - this.__tokenFormField.value = newVal; - if (this.action) this.form.submit(); + /** + * Unmounts and nullifies the card. + * @private + */ + async unmountCard() { + this.card?.unmount(); + await this.set({ card: null, stripeReady: false }); } } diff --git a/src/lib/dom.js b/src/lib/dom.js new file mode 100644 index 0000000..7ad72e8 --- /dev/null +++ b/src/lib/dom.js @@ -0,0 +1,20 @@ +import { curry } from '@typed/curry'; +import { render } from 'lit-html'; + +/** + * Remove an element from the DOM + * @param {ChildNode} el + * @return {void} + */ +/* istanbul ignore next */ +export const remove = el => + el?.remove(); + +export const appendTemplate = curry(function appendTemplate(template, target) { + const tmp = document.createElement('div'); + render(template, tmp); + const { firstElementChild } = tmp; + target.appendChild(firstElementChild); + tmp.remove(); + return firstElementChild; +}); diff --git a/src/lib/predicates.js b/src/lib/predicates.js new file mode 100644 index 0000000..aedbcf5 --- /dev/null +++ b/src/lib/predicates.js @@ -0,0 +1,5 @@ +export const elem = xs => x => xs.includes(x); + +export const not = p => x => !p(x); + +export const isRepresentation = elem(['paymentMethod', 'source', 'token']); diff --git a/src/lib/strings.js b/src/lib/strings.js new file mode 100644 index 0000000..dd579fb --- /dev/null +++ b/src/lib/strings.js @@ -0,0 +1,34 @@ +import eagerDash from '@lavadrop/kebab-case'; +import eagerCamel from '@lavadrop/camel-case'; +import { memoize } from '@pacote/memoize'; + +const identity = x => x; + +/** + * camelCase a string + * @type {(string: string) => string} + */ +export const camel = memoize(identity, eagerCamel); + +/** + * dash-case a string + * @type {(string: string) => string} + */ +export const dash = memoize(identity, eagerDash); + +function randomReplacer(c) { + return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16); +} + +function getRandomString() { + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, randomReplacer); +} + +/** + * Generates a random mount point (UUID v4) for Stripe Elements. This will allow multiple + * Elements forms to be embedded on a single page. + * @return {String} mount element id + */ +export function generateRandomMountElementId() { + return `stripe-elements-mount-point-${getRandomString()}`; +} diff --git a/src/lib/strings.test.js b/src/lib/strings.test.js new file mode 100644 index 0000000..263cbba --- /dev/null +++ b/src/lib/strings.test.js @@ -0,0 +1,17 @@ +import { expect } from '@open-wc/testing'; +import { generateRandomMountElementId } from './strings.js'; + +describe('generateRandomMountElementId', function() { + let initial; + let next; + + it('generates a mount point id', function() { + initial = generateRandomMountElementId(); + expect(initial).to.be.a('string').and.match(/stripe-elements-mount-point-/); + }); + + it('randomizes the suffix on each call', function() { + next = generateRandomMountElementId(); + expect(next).to.not.equal(initial); + }); +}); diff --git a/src/shared.css b/src/shared.css new file mode 100644 index 0000000..f45eb14 --- /dev/null +++ b/src/shared.css @@ -0,0 +1,12 @@ +[hidden] { display: none !important; } + +:host { + display: block; +} + +#error { + font-family: sans-serif; + font-size: 14px; + padding-left: 42px; + padding-bottom: 10px; +} diff --git a/src/stripe-elements.css b/src/stripe-elements.css new file mode 100644 index 0000000..956086c --- /dev/null +++ b/src/stripe-elements.css @@ -0,0 +1,4 @@ +:host { + min-width: var(--stripe-elements-width, 300px); + min-height: var(--stripe-elements-height, 50px); +} diff --git a/src/stripe-elements.test.js b/src/stripe-elements.test.js index 25f1408..04a229e 100644 --- a/src/stripe-elements.test.js +++ b/src/stripe-elements.test.js @@ -1,859 +1,691 @@ -import './stripe-elements'; +import '../stripe-elements.js'; -import { expect, fixture, oneEvent, nextFrame, aTimeout } from '@open-wc/testing'; -import { html, render } from 'lit-html'; -import { spy, stub } from 'sinon'; - -import 'chai-things'; -import 'sinon-chai'; +import { expect, fixture, oneEvent } from '@open-wc/testing'; import { - INCOMPLETE_CARD_KEY, - MockedStripeAPI, + CARD_DECLINED_ERROR, + INCOMPLETE_CARD_ERROR, PUBLISHABLE_KEY, SHOULD_ERROR_KEY, SUCCESSFUL_SOURCE, SUCCESSFUL_TOKEN, - TOKEN_ERROR_KEY, } from '../test/mock-stripe'; - -function appendTemplate(template, target) { - const tmp = document.createElement('div'); - render(template, tmp); - const { firstElementChild } = tmp; - target.appendChild(firstElementChild); - tmp.remove(); - return firstElementChild; -} - -customElements.define('x-host', class XHost extends HTMLElement { - constructor() { - super(); - this.attachShadow({ mode: 'open' }); - this.shadowRoot.innerHTML = ``; - this.stripeElements = this.shadowRoot.firstElementChild; - } -}); - -customElements.define('y-host', class YHost extends HTMLElement { - constructor() { - super(); - this.attachShadow({ mode: 'open' }); - this.shadowRoot.innerHTML = ``; - } -}); - - -function camelCaseToDash( myStr ) { - return myStr.replace( /([a-z])([A-Z])/g, '$1-$2' ).toLowerCase(); -} - -const NO_STRIPE_JS = ` requires Stripe.js to be loaded first.`; -const INCOMPLETE_CC_INFO = 'Credit card information is incomplete.'; -const EMPTY_CC_INFO = 'Credit card information is empty.'; - -afterEach(function removeGlobalStyles() { - const globalStyles = document.getElementById('stripe-elements-custom-css-properties'); - if (globalStyles) globalStyles.remove(); -}); +import { + DEFAULT_PROPS, + EMPTY_CC_ERROR, + NOTIFYING_PROPS, + NO_STRIPE_CREATE_SOURCE_ERROR, + NO_STRIPE_CREATE_TOKEN_ERROR, + NO_STRIPE_JS, + READ_ONLY_PROPS, + appendGlobalStyles, + appendAllBlueStyleTag, + assertFiresStripeChange, + assertHasOneGlobalStyleTag, + createSource, + createToken, + element, + initialStripe, + initialStripeMountId, + mockShadyCSS, + mockShadyDOM, + mockStripe, + removeAllBlueStyleTag, + removeStripeMount, + reset, + resetTestState, + restoreAppended, + restoreCardClear, + restoreConsoleWarn, + restoreFormSubmit, + restoreGetComputedStyleValue, + restoreShadyCSS, + restoreShadyDOM, + restoreStripe, + setProps, + setupNoProps, + setupWithPublishableKey, + spyConsoleWarn, + spyGetComputedStyleValue, + stubFormSubmit, + synthStripeEvent, + synthStripeFormValues, + testDefaultPropEntry, + testReadOnlyProp, + testReadonlyNotifyingProp, + testWritableNotifyingProp, + validate, +} from '../test/helpers'; +import { elem, not } from './lib/predicates.js'; + +const assignedNodes = el => el.assignedNodes(); + +const expectedLightDOM = ({ stripeMountId }) => ` +
+
+
+ + + +
+
+`; describe('stripe-elements', function() { + beforeEach(spyConsoleWarn); + afterEach(restoreConsoleWarn); + afterEach(resetTestState); + it('instantiates without error', async function noInitialError() { - const element = await fixture(``); + await setupNoProps(); expect(element.constructor.is).to.equal('stripe-elements'); }); describe('default properties', function defaults() { - [ - { name: 'action', default: undefined }, - { name: 'brand', default: null }, - { name: 'card', default: null }, - { name: 'elements', default: null }, - { name: 'error', default: null }, - { name: 'hasError', default: false }, - { name: 'hideIcon', default: false }, - { name: 'hidePostalCode', default: false }, - { name: 'iconStyle', default: 'default' }, - { name: 'isComplete', default: false }, - { name: 'isEmpty', default: true }, - { name: 'source', default: null }, - { name: 'stripe', default: null }, - { name: 'token', default: null }, - { name: 'value', default: {} }, - ].forEach(prop => { - it(prop.name, async function() { - const element = await fixture(``); - expect(element[prop.name]).to.eql(prop.default); - }); - }); + beforeEach(setupNoProps); + Object.entries(DEFAULT_PROPS).forEach(testDefaultPropEntry); }); describe('read-only properties', function readOnly() { - [ - 'brand', - 'card', - 'elements', - 'error', - 'hasError', - 'isComplete', - 'isEmpty', - 'source', - 'stripe', - 'stripeReady', - 'token', - ].forEach(prop => { - it(prop, async function() { - const element = await fixture(``); - const init = element[prop]; - expect(() => element[prop] = Math.random()).to.throw; - expect(element[prop]).to.equal(init); - }); - }); + beforeEach(setupNoProps); + READ_ONLY_PROPS.forEach(testReadOnlyProp); }); - describe('notifying public properties', function notifying() { - [ - 'publishableKey', - ].forEach(prop => { - it(prop, async function() { - window.Stripe = {}; - const element = await fixture(``); - const synth = Math.random(); - setTimeout(() => { - element[prop] = synth; - }); - const eventName = `${camelCaseToDash(prop)}-changed`; - const { detail: { value } } = await oneEvent(element, eventName); - expect(value).to.eql(synth); - delete window.Stripe; - }); - }); + describe('notifying writable properties', function notifying() { + beforeEach(setupNoProps); + NOTIFYING_PROPS.filter(not(elem(READ_ONLY_PROPS))).forEach(testWritableNotifyingProp); }); - describe('document styles', function() { - it('appends a stylesheet to the document when absent', async function globalStylesWhen() { - await fixture(``); - const globalStyles = document.getElementById('stripe-elements-custom-css-properties'); - expect(globalStyles).to.not.be.null; - }); + describe('notifying read-only properties', function notifying() { + beforeEach(setupNoProps); + READ_ONLY_PROPS.filter(elem(NOTIFYING_PROPS)).forEach(testReadonlyNotifyingProp); + }); - it('doesnt append a stylesheet to the document when present', async function globalStylesWhen() { - const style = document.createElement('style'); - style.id = 'stripe-elements-custom-css-properties'; - document.head.appendChild(style); - await fixture(``); - const globalStyles = document.getElementById('stripe-elements-custom-css-properties'); - expect(globalStyles).to.equal(style); - }); + describe('with global CSS present in the document', function() { + beforeEach(appendGlobalStyles); + beforeEach(setupNoProps); + afterEach(restoreAppended); + it('does not append a second stylesheet to the document', assertHasOneGlobalStyleTag); }); - describe('ShadyDOM support', function shadyDOM() { - it('appends a shady-dom mount point', async function shadyMount() { - window.ShadyDOM = {}; - const element = await fixture(``); - expect(element.querySelector('form')).to.be.ok; - expect(element.querySelector('[aria-label="Credit or Debit Card"]')).to.be.ok; - expect(element.querySelector('input[name="stripeToken"]')).to.be.ok; - expect(element.querySelectorAll('form').length).to.equal(1); - }); + describe('without global CSS in the document', function() { + beforeEach(setupNoProps); + it('appends a stylesheet to the document when absent', assertHasOneGlobalStyleTag); + }); - it('only appends once', async function shadyMount() { - window.ShadyDOM = {}; - const element = await fixture(``); - element.firstUpdated(); - expect(element.querySelectorAll('form').length).to.equal(1); - delete window.ShadyDOM; + describe('When Mocked ShadyDOM polyfill is in use', function shadyDOM() { + beforeEach(mockShadyDOM); + beforeEach(setupNoProps); + afterEach(restoreShadyDOM); + + describe('when connected to document', function() { + it('appends a shady-dom mount point', function shadyMount() { + expect(element).lightDom.to.equal(` +
+
+ + + +
+ `); + }); + + it('finds its form', function findsForm() { + expect(element.form).to.be.an.instanceof(HTMLFormElement); + }); }); }); - describe('Shadow DOM support', function shadowDOM() { - it('leaves one breadcrumb on its way up to the document', async function breadcrumbs() { - const host = await fixture(``); - const element = host.stripeElements; - const target = document.querySelector('[aria-label="Credit or Debit Card"]'); - const [slottedChild] = element.querySelector('slot').assignedNodes(); + describe('With Native Shadow DOM support', function shadowDOM() { + let nestedElement; + let primaryHost; + let secondaryHost; + let tertiaryHost; + let stripeMountId; + describe('when nested one shadow-root deep', function() { + beforeEach(async function setupOneRoot() { + primaryHost = await fixture(``); + ({ nestedElement } = primaryHost); + ({ stripeMountId } = nestedElement); + }); - expect(slottedChild).to.contain(target); - }); + it('leaves one breadcrumb on its way up to the document', async function breadcrumbs() { + const [slottedChild] = nestedElement.querySelector('slot').assignedNodes(); + expect(slottedChild).to.contain(nestedElement.stripeMount); + }); - it('leaves two breadcrumbs on its way up to the document', async function breadcrumbs() { - const y = await fixture(``); - const x = y.shadowRoot.querySelector('x-host'); - const target = document.querySelector('[aria-label="Credit or Debit Card"]'); - const [slottedChild] = - x.shadowRoot.querySelector('slot') - .assignedNodes() - .flatMap(el => el.assignedNodes()); - expect(slottedChild).to.contain(target); - }); + it('slots mount point in to its light DOM', function() { + expect(primaryHost).lightDom.to.equal(expectedLightDOM({ stripeMountId })); + }); - it('finds its form one shadowroot deep', async function breadcrumbs() { - const x = await fixture(``); - const element = x.shadowRoot.querySelector('stripe-elements'); - expect(element.form).to.be.an.instanceOf(HTMLFormElement); + it('finds its form', async function() { + expect(nestedElement.form).to.be.an.instanceOf(HTMLFormElement); + }); }); - it('finds its form two shadowroots deep', async function breadcrumbs() { - const y = await fixture(``); - const x = y.shadowRoot.querySelector('x-host'); - const element = x.shadowRoot.querySelector('stripe-elements'); - expect(element.form).to.be.an.instanceOf(HTMLFormElement); - }); + describe('when nested two shadow-roots deep', function() { + beforeEach(async function setupTwoRoots() { + secondaryHost = await fixture(``); + ({ primaryHost } = secondaryHost); + ({ nestedElement } = primaryHost); + ({ stripeMountId } = nestedElement); + }); + + it('forwards stripe mount deeply through slots', async function breadcrumbs() { + const [slottedChild] = + primaryHost.shadowRoot.querySelector('slot') + .assignedNodes() + .flatMap(assignedNodes); + expect(slottedChild).to.contain(nestedElement.stripeMount); + }); - it('only creates one slot when instantiated two roots deep', async function() { - const host = await fixture(``); - expect(document.querySelectorAll('div[slot="stripe-card"]').length).to.equal(1); + it('slots mount point in to the light DOM of the secondary shadow host', function() { + const { stripeMountId } = nestedElement; + expect(secondaryHost).lightDom.to.equal(expectedLightDOM({ stripeMountId })); + }); + + it('appends a slot to the shadow DOM of the secondary shadow host', function() { + expect(secondaryHost).shadowDom.to.equal(` + + + + `); + }); + + it('finds its form', function() { + expect(nestedElement.form).to.be.an.instanceOf(HTMLFormElement); + }); + + it('only creates one slot', function() { + expect(document.querySelectorAll('div[slot="stripe-card"]').length).to.equal(1); + }); }); - }); - describe('with a publishable key', function apiKey() { - describe('without Stripe.js', function withoutStripe() { - beforeEach(function stubConsole() { - stub(console, 'warn'); + describe('when nested three shadow-roots deep', function() { + beforeEach(async function setupThreeRoots() { + tertiaryHost = await fixture(``); + ({ secondaryHost } = tertiaryHost); + ({ primaryHost } = secondaryHost); + ({ nestedElement } = primaryHost); + ({ stripeMountId } = nestedElement); + }); + + it('forwards stripe mount deeply through slots', async function breadcrumbs() { + const [slottedChild] = + primaryHost.shadowRoot.querySelector('slot') + .assignedNodes() + .flatMap(assignedNodes) + .flatMap(assignedNodes); + expect(slottedChild).to.contain(nestedElement.stripeMount); + }); + + it('slots mount point in to the light DOM of the tertiary shadow host', function() { + expect(tertiaryHost).lightDom.to.equal(expectedLightDOM({ stripeMountId })); }); - afterEach(function restoreConsole() { - console.warn.restore(); + it('appends a slot to the shadow DOM of the tertiary shadow host', function() { + expect(tertiaryHost).shadowDom.to.equal(` + + + + `); }); + it('appends a slot to the shadow DOM of the secondary shadow host', function() { + expect(secondaryHost).shadowDom.to.equal(` + + + + `); + }); + + it('finds its form', function() { + expect(nestedElement.form).to.be.an.instanceOf(HTMLFormElement); + }); + + it('only creates one slot', function() { + expect(document.querySelectorAll('div[slot="stripe-card"]').length).to.equal(1); + }); + }); + }); + + describe('without Stripe.js', function withoutStripe() { + beforeEach(restoreStripe); + describe('with a valid publishable key', function apiKey() { + beforeEach(setupWithPublishableKey(PUBLISHABLE_KEY)); + it('logs a warning', async function logsWarning() { - const element = await fixture(``); expect(console.warn).to.have.been.calledWith(NO_STRIPE_JS); - expect(element.stripe).to.not.be.ok; }); it('does not initialize stripe instance', async function noStripeInit() { - const element = await fixture(``); expect(element.stripe).to.not.be.ok; }); it('does not mount card', async function noCard() { - const element = await fixture(``); expect(element.card).to.not.be.ok; }); - it('sets the error', async function setsError() { - const element = await fixture(``); - expect(element.error).to.eql({ message: NO_STRIPE_JS }); + it('sets the `error` property', async function setsError() { + expect(element.error.message).to.equal(NO_STRIPE_JS); }); - it('throws an error when creating token', async function submit() { - const element = await fixture(``); - return element.createToken() - .then(() => expect.fail('Resolved token promise without Stripe.js')) - .catch(err => expect(err.message).to.equal('Cannot create token before initializing Stripe')); + it('throws an error when creating token', async function() { + try { + await element.createToken(); + expect.fail('Resolved token promise without Stripe.js'); + } catch (err) { + expect(err.message).to.equal(NO_STRIPE_CREATE_TOKEN_ERROR); + } }); - it('throws an error when creating source', async function submit() { - const element = await fixture(``); - return element.createSource() - .then(() => expect.fail('Resolved source promise without Stripe.js')) - .catch(err => expect(err.message).to.equal('Cannot create source before initializing Stripe')); + it('throws an error when creating source', async function() { + try { + await element.createSource(); + expect.fail('Resolved source promise without Stripe.js'); + } catch (err) { + expect(err.message).to.equal(NO_STRIPE_CREATE_SOURCE_ERROR); + } }); }); + }); - describe('with mocked Stripe.js', function withMockedStripeJs() { - beforeEach(function mockStripe() { - window.Stripe = (key, opts) => new MockedStripeAPI(key, opts); + describe('with mocked Stripe.js', function withMockedStripeJs() { + beforeEach(mockStripe); + afterEach(restoreStripe); + describe('and CSS custom properties applied', function() { + beforeEach(appendAllBlueStyleTag); + afterEach(removeAllBlueStyleTag); + describe('with a mocked ShadyCSS shim', function() { + beforeEach(mockShadyCSS); + beforeEach(spyGetComputedStyleValue); + afterEach(restoreShadyCSS); + afterEach(restoreGetComputedStyleValue); + describe('with a valid publishable key', function() { + beforeEach(setupWithPublishableKey(PUBLISHABLE_KEY)); + describe('and a valid card', function() { + beforeEach(synthStripeFormValues({ cardNumber: '4242424242424242', mm: '01', yy: '40', cvc: '000' })); + it('passes CSS custom property values to stripe', function() { + const allValues = Object.values(element.card.style).flatMap(Object.values); + expect(allValues).to.all.equal('blue'); + }); + }); + }); }); - afterEach(function restoreMock() { - delete window.Stripe; + describe('without the ShadyCSS shim', function() { + describe('with a valid publishable key', function() { + beforeEach(setupWithPublishableKey(PUBLISHABLE_KEY)); + describe('and a valid card', function() { + beforeEach(synthStripeFormValues({ cardNumber: '4242424242424242', mm: '01', yy: '40', cvc: '000' })); + it('passes CSS custom property values to stripe', function() { + const allValues = Object.values(element.card.style).flatMap(Object.values); + expect(allValues).to.all.equal('blue'); + }); + }); + }); }); + }); + + describe('and no publishable key', function() { + beforeEach(setupNoProps); + describe('when stripe mount point is removed from DOM', function() { + beforeEach(removeStripeMount); + describe('then publishable key is set', function() { + beforeEach(setProps({ publishableKey: PUBLISHABLE_KEY })); + it('rebuilds its DOM', function() { + const { stripeMountId } = element; + expect(element).lightDom.to.equal(expectedLightDOM({ stripeMountId })); + expect(element.stripeMount, 'mount').to.be.ok; + }); + + it('uses a new id', function() { + expect(element.stripeMount.id).to.not.equal(initialStripeMountId); + }); + + it('finds its form', function() { + expect(element.querySelector('form')).to.be.ok; + }); + }); + }); + }); + + describe('and an invalid publishable key', function() { + beforeEach(setupWithPublishableKey(SHOULD_ERROR_KEY)); + describe('and a complete, valid form', function() { + beforeEach(synthStripeFormValues({ cardNumber: '4242424242424242', mm: '01', yy: '40', cvc: '000' })); + describe('calling createSource()', function() { + beforeEach(createSource); + it('sets the `error` property', function() { + expect(element.error.message, 'error').to.equal(SHOULD_ERROR_KEY); + expect(element.token, 'token').to.be.null; + expect(element.source, 'source').to.be.null; + }); + }); + + describe('calling validate()', function() { + beforeEach(validate); + it('returns true', function validating() { + expect(element.validate()).to.be.true; + }); + + it('unsets the `error` property', function() { + expect(element.error).to.be.null; + }); + }); + }); + }); + + describe('and a valid publishable key', function() { + beforeEach(setupWithPublishableKey(PUBLISHABLE_KEY)); it('initializes stripe instance', async function stripeInit() { - const element = await fixture(``); expect(element.stripe).to.be.ok; }); it('initializes elements instance', async function elementsInit() { - const element = await fixture(``); expect(element.elements).to.be.ok; }); it('mounts a card into the target', async function cardInit() { - const element = await fixture(``); expect(element.card).to.be.ok; }); - describe('when pk is reset', function pkReset() { - it('reinitializes stripe', async function() { - const element = await fixture(``); - const initial = element.stripe; - element.publishableKey = 'foo'; - await element.updateComplete; - expect(element.stripe).to.not.equal(initial); - }); + describe('when publishable key is changed', function publishableKeyReset() { + let initialStripeMountId; + beforeEach(function() { initialStripeMountId = element.stripeMountId; }); + beforeEach(setProps({ publishableKey: 'foo' })); + afterEach(function() { initialStripeMountId = undefined; }); + it('reinitializes stripe', function() { expect(element.stripe).to.not.equal(initialStripe); }); + it('uses a new mount point id', function() { expect(element.stripeMountId).to.not.equal(initialStripeMountId); }); }); - describe('when pk is unset', function pkReset() { - it('unsets stripe instance', async function() { - const element = await fixture(``); - element.publishableKey = ''; - await element.updateComplete; + describe('when publishable key is unset', function pkReset() { + beforeEach(setProps({ publishableKey: undefined })); + + it('unsets stripe instance', function() { expect(element.stripe).to.be.null; }); - it('unsets element instance', async function() { - const element = await fixture(``); - element.publishableKey = ''; - await element.updateComplete; + it('unsets element instance', function() { expect(element.elements).to.be.null; }); - it('unsets card', async function() { - const element = await fixture(``); - element.publishableKey = ''; - await element.updateComplete; + it('unsets card', function() { expect(element.card).to.be.null; }); }); - describe('when dom is screwed before pk is set', function pkReset() { - it('rebuilds its dom', async function() { - const element = await fixture(``); - element.stripeMount.remove(); - element.publishableKey = PUBLISHABLE_KEY; - await element.updateComplete; - expect(element.stripeMount).to.be.ok; - expect(element.querySelector('form')).to.be.ok; - }); + describe('calling validate()', function() { + beforeEach(validate); - it('uses a new id', async function() { - const element = await fixture(``); - const initial = element.stripeMount.id; - element.stripeMount.remove(); - element.publishableKey = PUBLISHABLE_KEY; - await element.updateComplete; - expect(element.stripeMount.id).to.not.equal(initial); + it('returns false', function() { + expect(element.validate()).to.be.false; }); - it('rebuilds the whole trail', async function() { - const element = await fixture(``); - element.stripeMount.remove(); - element.publishableKey = PUBLISHABLE_KEY; - await element.updateComplete; - expect(element.stripeMount).to.be.ok; - expect(element.querySelector('form')).to.be.ok; + it('sets the `error` property', function callingValidateWithoutCard() { + expect(element.error.message).to.equal(EMPTY_CC_ERROR); }); }); - describe('when stripe fires change', function() { - it('fires a stripe-change event', async function() { - const element = await fixture(``); - const details = { foo: 'bar' }; - setTimeout(() => element.card.synthEvent(details)); - const { detail } = await oneEvent(element, 'stripe-change'); - expect(detail.foo).to.equal('bar'); + describe('calling isPotentiallyValid()', function() { + it('returns false', function callingIsPotentiallyValidWithoutCard() { + expect(element.isPotentiallyValid()).to.be.false; }); - }); - describe('when card is ready', function cardReady() { - it('fires stripe-ready event', async function() { - const element = await fixture(``); - setTimeout(() => element.card.synthEvent('ready')); - const ev = await oneEvent(element, 'stripe-ready'); - expect(ev).to.be.ok; + it('does not set the `error` property', function() { + expect(element.error).to.be.null; }); + }); - it('fires stripe-ready-changed event', async function() { - const element = await fixture(``); - setTimeout(() => element.card.synthEvent('ready')); - const ev = await oneEvent(element, 'stripe-ready-changed'); - expect(ev.detail.value).to.be.true; - }); + describe('calling createSource()', function callingCreateSource() { + beforeEach(createSource); - it('sets stripeReady', async function() { - const element = await fixture(``); - element.card.synthEvent('ready'); - expect(element.stripeReady).to.be.true; + it('sets the `error` property', function setsError() { + expect(element.source, 'source').to.be.null; + expect(element.token, 'token').to.be.null; + expect(element.error, 'error').to.equal(INCOMPLETE_CARD_ERROR); }); }); - describe('when card changes', function cardChange() { - describe('when empty changes', function emptyChange() { - it('fires is-empty-changed event', async function isEmptyChanged() { - const element = await fixture(``); - const synth = Math.random() + 1; - setTimeout(() => element.card.synthEvent({ empty: synth })); - const ev = await oneEvent(element, 'is-empty-changed'); - expect(ev.detail.value).to.equal(synth); - }); + describe('calling createToken()', function() { + beforeEach(createToken); - it('sets isEmpty', async function setsIsEmpty() { - const element = await fixture(``); - element.card.synthEvent({ empty: true }); - expect(element.isEmpty).to.be.true; - }); - - describe('validating empty card', function() { - it('is false', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: true }); - await element.updateComplete; - expect(element.validate()).to.be.false; - }); - - it('sets error', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: true }); - element.validate(); - await nextFrame(); - await element.updateComplete; - expect(element.error).to.equal(EMPTY_CC_INFO); - }); - }); + it('sets the `error` property', function() { + expect(element.token, 'token').to.be.null; + expect(element.source, 'source').to.be.null; + expect(element.error, 'error').to.equal(INCOMPLETE_CARD_ERROR); }); + }); - describe('when complete changes', function emptyChange() { - it('fires is-complete-changed event', async function isEmptyChanged() { - const element = await fixture(``); - const synth = Math.random() + 1; - setTimeout(() => element.card.synthEvent({ complete: synth })); - const ev = await oneEvent(element, 'is-complete-changed'); - expect(ev.detail.value).to.equal(synth); - }); - - it('sets isComplete', async function setsIsEmpty() { - const element = await fixture(``); - element.card.synthEvent({ complete: true }); - expect(element.isComplete).to.be.true; - }); - - describe('validating incomplete card', function() { - it('is false', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: false }); - await element.updateComplete; - expect(element.validate()).to.be.false; - }); - - it('sets error', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: false }); - await element.updateComplete; - element.validate(); - await element.updateComplete; - expect(element.error).to.equal(INCOMPLETE_CC_INFO); - }); - }); + describe('when stripe fires `ready` event', function cardReady() { + beforeEach(synthStripeEvent('ready')); + it('fires `stripe-ready` event', async function() { + const ev = await oneEvent(element, 'stripe-ready'); + expect(ev).to.be.ok; }); - describe('when brand changes', function brandChange() { - it('fires brand-changed event', async function brandChanged() { - const element = await fixture(``); - const synth = Math.random() + 1; - setTimeout(() => element.card.synthEvent({ brand: synth })); - const ev = await oneEvent(element, 'brand-changed'); - expect(ev.detail.value).to.equal(synth); - }); - - it('sets brand', async function setsBrand() { - const element = await fixture(``); - const brand = 'visa'; - element.card.synthEvent({ brand }); - expect(element.brand).to.equal(brand); - }); + it('fires `stripe-ready-changed` event', async function() { + const { detail: { value } } = await oneEvent(element, 'stripe-ready-changed'); + expect(value).to.be.true; }); - describe('when error changes', function errorChange() { - it('fires error-changed event', async function errorChanged() { - const element = await fixture(``); - const synth = Math.random() + 1; - setTimeout(() => element.card.synthEvent({ error: synth })); - const ev = await oneEvent(element, 'error-changed'); - expect(ev.detail.value).to.equal(synth); - }); - - it('sets error', async function setsError() { - const element = await fixture(``); - element.card.synthEvent({ error: { message: 'foo' } }); - expect(element.error).to.eql({ message: 'foo' }); - }); - - it('sets hasError', async function setsError() { - const element = await fixture(``); - element.card.synthEvent({ error: { message: 'foo' } }); - expect(element.hasError).to.be.true; - }); + it('sets `stripeReady` property', async function() { + await oneEvent(element, 'stripe-ready'); + expect(element.stripeReady).to.be.true; }); + }); - describe('potentially valid', function() { - it('is true when neither incomplete, empty nor with error', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: false }); - await element.updateComplete; - expect(element.isPotentiallyValid()).to.be.true; - }); + describe('when stripe fires `change` event', function cardChange() { + describe('without regard to the event content', function() { + beforeEach(synthStripeEvent('change')); + it('fires a `stripe-change` event', assertFiresStripeChange); }); - describe('reset', function() { - it('unsets error', async function() { - const element = await fixture(``); - // set some arbitrary initial state - element.card.synthEvent({ brand: 'visa', complete: false, empty: false }); - await nextFrame(); - expect(element.error).to.not.be.null; - element.reset(); - await element.updateComplete; - expect(element.error).to.be.null; + describe('with a `brand` property', function brandChange() { + const brand = 'visa'; + beforeEach(synthStripeEvent('change', { brand })); + it('fires a `brand-changed` event', async function brandChanged() { + const { detail: { value } } = await oneEvent(element, 'brand-changed'); + expect(value).to.equal(brand); }); - it('clears the card', async function() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - stub(element.card, 'clear'); - element.reset(); - await nextFrame(); - await element.updateComplete; - expect(element.card.clear).to.have.been.called; - element.card.clear.restore(); + it('sets brand', async function setsBrand() { + await oneEvent(element, 'brand-changed'); + expect(element.brand).to.equal(brand); }); }); - }); - describe('when createSource called', function submitting() { - describe('when card is incomplete', function() { - it('does nothing', async function submit() { - const element = await fixture(``); - element.createSource(); - expect(element.token).to.be.null; - expect(element.source).to.be.null; - expect(element.error).to.be.null; - }); - }); + describe('describing a non-empty, incomplete card', function() { + beforeEach(synthStripeEvent('change', { brand: 'visa', empty: false, complete: false })); - describe('when createSource throws', function throws() { - it('sets error', async function() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createSource(); - await nextFrame(); - await element.updateComplete; - expect(element.error).to.eql(SHOULD_ERROR_KEY); - expect(element.token).to.be.null; - expect(element.source).to.be.null; + it('fires `is-empty-changed` event', async function isEmptyChanged() { + const { detail: { value: isEmpty } } = await oneEvent(element, 'is-empty-changed'); + expect(isEmpty).to.be.false; }); - describe('validating existing error', function() { - it('is false', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: false }); - await element.updateComplete; - expect(element.validate()).to.be.false; + describe('then after the event', function() { + beforeEach(async function() { + await oneEvent(element, 'stripe-change'); }); - it('retains error', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createSource(); - await nextFrame(); - await element.updateComplete; - element.validate(); - expect(element.error).to.equal(TOKEN_ERROR_KEY); - expect(element.token).to.be.null; - expect(element.source).to.be.null; + describe('calling reset()', function() { + beforeEach(reset); + afterEach(restoreCardClear); + + it('unsets the `error`', function() { + expect(element.error).to.be.null; + }); + + it('clears the card', function() { + expect(element.card.clear).to.have.been.called; + }); }); }); }); - describe('when createSource returns error', function throws() { - it('sets error', async function() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createSource(); - await nextFrame(); - await element.updateComplete; - expect(element.error).to.eql(TOKEN_ERROR_KEY); - expect(element.token).to.be.null; - expect(element.source).to.be.null; + describe('describing a complete card', function() { + beforeEach(synthStripeEvent('change', { brand: 'visa', empty: false, complete: true })); + it('fires `is-complete-changed` event', async function() { + const { detail: { value: isComplete } } = await oneEvent(element, 'is-complete-changed'); + expect(isComplete).to.be.true; }); }); + }); - describe('when source is returned', function() { - it('sets source', async function submit() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - element.createSource(); - await element.updateComplete; - expect(element.source).to.equal(SUCCESSFUL_SOURCE); - }); + describe('with a non-empty, incomplete form', function() { + beforeEach(synthStripeFormValues({ cardNumber: '4242424242424242' })); - it('fires source-changed', async function submit() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - setTimeout(() => element.createSource()); - const ev = await oneEvent(element, 'source-changed'); - expect(ev.detail.value).to.equal(SUCCESSFUL_SOURCE); + describe('calling createSource()', function() { + beforeEach(createSource); + it('sets the `error` property', function() { + expect(element.token, 'token').to.be.null; + expect(element.source, 'source').to.be.null; + expect(element.error, 'error').to.eql(INCOMPLETE_CARD_ERROR); }); - it('fires stripe-source', async function submit() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - setTimeout(() => element.createSource()); - const ev = await oneEvent(element, 'stripe-source'); - expect(ev.detail).to.equal(SUCCESSFUL_SOURCE); + it('sets the `hasError` property', function() { + expect(element.hasError).to.be.true; }); - describe('when there is an action', function() { - it('submits the form', async function submit() { - const element = await fixture(``); - await element.updateComplete; - const { form } = element; - const subStub = stub(form, 'submit'); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createSource(); - await aTimeout(100); - expect(subStub).to.have.been.called; - subStub.restore(); + describe('calling validate()', function() { + it('returns false', function() { + expect(element.validate()).to.be.false; }); }); - describe('validating good token', function() { - it('is true', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - expect(element.validate()).to.be.true; - expect(element.error).to.not.be.ok; - }); - - it('it is also "potentially" valid', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - expect(element.isPotentiallyValid()).to.be.true; - expect(element.error).to.not.be.ok; + describe('calling isPotentiallyValid()', function() { + it('returns false', function() { + expect(element.isPotentiallyValid()).to.be.false; }); }); }); - }); - describe('when createToken called', function submitting() { - describe('when card is incomplete', function() { - it('does nothing', async function submit() { - const element = await fixture(``); - element.createToken(); - expect(element.token).to.be.null; - expect(element.source).to.be.null; - expect(element.error).to.be.null; + describe('calling createToken()', function() { + beforeEach(createToken); + it('sets the `error` property', function() { + expect(element.token, 'token').to.be.null; + expect(element.source, 'source').to.be.null; + expect(element.error, 'error').to.eql(INCOMPLETE_CARD_ERROR); }); }); + }); - describe('when createToken throws', function throws() { - it('sets error', async function() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createToken(); - await nextFrame(); - await element.updateComplete; - expect(element.error).to.eql(SHOULD_ERROR_KEY); - expect(element.token).to.be.null; - expect(element.source).to.be.null; - }); - - describe('validating existing error', function() { - it('is false', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: false, empty: false }); - await element.updateComplete; - expect(element.validate()).to.be.false; - }); + describe('with a valid card', function() { + beforeEach(synthStripeFormValues({ cardNumber: '4242424242424242', mm: '01', yy: '40', cvc: '000' })); - it('retains error', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createToken(); - await nextFrame(); - await element.updateComplete; - element.validate(); - expect(element.error).to.equal(TOKEN_ERROR_KEY); - expect(element.token).to.be.null; - expect(element.source).to.be.null; - }); - }); + it('sets the `isEmpty` property', function() { + expect(element.isEmpty).to.be.false; }); - describe('when createToken returns error', function throws() { - it('sets error', async function() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createToken(); - await nextFrame(); - await element.updateComplete; - expect(element.error).to.eql(TOKEN_ERROR_KEY); - expect(element.token).to.be.null; - expect(element.source).to.be.null; - }); + it('sets the `isComplete` property', function() { + expect(element.isComplete).to.be.true; }); - describe('when token is returned', function() { - it('sets token', async function submit() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.createToken(); - await element.updateComplete; - expect(element.token).to.equal(SUCCESSFUL_TOKEN); - }); + describe('calling createToken()', function() { + beforeEach(createToken); - it('fires token-changed', async function submit() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - setTimeout(() => element.createToken()); + it('fires a `token-changed` event', async function() { const ev = await oneEvent(element, 'token-changed'); expect(ev.detail.value).to.equal(SUCCESSFUL_TOKEN); }); - it('fires stripe-token', async function submit() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - setTimeout(() => element.createToken()); + it('fires a `stripe-token` event', async function() { const ev = await oneEvent(element, 'stripe-token'); expect(ev.detail).to.equal(SUCCESSFUL_TOKEN); }); + }); + + describe('with `action` property set', function() { + beforeEach(stubFormSubmit); + beforeEach(setProps({ action: '/here' })); + afterEach(restoreFormSubmit); + + describe('calling createSource()', function() { + it('submits the form', async function() { + await createSource(); + expect(element.form.submit).to.have.been.called; + }); + + it('fires a `source-changed` event', async function() { + createSource(); + const ev = await oneEvent(element, 'source-changed'); + expect(ev.detail.value).to.equal(SUCCESSFUL_SOURCE); + }); - describe('when there is an action', function() { - it('submits the form', async function submit() { - const element = await fixture(``); - await element.updateComplete; - const form = element.querySelector('form'); - const subStub = stub(form, 'submit'); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - element.createToken(); - await aTimeout(100); - expect(subStub).to.have.been.called; - subStub.restore(); + it('fires a `stripe-source` event', async function() { + createSource(); + const ev = await oneEvent(element, 'stripe-source'); + expect(ev.detail).to.equal(SUCCESSFUL_SOURCE); }); }); - describe('validating good token', function() { - it('is true', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - expect(element.validate()).to.be.true; - expect(element.error).to.not.be.ok; + describe('calling createToken()', function() { + beforeEach(createToken); + it('submits the form', function() { + expect(element.form.submit).to.have.been.called; + }); + + describe('calling validate()', function() { + beforeEach(validate); + it('returns true', function() { + expect(element.validate()).to.be.true; + }); + + it('does not set `error`', function() { + expect(element.error).to.be.null; + }); }); - it('it is also "potentially" valid', async function validating() { - const element = await fixture(``); - element.card.synthEvent({ brand: 'visa', complete: true, empty: false }); - await element.updateComplete; - expect(element.isPotentiallyValid()).to.be.true; - expect(element.error).to.not.be.ok; + describe('calling isPotentiallyValid()', function() { + it('returns true', function() { + expect(element.isPotentiallyValid()).to.be.true; + }); }); }); }); }); - describe('styling', function() { - const allBlue = html` - `; - - describe('with native shadowDOM', function() { - beforeEach(function applyShim() { - appendTemplate(allBlue, document.head); - }); + describe('with a card that will be declined', function() { + beforeEach(synthStripeFormValues({ cardNumber: '4000000000000002', mm: '01', yy: '40', cvc: '000' })); - afterEach(function removeShim() { - document.getElementById('all-blue-styles').remove(); + describe('calling createSource()', function() { + it('sets the `error` property', async function() { + try { + await element.createSource(); + } catch { + expect(element.error).to.equal(CARD_DECLINED_ERROR); + expect(element.token).to.be.null; + expect(element.source).to.be.null; + } }); - it('passes css custom styles to stripe', async function() { - appendTemplate(allBlue, document.head); - const element = await fixture(``); - await element.updateComplete; - const allValues = Object.values(element.card.style).flatMap(Object.values); - expect(allValues).to.all.equal('blue'); - document.getElementById('all-blue-styles').remove(); + it('rejects with the Stripe error', async function() { + return element.createSource() + .then( + _ => expect.fail('createSource Resolved'), + e => expect(e).to.equal(CARD_DECLINED_ERROR) + ); }); }); - describe('with mocked ShadyCSS', function() { - const adoptedCssTextMap = {}; - - beforeEach(function applyMock() { - appendTemplate(allBlue, document.head); - window.ShadyCSS = { - getComputedStyleValue(el, name) { - return getComputedStyle(el).getPropertyValue(name); - }, - ScopingShim: { - prepareAdoptedCssText(cssTextArray, elementName) { - adoptedCssTextMap[elementName] = cssTextArray.join(' '); - }, - }, - }; - spy(window.ShadyCSS, 'getComputedStyleValue'); + describe('calling createToken()', function() { + beforeEach(createToken); + it('sets the `error` property', function() { + expect(element.error.code).to.equal(CARD_DECLINED_ERROR.code); + expect(element.token).to.be.null; + expect(element.source).to.be.null; }); - afterEach(function removeMock() { - document.getElementById('all-blue-styles').remove(); - window.ShadyCSS.getComputedStyleValue.restore(); - delete window.ShadyCSS; - }); + describe('calling validate()', function() { + beforeEach(validate); + it('returns false', function() { + expect(element.validate()).to.be.false; + }); - it('passes css custom styles to stripe', async function() { - const element = await fixture(``); - await element.updateComplete; - const allValues = Object.values(element.card.style).flatMap(Object.values); - expect(allValues).to.all.equal('blue'); - expect(window.ShadyCSS.getComputedStyleValue).to.have.been.called; + it('retains the `error` property', async function validating() { + expect(element.error.code).to.equal(CARD_DECLINED_ERROR.code); + }); }); }); }); diff --git a/src/stripe-method-decorator.js b/src/stripe-method-decorator.js new file mode 100644 index 0000000..0a3843a --- /dev/null +++ b/src/stripe-method-decorator.js @@ -0,0 +1,21 @@ +/* eslint-disable no-invalid-this */ + +function wrap(f) { + return wrapped => { + const { descriptor } = wrapped; + const original = descriptor.value; + + descriptor.value = f(original); + + return { ...wrapped, descriptor }; + }; +} + +export const stripeMethod = wrap(function(f) { + const { name } = f; + return async function(...args) { + if (!this.stripe) throw new Error(`<${this.constructor.is}>: Stripe must be initialized before calling ${name}.`); + return f.call(this, ...args) + .then(this.handleResponse); + }; +}); diff --git a/stories/helpers.js b/stories/helpers.js index fd66057..dac1063 100644 --- a/stories/helpers.js +++ b/stories/helpers.js @@ -1,2 +1,9 @@ export const $ = x => document.querySelector(x); export const $$ = x => [...document.querySelectorAll(x)]; + +const setKey = key => el => + (el.publishableKey = key); + +export const setKeys = selector => ({ target: { value } }) => + $$(selector) + .forEach(setKey(value)); diff --git a/stories/stripe-elements.stories.mdx b/stories/stripe-elements.stories.mdx index 3aca080..34e768b 100644 --- a/stories/stripe-elements.stories.mdx +++ b/stories/stripe-elements.stories.mdx @@ -12,7 +12,7 @@ import '@power-elements/json-viewer'; import '@material/mwc-textfield'; import '@material/mwc-button'; -import { $, $$ } from './helpers.js'; +import { $, $$, setKeys } from './helpers.js'; - { - () => { - const setPublishableKey = event => $$('stripe-elements:not(#should-error)').forEach(el => el.publishableKey = event.target.value); - return html` - `; - } + {html` + + ` } diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 0000000..6a22f7e --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,12 @@ +{ + "env": { + "mocha": true + }, + "rules": { + "no-console": "off", + "no-invalid-this": "off" + }, + "globals": { + "chai": true + } +} diff --git a/test/helpers.js b/test/helpers.js new file mode 100644 index 0000000..9d82383 --- /dev/null +++ b/test/helpers.js @@ -0,0 +1,361 @@ +import 'chai-things'; +import 'sinon-chai'; + +import { LitElement, html, customElement, query } from 'lit-element'; +import { spreadProps } from '@open-wc/lit-helpers'; + +import { + expect, + fixture, + nextFrame, + oneEvent, +} from '@open-wc/testing'; +import { spy, stub } from 'sinon'; + +import { MockedStripeAPI, PUBLISHABLE_KEY } from './mock-stripe'; +import { dash } from '../src/lib/strings'; + +const getTemplate = (props = {}) => + html``; + +/* eslint-disable no-unused-vars */ +@customElement('primary-host') +class PrimaryHost extends LitElement { + @query('stripe-elements') nestedElement; + + render() { return getTemplate({ publishableKey: PUBLISHABLE_KEY }); } +} + +@customElement('secondary-host') +class SecondaryHost extends LitElement { + @query('primary-host') primaryHost; + + render() { return html``; } +} + +@customElement('tertiary-host') +class TertiaryHost extends LitElement { + @query('secondary-host') secondaryHost; + + render() { return html``; } +} +/* eslint-enable no-unused-vars */ + +const stripeMethodError = name => `: Stripe must be initialized before calling ${name}.`; + +/* CONSTANTS */ +export const NO_STRIPE_JS = ` requires Stripe.js to be loaded first.`; +export const NO_STRIPE_CONFIRM_CARD_ERROR = stripeMethodError('confirmCardPayment'); +export const NO_STRIPE_CREATE_PAYMENT_METHOD_ERROR = stripeMethodError('createPaymentMethod'); +export const NO_STRIPE_CREATE_SOURCE_ERROR = stripeMethodError('createSource'); +export const NO_STRIPE_CREATE_TOKEN_ERROR = stripeMethodError('createToken'); +export const INCOMPLETE_CC_ERROR = 'Credit card information is incomplete.'; +export const EMPTY_CC_ERROR = 'Credit card information is empty.'; + +export const DEFAULT_PROPS = Object.freeze({ + action: undefined, + brand: null, + card: null, + elements: null, + error: null, + hasError: false, + hideIcon: false, + hidePostalCode: false, + iconStyle: 'default', + isComplete: false, + isEmpty: true, + publishableKey: undefined, + source: null, + stripe: null, + token: null, + value: {}, +}); + +export const READ_ONLY_PROPS = Object.freeze([ + 'brand', + 'card', + 'elements', + 'error', + 'hasError', + 'isComplete', + 'isEmpty', + 'source', + 'stripe', + 'stripeReady', + 'token', +]); + +export const NOTIFYING_PROPS = Object.freeze([ + 'brand', + 'card', + 'error', + 'hasError', + 'isComplete', + 'isEmpty', + 'publishableKey', + 'source', + 'stripeReady', + 'token', +]); + +export const ALLOWED_STYLES = Object.freeze([ + 'color', + 'fontFamily', + 'fontSize', + 'fontSmoothing', + 'fontStyle', + 'fontVariant', + 'iconColor', + 'letterSpacing', + 'lineHeight', + 'textDecoration', + 'textShadow', + 'textTransform', +]); + +export const STYLE_PREFIXES = Object.freeze([ + 'base', + 'complete', + 'empty', + 'invalid', +]); + +export const ALL_BLUE_STYLES = ALLOWED_STYLES.flatMap(camelCase => STYLE_PREFIXES.map(prefix => `--stripe-elements-${prefix}-${dash(camelCase)}:blue;`)); + +/* TEST STATE */ + +let submitStub; + +export let element; +export let initialStripeMountId; +export let initialStripe; + +export function resetTestState() { + element = undefined; + initialStripeMountId = undefined; + initialStripe = undefined; + document.getElementById('stripe-elements-custom-css-properties')?.remove(); +} + +const ALL_BLUE_STYLE_TAG = document.createElement('style'); +ALL_BLUE_STYLE_TAG.id = 'all-blue-styles'; +ALL_BLUE_STYLE_TAG.textContent = `html { + ${ALL_BLUE_STYLES.join('\n')} +}`; + +/* MOCKS, STUBS, AND SPIES */ + +class MockScopingShim { + adoptedCssTextMap = {} + + prepareAdoptedCssText(cssTextArray, elementName) { + this.adoptedCssTextMap[elementName] = cssTextArray.join(' '); + } +} + +class MockShadyCSS { + getComputedStyleValue(el, name) { + return getComputedStyle(el).getPropertyValue(name); + } + + ScopingShim = new MockScopingShim(); + + restore() { + this.ScopingShim.adoptedCssTextMap = {}; + } +} + +export function mockShadyCSS() { + window.ShadyCSS = new MockShadyCSS(); +} + +export function restoreShadyCSS() { + window.ShadyCSS.restore(); + window.ShadyCSS = undefined; +} + +export function spyGetComputedStyleValue() { + spy(window.ShadyCSS, 'getComputedStyleValue'); +} + +export function restoreGetComputedStyleValue() { + window.ShadyCSS?.getComputedStyleValue?.restore(); +} + +export function mockShadyDOM() { + window.ShadyDOM = new (class MockShadyDOM { })(); +} + +export function restoreShadyDOM() { + window.ShadyDOM = undefined; +} + +export function mockStripe() { + window.Stripe = (key, opts) => new MockedStripeAPI(key, opts); +} + +export function restoreStripe() { + delete window.Stripe; +} + +export function spyCardClear() { + spy(element.card, 'clear'); +} + +export function restoreCardClear() { + element?.card?.clear?.restore(); +} + +export function spyConsoleWarn() { + stub(console, 'warn'); +} + +export function restoreConsoleWarn() { + console.warn?.restore(); +} + +export function stubFormSubmit() { + submitStub = stub(element.form, 'submit'); +} + +export function restoreFormSubmit() { + submitStub?.restore(); +} + +/* FIXTURE */ + +export async function setupNoProps() { + element = await fixture(getTemplate()); +} + +export function setupWithPublishableKey(publishableKey) { + return async function setup() { + element = await fixture(getTemplate({ publishableKey })); + await element.updateComplete; + initialStripe = element.stripe; + }; +} + +export async function removeStripeMount() { + initialStripeMountId = element.stripeMount.id; + element?.stripeMount?.remove(); +} + +export function appendAllBlueStyleTag() { + document.head.appendChild(ALL_BLUE_STYLE_TAG); +} + +export function removeAllBlueStyleTag() { + document.getElementById('all-blue-styles').remove(); +} + +let appendedGlobalStyleTag; +export function appendGlobalStyles() { + appendedGlobalStyleTag = document.createElement('style'); + appendedGlobalStyleTag.id = 'stripe-elements-custom-css-properties'; + document.head.appendChild(appendedGlobalStyleTag); +} + +export function restoreAppended() { + appendedGlobalStyleTag = undefined; +} + +/* ASSERTIONS */ + +export function assertHasOneGlobalStyleTag() { + const queried = document.querySelectorAll('#stripe-elements-custom-css-properties'); + expect(queried.length).to.equal(1); +} + +export function testDefaultPropEntry([name, value]) { + return it(name, async function() { + expect(element[name], name).to.eql(value); + }); +} + +export function testReadOnlyProp(name) { + it(name, function() { + const init = element[name]; + expect(() => element[name] = Math.random()).to.throw; + expect(element[name], name).to.equal(init); + }); +} + +export function testWritableNotifyingProp(name) { + it(name, async function() { + const synth = `${Math.random()}`; + const eventName = `${dash(name)}-changed`; + setTimeout(function setProp() { element[name] = synth; }); + const { detail: { value } } = await oneEvent(element, eventName); + expect(value, name).to.eql(synth); + }); +} + +export function testReadonlyNotifyingProp(name) { + it(name, async function() { + const synth = `${Math.random()}`; + const eventName = `${dash(name)}-changed`; + setTimeout(function setProp() { element.set({ [name]: synth }); }); + const { detail: { value } } = await oneEvent(element, eventName); + expect(value, name).to.eql(synth); + }); +} + +export async function assertFiresStripeChange() { + const name = 'stripe-change'; + const { type } = await oneEvent(element, name); + expect(type).to.equal(name); +} + +/* ELEMENT METHODS */ + +export async function reset() { + spyCardClear(); + element.reset(); + await element.updateComplete; +} + +export async function createSource() { + element.createSource(); + // don't await result if we need to set up a listener + if (!this?.currentTest?.title.startsWith('fires')) await nextFrame(); +} + +export async function createToken() { + element.createToken(); + // don't await result if we need to set up a listener + if (!this?.currentTest?.title.startsWith('fires')) await nextFrame(); +} + +export async function createPaymentMethod() { + element.createPaymentMethod(); + // don't await result if we need to set up a listener + if (!this?.currentTest?.title.startsWith('fires')) await nextFrame(); +} + +export async function validate() { + element.validate(); + await element.updateComplete; +} + +export function setProps(props) { + return async function doSetProps() { + await element.set(props); + await nextFrame(); + await element.updateComplete; + }; +} + +export function synthStripeEvent(...args) { + return function() { + element.card.synthEvent(...args); + }; +} + +export function synthStripeFormValues(inputs) { + return async function() { + element?.card?.setState(inputs); + await oneEvent(element, 'stripe-change'); + await element.updateComplete; + }; +} diff --git a/test/mock-stripe.js b/test/mock-stripe.js index 03c4249..7019ae5 100644 --- a/test/mock-stripe.js +++ b/test/mock-stripe.js @@ -1,75 +1,161 @@ import { render, html } from 'lit-html'; +import luhn from 'luhn-js'; +import creditCardType from 'credit-card-type'; export const PUBLISHABLE_KEY = 'pk_test_XXXXXXXXXXXXXXXXXXXXXXXX'; + export const INCOMPLETE_CARD_KEY = 'INCOMPLETE_CARD_KEY'; + +export const INCOMPLETE_CARD_ERROR = { + type: 'validation_error', + code: 'incomplete_number', + message: 'Your card number is incomplete.', +}; + +export const CARD_DECLINED_ERROR = { + type: 'card_error', + code: 'card_declined', + message: 'The card has been declined.', +}; + export const SHOULD_ERROR_KEY = 'SHOULD_ERROR_KEY'; + export const TOKEN_ERROR_KEY = 'TOKEN_ERROR_KEY'; + export const SUCCESSFUL_TOKEN = Object.freeze({ id: 'SUCCESSFUL_TOKEN' }); + export const SUCCESSFUL_SOURCE = Object.freeze({ id: 'SUCCESSFUL_SOURCE' }); +export const SUCCESSFUL_PAYMENT_METHOD = Object.freeze({ id: 'SUCCESSFUL_PAYMENT_METHOD' }); + +const assign = target => ([k, v]) => target[k] = v; + +const CARD_ERRORS = { + '4000000000000002': CARD_DECLINED_ERROR, +}; + +class MockElement { + card = new EventTarget(); + + listeners = []; + + get error() { + const { cardNumber, complete, empty } = this; + const cardError = CARD_ERRORS[cardNumber?.toString()]; + const stateError = (!complete || empty) ? INCOMPLETE_CARD_ERROR : undefined; + return cardError || stateError; + } + + constructor(type, { hideIcon, hidePostalCode, iconStyle, style, value }) { + this.hideIcon = hideIcon; + this.hidePostalCode = hidePostalCode; + this.iconStyle = iconStyle; + this.style = style; + this.type = type; + this.value = value; + } + + // Stripe Card APIs + addEventListener(type, handler) { + this.listeners.push([type, handler]); + return this.card.addEventListener(type, handler); + } + + mount(node) { + render(html``, node); + } + + on() { } + + blur() { } + + clear() { } + + destroy() { + this.listeners.forEach(listener => this.card.removeEventListener(...listener)); + delete this.card; + } + + focus() { } + + unmount() { } + + update() { } + + // Test Helpers + synthEvent(type, params) { + const props = { ...params, error: this.error }; + const event = new CustomEvent(type); + Object.entries(props).forEach(assign(event)); + this.card.dispatchEvent(event); + } + + setState({ cardNumber, mm, yy, cvc, zip }) { + this.cardNumber = cardNumber; + this.zip = zip; + this.mm = mm; + this.yy = yy; + this.cvc = cvc; + + [{ type: this.brand }] = creditCardType(this.cardNumber); + + this.complete = + luhn.isValid(this.cardNumber) && mm && yy && cvc !== undefined; + + this.empty = + !cardNumber && cardNumber !== 0 && + !mm && mm !== 0 && + !yy && yy !== 0 && + !cvc && cvc !== 0; + + const { brand, complete, empty } = this; + + this.synthEvent('change', { brand, complete, empty }); + } +} + +class MockElements { + constructor({ locale, fonts }) { + this.locale = locale; + this.fonts = fonts; + return this; + } + + create(type, { style } = {}) { + return new MockElement(type, { style }); + } +} + export class MockedStripeAPI { constructor(key, opts) { this.key = key; this.opts = opts; - this.__card = null; + this.keyError = + key === SHOULD_ERROR_KEY ? new Error(SHOULD_ERROR_KEY) + : key === TOKEN_ERROR_KEY ? new Error(TOKEN_ERROR_KEY) + : undefined; return this; } elements({ fonts, locale } = {}) { - return { - create(type, { - hideIcon, - hidePostalCode, - iconStyle, - style, - value, - } = {}) { - return { - get style() { - return style; - }, - - // Stripe Card APIs - addEventListener(type, handler) { - return this.__card.addEventListener(type, handler); - }, - mount(node) { - render(html`
`, node); - this.__card = node.firstElementChild; - }, - on() {}, - blur() {}, - clear() {}, - destroy() { - delete this.__card; - }, - focus() {}, - unmount() {}, - update() {}, - - // Test Helpers - synthEvent(params) { - const calledWithType = (typeof params === 'string'); - const type = calledWithType ? params : 'change'; - const event = new CustomEvent(type); - const assign = ([k, v]) => event[k] = v; - if (!calledWithType) Object.entries(params).forEach(assign); - this.__card.dispatchEvent(event); - }, - }; - }, - }; + return new MockElements({ fonts, locale }); + } + + async createPaymentMethod({ error = this.keyError }, cardData) { + const paymentMethod = error ? undefined : SUCCESSFUL_PAYMENT_METHOD; + const response = { error, paymentMethod }; + return response; } - async createToken(card, cardData) { - if (this.key === SHOULD_ERROR_KEY) throw new Error(SHOULD_ERROR_KEY); - else if (this.key === TOKEN_ERROR_KEY) return { error: TOKEN_ERROR_KEY }; - else return { token: SUCCESSFUL_TOKEN }; + async createSource({ error = this.keyError }, cardData) { + const source = error ? undefined : SUCCESSFUL_SOURCE; + const response = { error, source }; + return response; } - async createSource(card, cardData) { - if (this.key === SHOULD_ERROR_KEY) throw new Error(SHOULD_ERROR_KEY); - else if (this.key === TOKEN_ERROR_KEY) return { error: TOKEN_ERROR_KEY }; - else return { source: SUCCESSFUL_SOURCE }; + async createToken({ error = this.keyError } = {}, cardData) { + const token = error ? undefined : SUCCESSFUL_TOKEN; + const response = { error, token }; + return response; } }