diff --git a/CHANGELOG.md b/CHANGELOG.md index 1684c15883..9382762a95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,19 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Breaking changes + +### Added + +- Resolves [#3316](https://github.com/microsoft/BotFramework-WebChat/issues/3316). Refactored platform-neutral APIs into the new `api` package, to be reused on React Native component, in PR [#3543](https://github.com/microsoft/BotFramework-WebChat/pull/3543) by [@compulim](https://github.com/compulim) + - The new layering is `core` -> `api` -> `component` (HTML-only) -> `bundle` + - Includes composition mode, platform-neutral React hooks, and localization resources + - Most hooks are available in the new `api` package. Some hooks are only available on the existing `component` package, due to their platform dependency or coupling with visual components. For example, Web Worker, 2D canvas, `useMicrophoneButton*` are not available on the `api` package + - Most implementations of middleware are only available in `component` package due to their coupling with visual components or platform features. Some implementations, (e.g. card action middleware and activity grouping middleware) are available on `api` package. For example: + - Carousel layout and stacked layout is only available on `component` package due to their coupling with their respective visual components + - For card action middleware, `imBack`, `messageBack` and `postBack` actions are available on `api` package, but `call`, `openUrl` and other platform-dependent actions are only available on `component` package + - `activityMiddleware`, `attachmentMiddleware`, etc, now support arrays for multiple middleware + ### Fixed - Fixes [#3489](https://github.com/microsoft/BotFramework-WebChat/issues/3489). [Accessibility]: Fix AT saying 'Bot undefined said', by [@corinagum](https://github.com/corinagum) in PR [#3524](https://github.com/microsoft/BotFramework-WebChat/pull/3524) diff --git a/__tests__/__image_snapshots__/chrome-docker/adaptive-cards-js-broken-card-of-invalid-version-1-snap.png b/__tests__/__image_snapshots__/chrome-docker/adaptive-cards-js-broken-card-of-invalid-version-1-snap.png new file mode 100644 index 0000000000..df4476ba67 Binary files /dev/null and b/__tests__/__image_snapshots__/chrome-docker/adaptive-cards-js-broken-card-of-invalid-version-1-snap.png differ diff --git a/__tests__/__image_snapshots__/chrome-docker/upload-js-upload-a-picture-2-snap.png b/__tests__/__image_snapshots__/chrome-docker/upload-js-upload-a-picture-2-snap.png new file mode 100644 index 0000000000..5190c85971 Binary files /dev/null and b/__tests__/__image_snapshots__/chrome-docker/upload-js-upload-a-picture-2-snap.png differ diff --git a/__tests__/__image_snapshots__/html/accessibility-live-region-attachment-unknown-card-js-accessibility-requirement-attachments-in-live-region-unknown-card-1-snap.png b/__tests__/__image_snapshots__/html/accessibility-live-region-attachment-unknown-card-js-accessibility-requirement-attachments-in-live-region-unknown-card-1-snap.png index d8dbb3c8bf..9dbcad9405 100644 Binary files a/__tests__/__image_snapshots__/html/accessibility-live-region-attachment-unknown-card-js-accessibility-requirement-attachments-in-live-region-unknown-card-1-snap.png and b/__tests__/__image_snapshots__/html/accessibility-live-region-attachment-unknown-card-js-accessibility-requirement-attachments-in-live-region-unknown-card-1-snap.png differ diff --git a/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-en-1-snap.png b/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-en-1-snap.png new file mode 100644 index 0000000000..8f6964e75d Binary files /dev/null and b/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-en-1-snap.png differ diff --git a/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-navigator-language-1-snap.png b/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-navigator-language-1-snap.png new file mode 100644 index 0000000000..8f6964e75d Binary files /dev/null and b/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-navigator-language-1-snap.png differ diff --git a/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-yue-1-snap.png b/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-yue-1-snap.png new file mode 100644 index 0000000000..396392d1a8 Binary files /dev/null and b/__tests__/__image_snapshots__/html/deprecated-localize-js-deprecated-localize-should-localize-text-in-yue-1-snap.png differ diff --git a/__tests__/__image_snapshots__/html/hero-card-actions-js-hero-card-actions-message-back-value-2-snap.png b/__tests__/__image_snapshots__/html/hero-card-actions-js-hero-card-actions-message-back-value-2-snap.png new file mode 100644 index 0000000000..69db1a9554 Binary files /dev/null and b/__tests__/__image_snapshots__/html/hero-card-actions-js-hero-card-actions-message-back-value-2-snap.png differ diff --git a/__tests__/__image_snapshots__/html/hooks-use-render-attachment-js-use-render-attachment-should-render-attachment-1-snap.png b/__tests__/__image_snapshots__/html/hooks-use-render-attachment-js-use-render-attachment-should-render-attachment-1-snap.png new file mode 100644 index 0000000000..f6b33c07b7 Binary files /dev/null and b/__tests__/__image_snapshots__/html/hooks-use-render-attachment-js-use-render-attachment-should-render-attachment-1-snap.png differ diff --git a/__tests__/adaptiveCards.js b/__tests__/adaptiveCards.js index c218ac51ee..dcc23b3002 100644 --- a/__tests__/adaptiveCards.js +++ b/__tests__/adaptiveCards.js @@ -139,3 +139,16 @@ test('disable card inputs', async () => { expect(await driver.takeScreenshot()).toMatchImageSnapshot(imageSnapshotOptions); }); + +test('broken card of invalid version', async () => { + const { driver, pageObjects } = await setupWebDriver(); + + await driver.wait(uiConnected(), timeouts.directLine); + await pageObjects.sendMessageViaSendBox('card broken', { waitForSend: true }); + + await driver.wait(minNumActivitiesShown(2), timeouts.directLine); + + const base64PNG = await driver.takeScreenshot(); + + expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); +}); diff --git a/__tests__/attachmentMiddleware.js b/__tests__/attachmentMiddleware.js index 1821f2b20f..5f011f5f2f 100644 --- a/__tests__/attachmentMiddleware.js +++ b/__tests__/attachmentMiddleware.js @@ -37,10 +37,12 @@ test('file upload should show thumbnail and file name', async () => { attachments: patchedAttachments }); - return React.createElement(React.Fragment, {}, [ + return React.createElement( + React.Fragment, + {}, next({ activity, attachment }), next({ activity: patchedActivity, attachment: patchedAttachment }) - ]); + ); } return next({ activity, attachment }); diff --git a/__tests__/cardActionMiddleware.js b/__tests__/cardActionMiddleware.js index 1b13ab33b6..253359c2e6 100644 --- a/__tests__/cardActionMiddleware.js +++ b/__tests__/cardActionMiddleware.js @@ -1,4 +1,4 @@ -import { By } from 'selenium-webdriver'; +import { By, logging } from 'selenium-webdriver'; import { imageSnapshotOptions, timeouts } from './constants.json'; @@ -98,7 +98,7 @@ test('card action "signin" when directLine.getSessionId is falsy', async () => { props: { cardActionMiddleware: ({ dispatch }) => next => ({ cardAction, getSignInUrl }) => { if (cardAction.type === 'signin') { - getSignInUrl().then(url => { + Promise.resolve(getSignInUrl()).then(url => { dispatch({ type: 'WEB_CHAT/SEND_MESSAGE', payload: { @@ -138,6 +138,6 @@ test('card action "signin" when directLine.getSessionId is falsy', async () => { expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); expect(await pageObjects.getConsoleErrors()).toEqual([]); expect(await pageObjects.getConsoleWarnings()).toEqual([ - 'botframework-webchat: No-magic-code OAuth flow is not supported on this Direct Line adapter.' + 'botframework-webchat: OAuth is not supported on this Direct Line adapter.' ]); }); diff --git a/__tests__/hooks/useTrackDimension.js b/__tests__/hooks/useTrackDimension.js index 9a23bd1434..85e946a3d6 100644 --- a/__tests__/hooks/useTrackDimension.js +++ b/__tests__/hooks/useTrackDimension.js @@ -48,6 +48,7 @@ describe('useTrackDimension', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "hello": "aloha", "prop:locale": "en-US", "prop:speechRecognition": "false", @@ -62,6 +63,7 @@ describe('useTrackDimension', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -85,6 +87,7 @@ describe('useTrackDimension', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -108,6 +111,7 @@ describe('useTrackDimension', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", diff --git a/__tests__/hooks/useTrackEvent.js b/__tests__/hooks/useTrackEvent.js index 6c5ce8762d..004b63e9a7 100644 --- a/__tests__/hooks/useTrackEvent.js +++ b/__tests__/hooks/useTrackEvent.js @@ -43,6 +43,7 @@ describe('useTrackEvent', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -66,6 +67,7 @@ describe('useTrackEvent', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -89,6 +91,7 @@ describe('useTrackEvent', () => { "data": 123, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -112,6 +115,7 @@ describe('useTrackEvent', () => { "data": "aloha", "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -138,6 +142,7 @@ describe('useTrackEvent', () => { }, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", diff --git a/__tests__/hooks/useTrackException.js b/__tests__/hooks/useTrackException.js index 1d54563d1a..ba57c55a81 100644 --- a/__tests__/hooks/useTrackException.js +++ b/__tests__/hooks/useTrackException.js @@ -43,6 +43,7 @@ describe('useTrackException', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -68,6 +69,7 @@ describe('useTrackException', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", diff --git a/__tests__/hooks/useTrackTiming.js b/__tests__/hooks/useTrackTiming.js index e995219dd0..452fa66984 100644 --- a/__tests__/hooks/useTrackTiming.js +++ b/__tests__/hooks/useTrackTiming.js @@ -49,6 +49,7 @@ describe('useTrackTiming', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -62,6 +63,7 @@ describe('useTrackTiming', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -92,6 +94,7 @@ describe('useTrackTiming', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", @@ -105,6 +108,7 @@ describe('useTrackTiming', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", diff --git a/__tests__/html/deprecated.localize.html b/__tests__/html/deprecated.localize.html new file mode 100644 index 0000000000..eb03fc6d81 --- /dev/null +++ b/__tests__/html/deprecated.localize.html @@ -0,0 +1,51 @@ + + + + + + + +
+ + + diff --git a/__tests__/html/deprecated.localize.js b/__tests__/html/deprecated.localize.js new file mode 100644 index 0000000000..8ab1fc0309 --- /dev/null +++ b/__tests__/html/deprecated.localize.js @@ -0,0 +1,9 @@ +/** + * @jest-environment ./__tests__/html/__jest__/WebChatEnvironment.js + */ + +describe('deprecated ', () => { + test('should localize text in navigator language', () => runHTMLTest('deprecated.localize.html')); + test('should localize text in "en"', () => runHTMLTest('deprecated.localize.html#l=en')); + test('should localize text in "yue"', () => runHTMLTest('deprecated.localize.html#l=yue')); +}); diff --git a/__tests__/html/focusManagement.sendFailedRetry.js b/__tests__/html/focusManagement.sendFailedRetry.js index cfe9352f1a..3845dabb14 100644 --- a/__tests__/html/focusManagement.sendFailedRetry.js +++ b/__tests__/html/focusManagement.sendFailedRetry.js @@ -3,5 +3,6 @@ */ describe('focus management', () => { - test('click on retry button should focus on main', () => runHTMLTest('focusManagement.sendFailedRetry.html')); + test('click on retry button should focus on main', () => + runHTMLTest('focusManagement.sendFailedRetry.html', { ignoreConsoleError: true })); }); diff --git a/__tests__/html/hooks.useRenderAttachment.html b/__tests__/html/hooks.useRenderAttachment.html new file mode 100644 index 0000000000..401092e683 --- /dev/null +++ b/__tests__/html/hooks.useRenderAttachment.html @@ -0,0 +1,77 @@ + + + + + + + +
+ + + diff --git a/__tests__/html/hooks.useRenderAttachment.js b/__tests__/html/hooks.useRenderAttachment.js new file mode 100644 index 0000000000..630faa8bb2 --- /dev/null +++ b/__tests__/html/hooks.useRenderAttachment.js @@ -0,0 +1,7 @@ +/** + * @jest-environment ./__tests__/html/__jest__/WebChatEnvironment.js + */ + +describe('useRenderAttachment', () => { + test('should render attachment', () => runHTMLTest('hooks.useRenderAttachment.html')); +}); diff --git a/__tests__/html/middleware.liveRegionAttachment.warning.returnRenderFunctionReturnFalse.html b/__tests__/html/middleware.liveRegionAttachment.warning.returnRenderFunctionReturnFalse.html index 5c2a1dae36..d6e12b266c 100644 --- a/__tests__/html/middleware.liveRegionAttachment.warning.returnRenderFunctionReturnFalse.html +++ b/__tests__/html/middleware.liveRegionAttachment.warning.returnRenderFunctionReturnFalse.html @@ -21,9 +21,7 @@ const RenderAttachmentForScreenReader = () => { const createAttachmentForScreenReaderRenderer = useCreateAttachmentForScreenReaderRenderer(); - createAttachmentForScreenReaderRenderer({ activity: {}, attachment: {} })(); - - return false; + return createAttachmentForScreenReaderRenderer({ activity: {}, attachment: {} })(); }; const attachmentForScreenReaderMiddleware = () => next => (...args) => { diff --git a/__tests__/html/offlineUI.sendFailed.noAck.js b/__tests__/html/offlineUI.sendFailed.noAck.js index dc9e90b0bd..f22b174d9f 100644 --- a/__tests__/html/offlineUI.sendFailed.noAck.js +++ b/__tests__/html/offlineUI.sendFailed.noAck.js @@ -4,5 +4,5 @@ describe('offline UI', () => { test('should display "Send failed. Retry" when activity is sent but not acknowledged', () => - runHTMLTest('offlineUI.sendFailed.noAck.html')); + runHTMLTest('offlineUI.sendFailed.noAck.html', { ignoreConsoleError: true })); }); diff --git a/__tests__/html/offlineUI.sendFailed.notSend.js b/__tests__/html/offlineUI.sendFailed.notSend.js index 721d93a5b9..eadc0529dd 100644 --- a/__tests__/html/offlineUI.sendFailed.notSend.js +++ b/__tests__/html/offlineUI.sendFailed.notSend.js @@ -4,5 +4,5 @@ describe('offline UI', () => { test('should display "Send failed. Retry" when activity is not able to send', () => - runHTMLTest('offlineUI.sendFailed.notSend.html')); + runHTMLTest('offlineUI.sendFailed.notSend.html', { ignoreConsoleError: true })); }); diff --git a/__tests__/html/timestamp.attachmentSendTimeout.js b/__tests__/html/timestamp.attachmentSendTimeout.js index 59e2febefc..09061dadf8 100644 --- a/__tests__/html/timestamp.attachmentSendTimeout.js +++ b/__tests__/html/timestamp.attachmentSendTimeout.js @@ -3,5 +3,6 @@ */ describe('timestamp', () => { - test('send timeout for attachment should be different', () => runHTMLTest('timestamp.attachmentSendTimeout.html')); + test('send timeout for attachment should be different', () => + runHTMLTest('timestamp.attachmentSendTimeout.html', { ignoreConsoleError: true })); }); diff --git a/__tests__/richCards.js b/__tests__/richCards.js index 1ae4e88d79..ebb54b170a 100644 --- a/__tests__/richCards.js +++ b/__tests__/richCards.js @@ -1,4 +1,4 @@ -import { By, until } from 'selenium-webdriver'; +import { By } from 'selenium-webdriver'; import { imageSnapshotOptions, timeouts } from './constants.json'; import allImagesLoaded from './setup/conditions/allImagesLoaded'; diff --git a/__tests__/setup/conditions/mediaBuffered.js b/__tests__/setup/conditions/mediaBuffered.js index 134d11774c..fac40fd40a 100644 --- a/__tests__/setup/conditions/mediaBuffered.js +++ b/__tests__/setup/conditions/mediaBuffered.js @@ -1,19 +1,31 @@ import { Condition } from 'selenium-webdriver'; +// We will check buffered duration for 5 times of each 300ms interval. +// If all 3 checks return the same buffered length, we will consider the buffering has stabilized. +const NUM_BUFFERED_CHECK = 5; +const BUFFERED_CHECK_INTERVAL = 300; + export default function mediaBuffered(mediaElement) { return new Condition('for audio to finish buffering', async driver => { - const result = await driver.executeScript(mediaElement => { - return ( - mediaElement.readyState === HTMLMediaElement.HAVE_ENOUGH_DATA && - mediaElement.buffered.length && - mediaElement.buffered.end(0) === mediaElement.duration - ); - }, mediaElement); + for (let index = 0; index < NUM_BUFFERED_CHECK; index++) { + const result = await driver.executeScript(mediaElement => { + const bufferedDuration = mediaElement.buffered.length && mediaElement.buffered.end(0); + const buffered = + mediaElement.readyState === HTMLMediaElement.HAVE_ENOUGH_DATA && + bufferedDuration === mediaElement.__lastBufferedDuration; + + mediaElement.__lastBufferedDuration = bufferedDuration; + + return buffered; + }, mediaElement); + + if (!result) { + return false; + } - // TODO: [P3] #3557 If the result is positive, audio finished buffering, we still need to wait for an unknown time to refresh the UI. - // Will be great if we can remove this sleep. - result && (await driver.sleep(2000)); + await driver.sleep(BUFFERED_CHECK_INTERVAL); + } - return result; + return true; }); } diff --git a/__tests__/setup/web/index.html b/__tests__/setup/web/index.html index 981fdb6dfe..4806b5762f 100644 --- a/__tests__/setup/web/index.html +++ b/__tests__/setup/web/index.html @@ -25,7 +25,7 @@ window.addEventListener('error', ({ colno, error, filename, lineno, message }) => { push( - 'onError', + 'error', JSON.stringify({ colno, error, diff --git a/__tests__/telemetry.js b/__tests__/telemetry.js index 7033f9f842..547ea89415 100644 --- a/__tests__/telemetry.js +++ b/__tests__/telemetry.js @@ -37,6 +37,7 @@ describe('telemetry', () => { "data": null, "dimensions": Object { "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", "prop:locale": "en-US", "prop:speechRecognition": "false", "prop:speechSynthesis": "false", diff --git a/__tests__/upload.js b/__tests__/upload.js index 30f4c6942a..eff95cb6d3 100644 --- a/__tests__/upload.js +++ b/__tests__/upload.js @@ -12,6 +12,22 @@ jest.setTimeout(timeouts.test); describe('upload a picture', () => { test('', async () => { const { driver, pageObjects } = await setupWebDriver({ + props: { + onTelemetry: event => { + const { data, dimensions, duration, error, fatal, name, type, value } = event; + + (window.WebChatTest.telemetryMeasurements || (window.WebChatTest.telemetryMeasurements = [])).push({ + data, + dimensions, + duration, + error, + fatal, + name, + type, + value + }); + } + }, // TODO: [P3] Offline bot did not reply with a downloadable attachment, we need to use production bot useProductionBot: true }); @@ -22,6 +38,86 @@ describe('upload a picture', () => { await driver.wait(minNumActivitiesShown(2), timeouts.directLine); await driver.wait(allImagesLoaded(), timeouts.fetchImage); + const telemetryMeasurements = await driver.executeScript(() => window.WebChatTest.telemetryMeasurements); + + expect(telemetryMeasurements).toHaveProperty('length', 4); + expect(telemetryMeasurements[2]).toHaveProperty('name', 'sendFiles:makeThumbnail'); + expect(telemetryMeasurements[2]).toHaveProperty('type', 'timingend'); + + telemetryMeasurements[2].duration = 1000; + + expect(telemetryMeasurements).toMatchInlineSnapshot(` + Array [ + Object { + "data": null, + "dimensions": Object { + "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", + "prop:locale": "en-US", + "prop:speechRecognition": "false", + "prop:speechSynthesis": "false", + }, + "duration": null, + "error": null, + "fatal": null, + "name": "init", + "type": "event", + "value": null, + }, + Object { + "data": null, + "dimensions": Object { + "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", + "prop:locale": "en-US", + "prop:speechRecognition": "false", + "prop:speechSynthesis": "false", + }, + "duration": null, + "error": null, + "fatal": null, + "name": "sendFiles:makeThumbnail", + "type": "timingstart", + "value": null, + }, + Object { + "data": null, + "dimensions": Object { + "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", + "prop:locale": "en-US", + "prop:speechRecognition": "false", + "prop:speechSynthesis": "false", + }, + "duration": 1000, + "error": null, + "fatal": null, + "name": "sendFiles:makeThumbnail", + "type": "timingend", + "value": null, + }, + Object { + "data": Object { + "numFiles": 1, + "sumSizeInKB": 379, + }, + "dimensions": Object { + "capability:downscaleImage:workerType": "web worker", + "capability:renderer": "html", + "prop:locale": "en-US", + "prop:speechRecognition": "false", + "prop:speechSynthesis": "false", + }, + "duration": null, + "error": null, + "fatal": null, + "name": "sendFiles", + "type": "event", + "value": null, + }, + ] + `); + const base64PNG = await driver.takeScreenshot(); expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); diff --git a/docs/HOOKS.md b/docs/HOOKS.md index f5eef5f747..559898835e 100644 --- a/docs/HOOKS.md +++ b/docs/HOOKS.md @@ -62,9 +62,11 @@ Following is the list of hooks supported by Web Chat API. - [`useCreateActivityRenderer`](#usecreateactivityrenderer) - [`useCreateActivityStatusRenderer`](#usecreateactivitystatusrenderer) - [`useCreateAttachmentForScreenReaderRenderer`](#useCreateAttachmentForScreenReaderRenderer) +- [`useCreateAttachmentRenderer`](#usecreateattachmentrenderer) - [`useCreateAvatarRenderer`](#usecreateavatarrenderer) - [`useDateFormatter`](#useDateFormatter) - [`useDebouncedNotification`](#usedebouncednotification) +- [`useDictateAbortable`](#usedictateabortable) - [`useDictateInterims`](#usedictateinterims) - [`useDictateState`](#usedictatestate) - [`useDirection`](#useDirection) @@ -313,6 +315,23 @@ useCreateAttachmentForScreenReaderRenderer(): ({ This hook will return a function that, when called with activity and attachment, will either return a function to render the attachment used by screen reader, or `false` if the attachment should not be rendered. +## `useCreateAttachmentRenderer` + + +```js +useCreateAttachmentRenderer(): ({ + activity: Activity, + attachment: Attachment +}) => + ( + false | + () => React.Element + ) +``` + + +([PXX] TBD) + ## `useCreateAvatarRenderer` @@ -362,6 +381,16 @@ Due to debouncing, notifications retrieved using this hook may not be current. A For the debounce behavior, please read our [article regarding notification system](https://github.com/microsoft/BotFramework-WebChat/tree/master/docs/NOTIFICATION.md). +## `useDictateAbortable` + + +```js +useDictateAbortable(): [boolean] +``` + + +When called, this hook will return `true` if the current dictation is abortable, otherwise, `false`. + ## `useDictateInterims` diff --git a/packages/api/.eslintignore b/packages/api/.eslintignore new file mode 100644 index 0000000000..8e2a691bcd --- /dev/null +++ b/packages/api/.eslintignore @@ -0,0 +1,9 @@ +/src/__tests__/**/* +/src/**/*.spec.js +/src/**/*.spec.jsx +/src/**/*.spec.ts +/src/**/*.spec.tsx +/src/**/*.test.js +/src/**/*.test.jsx +/src/**/*.test.ts +/src/**/*.test.tsx diff --git a/packages/api/.eslintrc.yml b/packages/api/.eslintrc.yml new file mode 100644 index 0000000000..3d1c9cc36d --- /dev/null +++ b/packages/api/.eslintrc.yml @@ -0,0 +1,91 @@ +extends: +- plugin:react/recommended +plugins: +- prettier +- react-hooks +rules: +# plugins + prettier/prettier: error + + react/button-has-type: error + react/default-props-match-prop-types: error + react/destructuring-assignment: error + react/display-name: off + react/forbid-component-props: + - error + - forbid: + - style + react/forbid-dom-props: + - error + - forbid: + - id + # react/forbid-prop-types: error // How to deal with Adaptive Card schema? + react/no-access-state-in-setstate: error + react/no-array-index-key: error + react/no-danger: error + react/no-did-mount-set-state: error + react/no-did-update-set-state: error + react/no-redundant-should-component-update: error + react/no-typos: error + react/no-this-in-sfc: error + react/no-unescaped-entities: error + react/no-unsafe: error + react/no-unused-prop-types: error + react/no-unused-state: error + react/no-will-update-set-state: error + react/prefer-es6-class: error + react/prefer-read-only-props: error + react/require-default-props: error + react/self-closing-comp: error + react/sort-prop-types: error + react/state-in-constructor: error + react/static-property-placement: + - error + - property assignment + react/style-prop-object: error + react/void-dom-elements-no-children: error + react/jsx-boolean-value: + - error + - always + react/jsx-closing-bracket-location: + - error + - tag-aligned + react/jsx-closing-tag-location: error + react/jsx-equals-spacing: + - error + - never + react/jsx-first-prop-new-line: + - error + - multiline-multiprop + react/jsx-handler-names: error + react/jsx-indent: + - error + - 2 + react/jsx-indent-props: + - error + - 2 + react/jsx-max-props-per-line: + - error + - maximum: 1 + when: multiline + react/jsx-no-bind: error + react/jsx-no-literals: error + # react/jsx-one-expression-per-line: #conflicts with prettier + # - error + # - allow: literal + react/jsx-fragments: + - error + - element + react/jsx-pascal-case: error + react/jsx-props-no-multi-spaces: error + react/jsx-sort-default-props: error + react/jsx-sort-props: error + react/jsx-tag-spacing: + - error + - afterOpening: never + beforeClosing: never + beforeSelfClosing: always + closingSlash: never + react/jsx-wrap-multilines: error # Conflict with no-extra-parens + react-hooks/rules-of-hooks: error + react-hooks/exhaustive-deps: warn diff --git a/packages/api/.gitignore b/packages/api/.gitignore new file mode 100644 index 0000000000..626c4f31ee --- /dev/null +++ b/packages/api/.gitignore @@ -0,0 +1,2 @@ +/lib +/node_modules diff --git a/packages/api/.prettierrc.yml b/packages/api/.prettierrc.yml new file mode 100644 index 0000000000..97987e7a58 --- /dev/null +++ b/packages/api/.prettierrc.yml @@ -0,0 +1,11 @@ +arrowParens: avoid +bracketSpacing: true +endOfLine: auto +jsxBracketSameLine: false +printWidth: 120 +proseWrap: preserve +quoteProps: as-needed +semi: true +singleQuote: true +tabWidth: 2 +trailingComma: none diff --git a/packages/api/babel.config.json b/packages/api/babel.config.json new file mode 100644 index 0000000000..e43758f909 --- /dev/null +++ b/packages/api/babel.config.json @@ -0,0 +1,48 @@ +{ + "env": { + "test": { + "exclude": ["src/**/*.worker.js"], + "plugins": ["babel-plugin-istanbul"] + } + }, + "overrides": [ + { + "plugins": [], + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "chrome": "69" + } + } + ] + ], + "test": "src/**/*.worker.js" + } + ], + "plugins": [ + "@babel/proposal-object-rest-spread", + [ + "transform-inline-environment-variables", + { + "include": ["npm_package_version"] + } + ] + ], + "presets": [ + "@babel/preset-typescript", + [ + "@babel/preset-env", + { + "modules": "commonjs", + "targets": { + "browsers": ["last 2 versions"] + } + } + ], + "@babel/react" + ], + "sourceMaps": "inline", + "sourceRoot": "component:///" +} diff --git a/packages/api/package-lock.json b/packages/api/package-lock.json new file mode 100644 index 0000000000..38b33de15b --- /dev/null +++ b/packages/api/package-lock.json @@ -0,0 +1,7101 @@ +{ + "name": "botframework-webchat-api", + "version": "0.0.0-0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.11.6.tgz", + "integrity": "sha512-+w7BZCvkewSmaRM6H4L2QM3RL90teqEIHDIFXAmrW33+0jhlymnDAEdqVeCZATvxhQuio1ifoGVlJJbIiH9Ffg==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + } + }, + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.6", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "requires": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz", + "integrity": "sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.11.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", + "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", + "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz", + "integrity": "sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.11.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz", + "integrity": "sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", + "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.5", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.4.tgz", + "integrity": "sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-react-display-name": "^7.10.4", + "@babel/plugin-transform-react-jsx": "^7.10.4", + "@babel/plugin-transform-react-jsx-development": "^7.10.4", + "@babel/plugin-transform-react-jsx-self": "^7.10.4", + "@babel/plugin-transform-react-jsx-source": "^7.10.4", + "@babel/plugin-transform-react-pure-annotations": "^7.10.4" + } + }, + "@babel/preset-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz", + "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.10.4" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" + }, + "@types/node": { + "version": "14.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", + "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/react": { + "version": "16.9.49", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.49.tgz", + "integrity": "sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "dev": true + }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "dev": true + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-transform-inline-environment-variables": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.3.tgz", + "integrity": "sha1-o7CYgzU76LXiM24/8e+KXZP5xIk=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" + }, + "bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.4.tgz", + "integrity": "sha512-7FOuawafVdEwa5Jv4nzeik/PepAjVte6HmVGHsjt2bC237jeL9QlcTBDF3PnHEvcC6uHwLGYPwZHNZMB7wWAnw==", + "requires": { + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.570", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001135", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001135.tgz", + "integrity": "sha512-ziNcheTGTHlu9g34EVoHQdIu5g4foc8EsxMGC7Xkokmvw0dqNtX8BS8RgCgFBaAiSp2IdjvBxNdh0ssib28eVQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "cldr-data": { + "version": "36.0.0", + "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-36.0.0.tgz", + "integrity": "sha512-F3n+9DUs41vhys8eF/hsCgkmYlgXMCiwaE75uGZjUbS/jkszBnLylXj7xW3bBlMU1d2IuAptpoNAb6lTCu/RSg==", + "dev": true, + "requires": { + "cldr-data-downloader": "0.3.x", + "glob": "5.x.x" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "cldr-data-downloader": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-0.3.5.tgz", + "integrity": "sha512-uyIMa1K98DAp/PE7dYpq2COIrkWn681Atjng1GgEzeJzYb1jANtugtp9wre6+voE+qzVC8jtWv6E/xZ1GTJdlw==", + "dev": true, + "requires": { + "adm-zip": "0.4.11", + "mkdirp": "0.5.0", + "nopt": "3.0.x", + "progress": "1.1.8", + "q": "1.0.1", + "request": "~2.87.0", + "request-progress": "0.3.1" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + } + } + }, + "cldrjs": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.4.tgz", + "integrity": "sha512-6QkI7oPLUZ9vA5BQAmUOfh5JIpESfnYy/M8d7Ddl9Yx+z2TAnQgnc3kbgjkIgxsk5Y0tOY+n6itMWXzQQQ2IWg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concurrently": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", + "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^6.1.0", + "tree-kill": "^1.2.2", + "yargs": "^13.3.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-in-js-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", + "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", + "requires": { + "hyphenate-style-name": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "csstype": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", + "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", + "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.571", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.571.tgz", + "integrity": "sha512-UYEQ2Gtc50kqmyOmOVtj6Oqi38lm5yRJY3pLuWt6UIot0No1L09uu6Ja6/1XKwmz/p0eJFZTUZi+khd1PV1hHA==" + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", + "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", + "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.0.tgz", + "integrity": "sha512-WaieZZ4cayAfPBmy5KkEqFfLQf/VkzoUsvM5DfD9G1lrz+3LtZ8X6nToEUQiFe1X5ApNIzkMd+7NUy+2OmSTQQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.17.0", + "string.prototype.matchall": "^4.0.2" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz", + "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "event-as-promise": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/event-as-promise/-/event-as-promise-1.0.5.tgz", + "integrity": "sha512-z/WIlyou7oTvXBjm5YYjfklr2d8gUWtx8b5GAcrIs1n1D35f7NIK0CrcYSXbY3VYikG9bUan+wScPyGXL/NH4A==" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "event-target-shim-es5": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/event-target-shim-es5/-/event-target-shim-es5-1.2.0.tgz", + "integrity": "sha512-Ki++m13aGuz86Ez7NgvP+JXoe1Jd5BZ4b9hte531pc+AMxVRlf4Lv4U30cGwK3bxlc/lxnvK8muHykVqDB369A==", + "requires": { + "@babel/core": "7.11.1", + "@babel/preset-env": "7.11.0", + "babel-loader": "8.1.0", + "webpack": "4.44.1", + "webpack-cli": "3.3.12" + }, + "dependencies": { + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/preset-env": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", + "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "requires": { + "@babel/compat-data": "^7.11.0", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.11.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.11.0", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.11.0", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "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", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "filewatcher": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/filewatcher/-/filewatcher-3.0.1.tgz", + "integrity": "sha1-9KGVc1Xdr0Q8zXiolfPVXiPIoDQ=", + "dev": true, + "requires": { + "debounce": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "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==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glamor": { + "version": "2.20.40", + "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", + "integrity": "sha512-DNXCd+c14N9QF8aAKrfl4xakPk5FdcFwmH7sD0qnC0Pr7xoZ5W9yovhUrY/dJc3psfGGXC58vqQyRtuskyUJxA==", + "requires": { + "fbjs": "^0.8.12", + "inline-style-prefixer": "^3.0.6", + "object-assign": "^4.1.1", + "prop-types": "^15.5.10", + "through": "^2.3.8" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": 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=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.5.0.tgz", + "integrity": "sha512-76fcPQO/WLthtSwjgIZ/Zv2XSXqv9ifvl1PwIxJNCZNFHigGCpg3fBZ0poJ30b2kdDgofPkYl478lVZA6esESQ==", + "requires": { + "cldrjs": "^0.5.0" + } + }, + "globalize-compiler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/globalize-compiler/-/globalize-compiler-1.1.1.tgz", + "integrity": "sha512-oZIwVp3L/waDidle7Qrw4FiCCmOLAqvdM9P7W8nEO4OfXO//l/abBiA+RL2+mYZPOpTAlRDVS2FLfFVWxHovWA==", + "dev": true, + "requires": { + "escodegen": "^1.6.1", + "esprima": "^2.3.0", + "nopt": "^3.0.3" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "iana-tz-data": { + "version": "2019.1.0", + "resolved": "https://registry.npmjs.org/iana-tz-data/-/iana-tz-data-2019.1.0.tgz", + "integrity": "sha512-T7+26Skkyxqjp4mg20/O065j9J5qP39nWVQj/2ArxQ0gSPkL+T9lwerRmiOAzFRNsNXepX45QqchqTVENwNvig==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inline-style-prefixer": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", + "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", + "requires": { + "bowser": "^1.7.3", + "css-in-js-utils": "^2.0.0" + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.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 + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "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==" + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-2.0.1.tgz", + "integrity": "sha512-oIEbWiVDxDpl5tIF4S6zYS9JExhh3bun3uLb3YAinHPTlRtW4g1S66LtJrJ4Npq8dgIa8CLK5iPVah5n4n0s2w==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memoize-one": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.3.tgz", + "integrity": "sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-dev": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/node-dev/-/node-dev-5.2.0.tgz", + "integrity": "sha512-//aG1cBZsXhQeXbIcZokYsxktU9p+xnG0dzJaDmfwuX50NnjxRoScj6Ymm0JuWVA6180sYfkRGP38vf8fJ4j+Q==", + "dev": true, + "requires": { + "dateformat": "^3.0.3", + "dynamic-dedupe": "^0.3.0", + "filewatcher": "~3.0.0", + "minimist": "^1.1.3", + "node-notifier": "^5.4.0", + "resolve": "^1.0.0" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.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==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "optional": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^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==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react-dictate-button": { + "version": "1.2.3-master.6b4fe72", + "resolved": "https://registry.npmjs.org/react-dictate-button/-/react-dictate-button-1.2.3-master.6b4fe72.tgz", + "integrity": "sha512-dAgitz+7jQTPx8aQRkggEchYxwzkpnd6pC35IztWrGlHgF70l35B8PA0d5m336E0G2suIEk4QFSDI1gVx9nLfw==", + "requires": { + "classnames": "^2.2.6", + "glamor": "^2.20.40", + "memoize-one": "^4.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-redux": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", + "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", + "requires": { + "@babel/runtime": "^7.5.5", + "hoist-non-react-statics": "^3.3.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.9.0" + } + }, + "react-say": { + "version": "2.0.2-master.ee7cd76", + "resolved": "https://registry.npmjs.org/react-say/-/react-say-2.0.2-master.ee7cd76.tgz", + "integrity": "sha512-wTJleRlP5ojCuYGElAtBCrbeGgm2FB6De4/YilBWfDBNhPUHiiHgZSQpn8x+E9aEvx2vZINI7gH+1SrAcoazDA==", + "requires": { + "@babel/runtime": "^7.7.2", + "classnames": "^2.2.6", + "event-as-promise": "^1.0.5", + "memoize-one": "^5.1.1" + }, + "dependencies": { + "memoize-one": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + } + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "optional": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-progress": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", + "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=", + "dev": true, + "requires": { + "throttleit": "~0.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", + "dev": true, + "requires": { + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + } + }, + "simple-update-in": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/simple-update-in/-/simple-update-in-2.2.0.tgz", + "integrity": "sha512-FrW41lLiOs82jKxwq39UrE1HDAHOvirKWk4Nv8tqnFFFknVbTxcHZzDS4vt02qqdU/5+KNsQHWzhKHznDBmrww==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "optional": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "webpack": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", + "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "requires": { + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "whatwg-fetch": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", + "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "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==", + "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==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/packages/api/package.json b/packages/api/package.json new file mode 100644 index 0000000000..74cc484404 --- /dev/null +++ b/packages/api/package.json @@ -0,0 +1,70 @@ +{ + "name": "botframework-webchat-api", + "version": "0.0.0-0", + "description": "React DOM component of botframework-webchat", + "main": "lib/index.js", + "publishConfig": { + "access": "public" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/BotFramework-WebChat.git" + }, + "bugs": { + "url": "https://github.com/microsoft/BotFramework-WebChat/issues" + }, + "homepage": "https://github.com/microsoft/BotFramework-WebChat/tree/master/packages/component#readme", + "scripts": { + "build": "npm run build:typescript && npm run build:babel && npm run build:globalize", + "build:babel": "babel src --copy-files --extensions .js,.ts,.tsx --ignore **/*.spec.js,**/*.spec.ts,**/*.spec.tsx,**/*.test.js,**/*.test.ts,**/*.test.tsx,__tests__/**/*.js,__tests__/**/*.ts,__tests__/**/*.tsx --no-copy-ignored --out-dir lib --verbose", + "build:globalize": "node scripts/createPrecompiledGlobalize.js", + "build:typescript": "tsc --project src/tsconfig.json", + "eslint": "eslint src/**/*.js src/**/*.ts", + "prestart": "npm run build:babel", + "start": "concurrently --kill-others --names \"babel,globalize,tsc\" \"npm run start:babel\" \"npm run start:globalize\" \"npm run start:typescript\"", + "start:babel": "npm run build:babel -- --skip-initial-build --watch", + "start:globalize": "node-dev --respawn scripts/createPrecompiledGlobalize.js", + "start:typescript": "npm run build:typescript -- --watch" + }, + "cldr-data-coverage": "full", + "devDependencies": { + "@babel/cli": "^7.11.6", + "@babel/core": "^7.11.6", + "@babel/preset-env": "^7.11.5", + "@babel/preset-react": "^7.10.4", + "@babel/preset-typescript": "^7.10.4", + "@types/node": "^14.11.2", + "@types/react": "^16.9.49", + "babel-plugin-istanbul": "^6.0.0", + "babel-plugin-transform-inline-environment-variables": "^0.4.3", + "cldr-data": "^36.0.0", + "concurrently": "^5.3.0", + "core-js": "^3.6.5", + "eslint": "^7.9.0", + "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-react": "^7.21.0", + "eslint-plugin-react-hooks": "^4.1.2", + "globalize-compiler": "^1.1.1", + "iana-tz-data": "^2019.1.0", + "node-dev": "^5.2.0", + "prettier": "^2.1.2", + "typescript": "^4.0.3" + }, + "dependencies": { + "botframework-webchat-core": "^0.0.0-0", + "event-target-shim": "5.0.1", + "event-target-shim-es5": "1.2.0", + "globalize": "1.5.0", + "math-random": "2.0.1", + "prop-types": "15.7.2", + "react-redux": "7.2.0", + "redux": "4.0.5", + "simple-update-in": "2.2.0" + }, + "peerDependencies": { + "react": "^16.8.6", + "react-dom": "^16.8.6" + } +} diff --git a/packages/component/scripts/createPrecompiledGlobalize.js b/packages/api/scripts/createPrecompiledGlobalize.js similarity index 81% rename from packages/component/scripts/createPrecompiledGlobalize.js rename to packages/api/scripts/createPrecompiledGlobalize.js index e1d18b0910..6a6bbc645a 100644 --- a/packages/component/scripts/createPrecompiledGlobalize.js +++ b/packages/api/scripts/createPrecompiledGlobalize.js @@ -1,9 +1,9 @@ const { format } = require('prettier'); -const { join, relative } = require('path'); -const { writeFileSync } = require('fs'); +const { dirname, join, relative } = require('path'); +const { existsSync, mkdirSync, writeFileSync } = require('fs'); const Globalize = require('globalize'); const globalizeCompiler = require('globalize-compiler'); -const languages = Object.values(require('../src/Localization/overrides.json')).map( +const languages = Object.values(require('../src/localization/overrides.json')).map( ({ GLOBALIZE_LANGUAGE }) => GLOBALIZE_LANGUAGE ); @@ -30,11 +30,12 @@ const formattersAndParsers = languages.reduce((formattersAndParsers, language) = }, []); const code = format(globalizeCompiler.compile(formattersAndParsers), { parser: 'babel' }); -const filename = join(__dirname, '../lib/Utils/PrecompiledGlobalize.js'); +const filename = join(__dirname, '../lib/external/PrecompiledGlobalize.js'); // globalize-compiler is emitting AMD code, pointing to "globalize-runtime" instead of "globalize/dist/globalize-runtime" const patchedCode = code.replace(/\"globalize-runtime\//g, '"globalize/dist/globalize-runtime/'); +existsSync(dirname(filename)) || mkdirSync(dirname(filename)); writeFileSync(filename, patchedCode); console.log(`Successfully compiled globalize to ${relative(process.cwd(), filename)}.`); diff --git a/packages/api/src/defaultStyleOptions.js b/packages/api/src/defaultStyleOptions.js new file mode 100644 index 0000000000..c90bba24be --- /dev/null +++ b/packages/api/src/defaultStyleOptions.js @@ -0,0 +1,203 @@ +/* eslint no-magic-numbers: "off" */ + +function fontFamily(fonts) { + return fonts.map(font => `'${font}'`).join(', '); +} + +const DEFAULT_ACCENT = '#0063B1'; +const DEFAULT_SUBTLE = '#767676'; // With contrast 4.5:1 to white +const PADDING_REGULAR = 10; + +const DEFAULT_OPTIONS = { + // Color and paddings + accent: DEFAULT_ACCENT, + backgroundColor: 'White', + cardEmphasisBackgroundColor: '#F0F0F0', + paddingRegular: PADDING_REGULAR, + paddingWide: PADDING_REGULAR * 2, + subtle: DEFAULT_SUBTLE, + + // Word break + messageActivityWordBreak: 'break-word', // 'normal' || 'break-all' || 'break-word' || 'keep-all' + + // Fonts + fontSizeSmall: '80%', + monospaceFont: fontFamily(['Consolas', 'Courier New', 'monospace']), + primaryFont: fontFamily(['Calibri', 'Helvetica Neue', 'Arial', 'sans-serif']), + + // Avatar + avatarBorderRadius: '50%', + avatarSize: 40, + botAvatarBackgroundColor: undefined, // defaults to accent color + botAvatarImage: undefined, // Or a string of URL. Can be a data URI or blob. + botAvatarInitials: undefined, // Or a string. Empty strings means it has avatar but not initials inside. + userAvatarBackgroundColor: undefined, // defaults to accent color + userAvatarImage: undefined, // Or a string of URL. Can be a data URI or blob. + userAvatarInitials: undefined, // Or a string. Empty strings means it has avatar but not initials inside. + showAvatarInGroup: 'status', // Or 'sender' or true (on every activity). + + // Bubble + // TODO: Should we make a bubbleFromBot* + bubbleBackground: 'White', + bubbleBorderColor: '#E6E6E6', + bubbleBorderRadius: 2, + bubbleBorderStyle: 'solid', + bubbleBorderWidth: 1, + bubbleFromUserBackground: 'White', + bubbleFromUserBorderColor: '#E6E6E6', + bubbleFromUserBorderRadius: 2, + bubbleFromUserBorderStyle: 'solid', + bubbleFromUserBorderWidth: 1, + bubbleFromUserNubOffset: 0, // Either a positive/negative number, or "bottom" + bubbleFromUserNubSize: undefined, // Or a number. 0 means a sharp corner. + bubbleFromUserTextColor: 'Black', + bubbleImageHeight: 240, + bubbleMaxWidth: 480, // screen width = 600px + bubbleMinHeight: 40, + bubbleMinWidth: 250, // min screen width = 300px, Edge requires 372px (https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/13621468/) + bubbleNubOffset: 0, // Either a positive/negative number, or "bottom" + bubbleNubSize: undefined, // Or a number. 0 means a sharp corner. + bubbleTextColor: 'Black', + + // Markdown + markdownRespectCRLF: true, + + // Rich Cards + richCardWrapTitle: false, // Applies to subtitles as well + + // Root + rootHeight: '100%', + rootWidth: '100%', + rootZIndex: 0, // "z-index" for the root container of Web Chat. This will form a new stacking context so "z-index" used in children won't pollute. + + // Scroll to end button + hideScrollToEndButton: false, + + // Send box + hideSendBox: false, + hideUploadButton: false, + microphoneButtonColorOnDictate: '#F33', + sendBoxBackground: 'White', + sendBoxButtonColor: undefined, // defaults to subtle + sendBoxButtonColorOnDisabled: '#CCC', + sendBoxButtonColorOnFocus: '#333', + sendBoxButtonColorOnHover: '#333', + sendBoxDisabledTextColor: undefined, // defaults to subtle + sendBoxHeight: 40, + sendBoxMaxHeight: 200, + sendBoxTextColor: 'Black', + // TODO: We should deprecate this because there isn't an easy way to make the width of the send box narrower than the transcript + sendBoxBorderBottom: '', + sendBoxBorderLeft: '', + sendBoxBorderRight: '', + sendBoxBorderTop: 'solid 1px #E6E6E6', + sendBoxPlaceholderColor: undefined, // defaults to subtle + sendBoxTextWrap: false, + + // Visually show spoken text + showSpokenText: false, + + // Suggested actions + suggestedActionBackground: 'White', + suggestedActionBorder: undefined, // split into 3, null + suggestedActionBorderColor: undefined, // defaults to accent + suggestedActionBorderRadius: 0, + suggestedActionBorderStyle: 'solid', + suggestedActionBorderWidth: 2, + suggestedActionDisabledBackground: undefined, // defaults to suggestedActionBackground + suggestedActionDisabledBorder: null, + suggestedActionDisabledBorderColor: '#E6E6E6', + suggestedActionDisabledBorderStyle: 'solid', + suggestedActionDisabledBorderWidth: 2, + suggestedActionDisabledTextColor: undefined, // defaults to subtle + suggestedActionHeight: 40, + suggestedActionImageHeight: 20, + suggestedActionLayout: 'carousel', // either 'carousel' or 'stacked' + suggestedActionTextColor: null, + + // Suggested actions carousel layout + suggestedActionsCarouselFlipperCursor: null, // Cursor when mouse over on flipper + suggestedActionsCarouselFlipperBoxWidth: 40, // Flipper bounding box size + suggestedActionsCarouselFlipperSize: 20, // Flipper visible size + + // Suggested actions stacked layout + suggestedActionsStackedHeight: undefined, // sets the container's max height. defaults to 'auto' + suggestedActionsStackedOverflow: undefined, // defaults to 'auto', + + // Timestamp + groupTimestamp: true, + sendTimeout: 20000, + sendTimeoutForAttachments: 120000, + timestampColor: undefined, // defaults to subtle + timestampFormat: 'relative', // 'absolute' + + // Transcript overlay buttons (e.g. carousel and suggested action flippers, scroll to bottom, etc.) + newMessagesButtonFontSize: '85%', + transcriptOverlayButtonBackground: 'rgba(0, 0, 0, .6)', + transcriptOverlayButtonBackgroundOnFocus: 'rgba(0, 0, 0, .8)', + transcriptOverlayButtonBackgroundOnHover: 'rgba(0, 0, 0, .8)', + transcriptOverlayButtonColor: 'White', + transcriptOverlayButtonColorOnFocus: undefined, // defaults to transcriptOverlayButtonColor + transcriptOverlayButtonColorOnHover: undefined, // defaults to transcriptOverlayButtonColor + + // Video + videoHeight: 270, // based on bubbleMaxWidth: 480 / 16 * 9 = 270 + + // Connectivity UI + connectivityIconPadding: PADDING_REGULAR * 1.2, + connectivityMarginLeftRight: PADDING_REGULAR * 1.4, + connectivityMarginTopBottom: PADDING_REGULAR * 0.8, + connectivityTextSize: '75%', + failedConnectivity: '#C50F1F', + slowConnectivity: '#EAA300', + notificationText: '#5E5E5E', + slowConnectionAfter: 15000, + + typingAnimationBackgroundImage: null, + typingAnimationDuration: 5000, + typingAnimationHeight: 20, + typingAnimationWidth: 64, + + spinnerAnimationBackgroundImage: null, + spinnerAnimationHeight: 16, + spinnerAnimationWidth: 16, + spinnerAnimationPadding: 12, + + // TODO: [P0] #3322 This is only supported on HTML. + enableUploadThumbnail: true, + uploadThumbnailContentType: 'image/jpeg', + uploadThumbnailHeight: 360, + uploadThumbnailQuality: 0.6, + uploadThumbnailWidth: 720, + + // deprecated; will be removed on or after 2021-02-01 + spinnerAnimationPaddingRight: undefined, + + // Toast UI + + // New debounce timeout value only affects new notifications. + notificationDebounceTimeout: 400, + + hideToaster: false, + toasterHeight: 32, + toasterMaxHeight: 32 * 5, + toasterSingularMaxHeight: 50, + toastFontSize: '87.5%', + toastIconWidth: 36, + toastSeparatorColor: '#E8EAEC', + toastTextPadding: 6, + + toastErrorBackgroundColor: '#FDE7E9', + toastErrorColor: '#A80000', + toastInfoBackgroundColor: '#CEF1FF', + toastInfoColor: '#105E7D', + toastSuccessBackgroundColor: '#DFF6DD', + toastSuccessColor: '#107C10', + toastWarnBackgroundColor: '#FFF4CE', + toastWarnColor: '#3B3A39', + + // Emoji + emojiSet: true // true || false || { ':)' : '😊'} +}; + +export default DEFAULT_OPTIONS; diff --git a/packages/api/src/hooks/Composer.js b/packages/api/src/hooks/Composer.js new file mode 100644 index 0000000000..94fb0d1070 --- /dev/null +++ b/packages/api/src/hooks/Composer.js @@ -0,0 +1,615 @@ +import { Provider } from 'react-redux'; +import PropTypes from 'prop-types'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import updateIn from 'simple-update-in'; + +import createCustomEvent from '../utils/createCustomEvent'; +import ErrorBoundary from './utils/ErrorBoundary'; +import getAllLocalizedStrings from '../localization/getAllLocalizedStrings'; +import isObject from '../utils/isObject'; +import normalizeLanguage from '../utils/normalizeLanguage'; +import PrecompiledGlobalize from '../external/PrecompiledGlobalize'; + +import { + clearSuggestedActions, + connect as createConnectAction, + createStore, + disconnect, + dismissNotification, + emitTypingIndicator, + markActivity, + postActivity, + sendEvent, + sendFiles, + sendMessage, + sendMessageBack, + sendPostBack, + setDictateInterims, + setDictateState, + setLanguage, + setNotification, + setSendBox, + setSendTimeout, + setSendTypingIndicator, + startDictate, + startSpeakingActivity, + stopDictate, + stopSpeakingActivity, + submitSendBox +} from 'botframework-webchat-core'; + +import createDefaultCardActionMiddleware from './middleware/createDefaultCardActionMiddleware'; +import createDefaultGroupActivitiesMiddleware from './middleware/createDefaultGroupActivitiesMiddleware'; +import defaultSelectVoice from './internal/defaultSelectVoice'; +import mapMap from '../utils/mapMap'; +import observableToPromise from './utils/observableToPromise'; +import Tracker from './internal/Tracker'; +import WebChatReduxContext, { useDispatch } from './internal/WebChatReduxContext'; +import WebChatAPIContext from './internal/WebChatAPIContext'; + +import applyMiddleware, { forRenderer as applyMiddlewareForRenderer } from './middleware/applyMiddleware'; +import patchStyleOptions from '../patchStyleOptions'; +import singleToArray from './utils/singleToArray'; + +// List of Redux actions factory we are hoisting as Web Chat functions +const DISPATCHERS = { + clearSuggestedActions, + dismissNotification, + emitTypingIndicator, + markActivity, + postActivity, + sendEvent, + sendFiles, + sendMessage, + sendMessageBack, + sendPostBack, + setDictateInterims, + setDictateState, + setNotification, + setSendBox, + setSendTimeout, + startDictate, + startSpeakingActivity, + stopDictate, + stopSpeakingActivity, + submitSendBox +}; + +function createCardActionContext({ cardActionMiddleware, directLine, dispatch }) { + const runMiddleware = applyMiddleware( + 'card action', + ...singleToArray(cardActionMiddleware), + createDefaultCardActionMiddleware() + )({ dispatch }); + + return { + onCardAction: (cardAction, { target } = {}) => + runMiddleware({ + cardAction, + getSignInUrl: + cardAction.type === 'signin' + ? () => { + const { value } = cardAction; + + if (directLine.getSessionId) { + // TODO: [P3] We should change this one to async/await. + // This is the first place in this project to use async. + // Thus, we need to add @babel/plugin-transform-runtime and @babel/runtime. + + return observableToPromise(directLine.getSessionId()).then( + sessionId => `${value}${encodeURIComponent(`&code_challenge=${sessionId}`)}` + ); + } + + console.warn('botframework-webchat: OAuth is not supported on this Direct Line adapter.'); + + return value; + } + : null, + target + }) + }; +} + +function createGroupActivitiesContext({ groupActivitiesMiddleware, groupTimestamp }) { + const runMiddleware = applyMiddleware( + 'group activities', + ...singleToArray(groupActivitiesMiddleware), + createDefaultGroupActivitiesMiddleware({ groupTimestamp }) + ); + + return { + groupActivities: runMiddleware({}) + }; +} + +function mergeStringsOverrides(localizedStrings, language, overrideLocalizedStrings) { + if (!overrideLocalizedStrings) { + return localizedStrings; + } else if (typeof overrideLocalizedStrings === 'function') { + const merged = overrideLocalizedStrings(localizedStrings, language); + + if (!isObject(merged)) { + throw new Error('botframework-webchat: overrideLocalizedStrings function must return an object.'); + } + + return merged; + } + + if (!isObject(overrideLocalizedStrings)) { + throw new Error('botframework-webchat: overrideLocalizedStrings must be either a function, an object, or falsy.'); + } + + return { ...localizedStrings, ...overrideLocalizedStrings }; +} + +const Composer = ({ + activityMiddleware, + activityRenderer, + activityStatusMiddleware, + activityStatusRenderer, + attachmentMiddleware, + attachmentForScreenReaderMiddleware, + attachmentRenderer, + avatarMiddleware, + avatarRenderer, + cardActionMiddleware, + children, + dir, + directLine, + disabled, + downscaleImageToDataURL, + grammars, + groupActivitiesMiddleware, + groupTimestamp, + internalErrorBoxClass, + locale, + onTelemetry, + overrideLocalizedStrings, + renderMarkdown, + selectVoice, + sendTimeout, + sendTypingIndicator, + styleOptions, + toastMiddleware, + toastRenderer, + typingIndicatorMiddleware, + typingIndicatorRenderer, + userID, + username +}) => { + const dispatch = useDispatch(); + const telemetryDimensionsRef = useRef({}); + + const patchedDir = useMemo(() => (dir === 'ltr' || dir === 'rtl' ? dir : 'auto'), [dir]); + const patchedGrammars = useMemo(() => grammars || [], [grammars]); + const patchedStyleOptions = useMemo(() => patchStyleOptions(styleOptions, { groupTimestamp, sendTimeout }), [ + groupTimestamp, + sendTimeout, + styleOptions + ]); + + useEffect(() => { + dispatch(setLanguage(locale)); + }, [dispatch, locale]); + + useEffect(() => { + typeof sendTimeout === 'number' && dispatch(setSendTimeout(sendTimeout)); + }, [dispatch, sendTimeout]); + + useEffect(() => { + dispatch(setSendTypingIndicator(!!sendTypingIndicator)); + }, [dispatch, sendTypingIndicator]); + + useEffect(() => { + dispatch( + createConnectAction({ + directLine, + userID, + username + }) + ); + + return () => { + // TODO: [P3] disconnect() is an async call (pending -> fulfilled), we need to wait, or change it to reconnect() + dispatch(disconnect()); + }; + }, [dispatch, directLine, userID, username]); + + const cardActionContext = useMemo(() => createCardActionContext({ cardActionMiddleware, directLine, dispatch }), [ + cardActionMiddleware, + directLine, + dispatch + ]); + + const patchedSelectVoice = useMemo(() => selectVoice || defaultSelectVoice.bind(null, { language: locale }), [ + locale, + selectVoice + ]); + + const groupActivitiesContext = useMemo( + () => + createGroupActivitiesContext({ + groupActivitiesMiddleware, + groupTimestamp: patchedStyleOptions.groupTimestamp + }), + [groupActivitiesMiddleware, patchedStyleOptions.groupTimestamp] + ); + + const hoistedDispatchers = useMemo( + () => mapMap(DISPATCHERS, dispatcher => (...args) => dispatch(dispatcher(...args))), + [dispatch] + ); + + const patchedLocalizedStrings = useMemo( + () => mergeStringsOverrides(getAllLocalizedStrings()[normalizeLanguage(locale)], locale, overrideLocalizedStrings), + [locale, overrideLocalizedStrings] + ); + + const localizedGlobalize = useMemo(() => { + const { GLOBALIZE, GLOBALIZE_LANGUAGE } = patchedLocalizedStrings || {}; + + return GLOBALIZE || (GLOBALIZE_LANGUAGE && PrecompiledGlobalize(GLOBALIZE_LANGUAGE)) || PrecompiledGlobalize('en'); + }, [patchedLocalizedStrings]); + + const trackDimension = useCallback( + (name, data) => { + if (!name || typeof name !== 'string') { + return console.warn('botframework-webchat: Telemetry dimension name must be a string.'); + } + + const type = typeof data; + + if (type !== 'string' && type !== 'undefined') { + return console.warn('botframework-webchat: Telemetry dimension data must be a string or undefined.'); + } + + telemetryDimensionsRef.current = updateIn( + telemetryDimensionsRef.current, + [name], + type === 'undefined' ? data : () => data + ); + }, + [telemetryDimensionsRef] + ); + + const patchedActivityRenderer = useMemo(() => { + activityRenderer && + console.warn( + 'Web Chat: "activityRenderer" is deprecated and will be removed on 2022-06-15, please use "activityMiddleware" instead.' + ); + + return ( + activityRenderer || + applyMiddlewareForRenderer( + 'activity', + { strict: false }, + ...singleToArray(activityMiddleware), + () => () => ({ activity }) => { + if (activity) { + throw new Error(`No renderer for activity of type "${activity.type}"`); + } else { + throw new Error('No activity to render'); + } + } + )({}) + ); + }, [activityMiddleware, activityRenderer]); + + const patchedActivityStatusRenderer = useMemo(() => { + activityStatusRenderer && + console.warn( + 'Web Chat: "activityStatusRenderer" is deprecated and will be removed on 2022-06-15, please use "activityStatusMiddleware" instead.' + ); + + return ( + activityStatusRenderer || + applyMiddlewareForRenderer( + 'activity status', + { strict: false }, + ...singleToArray(activityStatusMiddleware), + () => () => () => false + )({}) + ); + }, [activityStatusMiddleware, activityStatusRenderer]); + + const patchedAttachmentForScreenReaderRenderer = useMemo( + () => + applyMiddlewareForRenderer( + 'attachment for screen reader', + { strict: true }, + ...singleToArray(attachmentForScreenReaderMiddleware), + () => () => ({ attachment }) => () => { + if (attachment) { + throw new Error(`No renderer for attachment for screen reader of type "${attachment.contentType}"`); + } else { + throw new Error('No attachment to render'); + } + } + )({}), + [attachmentForScreenReaderMiddleware] + ); + + const patchedAttachmentRenderer = useMemo(() => { + if (attachmentRenderer) { + console.warn( + 'Web Chat: "attachmentRenderer" is deprecated and will be removed on 2022-06-15, please use "attachmentMiddleware" instead.' + ); + + return attachmentRenderer; + } + + // Attachment renderer + return applyMiddleware('attachment', ...singleToArray(attachmentMiddleware), () => () => ({ attachment }) => { + if (attachment) { + throw new Error(`No renderer for attachment of type "${attachment.contentType}"`); + } else { + throw new Error('No attachment to render'); + } + })({}); + }, [attachmentMiddleware, attachmentRenderer]); + + const patchedAvatarRenderer = useMemo(() => { + avatarRenderer && + console.warn( + 'Web Chat: "avatarRenderer" is deprecated and will be removed on 2022-06-15, please use "avatarMiddleware" instead.' + ); + + return ( + avatarRenderer || + applyMiddlewareForRenderer('avatar', { strict: false }, ...singleToArray(avatarMiddleware), () => () => () => + false + )({}) + ); + }, [avatarMiddleware, avatarRenderer]); + + const patchedToastRenderer = useMemo(() => { + toastRenderer && + console.warn( + 'Web Chat: "toastRenderer" is deprecated and will be removed on 2022-06-15, please use "toastMiddleware" instead.' + ); + + return ( + toastRenderer || + applyMiddlewareForRenderer( + 'toast', + { strict: false }, + ...singleToArray(toastMiddleware), + () => () => ({ notification }) => { + if (notification) { + throw new Error(`No renderer for notification of type "${notification.contentType}"`); + } else { + throw new Error('No notification to render'); + } + } + )({}) + ); + }, [toastMiddleware, toastRenderer]); + + const patchedTypingIndicatorRenderer = useMemo(() => { + typingIndicatorRenderer && + console.warn( + 'Web Chat: "typingIndicatorRenderer" is deprecated and will be removed on 2022-06-15, please use "typingIndicatorMiddleware" instead.' + ); + + return ( + typingIndicatorRenderer || + applyMiddlewareForRenderer( + 'typing indicator', + { strict: false }, + ...singleToArray(typingIndicatorMiddleware), + () => () => () => false + )({}) + ); + }, [typingIndicatorMiddleware, typingIndicatorRenderer]); + + // This is a heavy function, and it is expected to be only called when there is a need to recreate business logic, e.g. + // - User ID changed, causing all send* functions to be updated + // - send + + // TODO: [P3] We should think about if we allow the user to change onSendBoxValueChanged/sendBoxValue, e.g. + // 1. Turns text into UPPERCASE + // 2. Filter out profanity + + // TODO: [P4] Revisit all members of context + // This context should consist of members that are not in the Redux store + // i.e. members that are not interested in other types of UIs + const context = useMemo( + () => ({ + ...cardActionContext, + ...groupActivitiesContext, + ...hoistedDispatchers, + activityRenderer: patchedActivityRenderer, + activityStatusRenderer: patchedActivityStatusRenderer, + attachmentForScreenReaderRenderer: patchedAttachmentForScreenReaderRenderer, + attachmentRenderer: patchedAttachmentRenderer, + avatarRenderer: patchedAvatarRenderer, + dir: patchedDir, + directLine, + disabled, + downscaleImageToDataURL, + grammars: patchedGrammars, + internalErrorBoxClass, + language: locale, + localizedGlobalizeState: [localizedGlobalize], + localizedStrings: patchedLocalizedStrings, + onTelemetry, + renderMarkdown, + selectVoice: patchedSelectVoice, + sendTypingIndicator, + styleOptions: patchedStyleOptions, + telemetryDimensionsRef, + toastRenderer: patchedToastRenderer, + trackDimension, + typingIndicatorRenderer: patchedTypingIndicatorRenderer, + userID, + username + }), + [ + cardActionContext, + directLine, + disabled, + downscaleImageToDataURL, + groupActivitiesContext, + hoistedDispatchers, + internalErrorBoxClass, + locale, + localizedGlobalize, + onTelemetry, + patchedActivityRenderer, + patchedActivityStatusRenderer, + patchedAttachmentForScreenReaderRenderer, + patchedAttachmentRenderer, + patchedAvatarRenderer, + patchedDir, + patchedGrammars, + patchedLocalizedStrings, + patchedSelectVoice, + patchedStyleOptions, + patchedToastRenderer, + patchedTypingIndicatorRenderer, + renderMarkdown, + sendTypingIndicator, + telemetryDimensionsRef, + trackDimension, + userID, + username + ] + ); + + return ( + + {typeof children === 'function' ? children(context) : children} + {onTelemetry && } + + ); +}; + +// We will create a Redux store if it was not passed in +const ComposeWithStore = ({ internalRenderErrorBox, onTelemetry, store, ...props }) => { + const [error, setError] = useState(); + + const handleError = useCallback( + error => { + console.error('botframework-webchat: Uncaught exception', { error }); + + onTelemetry && onTelemetry(createCustomEvent('exception', { error, fatal: true })); + setError(error); + }, + [onTelemetry, setError] + ); + + const memoizedStore = useMemo(() => store || createStore(), [store]); + + return error ? ( + !!internalRenderErrorBox && internalRenderErrorBox({ error, type: 'uncaught exception' }) + ) : ( + + + + + + ); +}; + +ComposeWithStore.defaultProps = { + internalRenderErrorBox: undefined, + onTelemetry: undefined, + store: undefined +}; + +ComposeWithStore.propTypes = { + internalRenderErrorBox: PropTypes.any, + onTelemetry: PropTypes.func, + store: PropTypes.any +}; + +export default ComposeWithStore; + +// TODO: [P3] We should consider moving some data from Redux store to props +// Although we use `connectToWebChat` to hide the details of accessor of Redux store, +// we should clean up the responsibility between Context and Redux store +// We should decide which data is needed for React but not in other environment such as CLI/VSCode + +Composer.defaultProps = { + activityMiddleware: undefined, + activityRenderer: undefined, + activityStatusMiddleware: undefined, + activityStatusRenderer: undefined, + attachmentForScreenReaderMiddleware: undefined, + attachmentMiddleware: undefined, + attachmentRenderer: undefined, + avatarMiddleware: undefined, + avatarRenderer: undefined, + cardActionMiddleware: undefined, + children: undefined, + dir: 'auto', + disabled: false, + downscaleImageToDataURL: undefined, + grammars: [], + groupActivitiesMiddleware: undefined, + groupTimestamp: undefined, + internalErrorBoxClass: undefined, + locale: window.navigator.language || 'en-US', + onTelemetry: undefined, + overrideLocalizedStrings: undefined, + renderMarkdown: undefined, + selectVoice: undefined, + sendTimeout: undefined, + sendTypingIndicator: false, + styleOptions: {}, + toastMiddleware: undefined, + toastRenderer: undefined, + typingIndicatorMiddleware: undefined, + typingIndicatorRenderer: undefined, + userID: '', + username: '' +}; + +Composer.propTypes = { + activityMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + activityRenderer: PropTypes.func, + activityStatusMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + activityStatusRenderer: PropTypes.func, + attachmentForScreenReaderMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + attachmentMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + attachmentRenderer: PropTypes.func, + avatarMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + avatarRenderer: PropTypes.func, + cardActionMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + children: PropTypes.any, + dir: PropTypes.oneOf(['auto', 'ltr', 'rtl']), + directLine: PropTypes.shape({ + activity$: PropTypes.shape({ + subscribe: PropTypes.func.isRequired + }).isRequired, + connectionStatus$: PropTypes.shape({ + subscribe: PropTypes.func.isRequired + }).isRequired, + end: PropTypes.func, + getSessionId: PropTypes.func, + postActivity: PropTypes.func.isRequired, + referenceGrammarID: PropTypes.string, + token: PropTypes.string + }).isRequired, + disabled: PropTypes.bool, + downscaleImageToDataURL: PropTypes.func, + grammars: PropTypes.arrayOf(PropTypes.string), + groupActivitiesMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + groupTimestamp: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]), + internalErrorBoxClass: PropTypes.func, // This is for internal use only. We don't allow customization of error box. + locale: PropTypes.string, + onTelemetry: PropTypes.func, + overrideLocalizedStrings: PropTypes.oneOfType([PropTypes.any, PropTypes.func]), + renderMarkdown: PropTypes.func, + selectVoice: PropTypes.func, + sendTimeout: PropTypes.number, + sendTypingIndicator: PropTypes.bool, + styleOptions: PropTypes.any, + toastMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + toastRenderer: PropTypes.func, + typingIndicatorMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + typingIndicatorRenderer: PropTypes.func, + userID: PropTypes.string, + username: PropTypes.string +}; diff --git a/packages/api/src/hooks/index.js b/packages/api/src/hooks/index.js new file mode 100644 index 0000000000..be92e44884 --- /dev/null +++ b/packages/api/src/hooks/index.js @@ -0,0 +1,125 @@ +import useActiveTyping from './useActiveTyping'; +import useActivities from './useActivities'; +import useAvatarForBot from './useAvatarForBot'; +import useAvatarForUser from './useAvatarForUser'; +import useByteFormatter from './useByteFormatter'; +import useConnectivityStatus from './useConnectivityStatus'; +import useCreateActivityRenderer from './useCreateActivityRenderer'; +import useCreateActivityStatusRenderer from './useCreateActivityStatusRenderer'; +import useCreateAttachmentForScreenReaderRenderer from './useCreateAttachmentForScreenReaderRenderer'; +import useCreateAvatarRenderer from './useCreateAvatarRenderer'; +import useDateFormatter from './useDateFormatter'; +import useDebouncedNotifications from './useDebouncedNotifications'; +import useDictateInterims from './useDictateInterims'; +import useDictateState from './useDictateState'; +import useDirection from './useDirection'; +import useDisabled from './useDisabled'; +import useDismissNotification from './useDismissNotification'; +import useEmitTypingIndicator from './useEmitTypingIndicator'; +import useGetSendTimeoutForActivity from './useGetSendTimeoutForActivity'; +import useGrammars from './useGrammars'; +import useGroupActivities from './useGroupActivities'; +import useGroupTimestamp from './useGroupTimestamp'; +import useLanguage from './useLanguage'; +import useLastTypingAt from './useLastTypingAt'; +import useLocalize from './useLocalize'; // Deprecated on or after 2022-02-12 +import useLocalizeDate from './useLocalizeDate'; // Deprecated on or after 2022-02-12 +import useLocalizer from './useLocalizer'; +import useMarkActivityAsSpoken from './useMarkActivityAsSpoken'; +import usePerformCardAction from './usePerformCardAction'; +import usePostActivity from './usePostActivity'; +import useReferenceGrammarID from './useReferenceGrammarID'; +import useRelativeTimeFormatter from './useRelativeTimeFormatter'; +import useRenderActivity from './useRenderActivity'; +import useRenderActivityStatus from './useRenderActivityStatus'; +import useRenderAttachment from './useRenderAttachment'; +import useRenderAvatar from './useRenderAvatar'; +import useRenderToast from './useRenderToast'; +import useRenderTypingIndicator from './useRenderTypingIndicator'; +import useSendBoxValue from './useSendBoxValue'; +import useSendEvent from './useSendEvent'; +import useSendFiles from './useSendFiles'; +import useSendMessage from './useSendMessage'; +import useSendMessageBack from './useSendMessageBack'; +import useSendPostBack from './useSendPostBack'; +import useSendTimeoutForActivity from './useSendTimeoutForActivity'; +import useSendTypingIndicator from './useSendTypingIndicator'; +import useSetNotification from './useSetNotification'; +import useShouldSpeakIncomingActivity from './useShouldSpeakIncomingActivity'; +import useStartDictate from './useStartDictate'; +import useStopDictate from './useStopDictate'; +import useStyleOptions from './useStyleOptions'; +import useSubmitSendBox from './useSubmitSendBox'; +import useSuggestedActions from './useSuggestedActions'; +import useTimeoutForSend from './useTimeoutForSend'; +import useTrackDimension from './useTrackDimension'; +import useTrackEvent from './useTrackEvent'; +import useTrackException from './useTrackException'; +import useTrackTiming from './useTrackTiming'; +import useUserID from './useUserID'; +import useUsername from './useUsername'; +import useVoiceSelector from './useVoiceSelector'; + +export { + useActiveTyping, + useActivities, + useAvatarForBot, + useAvatarForUser, + useByteFormatter, + useConnectivityStatus, + useCreateActivityRenderer, + useCreateActivityStatusRenderer, + useCreateAttachmentForScreenReaderRenderer, + useCreateAvatarRenderer, + useDateFormatter, + useDebouncedNotifications, + useDictateInterims, + useDictateState, + useDirection, + useDisabled, + useDismissNotification, + useEmitTypingIndicator, + useGetSendTimeoutForActivity, + useGrammars, + useGroupActivities, + useGroupTimestamp, + useLanguage, + useLastTypingAt, + useLocalize, + useLocalizeDate, + useLocalizer, + useMarkActivityAsSpoken, + usePerformCardAction, + usePostActivity, + useReferenceGrammarID, + useRelativeTimeFormatter, + useRenderActivity, + useRenderActivityStatus, + useRenderAttachment, + useRenderAvatar, + useRenderToast, + useRenderTypingIndicator, + useSendBoxValue, + useSendEvent, + useSendFiles, + useSendMessage, + useSendMessageBack, + useSendPostBack, + useSendTimeoutForActivity, + useSendTypingIndicator, + useSetNotification, + useShouldSpeakIncomingActivity, + useStartDictate, + useStopDictate, + useStyleOptions, + useSubmitSendBox, + useSuggestedActions, + useTimeoutForSend, + useTrackDimension, + useTrackEvent, + useTrackException, + useTrackTiming, + useUserID, + useUsername, + useVoiceSelector +}; diff --git a/packages/api/src/hooks/internal/ErrorBox.js b/packages/api/src/hooks/internal/ErrorBox.js new file mode 100644 index 0000000000..69d98ec578 --- /dev/null +++ b/packages/api/src/hooks/internal/ErrorBox.js @@ -0,0 +1,33 @@ +import { createElement, useEffect } from 'react'; +import PropTypes from 'prop-types'; + +import useErrorBoxClass from './useErrorBoxClass'; +import useTrackException from '../useTrackException'; + +const ErrorBox = ({ error, type }) => { + const [errorBoxClass] = useErrorBoxClass(); + const trackException = useTrackException(); + + useEffect(() => { + trackException(error, false); + }, [error, trackException]); + + useEffect(() => { + console.group(`botframework-webchat: ${type}`); + console.error(error); + console.groupEnd(); + }, [error, type]); + + return !!errorBoxClass && createElement(errorBoxClass, { error, type }); +}; + +ErrorBox.defaultProps = { + type: undefined +}; + +ErrorBox.propTypes = { + error: PropTypes.any.isRequired, + type: PropTypes.string +}; + +export default ErrorBox; diff --git a/packages/component/src/Tracker.js b/packages/api/src/hooks/internal/Tracker.js similarity index 61% rename from packages/component/src/Tracker.js rename to packages/api/src/hooks/internal/Tracker.js index 5144b9332f..3dffdab20f 100644 --- a/packages/component/src/Tracker.js +++ b/packages/api/src/hooks/internal/Tracker.js @@ -1,4 +1,4 @@ -import useTracker from './hooks/internal/useTracker'; +import useTracker from './useTracker'; const Tracker = () => { useTracker(); diff --git a/packages/api/src/hooks/internal/WebChatAPIContext.js b/packages/api/src/hooks/internal/WebChatAPIContext.js new file mode 100644 index 0000000000..c25d3d4c41 --- /dev/null +++ b/packages/api/src/hooks/internal/WebChatAPIContext.js @@ -0,0 +1,9 @@ +import { createContext } from 'react'; + +const context = createContext({ + sendFocusRef: null +}); + +context.displayName = 'WebChatAPIContext'; + +export default context; diff --git a/packages/component/src/WebChatReduxContext.js b/packages/api/src/hooks/internal/WebChatReduxContext.js similarity index 100% rename from packages/component/src/WebChatReduxContext.js rename to packages/api/src/hooks/internal/WebChatReduxContext.js diff --git a/packages/component/src/defaultSelectVoice.js b/packages/api/src/hooks/internal/defaultSelectVoice.js similarity index 100% rename from packages/component/src/defaultSelectVoice.js rename to packages/api/src/hooks/internal/defaultSelectVoice.js diff --git a/packages/component/src/defaultSelectVoice.test.js b/packages/api/src/hooks/internal/defaultSelectVoice.test.js similarity index 100% rename from packages/component/src/defaultSelectVoice.test.js rename to packages/api/src/hooks/internal/defaultSelectVoice.test.js diff --git a/packages/component/src/hooks/internal/useCreateActivityRendererInternal.js b/packages/api/src/hooks/internal/useCreateActivityRendererInternal.js similarity index 74% rename from packages/component/src/hooks/internal/useCreateActivityRendererInternal.js rename to packages/api/src/hooks/internal/useCreateActivityRendererInternal.js index bdcd738db6..0a6ea49875 100644 --- a/packages/component/src/hooks/internal/useCreateActivityRendererInternal.js +++ b/packages/api/src/hooks/internal/useCreateActivityRendererInternal.js @@ -1,10 +1,10 @@ -import { useMemo } from 'react'; +import { isValidElement, useMemo } from 'react'; import useRenderAttachment from '../useRenderAttachment'; -import useWebChatUIContext from './useWebChatUIContext'; +import useWebChatAPIContext from './useWebChatAPIContext'; export default function useCreateActivityRendererInternal(renderAttachmentOverride) { - const { activityRenderer: createActivityRenderer } = useWebChatUIContext(); + const { activityRenderer: createActivityRenderer } = useWebChatAPIContext(); const defaultRenderAttachment = useRenderAttachment(); const renderAttachment = renderAttachmentOverride || defaultRenderAttachment; @@ -18,7 +18,14 @@ export default function useCreateActivityRendererInternal(renderAttachmentOverri } return renderActivityOptions => { - const activityElement = renderActivity(renderAttachment, renderActivityOptions); + if (isValidElement(renderActivity)) { + return renderActivity; + } + + const activityElement = renderActivity( + (...renderAttachmentArgs) => renderAttachment(...renderAttachmentArgs), + renderActivityOptions + ); // "activityElement" cannot be false. If the middleware want to hide the "activityElement", it should return "false" when we call createActivityRenderer(). activityElement || diff --git a/packages/component/src/hooks/internal/useDebugDeps.js b/packages/api/src/hooks/internal/useDebugDeps.js similarity index 100% rename from packages/component/src/hooks/internal/useDebugDeps.js rename to packages/api/src/hooks/internal/useDebugDeps.js diff --git a/packages/api/src/hooks/internal/useDirFromProps.js b/packages/api/src/hooks/internal/useDirFromProps.js new file mode 100644 index 0000000000..f3ba76324f --- /dev/null +++ b/packages/api/src/hooks/internal/useDirFromProps.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useDirFromProps() { + return [useWebChatAPIContext().dir]; +} diff --git a/packages/api/src/hooks/internal/useDownscaleImageToDataURL.js b/packages/api/src/hooks/internal/useDownscaleImageToDataURL.js new file mode 100644 index 0000000000..2c0b5a08e8 --- /dev/null +++ b/packages/api/src/hooks/internal/useDownscaleImageToDataURL.js @@ -0,0 +1,7 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useDownscaleImageToDataURL() { + const { downscaleImageToDataURL } = useWebChatAPIContext(); + + return downscaleImageToDataURL; +} diff --git a/packages/api/src/hooks/internal/useErrorBoxClass.js b/packages/api/src/hooks/internal/useErrorBoxClass.js new file mode 100644 index 0000000000..fd1fabd41e --- /dev/null +++ b/packages/api/src/hooks/internal/useErrorBoxClass.js @@ -0,0 +1,7 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useErrorBoxClass() { + const { internalErrorBoxClass } = useWebChatAPIContext(); + + return [internalErrorBoxClass]; +} diff --git a/packages/api/src/hooks/internal/useForceRender.js b/packages/api/src/hooks/internal/useForceRender.js new file mode 100644 index 0000000000..82a0f9ed74 --- /dev/null +++ b/packages/api/src/hooks/internal/useForceRender.js @@ -0,0 +1,9 @@ +import { useCallback, useState } from 'react'; + +function useForceRender() { + const [, setForceRender] = useState(); + + return useCallback(() => setForceRender({}), [setForceRender]); +} + +export default useForceRender; diff --git a/packages/api/src/hooks/internal/useLocalizedGlobalize.js b/packages/api/src/hooks/internal/useLocalizedGlobalize.js new file mode 100644 index 0000000000..e38989e8d9 --- /dev/null +++ b/packages/api/src/hooks/internal/useLocalizedGlobalize.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useLocalizedGlobalize() { + return useWebChatAPIContext().localizedGlobalizeState; +} diff --git a/packages/api/src/hooks/internal/useLocalizedStrings.js b/packages/api/src/hooks/internal/useLocalizedStrings.js new file mode 100644 index 0000000000..d29d7835b5 --- /dev/null +++ b/packages/api/src/hooks/internal/useLocalizedStrings.js @@ -0,0 +1,7 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useLocalizedStrings() { + const { localizedStrings } = useWebChatAPIContext(); + + return localizedStrings; +} diff --git a/packages/api/src/hooks/internal/useMarkActivity.js b/packages/api/src/hooks/internal/useMarkActivity.js new file mode 100644 index 0000000000..6b34121bea --- /dev/null +++ b/packages/api/src/hooks/internal/useMarkActivity.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useMarkActivity() { + return useWebChatAPIContext().markActivity; +} diff --git a/packages/component/src/hooks/internal/useReadTelemetryDimensions.js b/packages/api/src/hooks/internal/useReadTelemetryDimensions.js similarity index 61% rename from packages/component/src/hooks/internal/useReadTelemetryDimensions.js rename to packages/api/src/hooks/internal/useReadTelemetryDimensions.js index 3c9dc06611..da4b5a485c 100644 --- a/packages/component/src/hooks/internal/useReadTelemetryDimensions.js +++ b/packages/api/src/hooks/internal/useReadTelemetryDimensions.js @@ -1,9 +1,9 @@ import { useCallback } from 'react'; -import useWebChatUIContext from './useWebChatUIContext'; +import useWebChatAPIContext from './useWebChatAPIContext'; export default function useReadTelemetryDimensions() { - const { telemetryDimensionsRef } = useWebChatUIContext(); + const { telemetryDimensionsRef } = useWebChatAPIContext(); return useCallback(() => ({ ...telemetryDimensionsRef.current }), [telemetryDimensionsRef]); } diff --git a/packages/api/src/hooks/internal/useSetDictateState.js b/packages/api/src/hooks/internal/useSetDictateState.js new file mode 100644 index 0000000000..03fb12c869 --- /dev/null +++ b/packages/api/src/hooks/internal/useSetDictateState.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './useWebChatAPIContext'; + +export default function useSetDictateState() { + return useWebChatAPIContext().setDictateState; +} diff --git a/packages/component/src/hooks/internal/useTimePassed.js b/packages/api/src/hooks/internal/useTimePassed.js similarity index 100% rename from packages/component/src/hooks/internal/useTimePassed.js rename to packages/api/src/hooks/internal/useTimePassed.js diff --git a/packages/api/src/hooks/internal/useTimer.js b/packages/api/src/hooks/internal/useTimer.js new file mode 100644 index 0000000000..95fc462c8e --- /dev/null +++ b/packages/api/src/hooks/internal/useTimer.js @@ -0,0 +1,11 @@ +import { useEffect } from 'react'; + +export default function useTimer(at, fn) { + useEffect(() => { + if (typeof at === 'number') { + const timeout = setTimeout(fn, Math.max(0, at - Date.now())); + + return () => clearTimeout(timeout); + } + }, [at, fn]); +} diff --git a/packages/api/src/hooks/internal/useTracker.js b/packages/api/src/hooks/internal/useTracker.js new file mode 100644 index 0000000000..c8a51c0748 --- /dev/null +++ b/packages/api/src/hooks/internal/useTracker.js @@ -0,0 +1,29 @@ +import { useEffect } from 'react'; + +import useLanguage from '../useLanguage'; +import useTrackDimension from '../useTrackDimension'; +import useTrackEvent from '../useTrackEvent'; + +function useTracker() { + const [language] = useLanguage(); + const trackDimension = useTrackDimension(); + const trackEvent = useTrackEvent(); + + // TODO: [P2] #2937 Track how many of them customized the following: + // - activityMiddleware + // - activityStatusMiddleware + // - attachmentMiddleware + // - cardActionMiddleware + // - toastMiddleware + // - styleOptions + + useEffect(() => { + trackDimension('prop:locale', language); + }, [language, trackDimension]); + + useEffect(() => { + trackEvent('init'); + }, [trackEvent]); +} + +export default useTracker; diff --git a/packages/api/src/hooks/internal/useWebChatAPIContext.js b/packages/api/src/hooks/internal/useWebChatAPIContext.js new file mode 100644 index 0000000000..96ec39307f --- /dev/null +++ b/packages/api/src/hooks/internal/useWebChatAPIContext.js @@ -0,0 +1,13 @@ +import { useContext } from 'react'; + +import WebChatAPIContext from './WebChatAPIContext'; + +export default function useWebChatAPIContext() { + const context = useContext(WebChatAPIContext); + + if (!context) { + throw new Error('This hook can only be used on a component that is a descendant of '); + } + + return context; +} diff --git a/packages/api/src/hooks/middleware/UserlandBoundary.js b/packages/api/src/hooks/middleware/UserlandBoundary.js new file mode 100644 index 0000000000..a7d44f21a2 --- /dev/null +++ b/packages/api/src/hooks/middleware/UserlandBoundary.js @@ -0,0 +1,29 @@ +import PropTypes from 'prop-types'; +import React, { useCallback, useState } from 'react'; + +import ErrorBoundary from '../utils/ErrorBoundary'; +import ErrorBox from '../internal/ErrorBox'; + +const UserlandBoundary = ({ children, type }) => { + const [error, setError] = useState(); + + const handleError = useCallback(error => setError(error), []); + + return error ? ( + + ) : ( + {children} + ); +}; + +UserlandBoundary.defaultProps = { + children: undefined, + type: undefined +}; + +UserlandBoundary.propTypes = { + children: PropTypes.any, + type: PropTypes.string +}; + +export default UserlandBoundary; diff --git a/packages/api/src/hooks/middleware/applyMiddleware.js b/packages/api/src/hooks/middleware/applyMiddleware.js new file mode 100644 index 0000000000..d3351084e9 --- /dev/null +++ b/packages/api/src/hooks/middleware/applyMiddleware.js @@ -0,0 +1,62 @@ +import React, { isValidElement } from 'react'; + +import concatMiddleware from './concatMiddleware'; +import ErrorBox from '../internal/ErrorBox'; +import UserlandBoundary from './UserlandBoundary'; + +export default function applyMiddleware(type, ...middleware) { + return (...setupArgs) => + concatMiddleware(...middleware)(...setupArgs)(() => { + throw new Error(`reached terminator of ${type}`); + }); +} + +export function forRenderer(type, { strict = false } = {}, ...middleware) { + return (...setupArgs) => { + const runMiddleware = concatMiddleware(...middleware)(...setupArgs)(() => ( + + )); + + // The createRendererArgs is "what to render", for example, activity. + // The function should return with only one of the two results: + // - Returns a function if there is a renderer *committed* to render; + // - Returns false if nothing should be rendered. + return (...createRendererArgs) => { + try { + const render = runMiddleware(...createRendererArgs); + + if (!render) { + return false; + } else if (isValidElement(render)) { + if (strict) { + console.error(`botframework-webchat: ${type} should only return either false or a render function.`); + + return false; + } + + return {render}; + } else { + return (...renderTimeArgs) => ( + + {() => { + try { + const element = render(...renderTimeArgs); + + if (strict && !isValidElement(element)) { + console.error(`botframework-webchat: ${type} should return React element only.`); + } + + return element; + } catch (err) { + return ; + } + }} + + ); + } + } catch (err) { + return ; + } + }; + }; +} diff --git a/packages/api/src/hooks/middleware/concatMiddleware.js b/packages/api/src/hooks/middleware/concatMiddleware.js new file mode 100644 index 0000000000..046d335408 --- /dev/null +++ b/packages/api/src/hooks/middleware/concatMiddleware.js @@ -0,0 +1,19 @@ +export default function concatMiddleware(...middleware) { + return setupArgs => { + const setup = middleware.reduce( + (setup, middleware) => (middleware ? [...setup, middleware(setupArgs)] : setup), + [] + ); + + return last => { + const stack = setup.slice(); + const work = index => (...runArgs) => { + const next = stack[index]; + + return (next ? next(work(index + 1)) : last)(...runArgs); + }; + + return work(0); + }; + }; +} diff --git a/packages/component/src/Middleware/concatMiddleware.spec.js b/packages/api/src/hooks/middleware/concatMiddleware.spec.js similarity index 100% rename from packages/component/src/Middleware/concatMiddleware.spec.js rename to packages/api/src/hooks/middleware/concatMiddleware.spec.js diff --git a/packages/api/src/hooks/middleware/createDefaultCardActionMiddleware.js b/packages/api/src/hooks/middleware/createDefaultCardActionMiddleware.js new file mode 100644 index 0000000000..a8fda34ece --- /dev/null +++ b/packages/api/src/hooks/middleware/createDefaultCardActionMiddleware.js @@ -0,0 +1,36 @@ +import { sendMessage, sendMessageBack, sendPostBack } from 'botframework-webchat-core'; + +export default function createDefaultCardActionMiddleware() { + return ({ dispatch }) => next => (...args) => { + const [ + { + cardAction: { displayText, text, type, value } + } + ] = args; + + switch (type) { + case 'imBack': + if (typeof value === 'string') { + // TODO: [P4] Instead of calling dispatch, we should move to dispatchers instead for completeness + dispatch(sendMessage(value, 'imBack')); + } else { + throw new Error('cannot send "imBack" with a non-string value'); + } + + break; + + case 'messageBack': + dispatch(sendMessageBack(value, text, displayText)); + + break; + + case 'postBack': + dispatch(sendPostBack(value)); + + break; + + default: + return next(...args); + } + }; +} diff --git a/packages/api/src/hooks/middleware/createDefaultGroupActivitiesMiddleware.js b/packages/api/src/hooks/middleware/createDefaultGroupActivitiesMiddleware.js new file mode 100644 index 0000000000..2e93edf445 --- /dev/null +++ b/packages/api/src/hooks/middleware/createDefaultGroupActivitiesMiddleware.js @@ -0,0 +1,55 @@ +import { Constants } from 'botframework-webchat-core'; + +const { + ActivityClientState: { SENT } +} = Constants; + +function bin(items, grouping) { + let lastBin; + const bins = []; + let lastItem; + + items.forEach(item => { + if (lastItem && grouping(lastItem, item)) { + lastBin.push(item); + } else { + lastBin = [item]; + bins.push(lastBin); + } + + lastItem = item; + }); + + return bins; +} + +function sending(activity) { + return activity.from.role === 'user' && activity.channelData && activity.channelData.state !== SENT; +} + +function shouldGroupTimestamp(activityX, activityY, groupTimestamp) { + if (groupTimestamp === false) { + // Hide timestamp for all activities. + return true; + } else if (activityX && activityY) { + if (sending(activityX) !== sending(activityY)) { + return false; + } + + groupTimestamp = typeof groupTimestamp === 'number' ? groupTimestamp : Infinity; + + const timeX = new Date(activityX.timestamp).getTime(); + const timeY = new Date(activityY.timestamp).getTime(); + + return Math.abs(timeX - timeY) <= groupTimestamp; + } + + return false; +} + +export default function createDefaultGroupActivityMiddleware({ groupTimestamp }) { + return () => () => ({ activities }) => ({ + sender: bin(activities, (x, y) => x.from.role === y.from.role), + status: bin(activities, (x, y) => shouldGroupTimestamp(x, y, groupTimestamp)) + }); +} diff --git a/packages/component/src/hooks/useActiveTyping.js b/packages/api/src/hooks/useActiveTyping.js similarity index 95% rename from packages/component/src/hooks/useActiveTyping.js rename to packages/api/src/hooks/useActiveTyping.js index 23617155f5..e845e3bf4f 100644 --- a/packages/component/src/hooks/useActiveTyping.js +++ b/packages/api/src/hooks/useActiveTyping.js @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; import useForceRender from './internal/useForceRender'; import useStyleOptions from './useStyleOptions'; diff --git a/packages/component/src/hooks/useActivities.js b/packages/api/src/hooks/useActivities.js similarity index 61% rename from packages/component/src/hooks/useActivities.js rename to packages/api/src/hooks/useActivities.js index 3ffec17032..b476d2f684 100644 --- a/packages/component/src/hooks/useActivities.js +++ b/packages/api/src/hooks/useActivities.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; export default function useActivities() { return [useSelector(({ activities }) => activities)]; diff --git a/packages/component/src/hooks/useAvatarForBot.js b/packages/api/src/hooks/useAvatarForBot.js similarity index 100% rename from packages/component/src/hooks/useAvatarForBot.js rename to packages/api/src/hooks/useAvatarForBot.js diff --git a/packages/component/src/hooks/useAvatarForUser.js b/packages/api/src/hooks/useAvatarForUser.js similarity index 100% rename from packages/component/src/hooks/useAvatarForUser.js rename to packages/api/src/hooks/useAvatarForUser.js diff --git a/packages/component/src/hooks/useByteFormatter.js b/packages/api/src/hooks/useByteFormatter.js similarity index 100% rename from packages/component/src/hooks/useByteFormatter.js rename to packages/api/src/hooks/useByteFormatter.js diff --git a/packages/component/src/hooks/useConnectivityStatus.js b/packages/api/src/hooks/useConnectivityStatus.js similarity index 66% rename from packages/component/src/hooks/useConnectivityStatus.js rename to packages/api/src/hooks/useConnectivityStatus.js index 4cbd5f19d2..7decfdc4b6 100644 --- a/packages/component/src/hooks/useConnectivityStatus.js +++ b/packages/api/src/hooks/useConnectivityStatus.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; export default function useConnectivityStatus() { return [useSelector(({ connectivityStatus }) => connectivityStatus)]; diff --git a/packages/component/src/hooks/useCreateActivityRenderer.js b/packages/api/src/hooks/useCreateActivityRenderer.js similarity index 100% rename from packages/component/src/hooks/useCreateActivityRenderer.js rename to packages/api/src/hooks/useCreateActivityRenderer.js diff --git a/packages/component/src/hooks/useCreateActivityStatusRenderer.js b/packages/api/src/hooks/useCreateActivityStatusRenderer.js similarity index 95% rename from packages/component/src/hooks/useCreateActivityStatusRenderer.js rename to packages/api/src/hooks/useCreateActivityStatusRenderer.js index 0a863ebee8..df6ee820b8 100644 --- a/packages/component/src/hooks/useCreateActivityStatusRenderer.js +++ b/packages/api/src/hooks/useCreateActivityStatusRenderer.js @@ -5,14 +5,14 @@ import React, { useMemo } from 'react'; import useGetSendTimeoutForActivity from './useGetSendTimeoutForActivity'; import useTimePassed from './internal/useTimePassed'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; const { ActivityClientState: { SEND_FAILED, SENDING, SENT } } = Constants; const ActivityStatusContainer = ({ activity, hideTimestamp, nextVisibleActivity }) => { - const { activityStatusRenderer: createActivityStatusRenderer } = useWebChatUIContext(); + const { activityStatusRenderer: createActivityStatusRenderer } = useWebChatAPIContext(); const getSendTimeoutForActivity = useGetSendTimeoutForActivity(); // SEND_FAILED from the activity is ignored, and is instead based on styleOptions.sendTimeout. diff --git a/packages/api/src/hooks/useCreateAttachmentForScreenReaderRenderer.js b/packages/api/src/hooks/useCreateAttachmentForScreenReaderRenderer.js new file mode 100644 index 0000000000..2a0fe23642 --- /dev/null +++ b/packages/api/src/hooks/useCreateAttachmentForScreenReaderRenderer.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useCreateAttachmentForScreenReaderRenderer() { + return useWebChatAPIContext().attachmentForScreenReaderRenderer; +} diff --git a/packages/component/src/hooks/useCreateAvatarRenderer.js b/packages/api/src/hooks/useCreateAvatarRenderer.js similarity index 86% rename from packages/component/src/hooks/useCreateAvatarRenderer.js rename to packages/api/src/hooks/useCreateAvatarRenderer.js index 19f03e443d..16049e87ea 100644 --- a/packages/component/src/hooks/useCreateAvatarRenderer.js +++ b/packages/api/src/hooks/useCreateAvatarRenderer.js @@ -1,11 +1,11 @@ import { useMemo } from 'react'; import useStyleOptions from './useStyleOptions'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useCreateAvatarRenderer() { const [styleOptions] = useStyleOptions(); - const { avatarRenderer } = useWebChatUIContext(); + const { avatarRenderer } = useWebChatAPIContext(); return useMemo( () => ({ activity }) => { diff --git a/packages/component/src/hooks/useDateFormatter.js b/packages/api/src/hooks/useDateFormatter.js similarity index 100% rename from packages/component/src/hooks/useDateFormatter.js rename to packages/api/src/hooks/useDateFormatter.js diff --git a/packages/component/src/hooks/useDebouncedNotifications.js b/packages/api/src/hooks/useDebouncedNotifications.js similarity index 98% rename from packages/component/src/hooks/useDebouncedNotifications.js rename to packages/api/src/hooks/useDebouncedNotifications.js index f963c51ed3..81dabb3f46 100644 --- a/packages/component/src/hooks/useDebouncedNotifications.js +++ b/packages/api/src/hooks/useDebouncedNotifications.js @@ -1,7 +1,7 @@ import { useRef } from 'react'; import updateIn from 'simple-update-in'; -import findMin from '../Utils/findMin'; +import findMin from '../utils/findMin'; import useForceRender from './internal/useForceRender'; import useNotifications from './useNotifications'; import useStyleOptions from './useStyleOptions'; diff --git a/packages/component/src/hooks/useDebouncedNotifications.spec.js b/packages/api/src/hooks/useDebouncedNotifications.spec.js similarity index 100% rename from packages/component/src/hooks/useDebouncedNotifications.spec.js rename to packages/api/src/hooks/useDebouncedNotifications.spec.js diff --git a/packages/api/src/hooks/useDictateInterims.js b/packages/api/src/hooks/useDictateInterims.js new file mode 100644 index 0000000000..8348058fe0 --- /dev/null +++ b/packages/api/src/hooks/useDictateInterims.js @@ -0,0 +1,6 @@ +import { useSelector } from './internal/WebChatReduxContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useDictateInterims() { + return [useSelector(({ dictateInterims }) => dictateInterims) || [], useWebChatAPIContext().setDictateInterims]; +} diff --git a/packages/component/src/hooks/useDictateState.js b/packages/api/src/hooks/useDictateState.js similarity index 75% rename from packages/component/src/hooks/useDictateState.js rename to packages/api/src/hooks/useDictateState.js index 7603d527fa..c2b7474d52 100644 --- a/packages/component/src/hooks/useDictateState.js +++ b/packages/api/src/hooks/useDictateState.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; // TODO: [P3] We should update this code to use core/src/selectors/dictateState.js export default function useDictateState() { diff --git a/packages/component/src/hooks/useDirection.js b/packages/api/src/hooks/useDirection.js similarity index 91% rename from packages/component/src/hooks/useDirection.js rename to packages/api/src/hooks/useDirection.js index cf456af16f..27d76038b3 100644 --- a/packages/component/src/hooks/useDirection.js +++ b/packages/api/src/hooks/useDirection.js @@ -1,6 +1,6 @@ import { useMemo } from 'react'; -import getRTLList from '../Localization/getRTLList'; +import getRTLList from '../localization/getRTLList'; import useDirFromProps from './internal/useDirFromProps'; import useLanguage from './useLanguage'; diff --git a/packages/api/src/hooks/useDisabled.js b/packages/api/src/hooks/useDisabled.js new file mode 100644 index 0000000000..e30e8d4ae4 --- /dev/null +++ b/packages/api/src/hooks/useDisabled.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useDisabled() { + return [useWebChatAPIContext().disabled]; +} diff --git a/packages/api/src/hooks/useDismissNotification.js b/packages/api/src/hooks/useDismissNotification.js new file mode 100644 index 0000000000..5b8eab1604 --- /dev/null +++ b/packages/api/src/hooks/useDismissNotification.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useDismissNotification() { + return useWebChatAPIContext().dismissNotification; +} diff --git a/packages/api/src/hooks/useEmitTypingIndicator.js b/packages/api/src/hooks/useEmitTypingIndicator.js new file mode 100644 index 0000000000..a8dd3d6d6c --- /dev/null +++ b/packages/api/src/hooks/useEmitTypingIndicator.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useEmitTypingIndicator() { + return useWebChatAPIContext().emitTypingIndicator; +} diff --git a/packages/component/src/hooks/useGetSendTimeoutForActivity.js b/packages/api/src/hooks/useGetSendTimeoutForActivity.js similarity index 100% rename from packages/component/src/hooks/useGetSendTimeoutForActivity.js rename to packages/api/src/hooks/useGetSendTimeoutForActivity.js diff --git a/packages/api/src/hooks/useGrammars.js b/packages/api/src/hooks/useGrammars.js new file mode 100644 index 0000000000..fb01abed12 --- /dev/null +++ b/packages/api/src/hooks/useGrammars.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useGrammars() { + return [useWebChatAPIContext().grammars]; +} diff --git a/packages/api/src/hooks/useGroupActivities.js b/packages/api/src/hooks/useGroupActivities.js new file mode 100644 index 0000000000..fad4dab54c --- /dev/null +++ b/packages/api/src/hooks/useGroupActivities.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useGroupActivities() { + return useWebChatAPIContext().groupActivities; +} diff --git a/packages/component/src/hooks/useGroupTimestamp.js b/packages/api/src/hooks/useGroupTimestamp.js similarity index 100% rename from packages/component/src/hooks/useGroupTimestamp.js rename to packages/api/src/hooks/useGroupTimestamp.js diff --git a/packages/component/src/hooks/useLanguage.js b/packages/api/src/hooks/useLanguage.js similarity index 71% rename from packages/component/src/hooks/useLanguage.js rename to packages/api/src/hooks/useLanguage.js index fba81ba961..400683a7df 100644 --- a/packages/component/src/hooks/useLanguage.js +++ b/packages/api/src/hooks/useLanguage.js @@ -1,8 +1,8 @@ import useLocalizedStrings from './internal/useLocalizedStrings'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useLanguage(options) { - const { language } = useWebChatUIContext(); + const { language } = useWebChatAPIContext(); const localizedStrings = useLocalizedStrings(); if (options === 'speech') { diff --git a/packages/component/src/hooks/useLastTypingAt.js b/packages/api/src/hooks/useLastTypingAt.js similarity index 86% rename from packages/component/src/hooks/useLastTypingAt.js rename to packages/api/src/hooks/useLastTypingAt.js index 8839d7fc73..b464951014 100644 --- a/packages/component/src/hooks/useLastTypingAt.js +++ b/packages/api/src/hooks/useLastTypingAt.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; let showDeprecationNotes = true; diff --git a/packages/component/src/hooks/useLocalize.js b/packages/api/src/hooks/useLocalize.js similarity index 81% rename from packages/component/src/hooks/useLocalize.js rename to packages/api/src/hooks/useLocalize.js index 68b7afc7ef..2c99e55ee4 100644 --- a/packages/component/src/hooks/useLocalize.js +++ b/packages/api/src/hooks/useLocalize.js @@ -1,6 +1,6 @@ import useLanguage from './useLanguage'; -import { localize } from '../Localization/Localize'; +import { localize } from '../localization/Localize'; export default function useLocalize(text, ...args) { const [language] = useLanguage(); diff --git a/packages/component/src/hooks/useLocalizeDate.js b/packages/api/src/hooks/useLocalizeDate.js similarity index 88% rename from packages/component/src/hooks/useLocalizeDate.js rename to packages/api/src/hooks/useLocalizeDate.js index f4c944d19e..3cf6de0849 100644 --- a/packages/component/src/hooks/useLocalizeDate.js +++ b/packages/api/src/hooks/useLocalizeDate.js @@ -1,6 +1,6 @@ import useLanguage from './useLanguage'; -import getLocaleString from '../Localization/getLocaleString'; +import getLocaleString from '../localization/getLocaleString'; let deprecationNotesShown; diff --git a/packages/component/src/hooks/useLocalizer.js b/packages/api/src/hooks/useLocalizer.js similarity index 95% rename from packages/component/src/hooks/useLocalizer.js rename to packages/api/src/hooks/useLocalizer.js index 6197c1ed37..dd50300ce3 100644 --- a/packages/component/src/hooks/useLocalizer.js +++ b/packages/api/src/hooks/useLocalizer.js @@ -1,9 +1,9 @@ import { useCallback } from 'react'; -import getAllLocalizedStrings from '../Localization/getAllLocalizedStrings'; +import getAllLocalizedStrings from '../localization/getAllLocalizedStrings'; import useLocalizedGlobalize from './internal/useLocalizedGlobalize'; import useLocalizedStrings from './internal/useLocalizedStrings'; -import isObject from '../Utils/isObject'; +import isObject from '../utils/isObject'; const DEFAULT_STRINGS = getAllLocalizedStrings()['en-US']; diff --git a/packages/component/src/hooks/useMarkActivityAsSpoken.js b/packages/api/src/hooks/useMarkActivityAsSpoken.js similarity index 100% rename from packages/component/src/hooks/useMarkActivityAsSpoken.js rename to packages/api/src/hooks/useMarkActivityAsSpoken.js diff --git a/packages/component/src/hooks/useNotifications.js b/packages/api/src/hooks/useNotifications.js similarity index 63% rename from packages/component/src/hooks/useNotifications.js rename to packages/api/src/hooks/useNotifications.js index 3c0bc5e046..2c4f60a94b 100644 --- a/packages/component/src/hooks/useNotifications.js +++ b/packages/api/src/hooks/useNotifications.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; export default function useNotifications() { return [useSelector(({ notifications }) => notifications)]; diff --git a/packages/api/src/hooks/usePerformCardAction.js b/packages/api/src/hooks/usePerformCardAction.js new file mode 100644 index 0000000000..60e50a2b38 --- /dev/null +++ b/packages/api/src/hooks/usePerformCardAction.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function usePerformCardAction() { + return useWebChatAPIContext().onCardAction; +} diff --git a/packages/api/src/hooks/usePostActivity.js b/packages/api/src/hooks/usePostActivity.js new file mode 100644 index 0000000000..c0c24f0675 --- /dev/null +++ b/packages/api/src/hooks/usePostActivity.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function usePostActivity() { + return useWebChatAPIContext().postActivity; +} diff --git a/packages/component/src/hooks/useReferenceGrammarID.js b/packages/api/src/hooks/useReferenceGrammarID.js similarity index 66% rename from packages/component/src/hooks/useReferenceGrammarID.js rename to packages/api/src/hooks/useReferenceGrammarID.js index 95087dc9f4..7e1188319f 100644 --- a/packages/component/src/hooks/useReferenceGrammarID.js +++ b/packages/api/src/hooks/useReferenceGrammarID.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; export default function useReferenceGrammarID() { return [useSelector(({ referenceGrammarID }) => referenceGrammarID)]; diff --git a/packages/component/src/hooks/useRelativeTimeFormatter.js b/packages/api/src/hooks/useRelativeTimeFormatter.js similarity index 100% rename from packages/component/src/hooks/useRelativeTimeFormatter.js rename to packages/api/src/hooks/useRelativeTimeFormatter.js diff --git a/packages/component/src/hooks/useRenderActivity.js b/packages/api/src/hooks/useRenderActivity.js similarity index 100% rename from packages/component/src/hooks/useRenderActivity.js rename to packages/api/src/hooks/useRenderActivity.js diff --git a/packages/component/src/hooks/useRenderActivityStatus.js b/packages/api/src/hooks/useRenderActivityStatus.js similarity index 94% rename from packages/component/src/hooks/useRenderActivityStatus.js rename to packages/api/src/hooks/useRenderActivityStatus.js index cda28ccba5..95997f050e 100644 --- a/packages/component/src/hooks/useRenderActivityStatus.js +++ b/packages/api/src/hooks/useRenderActivityStatus.js @@ -14,8 +14,6 @@ import useCreateActivityStatusRenderer from './useCreateActivityStatusRenderer'; // Despite deprecation, useRenderActivityStatus() can be retrofitted using useCreateActivityStatusRenderer(). -const RETURN_FALSE = () => false; - let showDeprecationNotes = true; export default function useRenderActivityStatus({ activity, nextVisibleActivity }) { @@ -32,6 +30,6 @@ export default function useRenderActivityStatus({ activity, nextVisibleActivity return useMemo(() => { const renderActivityStatus = createActivityStatusRenderer({ activity, nextVisibleActivity }); - return renderActivityStatus || RETURN_FALSE; + return !!renderActivityStatus && renderActivityStatus; }, [activity, createActivityStatusRenderer, nextVisibleActivity]); } diff --git a/packages/api/src/hooks/useRenderAttachment.js b/packages/api/src/hooks/useRenderAttachment.js new file mode 100644 index 0000000000..7179f64970 --- /dev/null +++ b/packages/api/src/hooks/useRenderAttachment.js @@ -0,0 +1,7 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useRenderAttachment() { + const { attachmentRenderer } = useWebChatAPIContext(); + + return attachmentRenderer; +} diff --git a/packages/component/src/hooks/useRenderAvatar.js b/packages/api/src/hooks/useRenderAvatar.js similarity index 100% rename from packages/component/src/hooks/useRenderAvatar.js rename to packages/api/src/hooks/useRenderAvatar.js diff --git a/packages/api/src/hooks/useRenderToast.js b/packages/api/src/hooks/useRenderToast.js new file mode 100644 index 0000000000..5d64a57738 --- /dev/null +++ b/packages/api/src/hooks/useRenderToast.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useRenderToast() { + return useWebChatAPIContext().toastRenderer; +} diff --git a/packages/api/src/hooks/useRenderTypingIndicator.js b/packages/api/src/hooks/useRenderTypingIndicator.js new file mode 100644 index 0000000000..bb25d813f9 --- /dev/null +++ b/packages/api/src/hooks/useRenderTypingIndicator.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useRenderTypingIndicator() { + return useWebChatAPIContext().typingIndicatorRenderer; +} diff --git a/packages/api/src/hooks/useSendBoxValue.js b/packages/api/src/hooks/useSendBoxValue.js new file mode 100644 index 0000000000..ebc79211b5 --- /dev/null +++ b/packages/api/src/hooks/useSendBoxValue.js @@ -0,0 +1,6 @@ +import { useSelector } from './internal/WebChatReduxContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSendBoxValue() { + return [useSelector(({ sendBoxValue }) => sendBoxValue), useWebChatAPIContext().setSendBox]; +} diff --git a/packages/api/src/hooks/useSendEvent.js b/packages/api/src/hooks/useSendEvent.js new file mode 100644 index 0000000000..c5608fa39d --- /dev/null +++ b/packages/api/src/hooks/useSendEvent.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSendEvent() { + return useWebChatAPIContext().sendEvent; +} diff --git a/packages/api/src/hooks/useSendFiles.js b/packages/api/src/hooks/useSendFiles.js new file mode 100644 index 0000000000..b43f8c5e63 --- /dev/null +++ b/packages/api/src/hooks/useSendFiles.js @@ -0,0 +1,25 @@ +/* eslint no-magic-numbers: ["error", { "ignore": [0, 1024] }] */ + +import { useCallback } from 'react'; + +import useTrackEvent from './useTrackEvent'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSendFiles() { + const { sendFiles } = useWebChatAPIContext(); + const trackEvent = useTrackEvent(); + + return useCallback( + files => { + if (files && files.length) { + sendFiles(files); + + trackEvent('sendFiles', { + numFiles: files.length, + sumSizeInKB: Math.round(files.reduce((total, { size }) => total + size, 0) / 1024) + }); + } + }, + [sendFiles, trackEvent] + ); +} diff --git a/packages/api/src/hooks/useSendMessage.js b/packages/api/src/hooks/useSendMessage.js new file mode 100644 index 0000000000..556f7832e7 --- /dev/null +++ b/packages/api/src/hooks/useSendMessage.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSendMessage() { + return useWebChatAPIContext().sendMessage; +} diff --git a/packages/api/src/hooks/useSendMessageBack.js b/packages/api/src/hooks/useSendMessageBack.js new file mode 100644 index 0000000000..0670804a31 --- /dev/null +++ b/packages/api/src/hooks/useSendMessageBack.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSendMessageBack() { + return useWebChatAPIContext().sendMessageBack; +} diff --git a/packages/api/src/hooks/useSendPostBack.js b/packages/api/src/hooks/useSendPostBack.js new file mode 100644 index 0000000000..94dbf9540c --- /dev/null +++ b/packages/api/src/hooks/useSendPostBack.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSendPostBack() { + return useWebChatAPIContext().sendPostBack; +} diff --git a/packages/component/src/hooks/useSendTimeoutForActivity.js b/packages/api/src/hooks/useSendTimeoutForActivity.js similarity index 100% rename from packages/component/src/hooks/useSendTimeoutForActivity.js rename to packages/api/src/hooks/useSendTimeoutForActivity.js diff --git a/packages/component/src/hooks/useSendTypingIndicator.js b/packages/api/src/hooks/useSendTypingIndicator.js similarity index 67% rename from packages/component/src/hooks/useSendTypingIndicator.js rename to packages/api/src/hooks/useSendTypingIndicator.js index 2ddf79fa48..dcc67ad32e 100644 --- a/packages/component/src/hooks/useSendTypingIndicator.js +++ b/packages/api/src/hooks/useSendTypingIndicator.js @@ -1,4 +1,4 @@ -import { useSelector } from '../WebChatReduxContext'; +import { useSelector } from './internal/WebChatReduxContext'; export default function useSendTypingIndicator() { return [useSelector(({ sendTypingIndicator }) => sendTypingIndicator)]; diff --git a/packages/api/src/hooks/useSetNotification.js b/packages/api/src/hooks/useSetNotification.js new file mode 100644 index 0000000000..ea734c9940 --- /dev/null +++ b/packages/api/src/hooks/useSetNotification.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useSetNotification() { + return useWebChatAPIContext().setNotification; +} diff --git a/packages/component/src/hooks/useShouldSpeakIncomingActivity.js b/packages/api/src/hooks/useShouldSpeakIncomingActivity.js similarity index 74% rename from packages/component/src/hooks/useShouldSpeakIncomingActivity.js rename to packages/api/src/hooks/useShouldSpeakIncomingActivity.js index f63f520e2c..809eae19e5 100644 --- a/packages/component/src/hooks/useShouldSpeakIncomingActivity.js +++ b/packages/api/src/hooks/useShouldSpeakIncomingActivity.js @@ -1,10 +1,10 @@ import { useCallback } from 'react'; -import { useSelector } from '../WebChatReduxContext'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import { useSelector } from './internal/WebChatReduxContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useShouldSpeakIncomingActivity() { - const { startSpeakingActivity, stopSpeakingActivity } = useWebChatUIContext(); + const { startSpeakingActivity, stopSpeakingActivity } = useWebChatAPIContext(); return [ useSelector(({ shouldSpeakIncomingActivity }) => shouldSpeakIncomingActivity), diff --git a/packages/api/src/hooks/useStartDictate.js b/packages/api/src/hooks/useStartDictate.js new file mode 100644 index 0000000000..8b60dd7526 --- /dev/null +++ b/packages/api/src/hooks/useStartDictate.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useStartDictate() { + return useWebChatAPIContext().startDictate; +} diff --git a/packages/api/src/hooks/useStopDictate.js b/packages/api/src/hooks/useStopDictate.js new file mode 100644 index 0000000000..e9d1f5acd6 --- /dev/null +++ b/packages/api/src/hooks/useStopDictate.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useStopDictate() { + return useWebChatAPIContext().stopDictate; +} diff --git a/packages/api/src/hooks/useStyleOptions.js b/packages/api/src/hooks/useStyleOptions.js new file mode 100644 index 0000000000..257cc74d8a --- /dev/null +++ b/packages/api/src/hooks/useStyleOptions.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useStyleOptions() { + return [useWebChatAPIContext().styleOptions]; +} diff --git a/packages/component/src/hooks/useSubmitSendBox.js b/packages/api/src/hooks/useSubmitSendBox.js similarity index 78% rename from packages/component/src/hooks/useSubmitSendBox.js rename to packages/api/src/hooks/useSubmitSendBox.js index 67d1e11317..b63c8c4f25 100644 --- a/packages/component/src/hooks/useSubmitSendBox.js +++ b/packages/api/src/hooks/useSubmitSendBox.js @@ -1,10 +1,10 @@ import { useCallback } from 'react'; import useTrackEvent from './useTrackEvent'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useSubmitSendBox() { - const { submitSendBox } = useWebChatUIContext(); + const { submitSendBox } = useWebChatAPIContext(); const trackEvent = useTrackEvent(); return useCallback( diff --git a/packages/component/src/hooks/useSuggestedActions.js b/packages/api/src/hooks/useSuggestedActions.js similarity index 69% rename from packages/component/src/hooks/useSuggestedActions.js rename to packages/api/src/hooks/useSuggestedActions.js index 5f8575a901..81037ca841 100644 --- a/packages/component/src/hooks/useSuggestedActions.js +++ b/packages/api/src/hooks/useSuggestedActions.js @@ -1,11 +1,11 @@ import { useCallback } from 'react'; -import { useSelector } from '../WebChatReduxContext'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import { useSelector } from './internal/WebChatReduxContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useSuggestedActions() { const value = useSelector(({ suggestedActions }) => suggestedActions); - const { clearSuggestedActions } = useWebChatUIContext(); + const { clearSuggestedActions } = useWebChatAPIContext(); return [ value, diff --git a/packages/component/src/hooks/useTimeoutForSend.js b/packages/api/src/hooks/useTimeoutForSend.js similarity index 100% rename from packages/component/src/hooks/useTimeoutForSend.js rename to packages/api/src/hooks/useTimeoutForSend.js diff --git a/packages/api/src/hooks/useTrackDimension.js b/packages/api/src/hooks/useTrackDimension.js new file mode 100644 index 0000000000..d40449fd98 --- /dev/null +++ b/packages/api/src/hooks/useTrackDimension.js @@ -0,0 +1,7 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useTrackDimension() { + const { trackDimension } = useWebChatAPIContext(); + + return trackDimension; +} diff --git a/packages/component/src/hooks/useTrackEvent.js b/packages/api/src/hooks/useTrackEvent.js similarity index 86% rename from packages/component/src/hooks/useTrackEvent.js rename to packages/api/src/hooks/useTrackEvent.js index 61aaea9180..77edbfbe7e 100644 --- a/packages/component/src/hooks/useTrackEvent.js +++ b/packages/api/src/hooks/useTrackEvent.js @@ -1,19 +1,16 @@ import { useCallback, useMemo } from 'react'; -import createCustomEvent from '../Utils/createCustomEvent'; +import createCustomEvent from '../utils/createCustomEvent'; +import isObject from '../utils/isObject'; import useReadTelemetryDimensions from './internal/useReadTelemetryDimensions'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; function isNonNegativeFiniteNumberOrString(value) { return (typeof value === 'number' && isFinite(value) && value >= 0) || typeof value === 'string'; } -function isObject(value) { - return Object.prototype.toString.call(value) === '[object Object]'; -} - export default function useTrackEvent() { - const { onTelemetry } = useWebChatUIContext(); + const { onTelemetry } = useWebChatAPIContext(); const readTelemetryDimensions = useReadTelemetryDimensions(); const trackEvent = useCallback( diff --git a/packages/component/src/hooks/useTrackException.js b/packages/api/src/hooks/useTrackException.js similarity index 80% rename from packages/component/src/hooks/useTrackException.js rename to packages/api/src/hooks/useTrackException.js index 18e3134ad5..bff37e75b2 100644 --- a/packages/component/src/hooks/useTrackException.js +++ b/packages/api/src/hooks/useTrackException.js @@ -1,11 +1,11 @@ import { useCallback } from 'react'; -import createCustomEvent from '../Utils/createCustomEvent'; +import createCustomEvent from '../utils/createCustomEvent'; import useReadTelemetryDimensions from './internal/useReadTelemetryDimensions'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useTrackException() { - const { onTelemetry } = useWebChatUIContext(); + const { onTelemetry } = useWebChatAPIContext(); const readTelemetryDimensions = useReadTelemetryDimensions(); return useCallback( diff --git a/packages/component/src/hooks/useTrackTiming.js b/packages/api/src/hooks/useTrackTiming.js similarity index 88% rename from packages/component/src/hooks/useTrackTiming.js rename to packages/api/src/hooks/useTrackTiming.js index ed92364df3..1bd8a66ee4 100644 --- a/packages/component/src/hooks/useTrackTiming.js +++ b/packages/api/src/hooks/useTrackTiming.js @@ -1,13 +1,13 @@ import { useCallback } from 'react'; -import createCustomEvent from '../Utils/createCustomEvent'; -import randomId from '../Utils/randomId'; +import createCustomEvent from '../utils/createCustomEvent'; +import randomId from '../utils/randomId'; import useReadTelemetryDimensions from './internal/useReadTelemetryDimensions'; import useTrackException from './useTrackException'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useTrackTiming() { - const { onTelemetry } = useWebChatUIContext(); + const { onTelemetry } = useWebChatAPIContext(); const readTelemetryDimensions = useReadTelemetryDimensions(); const trackException = useTrackException(); diff --git a/packages/api/src/hooks/useUserID.js b/packages/api/src/hooks/useUserID.js new file mode 100644 index 0000000000..3ad52d62a5 --- /dev/null +++ b/packages/api/src/hooks/useUserID.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useUserID() { + return [useWebChatAPIContext().userID]; +} diff --git a/packages/api/src/hooks/useUsername.js b/packages/api/src/hooks/useUsername.js new file mode 100644 index 0000000000..50a1bbb973 --- /dev/null +++ b/packages/api/src/hooks/useUsername.js @@ -0,0 +1,5 @@ +import useWebChatAPIContext from './internal/useWebChatAPIContext'; + +export default function useUsername() { + return [useWebChatAPIContext().username]; +} diff --git a/packages/component/src/hooks/useVoiceSelector.js b/packages/api/src/hooks/useVoiceSelector.js similarity index 62% rename from packages/component/src/hooks/useVoiceSelector.js rename to packages/api/src/hooks/useVoiceSelector.js index 821b71f07c..1fcfb9c119 100644 --- a/packages/component/src/hooks/useVoiceSelector.js +++ b/packages/api/src/hooks/useVoiceSelector.js @@ -1,8 +1,8 @@ import { useCallback } from 'react'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import useWebChatAPIContext from './internal/useWebChatAPIContext'; export default function useVoiceSelector(activity) { - const context = useWebChatUIContext(); + const context = useWebChatAPIContext(); return useCallback(voices => context.selectVoice(voices, activity), [activity, context]); } diff --git a/packages/api/src/hooks/utils/ErrorBoundary.js b/packages/api/src/hooks/utils/ErrorBoundary.js new file mode 100644 index 0000000000..f7c90af392 --- /dev/null +++ b/packages/api/src/hooks/utils/ErrorBoundary.js @@ -0,0 +1,34 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +const RenderChildrenFunction = ({ children }) => (typeof children === 'function' ? children() : children); + +class ErrorBoundary extends Component { + constructor() { + super(); + + this.state = { hasError: false }; + } + + componentDidCatch(error) { + this.setState({ hasError: true }); + + this.props.onError(error); + } + + render() { + return !this.state.hasError && {this.props.children}; + } +} + +ErrorBoundary.defaultProps = { + children: undefined, + onError: undefined +}; + +ErrorBoundary.propTypes = { + children: PropTypes.any, + onError: PropTypes.func +}; + +export default ErrorBoundary; diff --git a/packages/component/src/Utils/observableToPromise.js b/packages/api/src/hooks/utils/observableToPromise.js similarity index 100% rename from packages/component/src/Utils/observableToPromise.js rename to packages/api/src/hooks/utils/observableToPromise.js diff --git a/packages/api/src/hooks/utils/singleToArray.js b/packages/api/src/hooks/utils/singleToArray.js new file mode 100644 index 0000000000..873ed8ef89 --- /dev/null +++ b/packages/api/src/hooks/utils/singleToArray.js @@ -0,0 +1,3 @@ +export default function singleToArray(singleOrArray) { + return singleOrArray ? (Array.isArray(singleOrArray) ? singleOrArray : [singleOrArray]) : []; +} diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts new file mode 100644 index 0000000000..501e2d5659 --- /dev/null +++ b/packages/api/src/index.ts @@ -0,0 +1,6 @@ +import * as hooks from './hooks'; +import Composer from './hooks/Composer'; +import concatMiddleware from './hooks/middleware/concatMiddleware'; +import Localize, { localize } from './localization/Localize'; + +export { Composer, concatMiddleware, hooks, Localize, localize }; diff --git a/packages/component/src/Localization/Localize.js b/packages/api/src/localization/Localize.js similarity index 96% rename from packages/component/src/Localization/Localize.js rename to packages/api/src/localization/Localize.js index 41cce9cc4a..467b953a39 100644 --- a/packages/component/src/Localization/Localize.js +++ b/packages/api/src/localization/Localize.js @@ -4,7 +4,7 @@ import deprecatingGetLocaleString from './getLocaleString'; import getAllLocalizedStrings from './getAllLocalizedStrings'; import getRTLList from './getRTLList'; -import normalizeLanguage from '../Utils/normalizeLanguage'; +import normalizeLanguage from '../utils/normalizeLanguage'; import useLocalizer from '../hooks/useLocalizer'; let deprecationNotesShown; diff --git a/packages/component/src/__tests__/Localize.spec.js b/packages/api/src/localization/Localize.spec.js similarity index 94% rename from packages/component/src/__tests__/Localize.spec.js rename to packages/api/src/localization/Localize.spec.js index de9ebe9077..a01b8425f4 100644 --- a/packages/component/src/__tests__/Localize.spec.js +++ b/packages/api/src/localization/Localize.spec.js @@ -1,4 +1,4 @@ -import { getLocaleString, localize } from '../../lib/Localization/Localize'; +import { getLocaleString, localize } from './Localize'; const originalWarn = console.warn; let warnings; diff --git a/packages/component/src/Localization/ar-EG.json b/packages/api/src/localization/ar-EG.json similarity index 100% rename from packages/component/src/Localization/ar-EG.json rename to packages/api/src/localization/ar-EG.json diff --git a/packages/component/src/Localization/ar-JO.json b/packages/api/src/localization/ar-JO.json similarity index 100% rename from packages/component/src/Localization/ar-JO.json rename to packages/api/src/localization/ar-JO.json diff --git a/packages/component/src/Localization/ar-SA.json b/packages/api/src/localization/ar-SA.json similarity index 100% rename from packages/component/src/Localization/ar-SA.json rename to packages/api/src/localization/ar-SA.json diff --git a/packages/component/src/Localization/bg-BG.json b/packages/api/src/localization/bg-BG.json similarity index 100% rename from packages/component/src/Localization/bg-BG.json rename to packages/api/src/localization/bg-BG.json diff --git a/packages/component/src/Localization/ca-ES.json b/packages/api/src/localization/ca-ES.json similarity index 100% rename from packages/component/src/Localization/ca-ES.json rename to packages/api/src/localization/ca-ES.json diff --git a/packages/component/src/Localization/cs-CZ.json b/packages/api/src/localization/cs-CZ.json similarity index 100% rename from packages/component/src/Localization/cs-CZ.json rename to packages/api/src/localization/cs-CZ.json diff --git a/packages/component/src/Localization/da-DK.json b/packages/api/src/localization/da-DK.json similarity index 100% rename from packages/component/src/Localization/da-DK.json rename to packages/api/src/localization/da-DK.json diff --git a/packages/component/src/Localization/de-DE.json b/packages/api/src/localization/de-DE.json similarity index 100% rename from packages/component/src/Localization/de-DE.json rename to packages/api/src/localization/de-DE.json diff --git a/packages/component/src/Localization/el-GR.json b/packages/api/src/localization/el-GR.json similarity index 100% rename from packages/component/src/Localization/el-GR.json rename to packages/api/src/localization/el-GR.json diff --git a/packages/component/src/Localization/en-US.json b/packages/api/src/localization/en-US.json similarity index 100% rename from packages/component/src/Localization/en-US.json rename to packages/api/src/localization/en-US.json diff --git a/packages/component/src/Localization/es-ES.json b/packages/api/src/localization/es-ES.json similarity index 100% rename from packages/component/src/Localization/es-ES.json rename to packages/api/src/localization/es-ES.json diff --git a/packages/component/src/Localization/et-EE.json b/packages/api/src/localization/et-EE.json similarity index 100% rename from packages/component/src/Localization/et-EE.json rename to packages/api/src/localization/et-EE.json diff --git a/packages/component/src/Localization/eu-ES.json b/packages/api/src/localization/eu-ES.json similarity index 100% rename from packages/component/src/Localization/eu-ES.json rename to packages/api/src/localization/eu-ES.json diff --git a/packages/component/src/Localization/fi-FI.json b/packages/api/src/localization/fi-FI.json similarity index 100% rename from packages/component/src/Localization/fi-FI.json rename to packages/api/src/localization/fi-FI.json diff --git a/packages/component/src/Localization/fr-FR.json b/packages/api/src/localization/fr-FR.json similarity index 100% rename from packages/component/src/Localization/fr-FR.json rename to packages/api/src/localization/fr-FR.json diff --git a/packages/component/src/Localization/getAllLocalizedStrings.js b/packages/api/src/localization/getAllLocalizedStrings.js similarity index 100% rename from packages/component/src/Localization/getAllLocalizedStrings.js rename to packages/api/src/localization/getAllLocalizedStrings.js diff --git a/packages/component/src/Localization/getAllLocalizedStrings.spec.js b/packages/api/src/localization/getAllLocalizedStrings.spec.js similarity index 100% rename from packages/component/src/Localization/getAllLocalizedStrings.spec.js rename to packages/api/src/localization/getAllLocalizedStrings.spec.js diff --git a/packages/component/src/Localization/getLocaleString.js b/packages/api/src/localization/getLocaleString.js similarity index 71% rename from packages/component/src/Localization/getLocaleString.js rename to packages/api/src/localization/getLocaleString.js index 5a60db42ab..b582220670 100644 --- a/packages/component/src/Localization/getLocaleString.js +++ b/packages/api/src/localization/getLocaleString.js @@ -1,4 +1,4 @@ -import PrecompiledGlobalize from '../Utils/PrecompiledGlobalize'; +import PrecompiledGlobalize from '../../lib/external/PrecompiledGlobalize'; export default function getLocaleString(value, language) { const globalize = PrecompiledGlobalize(language); diff --git a/packages/component/src/__tests__/getLocaleString.spec.js b/packages/api/src/localization/getLocaleString.spec.js similarity index 86% rename from packages/component/src/__tests__/getLocaleString.spec.js rename to packages/api/src/localization/getLocaleString.spec.js index 1a2381bca5..3fb06fc84b 100644 --- a/packages/component/src/__tests__/getLocaleString.spec.js +++ b/packages/api/src/localization/getLocaleString.spec.js @@ -1,4 +1,4 @@ -import getLocaleString from '../../lib/Localization/getLocaleString'; +import getLocaleString from './getLocaleString'; test('should return formatted date for "en"', async () => { const actual = getLocaleString(new Date(2000, 11, 23, 12, 34, 56, 789), 'en'); diff --git a/packages/component/src/Localization/getRTLList.js b/packages/api/src/localization/getRTLList.js similarity index 100% rename from packages/component/src/Localization/getRTLList.js rename to packages/api/src/localization/getRTLList.js diff --git a/packages/component/src/Localization/gl-ES.json b/packages/api/src/localization/gl-ES.json similarity index 100% rename from packages/component/src/Localization/gl-ES.json rename to packages/api/src/localization/gl-ES.json diff --git a/packages/component/src/Localization/he-IL.json b/packages/api/src/localization/he-IL.json similarity index 100% rename from packages/component/src/Localization/he-IL.json rename to packages/api/src/localization/he-IL.json diff --git a/packages/component/src/Localization/hi-IN.json b/packages/api/src/localization/hi-IN.json similarity index 100% rename from packages/component/src/Localization/hi-IN.json rename to packages/api/src/localization/hi-IN.json diff --git a/packages/component/src/Localization/hr-HR.json b/packages/api/src/localization/hr-HR.json similarity index 100% rename from packages/component/src/Localization/hr-HR.json rename to packages/api/src/localization/hr-HR.json diff --git a/packages/component/src/Localization/hu-HU.json b/packages/api/src/localization/hu-HU.json similarity index 100% rename from packages/component/src/Localization/hu-HU.json rename to packages/api/src/localization/hu-HU.json diff --git a/packages/component/src/Localization/id-ID.json b/packages/api/src/localization/id-ID.json similarity index 100% rename from packages/component/src/Localization/id-ID.json rename to packages/api/src/localization/id-ID.json diff --git a/packages/component/src/Localization/it-IT.json b/packages/api/src/localization/it-IT.json similarity index 100% rename from packages/component/src/Localization/it-IT.json rename to packages/api/src/localization/it-IT.json diff --git a/packages/component/src/Localization/ja-JP.json b/packages/api/src/localization/ja-JP.json similarity index 100% rename from packages/component/src/Localization/ja-JP.json rename to packages/api/src/localization/ja-JP.json diff --git a/packages/component/src/Localization/kk-KZ.json b/packages/api/src/localization/kk-KZ.json similarity index 100% rename from packages/component/src/Localization/kk-KZ.json rename to packages/api/src/localization/kk-KZ.json diff --git a/packages/component/src/Localization/ko-KR.json b/packages/api/src/localization/ko-KR.json similarity index 100% rename from packages/component/src/Localization/ko-KR.json rename to packages/api/src/localization/ko-KR.json diff --git a/packages/component/src/Localization/lt-LT.json b/packages/api/src/localization/lt-LT.json similarity index 100% rename from packages/component/src/Localization/lt-LT.json rename to packages/api/src/localization/lt-LT.json diff --git a/packages/component/src/Localization/lv-LV.json b/packages/api/src/localization/lv-LV.json similarity index 100% rename from packages/component/src/Localization/lv-LV.json rename to packages/api/src/localization/lv-LV.json diff --git a/packages/component/src/Localization/mergeLocalizedStrings.js b/packages/api/src/localization/mergeLocalizedStrings.js similarity index 100% rename from packages/component/src/Localization/mergeLocalizedStrings.js rename to packages/api/src/localization/mergeLocalizedStrings.js diff --git a/packages/component/src/Localization/ms-MY.json b/packages/api/src/localization/ms-MY.json similarity index 100% rename from packages/component/src/Localization/ms-MY.json rename to packages/api/src/localization/ms-MY.json diff --git a/packages/component/src/Localization/nb-NO.json b/packages/api/src/localization/nb-NO.json similarity index 100% rename from packages/component/src/Localization/nb-NO.json rename to packages/api/src/localization/nb-NO.json diff --git a/packages/component/src/Localization/nl-NL.json b/packages/api/src/localization/nl-NL.json similarity index 100% rename from packages/component/src/Localization/nl-NL.json rename to packages/api/src/localization/nl-NL.json diff --git a/packages/component/src/Localization/overrides.json b/packages/api/src/localization/overrides.json similarity index 100% rename from packages/component/src/Localization/overrides.json rename to packages/api/src/localization/overrides.json diff --git a/packages/component/src/Localization/pl-PL.json b/packages/api/src/localization/pl-PL.json similarity index 100% rename from packages/component/src/Localization/pl-PL.json rename to packages/api/src/localization/pl-PL.json diff --git a/packages/component/src/Localization/pt-BR.json b/packages/api/src/localization/pt-BR.json similarity index 100% rename from packages/component/src/Localization/pt-BR.json rename to packages/api/src/localization/pt-BR.json diff --git a/packages/component/src/Localization/pt-PT.json b/packages/api/src/localization/pt-PT.json similarity index 100% rename from packages/component/src/Localization/pt-PT.json rename to packages/api/src/localization/pt-PT.json diff --git a/packages/component/src/Localization/ro-RO.json b/packages/api/src/localization/ro-RO.json similarity index 100% rename from packages/component/src/Localization/ro-RO.json rename to packages/api/src/localization/ro-RO.json diff --git a/packages/component/src/Localization/ru-RU.json b/packages/api/src/localization/ru-RU.json similarity index 100% rename from packages/component/src/Localization/ru-RU.json rename to packages/api/src/localization/ru-RU.json diff --git a/packages/component/src/Localization/sk-SK.json b/packages/api/src/localization/sk-SK.json similarity index 100% rename from packages/component/src/Localization/sk-SK.json rename to packages/api/src/localization/sk-SK.json diff --git a/packages/component/src/Localization/sl-SI.json b/packages/api/src/localization/sl-SI.json similarity index 100% rename from packages/component/src/Localization/sl-SI.json rename to packages/api/src/localization/sl-SI.json diff --git a/packages/component/src/Localization/sl-SL.json b/packages/api/src/localization/sl-SL.json similarity index 100% rename from packages/component/src/Localization/sl-SL.json rename to packages/api/src/localization/sl-SL.json diff --git a/packages/component/src/Localization/sr-Cyrl-CS.json b/packages/api/src/localization/sr-Cyrl-CS.json similarity index 100% rename from packages/component/src/Localization/sr-Cyrl-CS.json rename to packages/api/src/localization/sr-Cyrl-CS.json diff --git a/packages/component/src/Localization/sr-Cyrl.json b/packages/api/src/localization/sr-Cyrl.json similarity index 100% rename from packages/component/src/Localization/sr-Cyrl.json rename to packages/api/src/localization/sr-Cyrl.json diff --git a/packages/component/src/Localization/sr-Latn-CS.json b/packages/api/src/localization/sr-Latn-CS.json similarity index 100% rename from packages/component/src/Localization/sr-Latn-CS.json rename to packages/api/src/localization/sr-Latn-CS.json diff --git a/packages/component/src/Localization/sr-Latn.json b/packages/api/src/localization/sr-Latn.json similarity index 100% rename from packages/component/src/Localization/sr-Latn.json rename to packages/api/src/localization/sr-Latn.json diff --git a/packages/component/src/Localization/sv-SE.json b/packages/api/src/localization/sv-SE.json similarity index 100% rename from packages/component/src/Localization/sv-SE.json rename to packages/api/src/localization/sv-SE.json diff --git a/packages/component/src/Localization/th-TH.json b/packages/api/src/localization/th-TH.json similarity index 100% rename from packages/component/src/Localization/th-TH.json rename to packages/api/src/localization/th-TH.json diff --git a/packages/component/src/Localization/tr-TR.json b/packages/api/src/localization/tr-TR.json similarity index 100% rename from packages/component/src/Localization/tr-TR.json rename to packages/api/src/localization/tr-TR.json diff --git a/packages/component/src/Localization/uk-UA.json b/packages/api/src/localization/uk-UA.json similarity index 100% rename from packages/component/src/Localization/uk-UA.json rename to packages/api/src/localization/uk-UA.json diff --git a/packages/component/src/Localization/vi-VN.json b/packages/api/src/localization/vi-VN.json similarity index 100% rename from packages/component/src/Localization/vi-VN.json rename to packages/api/src/localization/vi-VN.json diff --git a/packages/component/src/Localization/yue.json b/packages/api/src/localization/yue.json similarity index 100% rename from packages/component/src/Localization/yue.json rename to packages/api/src/localization/yue.json diff --git a/packages/component/src/Localization/zh-CN.json b/packages/api/src/localization/zh-CN.json similarity index 100% rename from packages/component/src/Localization/zh-CN.json rename to packages/api/src/localization/zh-CN.json diff --git a/packages/component/src/Localization/zh-HK.json b/packages/api/src/localization/zh-HK.json similarity index 100% rename from packages/component/src/Localization/zh-HK.json rename to packages/api/src/localization/zh-HK.json diff --git a/packages/component/src/Localization/zh-TW.json b/packages/api/src/localization/zh-TW.json similarity index 100% rename from packages/component/src/Localization/zh-TW.json rename to packages/api/src/localization/zh-TW.json diff --git a/packages/api/src/patchStyleOptions.js b/packages/api/src/patchStyleOptions.js new file mode 100644 index 0000000000..b9d5500608 --- /dev/null +++ b/packages/api/src/patchStyleOptions.js @@ -0,0 +1,192 @@ +import defaultStyleOptions from './defaultStyleOptions'; + +// TODO: [P4] We should add a notice for people who want to use "styleSet" instead of "styleOptions". +// "styleSet" is actually CSS stylesheet and it is based on the DOM tree. +// DOM tree may change from time to time, thus, maintaining "styleSet" becomes a constant effort. + +function parseBorder(border) { + const dummyElement = document.createElement('div'); + + dummyElement.setAttribute('style', `border: ${border}`); + + const { + style: { borderColor: color, borderStyle: style, borderWidth: width } + } = dummyElement; + + return { + color, + style, + width + }; +} + +const PIXEL_UNIT_PATTERN = /^\d+px$/u; + +export default function patchStyleOptions( + options, + { groupTimestamp: groupTimestampFromProps, sendTimeout: sendTimeoutFromProps } +) { + const patchedOptions = { ...defaultStyleOptions, ...options }; + + // Keep this list flat (no nested style) and serializable (no functions) + + // TODO: [P4] Deprecate this code after bump to v5 + const { + bubbleBorder, + bubbleFromUserBorder, + bubbleFromUserNubOffset, + bubbleNubOffset, + emojiSet, + suggestedActionBorder, + suggestedActionDisabledBorder + } = patchedOptions; + + if (bubbleBorder) { + console.warn( + 'botframework-webchat: "styleSet.bubbleBorder" is deprecated and will be removed on or after 2020-07-17. Please use "bubbleBorderColor", "bubbleBorderStyle", and, "bubbleBorderWidth.' + ); + + const { color, style, width } = parseBorder(bubbleBorder); + + if (color && color !== 'initial') { + patchedOptions.bubbleBorderColor = color; + } + + if (style && style !== 'initial') { + patchedOptions.bubbleBorderStyle = style; + } + + if (PIXEL_UNIT_PATTERN.test(width)) { + patchedOptions.bubbleBorderWidth = parseInt(width, 10); + } + } + + if (bubbleFromUserBorder) { + console.warn( + 'botframework-webchat: "styleSet.bubbleFromUserBorder" is deprecated and will be removed on or after 2020-07-17. Please use "bubbleFromUserBorderColor", "bubbleFromUserBorderStyle", and, "bubbleFromUserBorderWidth".' + ); + + const { color, style, width } = parseBorder(bubbleFromUserBorder); + + if (color && color !== 'initial') { + patchedOptions.bubbleFromUserBorderColor = color; + } + + if (style && style !== 'initial') { + patchedOptions.bubbleFromUserBorderStyle = style; + } + + if (PIXEL_UNIT_PATTERN.test(width)) { + patchedOptions.bubbleFromUserBorderWidth = parseInt(width, 10); + } + } + + if (suggestedActionBorder) { + console.warn( + 'botframework-webchat: "styleSet.suggestedActionBorder" is deprecated and will be removed on or after 2020-09-11. Please use "suggestedActionBorderColor", "suggestedActionBorderStyle", and, "suggestedActionBorderWidth".' + ); + + const { color, style, width } = parseBorder(suggestedActionBorder); + + if (color && color !== 'initial') { + patchedOptions.suggestedActionBorderColor = color; + } + + if (style && style !== 'initial') { + patchedOptions.suggestedActionBorderStyle = style; + } + + if (PIXEL_UNIT_PATTERN.test(width)) { + patchedOptions.suggestedActionBorderWidth = parseInt(width, 10); + } + } + + if (suggestedActionDisabledBorder) { + console.warn( + 'botframework-webcaht: "styleSet.suggestedActionDisabledBorder" is deprecated and will be removed on or after 2020-09-11. Please use "suggestedActionDisabledBorderColor", "suggestedActionDisabledBorderStyle", and, "suggestedActionDisabledBorderWidth".' + ); + + const { color, style, width } = parseBorder(suggestedActionDisabledBorder); + + if (color && color !== 'initial') { + patchedOptions.suggestedActionDisabledBorderColor = color; + } + + if (style && style !== 'initial') { + patchedOptions.suggestedActionDisabledBorderStyle = style; + } + + if (PIXEL_UNIT_PATTERN.test(width)) { + patchedOptions.suggestedActionDisabledBorderWidth = parseInt(width, 10); + } + } + + if (bubbleFromUserNubOffset === 'top') { + patchedOptions.bubbleFromUserNubOffset = 0; + } else if (typeof bubbleFromUserNubOffset !== 'number') { + patchedOptions.bubbleFromUserNubOffset = -0; + } + + if (bubbleNubOffset === 'top') { + patchedOptions.bubbleNubOffset = 0; + } else if (typeof bubbleNubOffset !== 'number') { + patchedOptions.bubbleNubOffset = -0; + } + + if (emojiSet === true) { + patchedOptions.emojiSet = { + ':)': '😊', + ':-)': '😊', + '(:': '😊', + '(-:': '😊', + ':-|': '😐', + ':|': '😐', + ':-(': '☹️', + ':(': '☹️', + ':-D': '😀', + ':D': '😀', + ':-p': '😛', + ':p': '😛', + ':-P': '😛', + ':P': '😛', + ':-o': '😲', + ':o': '😲', + ':O': '😲', + ':-O': '😲', + ':-0': '😲', + ':0': '😲', + ';-)': '😉', + ';)': '😉', + '<3': '❤️', + ' { + event[key] = value; + }); + + return event; +} diff --git a/packages/component/src/Utils/findMin.js b/packages/api/src/utils/findMin.js similarity index 100% rename from packages/component/src/Utils/findMin.js rename to packages/api/src/utils/findMin.js diff --git a/packages/component/src/Utils/findMin.spec.js b/packages/api/src/utils/findMin.spec.js similarity index 100% rename from packages/component/src/Utils/findMin.spec.js rename to packages/api/src/utils/findMin.spec.js diff --git a/packages/component/src/Utils/isObject.js b/packages/api/src/utils/isObject.js similarity index 100% rename from packages/component/src/Utils/isObject.js rename to packages/api/src/utils/isObject.js diff --git a/packages/api/src/utils/mapMap.js b/packages/api/src/utils/mapMap.js new file mode 100644 index 0000000000..9d5bf45357 --- /dev/null +++ b/packages/api/src/utils/mapMap.js @@ -0,0 +1,7 @@ +export default function mapMap(map, mapper) { + return Object.entries(map).reduce((result, [key, value]) => { + result[key] = mapper(value, key); + + return result; + }, {}); +} diff --git a/packages/api/src/utils/mapMap.spec.js b/packages/api/src/utils/mapMap.spec.js new file mode 100644 index 0000000000..4ce08e6211 --- /dev/null +++ b/packages/api/src/utils/mapMap.spec.js @@ -0,0 +1,9 @@ +import mapMap from './mapMap'; + +test('multiply a map by 10', () => { + const map = { ten: 1, twenty: 2 }; + const actual = mapMap(map, value => value * 10); + + expect(actual).toEqual({ ten: 10, twenty: 20 }); + expect(actual).not.toBe(map); +}); diff --git a/packages/component/src/Utils/normalizeLanguage.js b/packages/api/src/utils/normalizeLanguage.js similarity index 100% rename from packages/component/src/Utils/normalizeLanguage.js rename to packages/api/src/utils/normalizeLanguage.js diff --git a/packages/component/src/Utils/normalizeLanguage.spec.js b/packages/api/src/utils/normalizeLanguage.spec.js similarity index 99% rename from packages/component/src/Utils/normalizeLanguage.spec.js rename to packages/api/src/utils/normalizeLanguage.spec.js index 687adc5c0f..d114a53d92 100644 --- a/packages/component/src/Utils/normalizeLanguage.spec.js +++ b/packages/api/src/utils/normalizeLanguage.spec.js @@ -1,4 +1,4 @@ -import getAllLocalizedStrings from '../Localization/getAllLocalizedStrings'; +import getAllLocalizedStrings from '../localization/getAllLocalizedStrings'; import normalizeLanguage from './normalizeLanguage'; const strings = getAllLocalizedStrings(); diff --git a/packages/api/src/utils/randomId.js b/packages/api/src/utils/randomId.js new file mode 100644 index 0000000000..73de08435b --- /dev/null +++ b/packages/api/src/utils/randomId.js @@ -0,0 +1,7 @@ +/* eslint no-magic-numbers: ["error", { "ignore": [2, 5, 36] }] */ + +import random from 'math-random'; + +export default function randomId(maxLength = 5) { + return random().toString(36).substr(2, maxLength); +} diff --git a/packages/bundle/package.json b/packages/bundle/package.json index b2d3af862a..fae26d6020 100644 --- a/packages/bundle/package.json +++ b/packages/bundle/package.json @@ -74,7 +74,7 @@ "isomorphic-react": "^0.0.0-0", "isomorphic-react-dom": "^0.0.0-0", "prettier": "^2.1.1", - "source-map-loader": "^1.0.2", + "source-map-loader": "^1.1.0", "terser-webpack-plugin": "^4.1.0", "typescript": "^4.0.2", "webpack": "^4.44.1", diff --git a/packages/bundle/src/FullComposer.js b/packages/bundle/src/FullComposer.js index 7991c5ccdf..24a1d10d97 100644 --- a/packages/bundle/src/FullComposer.js +++ b/packages/bundle/src/FullComposer.js @@ -1,9 +1,8 @@ +import { Components } from 'botframework-webchat-component'; import PropTypes from 'prop-types'; import React from 'react'; import AdaptiveCardsComposer from './adaptiveCards/AdaptiveCardsComposer'; -import { Components } from 'botframework-webchat-component'; - import useComposerProps from './useComposerProps'; const { Composer } = Components; diff --git a/packages/bundle/src/adaptiveCards/Attachment/AdaptiveCardRenderer.js b/packages/bundle/src/adaptiveCards/Attachment/AdaptiveCardRenderer.js index 0eb327bcda..4d3c91310c 100644 --- a/packages/bundle/src/adaptiveCards/Attachment/AdaptiveCardRenderer.js +++ b/packages/bundle/src/adaptiveCards/Attachment/AdaptiveCardRenderer.js @@ -449,12 +449,7 @@ const AdaptiveCardRenderer = ({ actionPerformedClassName, adaptiveCard, disabled }, [actionsPerformed, actionPerformedClassName, lastRender]); return errors.length ? ( - - {errors.map(({ error, message }, index) => ( - /* eslint-disable-next-line react/no-array-index-key */ -
{JSON.stringify({ error, message }, null, 2)}
- ))} -
+ ) : (
next => { - function AdaptiveCardMiddleware({ activity, attachment }) { - return attachment.contentType === 'application/vnd.microsoft.card.hero' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.adaptive' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.animation' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.audio' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.oauth' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.receipt' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.signin' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.thumbnail' ? ( - - ) : attachment.contentType === 'application/vnd.microsoft.card.video' ? ( - - ) : ( - next({ activity, attachment }) - ); - } + // This is not returning a React component, but a render function. + /* eslint-disable-next-line react/display-name */ + return () => next => (...args) => { + const [{ activity, attachment }] = args; - AdaptiveCardMiddleware.propTypes = { - activity: PropTypes.any.isRequired, - attachment: PropTypes.shape({ - contentType: PropTypes.string.isRequired - }).isRequired - }; - - return AdaptiveCardMiddleware; + return attachment.contentType === 'application/vnd.microsoft.card.hero' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.adaptive' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.animation' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.audio' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.oauth' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.receipt' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.signin' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.thumbnail' ? ( + + ) : attachment.contentType === 'application/vnd.microsoft.card.video' ? ( + + ) : ( + next(...args) + ); }; } diff --git a/packages/component/babel.config.json b/packages/component/babel.config.json index e43758f909..cfadc9c45f 100644 --- a/packages/component/babel.config.json +++ b/packages/component/babel.config.json @@ -26,7 +26,7 @@ [ "transform-inline-environment-variables", { - "include": ["npm_package_version"] + "include": ["NODE_ENV", "node_env", "npm_package_version"] } ] ], diff --git a/packages/component/package-lock.json b/packages/component/package-lock.json index df46196bc4..128f4d925d 100644 --- a/packages/component/package-lock.json +++ b/packages/component/package-lock.json @@ -33,7 +33,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -255,6 +254,33 @@ } } }, + "@babel/generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "requires": { + "@babel/types": "^7.12.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "@babel/helper-annotate-as-pure": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", @@ -610,6 +636,48 @@ } } }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-hoist-variables": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", @@ -1013,6 +1081,26 @@ } } }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "requires": { + "@babel/types": "^7.11.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", @@ -1252,13 +1340,17 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" + }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.10.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", @@ -2558,6 +2650,56 @@ } } }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/types": { "version": "7.8.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", @@ -2701,9 +2843,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" }, "@types/node": { "version": "14.6.0", @@ -2916,12 +3058,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "acorn": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", @@ -2934,12 +3070,6 @@ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", - "dev": true - }, "ajv": { "version": "6.12.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", @@ -3061,23 +3191,15 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { @@ -3111,12 +3233,6 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -3134,29 +3250,11 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "optional": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, "babel-loader": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", @@ -3268,15 +3366,6 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -3303,9 +3392,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==" }, "bowser": { "version": "1.9.4", @@ -3529,12 +3618,6 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001118.tgz", "integrity": "sha512-RNKPLojZo74a0cP7jFMidQI7nvLER40HgNfgKQEJ2PFm225L0ectUungNQoK3Xk3StQcFbpBPNEvoWD59436Hg==" }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "ccount": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", @@ -3638,74 +3721,6 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, - "cldr-data": { - "version": "36.0.0", - "resolved": "https://registry.npmjs.org/cldr-data/-/cldr-data-36.0.0.tgz", - "integrity": "sha512-F3n+9DUs41vhys8eF/hsCgkmYlgXMCiwaE75uGZjUbS/jkszBnLylXj7xW3bBlMU1d2IuAptpoNAb6lTCu/RSg==", - "dev": true, - "requires": { - "cldr-data-downloader": "0.3.x", - "glob": "5.x.x" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "cldr-data-downloader": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/cldr-data-downloader/-/cldr-data-downloader-0.3.5.tgz", - "integrity": "sha512-uyIMa1K98DAp/PE7dYpq2COIrkWn681Atjng1GgEzeJzYb1jANtugtp9wre6+voE+qzVC8jtWv6E/xZ1GTJdlw==", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "mkdirp": "0.5.0", - "nopt": "3.0.x", - "progress": "1.1.8", - "q": "1.0.1", - "request": "~2.87.0", - "request-progress": "0.3.1" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - } - } - }, - "cldrjs": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.1.tgz", - "integrity": "sha512-xyiP8uAm8K1IhmpDndZLraloW1yqu0L+HYdQ7O1aGPxx9Cr+BMnPANlNhSt++UKfxytL2hd2NPXgTjiy7k43Ew==" - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -3716,12 +3731,6 @@ "wrap-ansi": "^5.1.0" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "collapse-white-space": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", @@ -3749,15 +3758,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -3989,15 +3989,6 @@ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-fns": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.15.0.tgz", @@ -4085,12 +4076,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -4189,16 +4174,6 @@ "xtend": "^4.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "electron-to-chromium": { "version": "1.3.549", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.549.tgz", @@ -4343,60 +4318,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, "eslint": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", @@ -4685,14 +4606,6 @@ "webpack-cli": "3.3.12" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, "@babel/core": { "version": "7.11.1", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", @@ -4716,87 +4629,10 @@ "source-map": "^0.5.0" } }, - "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", - "requires": { - "@babel/types": "^7.11.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz", - "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==" - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "requires": { "@babel/helper-validator-identifier": "^7.10.4", "lodash": "^4.17.19", @@ -4960,12 +4796,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5119,23 +4949,6 @@ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -5217,15 +5030,6 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glamor": { "version": "2.20.40", "resolved": "https://registry.npmjs.org/glamor/-/glamor-2.20.40.tgz", @@ -5322,33 +5126,6 @@ } } }, - "globalize": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/globalize/-/globalize-1.5.0.tgz", - "integrity": "sha512-76fcPQO/WLthtSwjgIZ/Zv2XSXqv9ifvl1PwIxJNCZNFHigGCpg3fBZ0poJ30b2kdDgofPkYl478lVZA6esESQ==", - "requires": { - "cldrjs": "^0.5.0" - } - }, - "globalize-compiler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/globalize-compiler/-/globalize-compiler-1.1.1.tgz", - "integrity": "sha512-oZIwVp3L/waDidle7Qrw4FiCCmOLAqvdM9P7W8nEO4OfXO//l/abBiA+RL2+mYZPOpTAlRDVS2FLfFVWxHovWA==", - "dev": true, - "requires": { - "escodegen": "^1.6.1", - "esprima": "^2.3.0", - "nopt": "^3.0.3" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5365,48 +5142,6 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5534,17 +5269,6 @@ "entities": "^2.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -5555,12 +5279,6 @@ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" }, - "iana-tz-data": { - "version": "2019.1.0", - "resolved": "https://registry.npmjs.org/iana-tz-data/-/iana-tz-data-2019.1.0.tgz", - "integrity": "sha512-T7+26Skkyxqjp4mg20/O065j9J5qP39nWVQj/2ArxQ0gSPkL+T9lwerRmiOAzFRNsNXepX45QqchqTVENwNvig==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5884,12 +5602,6 @@ "has-symbols": "^1.0.1" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-whitespace-character": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", @@ -5934,12 +5646,6 @@ "whatwg-fetch": ">=0.10.0" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -5981,12 +5687,6 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5997,12 +5697,6 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6014,12 +5708,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", @@ -6028,18 +5716,6 @@ "minimist": "^1.2.5" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "jsx-ast-utils": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", @@ -6275,21 +5951,6 @@ } } }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6504,15 +6165,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6531,12 +6183,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "optional": true }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6721,13 +6367,12 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -6815,12 +6460,6 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -6986,18 +6625,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "q": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", - "integrity": "sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -7313,43 +6940,6 @@ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, - "request-progress": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", - "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=", - "dev": true, - "requires": { - "throttleit": "~0.0.2" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7455,9 +7045,9 @@ } }, "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex": { "version": "1.1.0", @@ -7484,13 +7074,26 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } } }, "semver": { @@ -7499,9 +7102,9 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } @@ -7828,23 +7431,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -8049,15 +7635,15 @@ } }, "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -8093,12 +7679,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throttleit": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8174,23 +7754,6 @@ "repeat-string": "^1.6.1" } }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -8222,21 +7785,6 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8481,12 +8029,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, "v8-compile-cache": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", @@ -8502,17 +8044,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", @@ -8595,9 +8126,9 @@ } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "optional": true, "requires": { "anymatch": "~3.1.1", @@ -8607,7 +8138,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "fill-range": { @@ -8650,9 +8181,9 @@ "optional": true }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "optional": true, "requires": { "picomatch": "^2.2.1" @@ -8709,9 +8240,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "eslint-scope": { "version": "4.0.3", diff --git a/packages/component/package.json b/packages/component/package.json index 56b6fcce9a..a47bb78939 100644 --- a/packages/component/package.json +++ b/packages/component/package.json @@ -17,18 +17,15 @@ }, "homepage": "https://github.com/microsoft/BotFramework-WebChat/tree/master/packages/component#readme", "scripts": { - "build": "npm run build:typescript && npm run build:babel && npm run build:globalize", + "build": "npm run build:typescript && npm run build:babel", "build:babel": "babel src --copy-files --extensions .js,.ts,.tsx --ignore **/*.spec.js,**/*.spec.ts,**/*.spec.tsx,**/*.test.js,**/*.test.ts,**/*.test.tsx,__tests__/**/*.js,__tests__/**/*.ts,__tests__/**/*.tsx --no-copy-ignored --out-dir lib --verbose", - "build:globalize": "node scripts/createPrecompiledGlobalize.js", "build:typescript": "tsc --project src/tsconfig.json", "eslint": "eslint src/**/*.js src/**/*.ts", "prestart": "npm run build:babel", - "start": "concurrently --kill-others --names \"babel,globalize,tsc\" \"npm run start:babel\" \"npm run start:globalize\" \"npm run start:typescript\"", + "start": "concurrently --kill-others --names \"babel,tsc\" \"npm run start:babel\" \"npm run start:typescript\"", "start:babel": "npm run build:babel -- --skip-initial-build --watch", - "start:globalize": "node-dev --respawn scripts/createPrecompiledGlobalize.js", "start:typescript": "npm run build:typescript -- --watch" }, - "cldr-data-coverage": "full", "devDependencies": { "@babel/cli": "^7.10.5", "@babel/core": "^7.11.0", @@ -39,27 +36,24 @@ "@types/react": "^16.9.47", "babel-plugin-istanbul": "^6.0.0", "babel-plugin-transform-inline-environment-variables": "^0.4.3", - "cldr-data": "^36.0.0", "concurrently": "^5.3.0", "core-js": "^3.6.5", "eslint": "^7.7.0", "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-react": "^7.20.6", "eslint-plugin-react-hooks": "^4.1.0", - "globalize-compiler": "^1.1.1", - "iana-tz-data": "^2019.1.0", "node-dev": "^5.2.0", "prettier": "^2.1.1", "typescript": "^4.0.2" }, "dependencies": { "base64-js": "1.3.1", + "botframework-webchat-api": "^0.0.0-0", "botframework-webchat-core": "0.0.0-0", "classnames": "2.2.6", "create-emotion": "10.0.27", "event-target-shim": "5.0.1", "event-target-shim-es5": "1.2.0", - "globalize": "1.5.0", "markdown-it": "11.0.0", "math-random": "2.0.1", "memoize-one": "5.1.1", diff --git a/packages/component/src/Activity/Bubble.js b/packages/component/src/Activity/Bubble.js index d0bde715a0..f395661063 100644 --- a/packages/component/src/Activity/Bubble.js +++ b/packages/component/src/Activity/Bubble.js @@ -1,15 +1,16 @@ /* eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1, 2, 10] }] */ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import isZeroOrPositive from '../Utils/isZeroOrPositive'; -import useDirection from '../hooks/useDirection'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useDirection, useStyleOptions } = hooks; + const ROOT_STYLE = { '&.webchat__bubble': { display: 'flex', diff --git a/packages/component/src/Activity/CarouselFilmStrip.js b/packages/component/src/Activity/CarouselFilmStrip.js index 547e5125c1..9fd5f939fd 100644 --- a/packages/component/src/Activity/CarouselFilmStrip.js +++ b/packages/component/src/Activity/CarouselFilmStrip.js @@ -1,5 +1,6 @@ /* eslint complexity: ["error", 30] */ +import { hooks } from 'botframework-webchat-api'; import { useItemContainerCallbackRef, useScrollableCallbackRef } from 'react-film'; import classNames from 'classnames'; import PropTypes from 'prop-types'; @@ -10,15 +11,12 @@ import connectToWebChat from '../connectToWebChat'; import isZeroOrPositive from '../Utils/isZeroOrPositive'; import ScreenReaderText from '../ScreenReaderText'; import textFormatToContentType from '../Utils/textFormatToContentType'; -import useAvatarForBot from '../hooks/useAvatarForBot'; -import useAvatarForUser from '../hooks/useAvatarForUser'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; import useUniqueId from '../hooks/internal/useUniqueId'; +const { useAvatarForBot, useAvatarForUser, useDirection, useLocalizer, useStyleOptions } = hooks; + const ROOT_STYLE = { '&.webchat__carousel-filmstrip': { display: 'flex', diff --git a/packages/component/src/Activity/CarouselLayout.js b/packages/component/src/Activity/CarouselLayout.js index 8928497ede..f5bdf801b2 100644 --- a/packages/component/src/Activity/CarouselLayout.js +++ b/packages/component/src/Activity/CarouselLayout.js @@ -1,3 +1,4 @@ +import { hooks } from 'botframework-webchat-api'; import { Composer as FilmComposer, createBasicStyleSet as createBasicStyleSetForReactFilm, @@ -12,12 +13,12 @@ import PropTypes from 'prop-types'; import React, { useMemo } from 'react'; import CarouselFilmStrip from './CarouselFilmStrip'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; import useNonce from '../hooks/internal/useNonce'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useDirection, useLocalizer } = hooks; + const ROOT_STYLE = { '&.webchat__carousel-layout': { overflow: 'hidden', diff --git a/packages/component/src/Activity/ScrollToEndButton.js b/packages/component/src/Activity/ScrollToEndButton.js index 48a206f90e..f2a89479b9 100644 --- a/packages/component/src/Activity/ScrollToEndButton.js +++ b/packages/component/src/Activity/ScrollToEndButton.js @@ -1,13 +1,13 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { forwardRef, useCallback } from 'react'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; +import { safari } from '../Utils/detectBrowser'; import useScrollToEnd from '../hooks/useScrollToEnd'; import useStyleSet from '../hooks/useStyleSet'; -import { safari } from '../Utils/detectBrowser'; +const { useDirection, useLocalizer } = hooks; const ScrollToEndButton = forwardRef( ( diff --git a/packages/component/src/Activity/Speak.js b/packages/component/src/Activity/Speak.js index b083207152..feb9d8d015 100644 --- a/packages/component/src/Activity/Speak.js +++ b/packages/component/src/Activity/Speak.js @@ -1,12 +1,12 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React, { useCallback, useMemo } from 'react'; import Say, { SayUtterance } from 'react-say'; import connectToWebChat from '../connectToWebChat'; import SayAlt from './SayAlt'; -import useMarkActivityAsSpoken from '../hooks/useMarkActivityAsSpoken'; -import useStyleOptions from '../hooks/useStyleOptions'; -import useVoiceSelector from '../hooks/useVoiceSelector'; + +const { useMarkActivityAsSpoken, useStyleOptions, useVoiceSelector } = hooks; // TODO: [P4] Consider moving this feature into BasicActivity // And it has better DOM position for showing visual spoken text diff --git a/packages/component/src/Activity/StackedLayout.js b/packages/component/src/Activity/StackedLayout.js index 79eacd82cf..e8e9f757cd 100644 --- a/packages/component/src/Activity/StackedLayout.js +++ b/packages/component/src/Activity/StackedLayout.js @@ -1,5 +1,6 @@ /* eslint complexity: ["error", 30] */ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; @@ -9,14 +10,13 @@ import connectToWebChat from '../connectToWebChat'; import isZeroOrPositive from '../Utils/isZeroOrPositive'; import ScreenReaderText from '../ScreenReaderText'; import textFormatToContentType from '../Utils/textFormatToContentType'; -import useAvatarForBot from '../hooks/useAvatarForBot'; -import useAvatarForUser from '../hooks/useAvatarForUser'; -import useLocalizer from '../hooks/useLocalizer'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; + import useUniqueId from '../hooks/internal/useUniqueId'; +const { useAvatarForBot, useAvatarForUser, useLocalizer, useStyleOptions } = hooks; + const ROOT_STYLE = { '&.webchat__stacked-layout': { position: 'relative', // This is to keep screen reader text in the destinated area. diff --git a/packages/component/src/Assets/TypingAnimation.js b/packages/component/src/Assets/TypingAnimation.js index 2207f369d8..97f38f2b03 100644 --- a/packages/component/src/Assets/TypingAnimation.js +++ b/packages/component/src/Assets/TypingAnimation.js @@ -1,12 +1,14 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React from 'react'; import ScreenReaderText from '../ScreenReaderText'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; + import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useDirection, useLocalizer } = hooks; + const ROOT_STYLE = { '&.webchat__typingIndicator.webchat__typingIndicator--rtl': { transform: 'scale(-1, 1)' } }; diff --git a/packages/component/src/Attachment/FileContent.js b/packages/component/src/Attachment/FileContent.js index c5aa45e1e4..1be2e1a897 100644 --- a/packages/component/src/Attachment/FileContent.js +++ b/packages/component/src/Attachment/FileContent.js @@ -1,15 +1,15 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import DownloadIcon from './Assets/DownloadIcon'; import ScreenReaderText from '../ScreenReaderText'; -import useByteFormatter from '../hooks/useByteFormatter'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useByteFormatter, useDirection, useLocalizer } = hooks; + const ROOT_STYLE = { display: 'flex', diff --git a/packages/component/src/Attachment/ImageContent.js b/packages/component/src/Attachment/ImageContent.js index f6ef4761c9..0d666fa935 100644 --- a/packages/component/src/Attachment/ImageContent.js +++ b/packages/component/src/Attachment/ImageContent.js @@ -1,8 +1,10 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React from 'react'; import CroppedImage from '../Utils/CroppedImage'; -import useStyleOptions from '../hooks/useStyleOptions'; + +const { useStyleOptions } = hooks; const ImageContent = ({ alt, src }) => { const [{ bubbleImageHeight }] = useStyleOptions(); diff --git a/packages/component/src/Avatar/ImageAvatar.js b/packages/component/src/Avatar/ImageAvatar.js index 1a25ecc3c7..8ddfcd8d95 100644 --- a/packages/component/src/Avatar/ImageAvatar.js +++ b/packages/component/src/Avatar/ImageAvatar.js @@ -1,13 +1,14 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import CroppedImage from '../Utils/CroppedImage'; -import useAvatarForBot from '../hooks/useAvatarForBot'; -import useAvatarForUser from '../hooks/useAvatarForUser'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useAvatarForBot, useAvatarForUser } = hooks; + const ROOT_STYLE = { '& .webchat__imageAvatar__image': { width: '100%' diff --git a/packages/component/src/Avatar/InitialsAvatar.js b/packages/component/src/Avatar/InitialsAvatar.js index ad4a150475..ff0d5d925f 100644 --- a/packages/component/src/Avatar/InitialsAvatar.js +++ b/packages/component/src/Avatar/InitialsAvatar.js @@ -1,12 +1,13 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import useAvatarForBot from '../hooks/useAvatarForBot'; -import useAvatarForUser from '../hooks/useAvatarForUser'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useAvatarForBot, useAvatarForUser } = hooks; + const ROOT_STYLE = { alignItems: 'center', display: 'flex', diff --git a/packages/component/src/BasicConnectivityStatus.js b/packages/component/src/BasicConnectivityStatus.js index eb97bf999b..2cf4e3da5d 100644 --- a/packages/component/src/BasicConnectivityStatus.js +++ b/packages/component/src/BasicConnectivityStatus.js @@ -1,10 +1,12 @@ +import { hooks } from 'botframework-webchat-api'; import React from 'react'; import ConnectivityStatusConnected from './ConnectivityStatus/Connected'; import ConnectivityStatusConnecting from './ConnectivityStatus/Connecting'; import ConnectivityStatusFailedToConnect from './ConnectivityStatus/FailedToConnect'; import ConnectivityStatusJavaScriptError from './ConnectivityStatus/JavaScriptError'; -import useDebouncedNotifications from './hooks/useDebouncedNotifications'; + +const { useDebouncedNotifications } = hooks; const BasicConnectivityStatus = () => { const [{ connectivitystatus: connectivityStatus }] = useDebouncedNotifications(); diff --git a/packages/component/src/BasicSendBox.js b/packages/component/src/BasicSendBox.js index 883be0ccdd..2e1d7a41c7 100644 --- a/packages/component/src/BasicSendBox.js +++ b/packages/component/src/BasicSendBox.js @@ -1,4 +1,5 @@ import { Constants } from 'botframework-webchat-core'; +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; @@ -9,10 +10,6 @@ import SendButton from './SendBox/SendButton'; import SuggestedActions from './SendBox/SuggestedActions'; import TextBox from './SendBox/TextBox'; import UploadButton from './SendBox/UploadButton'; -import useActivities from './hooks/useActivities'; -import useDirection from './hooks/useDirection'; -import useDictateState from './hooks/useDictateState'; -import useStyleOptions from './hooks/useStyleOptions'; import useStyleSet from './hooks/useStyleSet'; import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; import useWebSpeechPonyfill from './hooks/useWebSpeechPonyfill'; @@ -21,6 +18,8 @@ const { DictateState: { DICTATING, STARTING } } = Constants; +const { useActivities, useDirection, useDictateState, useStyleOptions } = hooks; + const ROOT_STYLE = { '& > .main': { display: 'flex' diff --git a/packages/component/src/BasicToast.js b/packages/component/src/BasicToast.js index 7318e39ae5..ead8607fa5 100644 --- a/packages/component/src/BasicToast.js +++ b/packages/component/src/BasicToast.js @@ -1,6 +1,7 @@ /* eslint react/forbid-dom-props: "off" */ /* eslint react/no-danger: "off" */ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { useCallback, useMemo } from 'react'; @@ -9,12 +10,12 @@ import DismissIcon from './Toast/DismissIcon'; import NotificationIcon from './Toast/NotificationIcon'; import randomId from './Utils/randomId'; import ScreenReaderText from './ScreenReaderText'; -import useDismissNotification from './hooks/useDismissNotification'; import useInternalRenderMarkdownInline from './hooks/internal/useInternalRenderMarkdownInline'; -import useLocalizer from './hooks/useLocalizer'; import useStyleSet from './hooks/useStyleSet'; import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; +const { useDismissNotification, useLocalizer } = hooks; + const ROOT_STYLE = { display: 'flex', diff --git a/packages/component/src/BasicToaster.js b/packages/component/src/BasicToaster.js index 13daaf475f..7b13c36d84 100644 --- a/packages/component/src/BasicToaster.js +++ b/packages/component/src/BasicToaster.js @@ -1,6 +1,7 @@ /* eslint no-magic-numbers: ["error", { "ignore": [0, 1, 2, 3, 4, 5] }] */ /* eslint react/forbid-dom-props: "off" */ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; @@ -8,12 +9,11 @@ import CollapseIcon from './Toast/CollapseIcon'; import ExpandIcon from './Toast/ExpandIcon'; import NotificationIcon from './Toast/NotificationIcon'; import randomId from './Utils/randomId'; -import useDebouncedNotifications from './hooks/useDebouncedNotifications'; -import useLocalizer from './hooks/useLocalizer'; -import useRenderToast from './hooks/useRenderToast'; import useStyleSet from './hooks/useStyleSet'; import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; +const { useDebouncedNotifications, useLocalizer, useRenderToast } = hooks; + const ROOT_STYLE = { display: 'flex', flexDirection: 'column', diff --git a/packages/component/src/BasicTranscript.js b/packages/component/src/BasicTranscript.js index ccdc753656..4cf0ccb40f 100644 --- a/packages/component/src/BasicTranscript.js +++ b/packages/component/src/BasicTranscript.js @@ -1,5 +1,6 @@ /* eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1] }] */ +import { hooks } from 'botframework-webchat-api'; import { Panel as ScrollToBottomPanel, useAnimatingToEnd, useSticky } from 'react-scroll-to-bottom'; import classNames from 'classnames'; import PropTypes from 'prop-types'; @@ -15,20 +16,23 @@ import removeInline from './Utils/removeInline'; import ScreenReaderActivity from './ScreenReaderActivity'; import ScrollToEndButton from './Activity/ScrollToEndButton'; import SpeakActivity from './Activity/Speak'; -import useActivities from './hooks/useActivities'; -import useCreateActivityRenderer from './hooks/useCreateActivityRenderer'; -import useCreateActivityStatusRenderer from './hooks/useCreateActivityStatusRenderer'; -import useCreateAvatarRenderer from './hooks/useCreateAvatarRenderer'; -import useDirection from './hooks/useDirection'; import useFocus from './hooks/useFocus'; -import useGroupActivities from './hooks/useGroupActivities'; -import useLocalizer from './hooks/useLocalizer'; import useMemoize from './hooks/internal/useMemoize'; -import useStyleOptions from './hooks/useStyleOptions'; import useStyleSet from './hooks/useStyleSet'; +import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; import useTranscriptActivityElementsRef from './hooks/internal/useTranscriptActivityElementsRef'; import useTranscriptRootElementRef from './hooks/internal/useTranscriptRootElementRef'; -import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; + +const { + useActivities, + useCreateActivityRenderer, + useCreateActivityStatusRenderer, + useCreateAvatarRenderer, + useDirection, + useGroupActivities, + useLocalizer, + useStyleOptions +} = hooks; const ROOT_STYLE = { '&.webchat__basic-transcript': { @@ -71,7 +75,7 @@ function validateAllActivitiesTagged(activities, bins) { return activities.every(activity => bins.some(bin => bin.includes(activity))); } -const BasicTranscript2 = ({ className }) => { +const BasicTranscript = ({ className }) => { const [{ activity: activityStyleSet }] = useStyleSet(); const [ { bubbleFromUserNubOffset, bubbleNubOffset, groupTimestamp, internalLiveRegionFadeAfter, showAvatarInGroup } @@ -381,11 +385,11 @@ const BasicTranscript2 = ({ className }) => { ); }; -BasicTranscript2.defaultProps = { +BasicTranscript.defaultProps = { className: '' }; -BasicTranscript2.propTypes = { +BasicTranscript.propTypes = { className: PropTypes.string }; @@ -522,4 +526,4 @@ InternalTranscriptScrollable.propTypes = { children: PropTypes.arrayOf(PropTypes.element).isRequired }; -export default BasicTranscript2; +export default BasicTranscript; diff --git a/packages/component/src/BasicTypingIndicator.js b/packages/component/src/BasicTypingIndicator.js index dba311c6c8..0c9f09e5f2 100644 --- a/packages/component/src/BasicTypingIndicator.js +++ b/packages/component/src/BasicTypingIndicator.js @@ -1,5 +1,6 @@ -import useActiveTyping from './hooks/useActiveTyping'; -import useRenderTypingIndicator from './hooks/useRenderTypingIndicator'; +import { hooks } from 'botframework-webchat-api'; + +const { useActiveTyping, useRenderTypingIndicator } = hooks; function useTypingIndicatorVisible() { const [activeTyping] = useActiveTyping(); diff --git a/packages/component/src/BasicWebChat.js b/packages/component/src/BasicWebChat.js index 4f062aa2cf..5d834c721c 100644 --- a/packages/component/src/BasicWebChat.js +++ b/packages/component/src/BasicWebChat.js @@ -1,6 +1,7 @@ /* eslint no-magic-numbers: ["error", { "ignore": [0, 1, 2] }] */ /* eslint react/no-unsafe: off */ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; @@ -11,12 +12,12 @@ import BasicSendBox from './BasicSendBox'; import BasicToaster from './BasicToaster'; import BasicTranscript from './BasicTranscript'; import TypeFocusSinkBox from './Utils/TypeFocusSink'; -import useDisabled from './hooks/useDisabled'; import useSendBoxFocusRef from './hooks/internal/useSendBoxFocusRef'; -import useStyleOptions from './hooks/useStyleOptions'; import useStyleSet from './hooks/useStyleSet'; -import useTranscriptFocusRef from './hooks/internal/useTranscriptFocusRef'; import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; +import useTranscriptFocusRef from './hooks/internal/useTranscriptFocusRef'; + +const { useDisabled, useStyleOptions } = hooks; const ROOT_STYLE = { display: 'flex', diff --git a/packages/component/src/Composer.js b/packages/component/src/Composer.js index 18128c6479..5368f0693d 100644 --- a/packages/component/src/Composer.js +++ b/packages/component/src/Composer.js @@ -1,142 +1,39 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable react/destructuring-assignment */ +import { Composer as APIComposer, hooks } from 'botframework-webchat-api'; import { Composer as SayComposer } from 'react-say'; import { Composer as ScrollToBottomComposer } from 'react-scroll-to-bottom'; - -import { Provider } from 'react-redux'; import createEmotion from 'create-emotion'; +import createStyleSet from './Styles/createStyleSet'; import MarkdownIt from 'markdown-it'; import PropTypes from 'prop-types'; -import React, { isValidElement, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import updateIn from 'simple-update-in'; - -import applyAttachmentForScreenReaderMiddleware from './Middleware/applyAttachmentForScreenReaderMiddleware'; -import createActivityRenderer from './Middleware/createActivityRenderer'; -import createActivityStatusRenderer from './Middleware/createActivityStatusRenderer'; -import createAttachmentRenderer from './Middleware/createAttachmentRenderer'; -import createAvatarRenderer from './Middleware/createAvatarRenderer'; -import createCSSKey from './Utils/createCSSKey'; -import createCustomEvent from './Utils/createCustomEvent'; -import createToastRenderer from './Middleware/createToastRenderer'; -import createTypingIndicatorRenderer from './Middleware/createTypingIndicatorRenderer'; -import ErrorBoundary from './ErrorBoundary'; -import getAllLocalizedStrings from './Localization/getAllLocalizedStrings'; -import isObject from './Utils/isObject'; -import normalizeLanguage from './Utils/normalizeLanguage'; -import PrecompiledGlobalize from './Utils/PrecompiledGlobalize'; -import useReferenceGrammarID from './hooks/useReferenceGrammarID'; +import React, { useCallback, useMemo, useRef, useState } from 'react'; import { - clearSuggestedActions, - connect as createConnectAction, - createStore, - disconnect, - dismissNotification, - emitTypingIndicator, - markActivity, - postActivity, - sendEvent, - sendFiles, - sendMessage, - sendMessageBack, - sendPostBack, - setDictateInterims, - setDictateState, - setLanguage, - setNotification, - setSendBox, - setSendTimeout, - setSendTypingIndicator, - startDictate, - startSpeakingActivity, - stopDictate, - stopSpeakingActivity, - submitSendBox -} from 'botframework-webchat-core'; - + speechSynthesis as bypassSpeechSynthesis, + SpeechSynthesisUtterance as BypassSpeechSynthesisUtterance +} from './hooks/internal/BypassSpeechSynthesisPonyfill'; import addTargetBlankToHyperlinksMarkdown from './Utils/addTargetBlankToHyperlinksMarkdown'; -import concatMiddleware from './Middleware/concatMiddleware'; -import createCoreCardActionMiddleware from './Middleware/CardAction/createCoreMiddleware'; -import createDefaultGroupActivitiesMiddleware from './Middleware/GroupActivities/createCoreMiddleware'; -import createStyleSet from './Styles/createStyleSet'; -import defaultSelectVoice from './defaultSelectVoice'; +import createCSSKey from './Utils/createCSSKey'; +import createDefaultActivityMiddleware from './Middleware/Activity/createCoreMiddleware'; +import createDefaultActivityStatusMiddleware from './Middleware/ActivityStatus/createCoreMiddleware'; +import createDefaultAttachmentForScreenReaderMiddleware from './Middleware/AttachmentForScreenReader/createCoreMiddleware'; +import createDefaultAttachmentMiddleware from './Middleware/Attachment/createCoreMiddleware'; +import createDefaultAvatarMiddleware from './Middleware/Avatar/createCoreMiddleware'; +import createDefaultCardActionMiddleware from './Middleware/CardAction/createCoreMiddleware'; +import createDefaultToastMiddleware from './Middleware/Toast/createCoreMiddleware'; +import createDefaultTypingIndicatorMiddleware from './Middleware/TypingIndicator/createCoreMiddleware'; import Dictation from './Dictation'; +import downscaleImageToDataURL from './Utils/downscaleImageToDataURL'; +import ErrorBox from './ErrorBox'; import mapMap from './Utils/mapMap'; -import observableToPromise from './Utils/observableToPromise'; -import Tracker from './Tracker'; -import WebChatReduxContext, { useDispatch } from './WebChatReduxContext'; -import WebChatUIContext from './WebChatUIContext'; - -import { - speechSynthesis as bypassSpeechSynthesis, - SpeechSynthesisUtterance as BypassSpeechSynthesisUtterance -} from './Speech/BypassSpeechSynthesisPonyfill'; - -// List of Redux actions factory we are hoisting as Web Chat functions -const DISPATCHERS = { - clearSuggestedActions, - dismissNotification, - emitTypingIndicator, - markActivity, - postActivity, - sendEvent, - sendFiles, - sendMessage, - sendMessageBack, - sendPostBack, - setDictateInterims, - setDictateState, - setNotification, - setSendBox, - setSendTimeout, - startDictate, - startSpeakingActivity, - stopDictate, - stopSpeakingActivity, - submitSendBox -}; +import singleToArray from './Utils/singleToArray'; +import UITracker from './hooks/internal/UITracker'; +import WebChatUIContext from './hooks/internal/WebChatUIContext'; -const emotionPool = {}; +const { useReferenceGrammarID, useStyleOptions } = hooks; -function styleSetToEmotionObjects(styleToEmotionObject, styleSet) { - return mapMap(styleSet, (style, key) => (key === 'options' ? style : styleToEmotionObject(style))); -} +const node_env = process.env.node_env || process.env.NODE_ENV; -function createCardActionContext({ cardActionMiddleware, directLine, dispatch }) { - const runMiddleware = concatMiddleware(cardActionMiddleware, createCoreCardActionMiddleware())({ dispatch }); - - return { - onCardAction: (cardAction, { target } = {}) => - runMiddleware(({ cardAction: { type } }) => { - throw new Error(`Web Chat: received unknown card action "${type}"`); - })({ - cardAction, - getSignInUrl: - cardAction.type === 'signin' - ? () => { - const { value } = cardAction; - - if (directLine.getSessionId) { - // TODO: [P3] We should change this one to async/await. - // This is the first place in this project to use async. - // Thus, we need to add @babel/plugin-transform-runtime and @babel/runtime. - - return observableToPromise(directLine.getSessionId()).then( - sessionId => `${value}${encodeURIComponent(`&code_challenge=${sessionId}`)}` - ); - } - - console.warn( - 'botframework-webchat: No-magic-code OAuth flow is not supported on this Direct Line adapter.' - ); - - return Promise.resolve(value); - } - : null, - target - }) - }; -} +const emotionPool = {}; function createFocusContext({ sendBoxFocusRef, transcriptFocusRef }) { return { @@ -164,143 +61,36 @@ function createFocusContext({ sendBoxFocusRef, transcriptFocusRef }) { }; } -function createGroupActivitiesContext({ groupActivitiesMiddleware, groupTimestamp }) { - const runMiddleware = concatMiddleware( - groupActivitiesMiddleware, - createDefaultGroupActivitiesMiddleware({ groupTimestamp }) - )()(() => { - throw new Error('botframework-webchat internal: No middleware is execute for groupActivities.'); - }); - - return { - groupActivities: ({ activities }) => runMiddleware({ activities }) - }; -} - -function mergeStringsOverrides(localizedStrings, language, overrideLocalizedStrings) { - if (!overrideLocalizedStrings) { - return localizedStrings; - } else if (typeof overrideLocalizedStrings === 'function') { - const merged = overrideLocalizedStrings(localizedStrings, language); - - if (!isObject(merged)) { - throw new Error('botframework-webchat: overrideLocalizedStrings function must return an object.'); - } - - return merged; - } - - if (!isObject(overrideLocalizedStrings)) { - throw new Error('botframework-webchat: overrideLocalizedStrings must be either a function, an object, or falsy.'); - } - - return { ...localizedStrings, ...overrideLocalizedStrings }; +function styleSetToEmotionObjects(styleToEmotionObject, styleSet) { + return mapMap(styleSet, (style, key) => (key === 'options' ? style : styleToEmotionObject(style))); } -const Composer = ({ - activityMiddleware, - activityRenderer, - activityStatusMiddleware, - activityStatusRenderer, - attachmentForScreenReaderMiddleware, - attachmentMiddleware, - attachmentRenderer, - avatarMiddleware, - avatarRenderer, - cardActionMiddleware, +const ComposerCore = ({ children, - dir, - directLine, - disabled, extraStyleSet, - grammars, - groupActivitiesMiddleware, - groupTimestamp, - locale, nonce, - onTelemetry, - overrideLocalizedStrings, renderMarkdown, - selectVoice, - sendTimeout, - sendTypingIndicator, - styleOptions, styleSet, suggestedActionsAccessKey, - toastMiddleware, - toastRenderer, - typingIndicatorMiddleware, - typingIndicatorRenderer, - userID, - username, webSpeechPonyfillFactory }) => { const [dictateAbortable, setDictateAbortable] = useState(); const [referenceGrammarID] = useReferenceGrammarID(); - const dispatch = useDispatch(); + const [styleOptions] = useStyleOptions(); + const internalMarkdownIt = useMemo(() => new MarkdownIt(), []); const sendBoxFocusRef = useRef(); - const telemetryDimensionsRef = useRef({}); + const transcriptActivityElementsRef = useRef([]); const transcriptFocusRef = useRef(); + const transcriptRootElementRef = useRef(); - const patchedDir = useMemo(() => (dir === 'ltr' || dir === 'rtl' ? dir : 'auto'), [dir]); - const patchedGrammars = useMemo(() => grammars || [], [grammars]); - - const patchedStyleOptions = useMemo(() => { - const patchedStyleOptions = { ...styleOptions }; - - if (typeof groupTimestamp !== 'undefined' && typeof patchedStyleOptions.groupTimestamp === 'undefined') { - console.warn( - 'Web Chat: "groupTimestamp" has been moved to "styleOptions". This deprecation migration will be removed on or after January 1 2022.' - ); - - patchedStyleOptions.groupTimestamp = groupTimestamp; - } - - if (typeof sendTimeout !== 'undefined' && typeof patchedStyleOptions.sendTimeout === 'undefined') { - console.warn( - 'Web Chat: "sendTimeout" has been moved to "styleOptions". This deprecation migration will be removed on or after January 1 2022.' - ); - - patchedStyleOptions.sendTimeout = sendTimeout; - } - - if (styleOptions.slowConnectionAfter < 0) { - console.warn('Web Chat: "slowConnectionAfter" cannot be negative, will set to 0.'); - - patchedStyleOptions.slowConnectionAfter = 0; - } - - return patchedStyleOptions; - }, [groupTimestamp, sendTimeout, styleOptions]); - - useEffect(() => { - dispatch(setLanguage(locale)); - }, [dispatch, locale]); - - useEffect(() => { - typeof sendTimeout === 'number' && dispatch(setSendTimeout(sendTimeout)); - }, [dispatch, sendTimeout]); - - useEffect(() => { - dispatch(setSendTypingIndicator(!!sendTypingIndicator)); - }, [dispatch, sendTypingIndicator]); - - useEffect(() => { - dispatch( - createConnectAction({ - directLine, - userID, - username - }) - ); - - return () => { - // TODO: [P3] disconnect() is an async call (pending -> fulfilled), we need to wait, or change it to reconnect() - dispatch(disconnect()); - }; - }, [dispatch, directLine, userID, username]); + const dictationOnError = useCallback(err => { + console.error(err); + }, []); - const internalMarkdownIt = useMemo(() => new MarkdownIt(), []); + const focusContext = useMemo(() => createFocusContext({ sendBoxFocusRef, transcriptFocusRef }), [ + sendBoxFocusRef, + transcriptFocusRef + ]); const internalRenderMarkdownInline = useMemo( () => markdown => { @@ -314,22 +104,6 @@ const Composer = ({ [internalMarkdownIt] ); - const cardActionContext = useMemo(() => createCardActionContext({ cardActionMiddleware, directLine, dispatch }), [ - cardActionMiddleware, - directLine, - dispatch - ]); - - const patchedSelectVoice = useMemo(() => selectVoice || defaultSelectVoice.bind(null, { language: locale }), [ - locale, - selectVoice - ]); - - const focusContext = useMemo(() => createFocusContext({ sendBoxFocusRef, transcriptFocusRef }), [ - sendBoxFocusRef, - transcriptFocusRef - ]); - const styleToEmotionObject = useMemo(() => { // Emotion doesn't hash with nonce. We need to provide the pooling mechanism. // 1. If 2 instances use different nonce, they should result in different hash; @@ -343,24 +117,10 @@ const Composer = ({ const patchedStyleSet = useMemo( () => styleSetToEmotionObjects(styleToEmotionObject, { - ...(styleSet || createStyleSet(patchedStyleOptions)), + ...(styleSet || createStyleSet(styleOptions)), ...extraStyleSet }), - [extraStyleSet, patchedStyleOptions, styleSet, styleToEmotionObject] - ); - - const groupActivitiesContext = useMemo( - () => - createGroupActivitiesContext({ - groupActivitiesMiddleware, - groupTimestamp: patchedStyleSet.options.groupTimestamp - }), - [groupActivitiesMiddleware, patchedStyleSet.options.groupTimestamp] - ); - - const hoistedDispatchers = useMemo( - () => mapMap(DISPATCHERS, dispatcher => (...args) => dispatch(dispatcher(...args))), - [dispatch] + [extraStyleSet, styleOptions, styleSet, styleToEmotionObject] ); const webSpeechPonyfill = useMemo(() => { @@ -374,281 +134,172 @@ const Composer = ({ }; }, [referenceGrammarID, webSpeechPonyfillFactory]); - const dictationOnError = useCallback(err => { - console.error(err); - }, []); - - const patchedLocalizedStrings = useMemo( - () => mergeStringsOverrides(getAllLocalizedStrings()[normalizeLanguage(locale)], locale, overrideLocalizedStrings), - [locale, overrideLocalizedStrings] - ); - - const localizedGlobalize = useMemo(() => { - const { GLOBALIZE, GLOBALIZE_LANGUAGE } = patchedLocalizedStrings || {}; - - return GLOBALIZE || (GLOBALIZE_LANGUAGE && PrecompiledGlobalize(GLOBALIZE_LANGUAGE)) || PrecompiledGlobalize('en'); - }, [patchedLocalizedStrings]); - - const trackDimension = useCallback( - (name, data) => { - if (!name || typeof name !== 'string') { - return console.warn('botframework-webchat: Telemetry dimension name must be a string.'); - } - - const type = typeof data; - - if (type !== 'string' && type !== 'undefined') { - return console.warn('botframework-webchat: Telemetry dimension data must be a string or undefined.'); - } - - telemetryDimensionsRef.current = updateIn( - telemetryDimensionsRef.current, - [name], - type === 'undefined' ? data : () => data - ); - }, - [telemetryDimensionsRef] - ); - - const patchedActivityRenderer = useMemo(() => { - activityRenderer && - console.warn( - 'Web Chat: "activityRenderer" is deprecated and will be removed on 2020-06-15, please use "activityMiddleware" instead.' - ); - - return activityRenderer || createActivityRenderer(activityMiddleware); - }, [activityMiddleware, activityRenderer]); - - const patchedActivityStatusRenderer = useMemo(() => { - activityStatusRenderer && - console.warn( - 'Web Chat: "activityStatusRenderer" is deprecated and will be removed on 2020-06-15, please use "activityStatusMiddleware" instead.' - ); - - return activityStatusRenderer || createActivityStatusRenderer(activityStatusMiddleware); - }, [activityStatusMiddleware, activityStatusRenderer]); - - const patchedAttachmentForScreenReaderRenderer = useMemo(() => { - const patchedAttachmentForScreenReaderRenderer = applyAttachmentForScreenReaderMiddleware( - attachmentForScreenReaderMiddleware - ); - - // The new function returned is for validating the result of attachmentForScreenReaderMiddleware. - return (...args) => { - const renderAttachmentForScreenReader = patchedAttachmentForScreenReaderRenderer(...args); - - if (renderAttachmentForScreenReader === false) { - return false; - } else if (typeof renderAttachmentForScreenReader === 'function') { - return (...renderArgs) => { - const element = renderAttachmentForScreenReader(...renderArgs); - - if (!isValidElement(element)) { - console.error( - 'botframework-webchat: Renderer of attachmentForScreenReaderMiddleware should return React element only.' - ); - } - - return element; - }; - } - - console.error( - 'botframework-webchat: attachmentForScreenReaderMiddleware should only return either false or a render function.' - ); - - return false; - }; - }, [attachmentForScreenReaderMiddleware]); - - const patchedAttachmentRenderer = useMemo(() => { - attachmentRenderer && - console.warn( - 'Web Chat: "attachmentRenderer" is deprecated and will be removed on 2020-06-15, please use "attachmentMiddleware" instead.' - ); - - return attachmentRenderer || createAttachmentRenderer(attachmentMiddleware); - }, [attachmentMiddleware, attachmentRenderer]); - - const patchedAvatarRenderer = useMemo(() => { - avatarRenderer && - console.warn( - 'Web Chat: "avatarRenderer" is deprecated and will be removed on 2020-06-15, please use "avatarMiddleware" instead.' - ); - - return avatarRenderer || createAvatarRenderer(avatarMiddleware); - }, [avatarMiddleware, avatarRenderer]); - - const patchedToastRenderer = useMemo(() => { - toastRenderer && - console.warn( - 'Web Chat: "toastRenderer" is deprecated and will be removed on 2020-06-15, please use "toastMiddleware" instead.' - ); - - return toastRenderer || createToastRenderer(toastMiddleware); - }, [toastMiddleware, toastRenderer]); - - const patchedTypingIndicatorRenderer = useMemo(() => { - typingIndicatorRenderer && - console.warn( - 'Web Chat: "typingIndicatorRenderer" is deprecated and will be removed on 2020-06-15, please use "typingIndicatorMiddleware" instead.' - ); - - return typingIndicatorRenderer || createTypingIndicatorRenderer(typingIndicatorMiddleware); - }, [typingIndicatorMiddleware, typingIndicatorRenderer]); - - const transcriptActivityElementsRef = useRef([]); - const transcriptRootElementRef = useRef(); - - // This is a heavy function, and it is expected to be only called when there is a need to recreate business logic, e.g. - // - User ID changed, causing all send* functions to be updated - // - send - - // TODO: [P3] We should think about if we allow the user to change onSendBoxValueChanged/sendBoxValue, e.g. - // 1. Turns text into UPPERCASE - // 2. Filter out profanity - - // TODO: [P4] Revisit all members of context - // This context should consist of members that are not in the Redux store - // i.e. members that are not interested in other types of UIs const context = useMemo( () => ({ - ...cardActionContext, ...focusContext, - ...groupActivitiesContext, - ...hoistedDispatchers, - activityRenderer: patchedActivityRenderer, - activityStatusRenderer: patchedActivityStatusRenderer, - attachmentRenderer: patchedAttachmentRenderer, - avatarRenderer: patchedAvatarRenderer, - createAttachmentForScreenReaderRenderer: patchedAttachmentForScreenReaderRenderer, dictateAbortable, - dir: patchedDir, - directLine, - disabled, - grammars: patchedGrammars, internalMarkdownItState: [internalMarkdownIt], internalRenderMarkdownInline, - language: locale, - localizedGlobalizeState: [localizedGlobalize], - localizedStrings: patchedLocalizedStrings, nonce, - onTelemetry, renderMarkdown, - selectVoice: patchedSelectVoice, sendBoxFocusRef, - sendTypingIndicator, setDictateAbortable, - styleOptions, styleSet: patchedStyleSet, styleToEmotionObject, suggestedActionsAccessKey, - telemetryDimensionsRef, - toastRenderer: patchedToastRenderer, - trackDimension, transcriptActivityElementsRef, transcriptFocusRef, transcriptRootElementRef, - typingIndicatorRenderer: patchedTypingIndicatorRenderer, - userID, - username, webSpeechPonyfill }), [ - cardActionContext, dictateAbortable, - directLine, - disabled, focusContext, - groupActivitiesContext, - hoistedDispatchers, internalMarkdownIt, internalRenderMarkdownInline, - locale, - localizedGlobalize, nonce, - onTelemetry, - patchedActivityRenderer, - patchedActivityStatusRenderer, - patchedAttachmentForScreenReaderRenderer, - patchedAttachmentRenderer, - patchedAvatarRenderer, - patchedDir, - patchedGrammars, - patchedLocalizedStrings, - patchedSelectVoice, patchedStyleSet, - patchedToastRenderer, - patchedTypingIndicatorRenderer, renderMarkdown, sendBoxFocusRef, - sendTypingIndicator, setDictateAbortable, - styleOptions, styleToEmotionObject, suggestedActionsAccessKey, - telemetryDimensionsRef, - trackDimension, transcriptActivityElementsRef, transcriptFocusRef, transcriptRootElementRef, - userID, - username, webSpeechPonyfill ] ); return ( - + - {typeof children === 'function' ? children(context) : children} + + {children} + + - - {onTelemetry && } - + ); }; -// We will create a Redux store if it was not passed in -const ComposeWithStore = ({ onTelemetry, store, ...props }) => { - const handleError = useCallback( - ({ error }) => { - onTelemetry && onTelemetry(createCustomEvent('exception', { error, fatal: true })); - }, - [onTelemetry] +ComposerCore.defaultProps = { + extraStyleSet: undefined, + nonce: undefined, + renderMarkdown: undefined, + styleSet: undefined, + suggestedActionsAccessKey: 'A a Å å', + webSpeechPonyfillFactory: undefined +}; + +ComposerCore.propTypes = { + extraStyleSet: PropTypes.any, + nonce: PropTypes.string, + renderMarkdown: PropTypes.func, + styleSet: PropTypes.any, + suggestedActionsAccessKey: PropTypes.oneOfType([PropTypes.oneOf([false]), PropTypes.string]), + webSpeechPonyfillFactory: PropTypes.func +}; + +const Composer = ({ + activityMiddleware, + activityStatusMiddleware, + attachmentForScreenReaderMiddleware, + attachmentMiddleware, + avatarMiddleware, + cardActionMiddleware, + children, + extraStyleSet, + renderMarkdown, + styleSet, + suggestedActionsAccessKey, + toastMiddleware, + typingIndicatorMiddleware, + webSpeechPonyfillFactory, + ...composerProps +}) => { + const { nonce, onTelemetry } = composerProps; + + const patchedActivityMiddleware = useMemo( + () => [...singleToArray(activityMiddleware), ...createDefaultActivityMiddleware()], + [activityMiddleware] ); - const memoizedStore = useMemo(() => store || createStore(), [store]); + const patchedActivityStatusMiddleware = useMemo( + () => [...singleToArray(activityStatusMiddleware), ...createDefaultActivityStatusMiddleware()], + [activityStatusMiddleware] + ); - return ( - - - - - - - + const patchedAttachmentForScreenReaderMiddleware = useMemo( + () => [ + ...singleToArray(attachmentForScreenReaderMiddleware), + ...createDefaultAttachmentForScreenReaderMiddleware() + ], + [attachmentForScreenReaderMiddleware] ); -}; -ComposeWithStore.defaultProps = { - onTelemetry: undefined, - store: undefined -}; + const patchedAttachmentMiddleware = useMemo( + () => [...singleToArray(attachmentMiddleware), ...createDefaultAttachmentMiddleware()], + [attachmentMiddleware] + ); -ComposeWithStore.propTypes = { - onTelemetry: PropTypes.func, - store: PropTypes.any -}; + const patchedAvatarMiddleware = useMemo( + () => [...singleToArray(avatarMiddleware), ...createDefaultAvatarMiddleware()], + [avatarMiddleware] + ); -export default ComposeWithStore; + const patchedCardActionMiddleware = useMemo( + () => [...singleToArray(cardActionMiddleware), ...createDefaultCardActionMiddleware()], + [cardActionMiddleware] + ); -// TODO: [P3] We should consider moving some data from Redux store to props -// Although we use `connectToWebChat` to hide the details of accessor of Redux store, -// we should clean up the responsibility between Context and Redux store -// We should decide which data is needed for React but not in other environment such as CLI/VSCode + const patchedToastMiddleware = useMemo(() => [...singleToArray(toastMiddleware), ...createDefaultToastMiddleware()], [ + toastMiddleware + ]); + + const patchedTypingIndicatorMiddleware = useMemo( + () => [...singleToArray(typingIndicatorMiddleware), ...createDefaultTypingIndicatorMiddleware()], + [typingIndicatorMiddleware] + ); + + return ( + + + + + {children} + {onTelemetry && } + + + + + ); +}; Composer.defaultProps = { + ...APIComposer.defaultProps, + ...ComposerCore.defaultProps, activityMiddleware: undefined, activityRenderer: undefined, activityStatusMiddleware: undefined, @@ -660,79 +311,36 @@ Composer.defaultProps = { avatarRenderer: undefined, cardActionMiddleware: undefined, children: undefined, - dir: 'auto', - disabled: false, - extraStyleSet: undefined, - grammars: [], - groupActivitiesMiddleware: undefined, - groupTimestamp: undefined, - locale: window.navigator.language || 'en-US', nonce: undefined, - onTelemetry: undefined, - overrideLocalizedStrings: undefined, renderMarkdown: undefined, - selectVoice: undefined, - sendTimeout: undefined, - sendTypingIndicator: false, - styleOptions: {}, - styleSet: undefined, - suggestedActionsAccessKey: 'A a Å å', toastMiddleware: undefined, toastRenderer: undefined, typingIndicatorMiddleware: undefined, typingIndicatorRenderer: undefined, - userID: '', - username: '', webSpeechPonyfillFactory: undefined }; Composer.propTypes = { - activityMiddleware: PropTypes.func, + ...APIComposer.propTypes, + ...ComposerCore.propTypes, + activityMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), activityRenderer: PropTypes.func, - activityStatusMiddleware: PropTypes.func, + activityStatusMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), activityStatusRenderer: PropTypes.func, - attachmentForScreenReaderMiddleware: PropTypes.func, - attachmentMiddleware: PropTypes.func, + attachmentForScreenReaderMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), + attachmentMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), attachmentRenderer: PropTypes.func, - avatarMiddleware: PropTypes.func, + avatarMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), avatarRenderer: PropTypes.func, cardActionMiddleware: PropTypes.func, children: PropTypes.any, - dir: PropTypes.oneOf(['auto', 'ltr', 'rtl']), - directLine: PropTypes.shape({ - activity$: PropTypes.shape({ - subscribe: PropTypes.func.isRequired - }).isRequired, - connectionStatus$: PropTypes.shape({ - subscribe: PropTypes.func.isRequired - }).isRequired, - end: PropTypes.func, - getSessionId: PropTypes.func, - postActivity: PropTypes.func.isRequired, - referenceGrammarID: PropTypes.string, - token: PropTypes.string - }).isRequired, - disabled: PropTypes.bool, - extraStyleSet: PropTypes.any, - grammars: PropTypes.arrayOf(PropTypes.string), - groupActivitiesMiddleware: PropTypes.func, - groupTimestamp: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]), - locale: PropTypes.string, nonce: PropTypes.string, - onTelemetry: PropTypes.func, - overrideLocalizedStrings: PropTypes.oneOfType([PropTypes.any, PropTypes.func]), renderMarkdown: PropTypes.func, - selectVoice: PropTypes.func, - sendTimeout: PropTypes.number, - sendTypingIndicator: PropTypes.bool, - styleOptions: PropTypes.any, - styleSet: PropTypes.any, - suggestedActionsAccessKey: PropTypes.oneOfType([PropTypes.oneOf([false]), PropTypes.string]), - toastMiddleware: PropTypes.func, + toastMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), toastRenderer: PropTypes.func, - typingIndicatorMiddleware: PropTypes.func, + typingIndicatorMiddleware: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.func), PropTypes.func]), typingIndicatorRenderer: PropTypes.func, - userID: PropTypes.string, - username: PropTypes.string, webSpeechPonyfillFactory: PropTypes.func }; + +export default Composer; diff --git a/packages/component/src/ConnectivityStatus/Assets/ErrorNotificationIcon.js b/packages/component/src/ConnectivityStatus/Assets/ErrorNotificationIcon.js index 1796b0b392..51652a0320 100644 --- a/packages/component/src/ConnectivityStatus/Assets/ErrorNotificationIcon.js +++ b/packages/component/src/ConnectivityStatus/Assets/ErrorNotificationIcon.js @@ -1,8 +1,9 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import useDirection from '../../hooks/useDirection'; +const { useDirection } = hooks; const ICON_SIZE_FACTOR = 16; diff --git a/packages/component/src/ConnectivityStatus/Assets/SpinnerAnimation.js b/packages/component/src/ConnectivityStatus/Assets/SpinnerAnimation.js index 3329131066..8d9cad9f31 100644 --- a/packages/component/src/ConnectivityStatus/Assets/SpinnerAnimation.js +++ b/packages/component/src/ConnectivityStatus/Assets/SpinnerAnimation.js @@ -1,9 +1,11 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React from 'react'; -import useDirection from '../../hooks/useDirection'; import useStyleSet from '../../hooks/useStyleSet'; +const { useDirection } = hooks; + const SpinnerAnimation = () => { const [{ spinnerAnimation: spinnerAnimationStyleSet }] = useStyleSet(); const [direction] = useDirection(); diff --git a/packages/component/src/ConnectivityStatus/Assets/WarningNotificationIcon.js b/packages/component/src/ConnectivityStatus/Assets/WarningNotificationIcon.js index 5d70632ced..ec0597fdac 100644 --- a/packages/component/src/ConnectivityStatus/Assets/WarningNotificationIcon.js +++ b/packages/component/src/ConnectivityStatus/Assets/WarningNotificationIcon.js @@ -1,8 +1,9 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import useDirection from '../../hooks/useDirection'; +const { useDirection } = hooks; const ICON_SIZE_FACTOR = 16; diff --git a/packages/component/src/ConnectivityStatus/Connected.js b/packages/component/src/ConnectivityStatus/Connected.js index 117f4d0f67..0b753c40ab 100644 --- a/packages/component/src/ConnectivityStatus/Connected.js +++ b/packages/component/src/ConnectivityStatus/Connected.js @@ -1,7 +1,9 @@ +import { hooks } from 'botframework-webchat-api'; import React from 'react'; import ScreenReaderText from '../ScreenReaderText'; -import useLocalizer from '../hooks/useLocalizer'; + +const { useLocalizer } = hooks; const ConnectivityStatusConnected = () => { const localize = useLocalizer(); diff --git a/packages/component/src/ConnectivityStatus/Connecting.js b/packages/component/src/ConnectivityStatus/Connecting.js index 578175315c..417016f9c1 100644 --- a/packages/component/src/ConnectivityStatus/Connecting.js +++ b/packages/component/src/ConnectivityStatus/Connecting.js @@ -1,17 +1,17 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { useState } from 'react'; import ScreenReaderText from '../ScreenReaderText'; import SpinnerAnimation from './Assets/SpinnerAnimation'; -import useDirection from '../hooks/useDirection'; import useForceRender from '../hooks/internal/useForceRender'; -import useLocalizer from '../hooks/useLocalizer'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleSet from '../hooks/useStyleSet'; import useTimer from '../hooks/internal/useTimer'; import WarningNotificationIcon from './Assets/WarningNotificationIcon'; +const { useDirection, useLocalizer, useStyleOptions } = hooks; + const ConnectivityStatusConnecting = ({ reconnect }) => { const [{ slowConnectionAfter }] = useStyleOptions(); const [ diff --git a/packages/component/src/ConnectivityStatus/FailedToConnect.js b/packages/component/src/ConnectivityStatus/FailedToConnect.js index b5e55788a1..716bc8fd06 100644 --- a/packages/component/src/ConnectivityStatus/FailedToConnect.js +++ b/packages/component/src/ConnectivityStatus/FailedToConnect.js @@ -1,12 +1,13 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React from 'react'; import ErrorNotificationIcon from './Assets/ErrorNotificationIcon'; import ScreenReaderText from '../ScreenReaderText'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; import useStyleSet from '../hooks/useStyleSet'; +const { useDirection, useLocalizer } = hooks; + const ConnectivityStatusFailedToConnect = () => { const [{ errorNotification: errorNotificationStyleSet }] = useStyleSet(); const [direction] = useDirection(); diff --git a/packages/component/src/ConnectivityStatus/JavaScriptError.js b/packages/component/src/ConnectivityStatus/JavaScriptError.js index ef77b619b0..d2e298efeb 100644 --- a/packages/component/src/ConnectivityStatus/JavaScriptError.js +++ b/packages/component/src/ConnectivityStatus/JavaScriptError.js @@ -1,12 +1,13 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React from 'react'; import ErrorNotificationIcon from './Assets/ErrorNotificationIcon'; import ScreenReaderText from '../ScreenReaderText'; -import useDirection from '../hooks/useDirection'; -import useLocalizer from '../hooks/useLocalizer'; import useStyleSet from '../hooks/useStyleSet'; +const { useDirection, useLocalizer } = hooks; + const ConnectivityStatusJavaScriptError = () => { const [{ errorNotification: errorNotificationStyleSet }] = useStyleSet(); const [direction] = useDirection(); diff --git a/packages/component/src/Dictation.js b/packages/component/src/Dictation.js index 0c98889ede..dffc34083c 100644 --- a/packages/component/src/Dictation.js +++ b/packages/component/src/Dictation.js @@ -1,23 +1,29 @@ import { Composer as DictateComposer } from 'react-dictate-button'; import { Constants } from 'botframework-webchat-core'; +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React, { useCallback, useMemo } from 'react'; -import useActivities from './hooks/useActivities'; -import useDictateInterims from './hooks/useDictateInterims'; -import useDictateState from './hooks/useDictateState'; -import useDisabled from './hooks/useDisabled'; -import useEmitTypingIndicator from './hooks/useEmitTypingIndicator'; -import useLanguage from './hooks/useLanguage'; -import useSendBoxValue from './hooks/useSendBoxValue'; -import useSendTypingIndicator from './hooks/useSendTypingIndicator'; -import useSetDictateState from './hooks/internal/useSetDictateState'; import useSettableDictateAbortable from './hooks/internal/useSettableDictateAbortable'; -import useShouldSpeakIncomingActivity from './hooks/useShouldSpeakIncomingActivity'; -import useStopDictate from './hooks/useStopDictate'; -import useSubmitSendBox from './hooks/useSubmitSendBox'; import useWebSpeechPonyfill from './hooks/useWebSpeechPonyfill'; +// TODO: [P1] #3350 No /lib/, we need to move setDictateState from bf-wc-core (Redux) to React Context. +import useSetDictateState from 'botframework-webchat-api/lib/hooks/internal/useSetDictateState'; + +const { + useActivities, + useDictateInterims, + useDictateState, + useDisabled, + useEmitTypingIndicator, + useLanguage, + useSendBoxValue, + useSendTypingIndicator, + useShouldSpeakIncomingActivity, + useStopDictate, + useSubmitSendBox +} = hooks; + const { DictateState: { DICTATING, IDLE, STARTING } } = Constants; diff --git a/packages/component/src/ErrorBoundary.js b/packages/component/src/ErrorBoundary.js deleted file mode 100644 index 15a8dab035..0000000000 --- a/packages/component/src/ErrorBoundary.js +++ /dev/null @@ -1,31 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; - -class ErrorBoundary extends React.Component { - // Currently, all errors caught are fatal errors. - // We will bubble up the error and let React unmount us. - componentDidCatch(error) { - const { onError } = this.props; - const errorEvent = new ErrorEvent('error', { error }); - - onError && onError(errorEvent); - } - - render() { - const { children } = this.props; - - return children; - } -} - -ErrorBoundary.defaultProps = { - children: false, - onError: undefined -}; - -ErrorBoundary.propTypes = { - children: PropTypes.any, - onError: PropTypes.func -}; - -export default ErrorBoundary; diff --git a/packages/component/src/ErrorBox.js b/packages/component/src/ErrorBox.js index 0b95f5c590..120c9dea8a 100644 --- a/packages/component/src/ErrorBox.js +++ b/packages/component/src/ErrorBox.js @@ -1,34 +1,28 @@ /* eslint no-console: "off" */ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; -import React, { useEffect } from 'react'; +import React from 'react'; import ScreenReaderText from './ScreenReaderText'; -import useLocalizer from './hooks/useLocalizer'; import useStyleSet from './hooks/useStyleSet'; -import useTrackException from './hooks/useTrackException'; -const ErrorBox = ({ children, error, message }) => { +const { useLocalizer } = hooks; + +const ErrorBox = ({ error, type }) => { const [{ errorBox: errorBoxStyleSet }] = useStyleSet(); const localize = useLocalizer(); - const trackException = useTrackException(); - - useEffect(() => { - const errorObject = error || new Error(message); - - trackException(errorObject, false); - - console.group(`botframework-webchat: ${message}`); - console.error(errorObject); - console.groupEnd(); - }, [error, message, trackException]); return (
-
{message}
-
{children}
+
{type}
+ {/* The callstack between production and development are different, thus, we should hide it for visual regression test */} +
+ {error.message} +
{error.stack}
+
); @@ -37,13 +31,13 @@ const ErrorBox = ({ children, error, message }) => { ErrorBox.defaultProps = { children: undefined, error: undefined, - message: '' + type: '' }; ErrorBox.propTypes = { children: PropTypes.any, - error: PropTypes.instanceOf(Error), - message: PropTypes.string + error: PropTypes.instanceOf(Error).isRequired, + type: PropTypes.string }; export default ErrorBox; diff --git a/packages/component/src/Middleware/Activity/createCoreMiddleware.js b/packages/component/src/Middleware/Activity/createCoreMiddleware.js index 98bd8c258a..63b6eee3c4 100644 --- a/packages/component/src/Middleware/Activity/createCoreMiddleware.js +++ b/packages/component/src/Middleware/Activity/createCoreMiddleware.js @@ -4,64 +4,66 @@ import CarouselLayout from '../../Activity/CarouselLayout'; import StackedLayout from '../../Activity/StackedLayout'; export default function createCoreMiddleware() { - return () => next => (...args) => { - const [{ activity }] = args; + return [ + () => next => (...args) => { + const [{ activity }] = args; - // TODO: [P4] Can we simplify these if-statement to something more readable? + // TODO: [P4] Can we simplify these if-statement to something more readable? - const { type } = activity; + const { type } = activity; - // Filter out activities that should not be visible - if (type === 'conversationUpdate' || type === 'event' || type === 'invoke' || type === 'typing') { - return false; - } else if (type === 'message') { - const { attachments = [], channelData, text } = activity; + // Filter out activities that should not be visible + if (type === 'conversationUpdate' || type === 'event' || type === 'invoke' || type === 'typing') { + return false; + } else if (type === 'message') { + const { attachments = [], channelData, text } = activity; - if ( - // Do not show postback - (channelData && channelData.postBack) || - // Do not show messageBack if displayText is undefined - (channelData && channelData.messageBack && !channelData.messageBack.displayText) || - // Do not show empty bubbles (no text and attachments, and not "typing") - !(text || attachments.length) - ) { + if ( + // Do not show postback + (channelData && channelData.postBack) || + // Do not show messageBack if displayText is undefined + (channelData && channelData.messageBack && !channelData.messageBack.displayText) || + // Do not show empty bubbles (no text and attachments, and not "typing") + !(text || attachments.length) + ) { + return false; + } + } else if (type === 'typing' && activity.from.role === 'user') { + // Do not show typing by oneself return false; } - } else if (type === 'typing' && activity.from.role === 'user') { - // Do not show typing by oneself - return false; - } - if (type === 'message' || type === 'typing') { - if (type === 'message' && (activity.attachments || []).length > 1 && activity.attachmentLayout === 'carousel') { - // The following line is not a React functional component, it's a render function called by useCreateActivityRenderer() hook. - // The function signature need to be compatible with older version of activity middleware, which was: - // - // renderActivity( - // renderAttachment: ({ activity, attachment }) => React.Element - // ) => React.Element + if (type === 'message' || type === 'typing') { + if (type === 'message' && (activity.attachments || []).length > 1 && activity.attachmentLayout === 'carousel') { + // The following line is not a React functional component, it's a render function called by useCreateActivityRenderer() hook. + // The function signature need to be compatible with older version of activity middleware, which was: + // + // renderActivity( + // renderAttachment: ({ activity, attachment }) => React.Element + // ) => React.Element + + return function renderCarouselLayout(renderAttachment, props) { + typeof props === 'undefined' && + console.warn( + 'botframework-webchat: One or more arguments were missing after passing through the activity middleware. Please check your custom activity middleware to make sure it passthrough all arguments.' + ); - return function renderCarouselLayout(renderAttachment, props) { + return ; + }; + } + + // The following line is not a React functional component, it's a render function called by useCreateActivityRenderer() hook. + return function renderStackedLayout(renderAttachment, props) { typeof props === 'undefined' && console.warn( 'botframework-webchat: One or more arguments were missing after passing through the activity middleware. Please check your custom activity middleware to make sure it passthrough all arguments.' ); - return ; + return ; }; } - // The following line is not a React functional component, it's a render function called by useCreateActivityRenderer() hook. - return function renderStackedLayout(renderAttachment, props) { - typeof props === 'undefined' && - console.warn( - 'botframework-webchat: One or more arguments were missing after passing through the activity middleware. Please check your custom activity middleware to make sure it passthrough all arguments.' - ); - - return ; - }; + return next(...args); } - - return next(...args); - }; + ]; } diff --git a/packages/component/src/Middleware/ActivityStatus/AbsoluteTime.js b/packages/component/src/Middleware/ActivityStatus/AbsoluteTime.js index 7fe6a3639b..bc4022e176 100644 --- a/packages/component/src/Middleware/ActivityStatus/AbsoluteTime.js +++ b/packages/component/src/Middleware/ActivityStatus/AbsoluteTime.js @@ -1,10 +1,10 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React from 'react'; import ScreenReaderText from '../../ScreenReaderText'; -import useDateFormatter from '../../hooks/useDateFormatter'; -import useLocalizer from '../../hooks/useLocalizer'; +const { useDateFormatter, useLocalizer } = hooks; const AbsoluteTime = ({ hide, value }) => { const localize = useLocalizer(); diff --git a/packages/component/src/Middleware/ActivityStatus/RelativeTime.js b/packages/component/src/Middleware/ActivityStatus/RelativeTime.js index 47a498ee30..47282129ca 100644 --- a/packages/component/src/Middleware/ActivityStatus/RelativeTime.js +++ b/packages/component/src/Middleware/ActivityStatus/RelativeTime.js @@ -1,11 +1,11 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React from 'react'; import ScreenReaderText from '../../ScreenReaderText'; -import useDateFormatter from '../../hooks/useDateFormatter'; import useForceRenderAtInterval from '../../hooks/internal/useForceRenderAtInterval'; -import useLocalizer from '../../hooks/useLocalizer'; -import useRelativeTimeFormatter from '../../hooks/useRelativeTimeFormatter'; + +const { useDateFormatter, useLocalizer, useRelativeTimeFormatter } = hooks; const TIMER_INTERVAL = 60000; diff --git a/packages/component/src/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js b/packages/component/src/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js index bab21a14f8..708c92dd00 100644 --- a/packages/component/src/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js +++ b/packages/component/src/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js @@ -1,8 +1,10 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React, { useCallback } from 'react'; import InlineMarkdown from '../../../Utils/InlineMarkdown'; -import useLocalizer from '../../../hooks/useLocalizer'; + +const { useLocalizer } = hooks; const MARKDOWN_REFERENCES = ['RETRY']; diff --git a/packages/component/src/Middleware/ActivityStatus/SendStatus/SendStatus.js b/packages/component/src/Middleware/ActivityStatus/SendStatus/SendStatus.js index 639eb7e8c3..8400f95310 100644 --- a/packages/component/src/Middleware/ActivityStatus/SendStatus/SendStatus.js +++ b/packages/component/src/Middleware/ActivityStatus/SendStatus/SendStatus.js @@ -1,4 +1,5 @@ import { Constants } from 'botframework-webchat-core'; +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React, { useCallback } from 'react'; @@ -6,10 +7,10 @@ import connectToWebChat from '../../../connectToWebChat'; import ScreenReaderText from '../../../ScreenReaderText'; import SendFailedRetry from './SendFailedRetry'; import useFocus from '../../../hooks/useFocus'; -import useLocalizer from '../../../hooks/useLocalizer'; -import usePostActivity from '../../../hooks/usePostActivity'; import useStyleSet from '../../../hooks/useStyleSet'; +const { useLocalizer, usePostActivity } = hooks; + const { ActivityClientState: { SEND_FAILED, SENDING } } = Constants; diff --git a/packages/component/src/Middleware/ActivityStatus/Timestamp.js b/packages/component/src/Middleware/ActivityStatus/Timestamp.js index 3149522861..992cf996e4 100644 --- a/packages/component/src/Middleware/ActivityStatus/Timestamp.js +++ b/packages/component/src/Middleware/ActivityStatus/Timestamp.js @@ -1,12 +1,14 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import AbsoluteTime from './AbsoluteTime'; import RelativeTime from './RelativeTime'; -import useStyleOptions from '../../hooks/useStyleOptions'; import useStyleSet from '../../hooks/useStyleSet'; +const { useStyleOptions } = hooks; + const Timestamp = ({ activity: { timestamp }, className }) => { const [{ timestampFormat }] = useStyleOptions(); const [{ timestamp: timestampStyleSet, sendStatus: sendStatusStyleSet }] = useStyleSet(); diff --git a/packages/component/src/Middleware/ActivityStatus/createCoreMiddleware.js b/packages/component/src/Middleware/ActivityStatus/createCoreMiddleware.js index c157d820d2..080948748f 100644 --- a/packages/component/src/Middleware/ActivityStatus/createCoreMiddleware.js +++ b/packages/component/src/Middleware/ActivityStatus/createCoreMiddleware.js @@ -1,7 +1,6 @@ -import concatMiddleware from '../concatMiddleware'; import createSendStatusMiddleware from './createSendStatusMiddleware'; import createTimestampMiddleware from './createTimestampMiddleware'; export default function createCoreMiddleware() { - return concatMiddleware(createSendStatusMiddleware(), createTimestampMiddleware()); + return [createSendStatusMiddleware(), createTimestampMiddleware()]; } diff --git a/packages/component/src/Middleware/Attachment/createCoreMiddleware.js b/packages/component/src/Middleware/Attachment/createCoreMiddleware.js index 5d75af256c..7df54b5c19 100644 --- a/packages/component/src/Middleware/Attachment/createCoreMiddleware.js +++ b/packages/component/src/Middleware/Attachment/createCoreMiddleware.js @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import React from 'react'; import AudioAttachment from '../../Attachment/AudioAttachment'; @@ -9,14 +8,20 @@ import VideoAttachment from '../../Attachment/VideoAttachment'; // TODO: [P4] Rename this file or the whole middleware, it looks either too simple or too comprehensive now export default function createCoreMiddleware() { - return () => next => { - const Attachment = ({ - activity = {}, - activity: { from: { role } = {} } = {}, - attachment, - attachment: { contentType, contentUrl, thumbnailUrl } = {} - }) => - role === 'user' && !/^text\//u.test(contentType) && !thumbnailUrl ? ( + return [ + // This is not returning a React component, but a render function. + /* eslint-disable-next-line react/display-name */ + () => next => (...args) => { + const [ + { + activity = {}, + activity: { from: { role } = {} } = {}, + attachment, + attachment: { contentType, contentUrl, thumbnailUrl } = {} + } + ] = args; + + return role === 'user' && !/^text\//u.test(contentType) && !thumbnailUrl ? ( ) : /^audio\//u.test(contentType) ? ( @@ -29,18 +34,8 @@ export default function createCoreMiddleware() { ) : /^text\//u.test(contentType) ? ( ) : ( - next({ activity, attachment }) + next(...args) ); - - Attachment.propTypes = { - activity: PropTypes.any.isRequired, - attachment: PropTypes.shape({ - contentType: PropTypes.string.isRequired, - contentUrl: PropTypes.string, - thumbnailUrl: PropTypes.string - }).isRequired - }; - - return Attachment; - }; + } + ]; } diff --git a/packages/component/src/Middleware/AttachmentForScreenReader/AudioAttachment.js b/packages/component/src/Middleware/AttachmentForScreenReader/AudioAttachment.js index 168fd3ea22..866e7f5f3d 100644 --- a/packages/component/src/Middleware/AttachmentForScreenReader/AudioAttachment.js +++ b/packages/component/src/Middleware/AttachmentForScreenReader/AudioAttachment.js @@ -1,6 +1,7 @@ +import { hooks } from 'botframework-webchat-api'; import React from 'react'; -import useLocalizer from '../../hooks/useLocalizer'; +const { useLocalizer } = hooks; const AudioAttachment = () => { const localize = useLocalizer(); diff --git a/packages/component/src/Middleware/AttachmentForScreenReader/FileAttachment.js b/packages/component/src/Middleware/AttachmentForScreenReader/FileAttachment.js index ef846fcd11..7b9e5788f7 100644 --- a/packages/component/src/Middleware/AttachmentForScreenReader/FileAttachment.js +++ b/packages/component/src/Middleware/AttachmentForScreenReader/FileAttachment.js @@ -1,7 +1,8 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React from 'react'; -import useLocalizer from '../../hooks/useLocalizer'; +const { useLocalizer } = hooks; const FileAttachment = ({ attachment: { name = '' } = {} }) => { const localize = useLocalizer(); diff --git a/packages/component/src/Middleware/AttachmentForScreenReader/ImageAttachment.js b/packages/component/src/Middleware/AttachmentForScreenReader/ImageAttachment.js index 804de52af2..cbebad14b9 100644 --- a/packages/component/src/Middleware/AttachmentForScreenReader/ImageAttachment.js +++ b/packages/component/src/Middleware/AttachmentForScreenReader/ImageAttachment.js @@ -1,6 +1,7 @@ +import { hooks } from 'botframework-webchat-api'; import React from 'react'; -import useLocalizer from '../../hooks/useLocalizer'; +const { useLocalizer } = hooks; const ImageAttachment = () => { const localize = useLocalizer(); diff --git a/packages/component/src/Middleware/AttachmentForScreenReader/TextAttachment.js b/packages/component/src/Middleware/AttachmentForScreenReader/TextAttachment.js index 66d8fcca6d..0c5164ffc2 100644 --- a/packages/component/src/Middleware/AttachmentForScreenReader/TextAttachment.js +++ b/packages/component/src/Middleware/AttachmentForScreenReader/TextAttachment.js @@ -1,7 +1,8 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React from 'react'; -import useLocalizer from '../../hooks/useLocalizer'; +const { useLocalizer } = hooks; const TextAttachment = ({ attachment: { content = '' } = {} }) => { const localize = useLocalizer(); diff --git a/packages/component/src/Middleware/AttachmentForScreenReader/VideoAttachment.js b/packages/component/src/Middleware/AttachmentForScreenReader/VideoAttachment.js index 00d47970c1..b37da1040a 100644 --- a/packages/component/src/Middleware/AttachmentForScreenReader/VideoAttachment.js +++ b/packages/component/src/Middleware/AttachmentForScreenReader/VideoAttachment.js @@ -1,6 +1,7 @@ +import { hooks } from 'botframework-webchat-api'; import React from 'react'; -import useLocalizer from '../../hooks/useLocalizer'; +const { useLocalizer } = hooks; const VideoAttachment = () => { const localize = useLocalizer(); diff --git a/packages/component/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.js b/packages/component/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.js index c8d3e7d56d..e136d88c18 100644 --- a/packages/component/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.js +++ b/packages/component/src/Middleware/AttachmentForScreenReader/createCoreMiddleware.js @@ -7,23 +7,29 @@ import TextAttachment from './TextAttachment'; import VideoAttachment from './VideoAttachment'; export default function createCoreMiddleware() { - return () => next => (...args) => { - const [ - { activity: { from: { role } = {} } = {}, attachment, attachment: { contentType, contentUrl, thumbnailUrl } = {} } - ] = args; + return [ + () => next => (...args) => { + const [ + { + activity: { from: { role } = {} } = {}, + attachment, + attachment: { contentType, contentUrl, thumbnailUrl } = {} + } + ] = args; - return role === 'user' && !/^text\//u.test(contentType) && !thumbnailUrl - ? () => - : /^audio\//u.test(contentType) - ? () => - : /^image\//u.test(contentType) - ? () => - : /^video\//u.test(contentType) - ? () => - : contentUrl || contentType === 'application/octet-stream' - ? () => - : /^text\//u.test(contentType) - ? () => - : next(...args); - }; + return role === 'user' && !/^text\//u.test(contentType) && !thumbnailUrl + ? () => + : /^audio\//u.test(contentType) + ? () => + : /^image\//u.test(contentType) + ? () => + : /^video\//u.test(contentType) + ? () => + : contentUrl || contentType === 'application/octet-stream' + ? () => + : /^text\//u.test(contentType) + ? () => + : next(...args); + } + ]; } diff --git a/packages/component/src/Middleware/Avatar/createCoreMiddleware.js b/packages/component/src/Middleware/Avatar/createCoreMiddleware.js index a9d46ace1f..7b45f25f32 100644 --- a/packages/component/src/Middleware/Avatar/createCoreMiddleware.js +++ b/packages/component/src/Middleware/Avatar/createCoreMiddleware.js @@ -2,7 +2,6 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import concatMiddleware from '../concatMiddleware'; import ImageAvatar from '../../Avatar/ImageAvatar'; import InitialsAvatar from '../../Avatar/InitialsAvatar'; import useStyleSet from '../../hooks/useStyleSet'; @@ -52,16 +51,18 @@ DefaultAvatar.propTypes = { }; export default function createCoreAvatarMiddleware() { - return concatMiddleware(() => () => ({ fromUser, styleOptions }) => { - const { botAvatarImage, botAvatarInitials, userAvatarImage, userAvatarInitials } = styleOptions; + return [ + () => () => ({ fromUser, styleOptions }) => { + const { botAvatarImage, botAvatarInitials, userAvatarImage, userAvatarInitials } = styleOptions; - if (fromUser ? userAvatarImage || userAvatarInitials : botAvatarImage || botAvatarInitials) { - // eslint-disable-next-line react/display-name - return () => ; - } + if (fromUser ? userAvatarImage || userAvatarInitials : botAvatarImage || botAvatarInitials) { + // eslint-disable-next-line react/display-name + return () => ; + } - return false; - }); + return false; + } + ]; } export { DefaultAvatar }; diff --git a/packages/component/src/Middleware/CardAction/createCoreMiddleware.js b/packages/component/src/Middleware/CardAction/createCoreMiddleware.js index d0d0bde5dd..20f588afb7 100644 --- a/packages/component/src/Middleware/CardAction/createCoreMiddleware.js +++ b/packages/component/src/Middleware/CardAction/createCoreMiddleware.js @@ -1,5 +1,3 @@ -import { sendMessage, sendMessageBack, sendPostBack } from 'botframework-webchat-core'; - // This code is adopted from sanitize-html/naughtyScheme. // sanitize-html is a dependency of Web Chat but the naughtScheme function is neither exposed nor reusable. // https://github.com/apostrophecms/sanitize-html/blob/master/src/index.js#L526 @@ -30,59 +28,47 @@ function getScheme(href) { const ALLOWED_SCHEMES = ['data', 'http', 'https', 'ftp', 'mailto', 'sip', 'tel']; export default function createDefaultCardActionMiddleware() { - return ({ dispatch }) => next => ({ cardAction, getSignInUrl }) => { - const { displayText, text, type, value } = cardAction; - - switch (type) { - case 'imBack': - if (typeof value === 'string') { - // TODO: [P4] Instead of calling dispatch, we should move to dispatchers instead for completeness - dispatch(sendMessage(value, 'imBack')); - } else { - throw new Error('cannot send "imBack" with a non-string value'); + return [ + () => next => (...args) => { + const [ + { + cardAction: { type, value }, + getSignInUrl } - - break; - - case 'messageBack': - dispatch(sendMessageBack(value, text, displayText)); - - break; - - case 'postBack': - dispatch(sendPostBack(value)); - - break; - - case 'call': - case 'downloadFile': - case 'openUrl': - case 'playAudio': - case 'playVideo': - case 'showImage': - if (ALLOWED_SCHEMES.includes(getScheme(value))) { - window.open(value, '_blank', 'noopener noreferrer'); - } else { - console.warn('botframework-webchat: Cannot open URL with disallowed schemes.', value); + ] = args; + + switch (type) { + case 'call': + case 'downloadFile': + case 'openUrl': + case 'playAudio': + case 'playVideo': + case 'showImage': + if (ALLOWED_SCHEMES.includes(getScheme(value))) { + window.open(value, '_blank', 'noopener noreferrer'); + } else { + console.warn('botframework-webchat: Cannot open URL with disallowed schemes.', value); + } + + break; + + case 'signin': { + // TODO: [P3] We should prime the URL into the OAuthCard directly, instead of calling getSessionId on-demand + // This is to eliminate the delay between window.open() and location.href call + + (async function () { + const popup = window.open(); + const url = await getSignInUrl(); + + popup.location.href = url; + })(); + + break; } - break; - - case 'signin': { - // TODO: [P3] We should prime the URL into the OAuthCard directly, instead of calling getSessionId on-demand - // This is to eliminate the delay between window.open() and location.href call - - const popup = window.open(); - - getSignInUrl().then(url => { - popup.location.href = url; - }); - - break; + default: + return next(...args); } - - default: - return next({ cardAction, getSignInUrl }); } - }; + ]; } diff --git a/packages/component/src/Middleware/Toast/createCoreMiddleware.js b/packages/component/src/Middleware/Toast/createCoreMiddleware.js index df8c194f00..0c85f6b0e0 100644 --- a/packages/component/src/Middleware/Toast/createCoreMiddleware.js +++ b/packages/component/src/Middleware/Toast/createCoreMiddleware.js @@ -1,8 +1,7 @@ -import concatMiddleware from '../concatMiddleware'; import createToastMiddleware from '../../Toast/createToastMiddleware'; function createCoreMiddleware() { - return concatMiddleware( + return [ () => next => (...args) => { const [ { @@ -15,7 +14,7 @@ function createCoreMiddleware() { return id !== 'connectivitystatus' && next(...args); }, createToastMiddleware() - ); + ]; } export default createCoreMiddleware; diff --git a/packages/component/src/Middleware/TypingIndicator/createCoreMiddleware.js b/packages/component/src/Middleware/TypingIndicator/createCoreMiddleware.js index 3a7d8e84c0..e4f5f55a7b 100644 --- a/packages/component/src/Middleware/TypingIndicator/createCoreMiddleware.js +++ b/packages/component/src/Middleware/TypingIndicator/createCoreMiddleware.js @@ -1,13 +1,14 @@ /* eslint react/prop-types: "off"*/ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React from 'react'; import TypingAnimation from '../../Assets/TypingAnimation'; -import useDirection from '../../hooks/useDirection'; -import useLocalizer from '../../hooks/useLocalizer'; import useStyleSet from '../../hooks/useStyleSet'; +const { useDirection, useLocalizer } = hooks; + const DotIndicator = () => { const [{ typingIndicator: typingIndicatorStyleSet }] = useStyleSet(); const [direction] = useDirection(); @@ -22,5 +23,5 @@ const DotIndicator = () => { // TODO: [P4] Rename this file or the whole middleware, it looks either too simple or too comprehensive now export default function createCoreMiddleware() { - return () => () => ({ visible }) => visible && ; + return [() => () => ({ visible }) => visible && ]; } diff --git a/packages/component/src/Middleware/applyAttachmentForScreenReaderMiddleware.js b/packages/component/src/Middleware/applyAttachmentForScreenReaderMiddleware.js deleted file mode 100644 index 60922c1c1f..0000000000 --- a/packages/component/src/Middleware/applyAttachmentForScreenReaderMiddleware.js +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React from 'react'; - -import concatMiddleware from './concatMiddleware'; -import createCoreMiddleware from './AttachmentForScreenReader/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; - -export default function applyAttachmentForScreenReaderMiddleware(additionalMiddleware) { - const activityMiddleware = concatMiddleware(additionalMiddleware, createCoreMiddleware())({}); - - return (...args) => { - try { - return activityMiddleware(() => false)(...args); - } catch (err) { - const FailedRenderAttachmentForScreenReader = () => ( - -
{JSON.stringify(err, null, 2)}
-
- ); - - return FailedRenderAttachmentForScreenReader; - } - }; -} diff --git a/packages/component/src/Middleware/concatMiddleware.js b/packages/component/src/Middleware/concatMiddleware.js deleted file mode 100644 index c5c89ca1f9..0000000000 --- a/packages/component/src/Middleware/concatMiddleware.js +++ /dev/null @@ -1,16 +0,0 @@ -export default function concatMiddleware(...middlewares) { - return options => { - const setup = middlewares.reduce((setup, middleware) => (middleware ? [...setup, middleware(options)] : setup), []); - - return last => { - const stack = setup.slice(); - const work = index => (...args) => { - const next = stack[index]; - - return (next ? next(work(index + 1)) : last)(...args); - }; - - return work(0); - }; - }; -} diff --git a/packages/component/src/Middleware/createActivityRenderer.js b/packages/component/src/Middleware/createActivityRenderer.js deleted file mode 100644 index 10e193b79e..0000000000 --- a/packages/component/src/Middleware/createActivityRenderer.js +++ /dev/null @@ -1,43 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React, { useEffect } from 'react'; -import PropTypes from 'prop-types'; - -import concatMiddleware from './concatMiddleware'; -import createCoreActivityMiddleware from './Activity/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; -import useTrackException from '../hooks/useTrackException'; - -const SilentError = ({ message }) => { - const trackException = useTrackException(); - - useEffect(() => { - trackException(new Error(message), false); - }, [message, trackException]); - - return false; -}; - -SilentError.propTypes = { - message: PropTypes.string.isRequired -}; - -export default function createActivityRenderer(additionalMiddleware) { - const activityMiddleware = concatMiddleware(additionalMiddleware, createCoreActivityMiddleware())({}); - - return (...args) => { - try { - return activityMiddleware(({ activity }) => () => ( - - ))(...args); - } catch (err) { - const FailedRenderActivity = () => ( - -
{JSON.stringify(err, null, 2)}
-
- ); - - return FailedRenderActivity; - } - }; -} diff --git a/packages/component/src/Middleware/createActivityStatusRenderer.js b/packages/component/src/Middleware/createActivityStatusRenderer.js deleted file mode 100644 index 38c26eeb06..0000000000 --- a/packages/component/src/Middleware/createActivityStatusRenderer.js +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React from 'react'; -import concatMiddleware from './concatMiddleware'; -import createCoreActivityStatusMiddleware from './ActivityStatus/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; - -export default function createActivityStatusRenderer(additionalMiddleware) { - const activityStatusMiddleware = concatMiddleware(additionalMiddleware, createCoreActivityStatusMiddleware())({}); - - return (...args) => { - try { - return activityStatusMiddleware(() => false)(...args); - } catch (err) { - const { message, stack } = err; - - // The next line is not a React component. It is a render function. - // eslint-disable-next-line react/display-name - return () => ( - -
{JSON.stringify({ message, stack }, null, 2)}
-
- ); - } - }; -} diff --git a/packages/component/src/Middleware/createAttachmentRenderer.js b/packages/component/src/Middleware/createAttachmentRenderer.js deleted file mode 100644 index c1dd461ab0..0000000000 --- a/packages/component/src/Middleware/createAttachmentRenderer.js +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React from 'react'; -import concatMiddleware from './concatMiddleware'; -import createCoreAttachmentMiddleware from './Attachment/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; - -export default function createAttachmentRenderer(additionalMiddleware) { - const attachmentMiddleware = concatMiddleware(additionalMiddleware, createCoreAttachmentMiddleware())({}); - - return (...args) => { - try { - return attachmentMiddleware(({ attachment }) => ( - -
{JSON.stringify(attachment, null, 2)}
-
- ))(...args); - } catch (err) { - return ( - -
{JSON.stringify(err, null, 2)}
-
- ); - } - }; -} diff --git a/packages/component/src/Middleware/createAvatarRenderer.js b/packages/component/src/Middleware/createAvatarRenderer.js deleted file mode 100644 index 8f2b3d0529..0000000000 --- a/packages/component/src/Middleware/createAvatarRenderer.js +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React from 'react'; -import concatMiddleware from './concatMiddleware'; -import createCoreAvatarMiddleware from './Avatar/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; - -export default function createAvatarRenderer(additionalMiddleware) { - const avatarMiddleware = concatMiddleware(additionalMiddleware, createCoreAvatarMiddleware())({}); - - return (...args) => { - try { - return avatarMiddleware(() => false)(...args); - } catch (err) { - const { message, stack } = err; - - console.error({ message, stack }); - - return ( - -
{JSON.stringify({ message, stack }, null, 2)}
-
- ); - } - }; -} diff --git a/packages/component/src/Middleware/createToastRenderer.js b/packages/component/src/Middleware/createToastRenderer.js deleted file mode 100644 index f69e78c50a..0000000000 --- a/packages/component/src/Middleware/createToastRenderer.js +++ /dev/null @@ -1,30 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React from 'react'; -import concatMiddleware from './concatMiddleware'; -import createCoreToastMiddleware from './Toast/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; - -export default function createToastRenderer(additionalMiddleware) { - const toastMiddleware = concatMiddleware(additionalMiddleware, createCoreToastMiddleware())({}); - - return (...args) => { - try { - return toastMiddleware(({ notification }) => ( - -
{JSON.stringify(notification, null, 2)}
-
- ))(...args); - } catch (err) { - const { message, stack } = err; - - console.error({ message, stack }); - - return ( - -
{JSON.stringify({ message, stack }, null, 2)}
-
- ); - } - }; -} diff --git a/packages/component/src/Middleware/createTypingIndicatorRenderer.js b/packages/component/src/Middleware/createTypingIndicatorRenderer.js deleted file mode 100644 index bc40ed3b77..0000000000 --- a/packages/component/src/Middleware/createTypingIndicatorRenderer.js +++ /dev/null @@ -1,30 +0,0 @@ -/* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ - -import React from 'react'; -import concatMiddleware from './concatMiddleware'; -import createCoreTypingIndicatorMiddleware from './TypingIndicator/createCoreMiddleware'; -import ErrorBox from '../ErrorBox'; - -export default function createTypingIndicatorRenderer(additionalMiddleware) { - const typingIndicatorMiddleware = concatMiddleware(additionalMiddleware, createCoreTypingIndicatorMiddleware())({}); - - return (...args) => { - try { - return typingIndicatorMiddleware(({ activeTyping, typing, visible }) => ( - -
{JSON.stringify({ activeTyping, typing, visible }, null, 2)}
-
- ))(...args); - } catch (err) { - const { message, stack } = err; - - console.error({ message, stack }); - - return ( - -
{JSON.stringify({ message, stack }, null, 2)}
-
- ); - } - }; -} diff --git a/packages/component/src/ScreenReaderActivity.js b/packages/component/src/ScreenReaderActivity.js index 1d81dcb6d5..bfe142b775 100644 --- a/packages/component/src/ScreenReaderActivity.js +++ b/packages/component/src/ScreenReaderActivity.js @@ -1,17 +1,16 @@ /* eslint no-magic-numbers: ["error", { "ignore": [2] }] */ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import textFormatToContentType from './Utils/textFormatToContentType'; -import useAvatarForBot from './hooks/useAvatarForBot'; -import useCreateAttachmentForScreenReaderRenderer from './hooks/useCreateAttachmentForScreenReaderRenderer'; -import useDateFormatter from './hooks/useDateFormatter'; -import useLocalizer from './hooks/useLocalizer'; import useStripMarkdown from './hooks/internal/useStripMarkdown'; import useStyleToEmotionObject from './hooks/internal/useStyleToEmotionObject'; +const { useAvatarForBot, useCreateAttachmentForScreenReaderRenderer, useDateFormatter, useLocalizer } = hooks; + const ROOT_STYLE = { '&.webchat__screen-reader-activity': { color: 'transparent', diff --git a/packages/component/src/SendBox/Assets/SendIcon.js b/packages/component/src/SendBox/Assets/SendIcon.js index bc80b99524..b772b8cb68 100644 --- a/packages/component/src/SendBox/Assets/SendIcon.js +++ b/packages/component/src/SendBox/Assets/SendIcon.js @@ -1,9 +1,11 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React from 'react'; -import useDirection from '../../hooks/useDirection'; import useStyleToEmotionObject from '../../hooks/internal/useStyleToEmotionObject'; +const { useDirection } = hooks; + const ROOT_STYLE = { '&.webchat__send-icon': { '&.webchat__send-icon--rtl': { diff --git a/packages/component/src/SendBox/DictationInterims.js b/packages/component/src/SendBox/DictationInterims.js index dfebebe79d..c0bb89f6f8 100644 --- a/packages/component/src/SendBox/DictationInterims.js +++ b/packages/component/src/SendBox/DictationInterims.js @@ -1,15 +1,12 @@ /* eslint react/no-array-index-key: "off" */ +import { Constants } from 'botframework-webchat-core'; +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; -import { Constants } from 'botframework-webchat-core'; - import connectToWebChat from '../connectToWebChat'; -import useDictateInterims from '../hooks/useDictateInterims'; -import useDictateState from '../hooks/useDictateState'; -import useLocalizer from '../hooks/useLocalizer'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; @@ -17,6 +14,8 @@ const { DictateState: { DICTATING, STARTING, STOPPING } } = Constants; +const { useDictateInterims, useDictateState, useLocalizer } = hooks; + const ROOT_STYLE = { alignItems: 'center', display: 'flex' diff --git a/packages/component/src/SendBox/MicrophoneButton.js b/packages/component/src/SendBox/MicrophoneButton.js index ab81061e0b..eadfdcbe3d 100644 --- a/packages/component/src/SendBox/MicrophoneButton.js +++ b/packages/component/src/SendBox/MicrophoneButton.js @@ -2,6 +2,7 @@ /* eslint react/forbid-dom-props: "off" */ import { Constants } from 'botframework-webchat-core'; +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import memoize from 'memoize-one'; import PropTypes from 'prop-types'; @@ -11,20 +12,23 @@ import connectToWebChat from '../connectToWebChat'; import IconButton from './IconButton'; import MicrophoneIcon from './Assets/MicrophoneIcon'; import useDictateAbortable from '../hooks/useDictateAbortable'; -import useDictateInterims from '../hooks/useDictateInterims'; -import useDictateState from '../hooks/useDictateState'; -import useDisabled from '../hooks/useDisabled'; -import useLocalizer from '../hooks/useLocalizer'; -import useSendBoxValue from '../hooks/useSendBoxValue'; -import useShouldSpeakIncomingActivity from '../hooks/useShouldSpeakIncomingActivity'; -import useStartDictate from '../hooks/useStartDictate'; -import useStopDictate from '../hooks/useStopDictate'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; import useWebSpeechPonyfill from '../hooks/useWebSpeechPonyfill'; const { DictateState } = Constants; +const { + useDictateInterims, + useDictateState, + useDisabled, + useLocalizer, + useSendBoxValue, + useShouldSpeakIncomingActivity, + useStartDictate, + useStopDictate +} = hooks; + const ROOT_STYLE = { display: 'flex', height: '100%', diff --git a/packages/component/src/SendBox/SendButton.js b/packages/component/src/SendBox/SendButton.js index ce5bf319cf..7d1afefb92 100644 --- a/packages/component/src/SendBox/SendButton.js +++ b/packages/component/src/SendBox/SendButton.js @@ -1,13 +1,13 @@ +import { hooks } from 'botframework-webchat-api'; import React, { useCallback } from 'react'; import connectToWebChat from '../connectToWebChat'; import IconButton from './IconButton'; import SendIcon from './Assets/SendIcon'; -import useDisabled from '../hooks/useDisabled'; import useFocus from '../hooks/useFocus'; -import useLocalizer from '../hooks/useLocalizer'; import useScrollToEnd from '../hooks/useScrollToEnd'; -import useSubmitSendBox from '../hooks/useSubmitSendBox'; + +const { useDisabled, useLocalizer, useSubmitSendBox } = hooks; const connectSendButton = (...selectors) => connectToWebChat( diff --git a/packages/component/src/SendBox/SuggestedAction.js b/packages/component/src/SendBox/SuggestedAction.js index 353dde3565..ea8c116cdc 100644 --- a/packages/component/src/SendBox/SuggestedAction.js +++ b/packages/component/src/SendBox/SuggestedAction.js @@ -1,20 +1,19 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { useCallback, useRef } from 'react'; import AccessibleButton from '../Utils/AccessibleButton'; import connectToWebChat from '../connectToWebChat'; -import useDirection from '../hooks/useDirection'; -import useDisabled from '../hooks/useDisabled'; import useFocus from '../hooks/useFocus'; import useFocusAccessKeyEffect from '../Utils/AccessKeySink/useFocusAccessKeyEffect'; import useLocalizeAccessKey from '../hooks/internal/useLocalizeAccessKey'; -import usePerformCardAction from '../hooks/usePerformCardAction'; import useScrollToEnd from '../hooks/useScrollToEnd'; +import useSuggestedActionsAccessKey from '../hooks/internal/useSuggestedActionsAccessKey'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; -import useSuggestedActions from '../hooks/useSuggestedActions'; -import useSuggestedActionsAccessKey from '../hooks/internal/useSuggestedActionsAccessKey'; + +const { useDirection, useDisabled, usePerformCardAction, useSuggestedActions } = hooks; const ROOT_STYLE = { '&.webchat__suggested-action': { diff --git a/packages/component/src/SendBox/SuggestedActions.js b/packages/component/src/SendBox/SuggestedActions.js index d28bbe7525..ff073e0ea8 100644 --- a/packages/component/src/SendBox/SuggestedActions.js +++ b/packages/component/src/SendBox/SuggestedActions.js @@ -1,5 +1,6 @@ /* eslint react/no-array-index-key: "off" */ +import { hooks } from 'botframework-webchat-api'; import BasicFilm, { createBasicStyleSet as createBasicStyleSetForReactFilm } from 'react-film'; import classNames from 'classnames'; import PropTypes from 'prop-types'; @@ -8,16 +9,15 @@ import React, { useMemo } from 'react'; import connectToWebChat from '../connectToWebChat'; import ScreenReaderText from '../ScreenReaderText'; import SuggestedAction from './SuggestedAction'; -import useDirection from '../hooks/useDirection'; import useLocalizeAccessKey from '../hooks/internal/useLocalizeAccessKey'; -import useLocalizer from '../hooks/useLocalizer'; import useNonce from '../hooks/internal/useNonce'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; import useSuggestedActionsAccessKey from '../hooks/internal/useSuggestedActionsAccessKey'; import useUniqueId from '../hooks/internal/useUniqueId'; +const { useDirection, useLocalizer, useStyleOptions } = hooks; + const ROOT_STYLE = { '&.webchat__suggested-actions .webchat__suggested-actions__stack': { display: 'flex', diff --git a/packages/component/src/SendBox/TextBox.js b/packages/component/src/SendBox/TextBox.js index afbdb71d92..5a1f997915 100644 --- a/packages/component/src/SendBox/TextBox.js +++ b/packages/component/src/SendBox/TextBox.js @@ -1,3 +1,4 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { forwardRef, useCallback, useEffect, useRef } from 'react'; @@ -6,18 +7,14 @@ import { Context as TypeFocusSinkContext } from '../Utils/TypeFocusSink'; import AccessibleInputText from '../Utils/AccessibleInputText'; import AccessibleTextArea from '../Utils/AccessibleTextArea'; import connectToWebChat from '../connectToWebChat'; -import useDisabled from '../hooks/useDisabled'; import useFocus from '../hooks/useFocus'; -import useLocalizer from '../hooks/useLocalizer'; import useReplaceEmoticon from '../hooks/internal/useReplaceEmoticon'; import useScrollToEnd from '../hooks/useScrollToEnd'; -import useSendBoxValue from '../hooks/useSendBoxValue'; -import useStopDictate from '../hooks/useStopDictate'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleSet from '../hooks/useStyleSet'; -import useSubmitSendBox from '../hooks/useSubmitSendBox'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useDisabled, useLocalizer, useSendBoxValue, useStopDictate, useStyleOptions, useSubmitSendBox } = hooks; + const ROOT_STYLE = { '&.webchat__send-box-text-box': { display: 'flex', diff --git a/packages/component/src/SendBox/UploadButton.js b/packages/component/src/SendBox/UploadButton.js index a37a158c0e..995954a4d4 100644 --- a/packages/component/src/SendBox/UploadButton.js +++ b/packages/component/src/SendBox/UploadButton.js @@ -1,16 +1,17 @@ +import { hooks } from 'botframework-webchat-api'; import classNames from 'classnames'; import React, { useCallback, useRef } from 'react'; import AttachmentIcon from './Assets/AttachmentIcon'; import connectToWebChat from '../connectToWebChat'; -import downscaleImageToDataURL from '../Utils/downscaleImageToDataURL'; +import downscaleImageToDataURL from '../Utils/downscaleImageToDataURL/index'; import IconButton from './IconButton'; -import useDisabled from '../hooks/useDisabled'; -import useLocalizer from '../hooks/useLocalizer'; import useSendFiles from '../hooks/useSendFiles'; import useStyleSet from '../hooks/useStyleSet'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; +const { useDisabled, useLocalizer } = hooks; + const ROOT_STYLE = { overflow: 'hidden', position: 'relative', diff --git a/packages/component/src/Toast/NotificationIcon.js b/packages/component/src/Toast/NotificationIcon.js index af134e0972..d27b21bad9 100644 --- a/packages/component/src/Toast/NotificationIcon.js +++ b/packages/component/src/Toast/NotificationIcon.js @@ -1,9 +1,11 @@ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React from 'react'; import CheckMarkIcon from './CheckMarkIcon'; import ExclamationMarkIcon from './ExclamationMarkIcon'; -import useLocalizer from '../hooks/useLocalizer'; + +const { useLocalizer } = hooks; const NotificationIcon = ({ className, level }) => { const localize = useLocalizer(); diff --git a/packages/component/src/Utils/InlineMarkdown.js b/packages/component/src/Utils/InlineMarkdown.js index 85ace47525..3bf918548f 100644 --- a/packages/component/src/Utils/InlineMarkdown.js +++ b/packages/component/src/Utils/InlineMarkdown.js @@ -1,16 +1,18 @@ /* eslint react/no-danger: "off" */ +import { hooks } from 'botframework-webchat-api'; import PropTypes from 'prop-types'; import React, { useCallback, useMemo } from 'react'; import updateIn from 'simple-update-in'; -import createCustomEvent from '../Utils/createCustomEvent'; +import createCustomEvent from './createCustomEvent'; import randomId from './randomId'; import useInternalMarkdownIt from '../hooks/internal/useInternalMarkdownIt'; -import useStyleOptions from '../hooks/useStyleOptions'; import useStyleToEmotionObject from '../hooks/internal/useStyleToEmotionObject'; import walkMarkdownTokens from './walkMarkdownTokens'; +const { useStyleOptions } = hooks; + function replaceAnchorWithButton(markdownTokens) { return walkMarkdownTokens(markdownTokens, markdownToken => { markdownToken = { ...markdownToken }; @@ -87,11 +89,7 @@ const InlineMarkdown = ({ children, onReference, references }) => { const html = useMemo(() => { const tree = markdownIt.parseInline(children, { - references: references.reduce( - // (references, key) => ({ ...references, [key]: { href: `#${key}` } }), - (references, key) => ({ ...references, [key]: { href: `#${refToHref[key]}` } }), - {} - ) + references: references.reduce((references, key) => ({ ...references, [key]: { href: `#${refToHref[key]}` } }), {}) }); // Turn "Retry" into "" diff --git a/packages/component/src/Utils/TypeFocusSink/Context.js b/packages/component/src/Utils/TypeFocusSink/Context.js index cff54ee61e..575c41368d 100644 --- a/packages/component/src/Utils/TypeFocusSink/Context.js +++ b/packages/component/src/Utils/TypeFocusSink/Context.js @@ -1,6 +1,6 @@ -import React from 'react'; +import { createContext } from 'react'; -const context = React.createContext({ +const context = createContext({ focusableRef: undefined }); diff --git a/packages/component/src/Utils/blobToArrayBuffer.js b/packages/component/src/Utils/downscaleImageToDataURL/blobToArrayBuffer.js similarity index 100% rename from packages/component/src/Utils/blobToArrayBuffer.js rename to packages/component/src/Utils/downscaleImageToDataURL/blobToArrayBuffer.js diff --git a/packages/component/src/Utils/downscaleImageToDataURLUsingBrowser.js b/packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingBrowser.js similarity index 100% rename from packages/component/src/Utils/downscaleImageToDataURLUsingBrowser.js rename to packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingBrowser.js diff --git a/packages/component/src/Utils/downscaleImageToDataURLUsingWorker.js b/packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js similarity index 74% rename from packages/component/src/Utils/downscaleImageToDataURLUsingWorker.js rename to packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js index 8a73616f72..e92b7cc0fc 100644 --- a/packages/component/src/Utils/downscaleImageToDataURLUsingWorker.js +++ b/packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js @@ -1,5 +1,4 @@ import blobToArrayBuffer from './blobToArrayBuffer'; -import memoizeOne from 'memoize-one'; import workerFunction from './downscaleImageToDataURLUsingWorker.worker'; function createWorker(fn) { @@ -60,33 +59,47 @@ const checkSupportOffscreenCanvas = () => { return typeof window.createImageBitmap !== 'undefined' && hasOffscreenCanvas && isOffscreenCanvasSupportGetContext2D; }; -const checkSupportWebWorker = memoizeOne(async () => { - if (typeof window.MessageChannel === 'undefined' || typeof window.Worker === 'undefined') { - return false; - } +let checkSupportWebWorkerPromise; - let worker; +function checkSupportWebWorker() { + return ( + checkSupportWebWorkerPromise || + (checkSupportWebWorkerPromise = (async () => { + if (typeof window.MessageChannel === 'undefined' || typeof window.Worker === 'undefined') { + return false; + } - try { - worker = await createWorker('function(){postMessage("ready")}'); - } catch (err) { - return false; - } + let worker; + + try { + worker = await createWorker('function(){postMessage("ready")}'); + } catch (err) { + return false; + } - worker.terminate(); + worker.terminate(); - return true; -}); + return true; + })()) + ); +} -const checkSupport = memoizeOne(async () => { - try { - const results = await Promise.all([checkSupportOffscreenCanvas(), checkSupportWebWorker()]); +let checkSupportPromise; - return results.every(result => result); - } catch (err) { - return false; - } -}); +function checkSupport() { + return ( + checkSupportPromise || + (checkSupportPromise = (async () => { + try { + const results = await Promise.all([checkSupportOffscreenCanvas(), checkSupportWebWorker()]); + + return results.every(result => result); + } catch (err) { + return false; + } + })()) + ); +} export default function downscaleImageToDataURLUsingWorker(blob, maxWidth, maxHeight, type, quality) { return new Promise((resolve, reject) => { diff --git a/packages/component/src/Utils/downscaleImageToDataURLUsingWorker.worker.js b/packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.worker.js similarity index 100% rename from packages/component/src/Utils/downscaleImageToDataURLUsingWorker.worker.js rename to packages/component/src/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.worker.js diff --git a/packages/component/src/Utils/downscaleImageToDataURL.js b/packages/component/src/Utils/downscaleImageToDataURL/index.js similarity index 100% rename from packages/component/src/Utils/downscaleImageToDataURL.js rename to packages/component/src/Utils/downscaleImageToDataURL/index.js diff --git a/packages/component/src/Utils/singleToArray.js b/packages/component/src/Utils/singleToArray.js new file mode 100644 index 0000000000..873ed8ef89 --- /dev/null +++ b/packages/component/src/Utils/singleToArray.js @@ -0,0 +1,3 @@ +export default function singleToArray(singleOrArray) { + return singleOrArray ? (Array.isArray(singleOrArray) ? singleOrArray : [singleOrArray]) : []; +} diff --git a/packages/component/src/WebChatUIContext.js b/packages/component/src/WebChatUIContext.js deleted file mode 100644 index 27cf45b251..0000000000 --- a/packages/component/src/WebChatUIContext.js +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; - -const context = React.createContext({ - sendFocusRef: null -}); - -context.displayName = 'WebChatUIContext'; - -export default context; diff --git a/packages/component/src/connectToWebChat.js b/packages/component/src/connectToWebChat.js index 84c1de44b8..6e32ad3afc 100644 --- a/packages/component/src/connectToWebChat.js +++ b/packages/component/src/connectToWebChat.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux'; import React from 'react'; -import WebChatReduxContext from './WebChatReduxContext'; -import WebChatUIContext from './WebChatUIContext'; +import WebChatAPIContext from 'botframework-webchat-api/lib/hooks/internal/WebChatAPIContext'; +import WebChatReduxContext from 'botframework-webchat-api/lib/hooks/internal/WebChatReduxContext'; function removeUndefinedValues(map) { return Object.keys(map).reduce((result, key) => { @@ -43,9 +43,9 @@ export default function connectToWebChat(...selectors) { )(Component); const WebChatConnectedComponent = props => ( - + {context => } - + ); return WebChatConnectedComponent; diff --git a/packages/component/src/hooks/index.js b/packages/component/src/hooks/index.js index 5b22d03271..bebd2a87cb 100644 --- a/packages/component/src/hooks/index.js +++ b/packages/component/src/hooks/index.js @@ -1,70 +1,12 @@ -import useActiveTyping from './useActiveTyping'; -import useActivities from './useActivities'; -import useAvatarForBot from './useAvatarForBot'; -import useAvatarForUser from './useAvatarForUser'; -import useByteFormatter from './useByteFormatter'; -import useConnectivityStatus from './useConnectivityStatus'; -import useCreateActivityRenderer from './useCreateActivityRenderer'; -import useCreateActivityStatusRenderer from './useCreateActivityStatusRenderer'; -import useCreateAttachmentForScreenReaderRenderer from './useCreateAttachmentForScreenReaderRenderer'; -import useCreateAvatarRenderer from './useCreateAvatarRenderer'; -import useDateFormatter from './useDateFormatter'; -import useDebouncedNotifications from './useDebouncedNotifications'; -import useDictateInterims from './useDictateInterims'; -import useDictateState from './useDictateState'; -import useDirection from './useDirection'; -import useDisabled from './useDisabled'; -import useDismissNotification from './useDismissNotification'; -import useEmitTypingIndicator from './useEmitTypingIndicator'; +import useDictateAbortable from './useDictateAbortable'; import useFocus from './useFocus'; import useFocusSendBox from './useFocusSendBox'; -import useGetSendTimeoutForActivity from './useGetSendTimeoutForActivity'; -import useGrammars from './useGrammars'; -import useGroupTimestamp from './useGroupTimestamp'; -import useLanguage from './useLanguage'; -import useLastTypingAt from './useLastTypingAt'; -import useLocalize from './useLocalize'; // Deprecated on or after 2022-02-12 -import useLocalizeDate from './useLocalizeDate'; // Deprecated on or after 2022-02-12 -import useLocalizer from './useLocalizer'; -import useMarkActivityAsSpoken from './useMarkActivityAsSpoken'; import useObserveScrollPosition from './useObserveScrollPosition'; -import usePerformCardAction from './usePerformCardAction'; -import usePostActivity from './usePostActivity'; -import useReferenceGrammarID from './useReferenceGrammarID'; -import useRelativeTimeFormatter from './useRelativeTimeFormatter'; -import useRenderActivity from './useRenderActivity'; -import useRenderActivityStatus from './useRenderActivityStatus'; -import useRenderAttachment from './useRenderAttachment'; -import useRenderAvatar from './useRenderAvatar'; import useRenderMarkdownAsHTML from './useRenderMarkdownAsHTML'; -import useRenderToast from './useRenderToast'; -import useRenderTypingIndicator from './useRenderTypingIndicator'; import useScrollTo from './useScrollTo'; import useScrollToEnd from './useScrollToEnd'; -import useSendBoxValue from './useSendBoxValue'; -import useSendEvent from './useSendEvent'; import useSendFiles from './useSendFiles'; -import useSendMessage from './useSendMessage'; -import useSendMessageBack from './useSendMessageBack'; -import useSendPostBack from './useSendPostBack'; -import useSendTimeoutForActivity from './useSendTimeoutForActivity'; -import useSendTypingIndicator from './useSendTypingIndicator'; -import useSetNotification from './useSetNotification'; -import useShouldSpeakIncomingActivity from './useShouldSpeakIncomingActivity'; -import useStartDictate from './useStartDictate'; -import useStopDictate from './useStopDictate'; -import useStyleOptions from './useStyleOptions'; import useStyleSet from './useStyleSet'; -import useSubmitSendBox from './useSubmitSendBox'; -import useSuggestedActions from './useSuggestedActions'; -import useTimeoutForSend from './useTimeoutForSend'; -import useTrackDimension from './useTrackDimension'; -import useTrackEvent from './useTrackEvent'; -import useTrackException from './useTrackException'; -import useTrackTiming from './useTrackTiming'; -import useUserID from './useUserID'; -import useUsername from './useUsername'; -import useVoiceSelector from './useVoiceSelector'; import useWebSpeechPonyfill from './useWebSpeechPonyfill'; import { useMicrophoneButtonClick, useMicrophoneButtonDisabled } from '../SendBox/MicrophoneButton'; @@ -73,78 +15,21 @@ import { useTextBoxSubmit, useTextBoxValue } from '../SendBox/TextBox'; import { useTypingIndicatorVisible } from '../BasicTypingIndicator'; export { - useActiveTyping, - useActivities, - useAvatarForBot, - useAvatarForUser, - useByteFormatter, - useConnectivityStatus, - useCreateActivityRenderer, - useCreateActivityStatusRenderer, - useCreateAttachmentForScreenReaderRenderer, - useCreateAvatarRenderer, - useDateFormatter, - useDebouncedNotifications, - useDictateInterims, - useDictateState, - useDirection, - useDisabled, - useDismissNotification, - useEmitTypingIndicator, + useDictateAbortable, useFocus, useFocusSendBox, - useGetSendTimeoutForActivity, - useGrammars, - useGroupTimestamp, - useLanguage, - useLastTypingAt, - useLocalize, - useLocalizeDate, - useLocalizer, - useMarkActivityAsSpoken, useMicrophoneButtonClick, useMicrophoneButtonDisabled, useObserveScrollPosition, - usePerformCardAction, - usePostActivity, - useReferenceGrammarID, - useRelativeTimeFormatter, - useRenderActivity, - useRenderActivityStatus, - useRenderAttachment, - useRenderAvatar, useRenderMarkdownAsHTML, - useRenderToast, - useRenderTypingIndicator, useScrollTo, useScrollToEnd, useSendBoxSpeechInterimsVisible, - useSendBoxValue, - useSendEvent, + // We are overwriting the `useSendFiles` hook from bf-wc-api and adding thumbnailing support. useSendFiles, - useSendMessage, - useSendMessageBack, - useSendPostBack, - useSendTimeoutForActivity, - useSendTypingIndicator, - useSetNotification, - useShouldSpeakIncomingActivity, - useStartDictate, - useStopDictate, - useStyleOptions, useStyleSet, - useSubmitSendBox, - useSuggestedActions, useTextBoxSubmit, useTextBoxValue, - useTimeoutForSend, - useTrackDimension, - useTrackEvent, - useTrackException, - useTrackTiming, useTypingIndicatorVisible, - useUserID, - useUsername, - useVoiceSelector, useWebSpeechPonyfill }; diff --git a/packages/component/src/Speech/BypassSpeechSynthesisPonyfill.js b/packages/component/src/hooks/internal/BypassSpeechSynthesisPonyfill.js similarity index 100% rename from packages/component/src/Speech/BypassSpeechSynthesisPonyfill.js rename to packages/component/src/hooks/internal/BypassSpeechSynthesisPonyfill.js diff --git a/packages/component/src/hooks/internal/UITracker.js b/packages/component/src/hooks/internal/UITracker.js new file mode 100644 index 0000000000..ff8afb4366 --- /dev/null +++ b/packages/component/src/hooks/internal/UITracker.js @@ -0,0 +1,30 @@ +import { hooks } from 'botframework-webchat-api'; +import { useEffect } from 'react'; + +import { checkSupport as supportWorker } from '../../Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker'; +import { speechSynthesis } from './BypassSpeechSynthesisPonyfill'; +import useWebSpeechPonyfill from '../useWebSpeechPonyfill'; + +const { useTrackDimension } = hooks; + +const Tracker = () => { + const [webSpeechPonyfill] = useWebSpeechPonyfill(); + const trackDimension = useTrackDimension(); + + const speechRecognitionCapability = !!webSpeechPonyfill.SpeechRecognition; + const speechSynthesisCapability = + webSpeechPonyfill.speechSynthesis && webSpeechPonyfill.speechSynthesis !== speechSynthesis; + + useEffect(() => { + trackDimension('capability:downscaleImage:workerType', supportWorker() ? 'web worker' : 'main'); + trackDimension('capability:renderer', 'html'); + + // TODO: [P2] #2937 Differentiate between Cognitive Services and browser speech + trackDimension('prop:speechRecognition', !!speechRecognitionCapability + ''); + trackDimension('prop:speechSynthesis', !!speechSynthesisCapability + ''); + }, [trackDimension, speechRecognitionCapability, speechSynthesisCapability]); + + return false; +}; + +export default Tracker; diff --git a/packages/component/src/hooks/internal/WebChatUIContext.js b/packages/component/src/hooks/internal/WebChatUIContext.js new file mode 100644 index 0000000000..bcfb4e6924 --- /dev/null +++ b/packages/component/src/hooks/internal/WebChatUIContext.js @@ -0,0 +1,5 @@ +import { createContext } from 'react'; + +const context = createContext(); + +export default context; diff --git a/packages/component/src/hooks/internal/useDirFromProps.js b/packages/component/src/hooks/internal/useDirFromProps.js deleted file mode 100644 index 1eaa09b034..0000000000 --- a/packages/component/src/hooks/internal/useDirFromProps.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './useWebChatUIContext'; - -export default function useDirFromProps() { - return [useWebChatUIContext().dir]; -} diff --git a/packages/component/src/hooks/internal/useDisableOnBlurEffect.js b/packages/component/src/hooks/internal/useDisableOnBlurEffect.js deleted file mode 100644 index f2bf2ffee7..0000000000 --- a/packages/component/src/hooks/internal/useDisableOnBlurEffect.js +++ /dev/null @@ -1,34 +0,0 @@ -import { useEffect } from 'react'; - -// Because different browser handling disabled-but-focused UI different, we are implementing a more general solution. -// When the button is being disabled: -// - If it is not currently focused, we will set "disabled"; -// - If it is currently focused, we will not set "disabled" until it is blurred (focus moved away). -function disableElement(element) { - element.setAttribute('disabled', 'disabled'); -} - -export default function useDisableOnBlurEffect(targetRef, disabled) { - useEffect(() => { - if (disabled) { - const { current } = targetRef; - - if (current) { - if (document.activeElement !== current) { - current.setAttribute('disabled', 'disabled'); - - return () => current.removeAttribute('disabled'); - } - - const blurHandler = disableElement.bind(null, current); - - current.addEventListener('blur', blurHandler); - - return () => { - current.removeAttribute('disabled'); - current.removeEventListener('blur', blurHandler); - }; - } - } - }, [disabled, targetRef]); -} diff --git a/packages/component/src/hooks/internal/useLocalizeAccessKey.js b/packages/component/src/hooks/internal/useLocalizeAccessKey.js index 80c67ee6ae..e533b09fa7 100644 --- a/packages/component/src/hooks/internal/useLocalizeAccessKey.js +++ b/packages/component/src/hooks/internal/useLocalizeAccessKey.js @@ -1,8 +1,10 @@ import { useCallback } from 'react'; +import { hooks } from 'botframework-webchat-api'; -import useLocalizer from './../useLocalizer'; import useNavigatorPlatform from './useNavigatorPlatform'; +const { useLocalizer } = hooks; + export default function useLocalizeAccessKey() { const [{ apple }] = useNavigatorPlatform(); const localize = useLocalizer(); diff --git a/packages/component/src/hooks/internal/useLocalizedGlobalize.js b/packages/component/src/hooks/internal/useLocalizedGlobalize.js deleted file mode 100644 index 2aea086720..0000000000 --- a/packages/component/src/hooks/internal/useLocalizedGlobalize.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './useWebChatUIContext'; - -export default function useLocalizedGlobalize() { - return useWebChatUIContext().localizedGlobalizeState; -} diff --git a/packages/component/src/hooks/internal/useLocalizedStrings.js b/packages/component/src/hooks/internal/useLocalizedStrings.js deleted file mode 100644 index d62d6a4ce9..0000000000 --- a/packages/component/src/hooks/internal/useLocalizedStrings.js +++ /dev/null @@ -1,7 +0,0 @@ -import useWebChatUIContext from './useWebChatUIContext'; - -export default function useLocalizedStrings() { - const { localizedStrings } = useWebChatUIContext(); - - return localizedStrings; -} diff --git a/packages/component/src/hooks/internal/useMarkActivity.js b/packages/component/src/hooks/internal/useMarkActivity.js deleted file mode 100644 index 6c421b9635..0000000000 --- a/packages/component/src/hooks/internal/useMarkActivity.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './useWebChatUIContext'; - -export default function useMarkActivity() { - return useWebChatUIContext().markActivity; -} diff --git a/packages/component/src/hooks/internal/useReplaceEmoticon.js b/packages/component/src/hooks/internal/useReplaceEmoticon.js index 3b653edcdb..6ca582a793 100644 --- a/packages/component/src/hooks/internal/useReplaceEmoticon.js +++ b/packages/component/src/hooks/internal/useReplaceEmoticon.js @@ -1,8 +1,9 @@ /*eslint require-unicode-regexp: "off" */ +import { hooks } from 'botframework-webchat-api'; import { useCallback } from 'react'; -import useStyleOptions from '../useStyleOptions'; +const { useStyleOptions } = hooks; export default function useReplaceEmoticon() { const [{ emojiSet }] = useStyleOptions(); diff --git a/packages/component/src/hooks/internal/useSetDictateState.js b/packages/component/src/hooks/internal/useSetDictateState.js deleted file mode 100644 index 40042b6110..0000000000 --- a/packages/component/src/hooks/internal/useSetDictateState.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './useWebChatUIContext'; - -export default function useSetDictateState() { - return useWebChatUIContext().setDictateState; -} diff --git a/packages/component/src/hooks/internal/useTracker.js b/packages/component/src/hooks/internal/useTracker.js deleted file mode 100644 index 276d0047b2..0000000000 --- a/packages/component/src/hooks/internal/useTracker.js +++ /dev/null @@ -1,51 +0,0 @@ -import { useEffect } from 'react'; - -import { checkSupport as supportWorker } from '../../Utils/downscaleImageToDataURLUsingWorker'; -import { speechSynthesis } from '../../Speech/BypassSpeechSynthesisPonyfill'; -import useLanguage from '../useLanguage'; -import useTrackDimension from '../useTrackDimension'; -import useTrackEvent from '../useTrackEvent'; -import useWebSpeechPonyfill from '../useWebSpeechPonyfill'; - -function useTracker() { - const [language] = useLanguage(); - const [webSpeechPonyfill] = useWebSpeechPonyfill(); - const trackDimension = useTrackDimension(); - const trackEvent = useTrackEvent(); - - // TODO: [P2] #2937 Track how many of them customized the following: - // - activityMiddleware - // - activityStatusMiddleware - // - attachmentMiddleware - // - cardActionMiddleware - // - toastMiddleware - // - styleOptions - - const speechRecognitionCapability = !!webSpeechPonyfill.SpeechRecognition; - const speechSynthesisCapability = - webSpeechPonyfill.speechSynthesis && webSpeechPonyfill.speechSynthesis !== speechSynthesis; - - useEffect(() => { - trackDimension('prop:locale', language); - }, [language, trackDimension]); - - useEffect(() => { - // TODO: [P2] #2937 Differentiate between Cognitive Services and browser speech - trackDimension('prop:speechRecognition', !!speechRecognitionCapability + ''); - }, [trackDimension, speechRecognitionCapability]); - - useEffect(() => { - // TODO: [P2] #2937 Differentiate between Cognitive Services and browser speech - trackDimension('prop:speechSynthesis', !!speechSynthesisCapability + ''); - }, [trackDimension, speechSynthesisCapability]); - - useEffect(() => { - trackDimension('capability:downscaleImage:workerType', supportWorker() ? 'web worker' : 'main'); - }, [trackDimension]); - - useEffect(() => { - trackEvent('init'); - }, [trackEvent]); -} - -export default useTracker; diff --git a/packages/component/src/hooks/internal/useWebChatUIContext.js b/packages/component/src/hooks/internal/useWebChatUIContext.js index 89797ee6b7..c33adb32b3 100644 --- a/packages/component/src/hooks/internal/useWebChatUIContext.js +++ b/packages/component/src/hooks/internal/useWebChatUIContext.js @@ -1,6 +1,6 @@ import { useContext } from 'react'; -import WebChatUIContext from '../../WebChatUIContext'; +import WebChatUIContext from './WebChatUIContext'; export default function useWebChatUIContext() { const context = useContext(WebChatUIContext); diff --git a/packages/component/src/hooks/useCreateAttachmentForScreenReaderRenderer.js b/packages/component/src/hooks/useCreateAttachmentForScreenReaderRenderer.js deleted file mode 100644 index f945ec439c..0000000000 --- a/packages/component/src/hooks/useCreateAttachmentForScreenReaderRenderer.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useCreateAttachmentForScreenReaderRenderer() { - return useWebChatUIContext().createAttachmentForScreenReaderRenderer; -} diff --git a/packages/component/src/hooks/useDictateInterims.js b/packages/component/src/hooks/useDictateInterims.js deleted file mode 100644 index 41bd858e67..0000000000 --- a/packages/component/src/hooks/useDictateInterims.js +++ /dev/null @@ -1,6 +0,0 @@ -import { useSelector } from '../WebChatReduxContext'; -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useDictateInterims() { - return [useSelector(({ dictateInterims }) => dictateInterims) || [], useWebChatUIContext().setDictateInterims]; -} diff --git a/packages/component/src/hooks/useDisabled.js b/packages/component/src/hooks/useDisabled.js deleted file mode 100644 index 998aa26b7c..0000000000 --- a/packages/component/src/hooks/useDisabled.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useDisabled() { - return [useWebChatUIContext().disabled]; -} diff --git a/packages/component/src/hooks/useDismissNotification.js b/packages/component/src/hooks/useDismissNotification.js deleted file mode 100644 index b5b7b9606f..0000000000 --- a/packages/component/src/hooks/useDismissNotification.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useDismissNotification() { - return useWebChatUIContext().dismissNotification; -} diff --git a/packages/component/src/hooks/useEmitTypingIndicator.js b/packages/component/src/hooks/useEmitTypingIndicator.js deleted file mode 100644 index 8407033d07..0000000000 --- a/packages/component/src/hooks/useEmitTypingIndicator.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useEmitTypingIndicator() { - return useWebChatUIContext().emitTypingIndicator; -} diff --git a/packages/component/src/hooks/useGrammars.js b/packages/component/src/hooks/useGrammars.js deleted file mode 100644 index 9c40af3436..0000000000 --- a/packages/component/src/hooks/useGrammars.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useGrammars() { - return [useWebChatUIContext().grammars]; -} diff --git a/packages/component/src/hooks/useGroupActivities.js b/packages/component/src/hooks/useGroupActivities.js deleted file mode 100644 index 766572d070..0000000000 --- a/packages/component/src/hooks/useGroupActivities.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useGroupActivities() { - return useWebChatUIContext().groupActivities; -} diff --git a/packages/component/src/hooks/usePerformCardAction.js b/packages/component/src/hooks/usePerformCardAction.js deleted file mode 100644 index b2b55b5b5b..0000000000 --- a/packages/component/src/hooks/usePerformCardAction.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function usePerformCardAction() { - return useWebChatUIContext().onCardAction; -} diff --git a/packages/component/src/hooks/usePostActivity.js b/packages/component/src/hooks/usePostActivity.js deleted file mode 100644 index 424f009352..0000000000 --- a/packages/component/src/hooks/usePostActivity.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function usePostActivity() { - return useWebChatUIContext().postActivity; -} diff --git a/packages/component/src/hooks/useRenderAttachment.js b/packages/component/src/hooks/useRenderAttachment.js deleted file mode 100644 index 85b0d4bc1e..0000000000 --- a/packages/component/src/hooks/useRenderAttachment.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useRenderAttachment() { - return useWebChatUIContext().attachmentRenderer; -} diff --git a/packages/component/src/hooks/useRenderMarkdownAsHTML.js b/packages/component/src/hooks/useRenderMarkdownAsHTML.js index 250270429a..c82eb24ab8 100644 --- a/packages/component/src/hooks/useRenderMarkdownAsHTML.js +++ b/packages/component/src/hooks/useRenderMarkdownAsHTML.js @@ -1,8 +1,10 @@ +import { hooks } from 'botframework-webchat-api'; import { useMemo } from 'react'; -import useStyleOptions from '../hooks/useStyleOptions'; import useWebChatUIContext from './internal/useWebChatUIContext'; +const { useStyleOptions } = hooks; + export default function useRenderMarkdownAsHTML() { const { renderMarkdown } = useWebChatUIContext(); const [styleOptions] = useStyleOptions(); diff --git a/packages/component/src/hooks/useRenderToast.js b/packages/component/src/hooks/useRenderToast.js deleted file mode 100644 index c58aa2b571..0000000000 --- a/packages/component/src/hooks/useRenderToast.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useRenderToast() { - return useWebChatUIContext().toastRenderer; -} diff --git a/packages/component/src/hooks/useRenderTypingIndicator.js b/packages/component/src/hooks/useRenderTypingIndicator.js deleted file mode 100644 index a7fb615bce..0000000000 --- a/packages/component/src/hooks/useRenderTypingIndicator.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useRenderTypingIndicator() { - return useWebChatUIContext().typingIndicatorRenderer; -} diff --git a/packages/component/src/hooks/useSendBoxValue.js b/packages/component/src/hooks/useSendBoxValue.js deleted file mode 100644 index a0f7996155..0000000000 --- a/packages/component/src/hooks/useSendBoxValue.js +++ /dev/null @@ -1,6 +0,0 @@ -import { useSelector } from '../WebChatReduxContext'; -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useSendBoxValue() { - return [useSelector(({ sendBoxValue }) => sendBoxValue), useWebChatUIContext().setSendBox]; -} diff --git a/packages/component/src/hooks/useSendEvent.js b/packages/component/src/hooks/useSendEvent.js deleted file mode 100644 index 5b0cd5917c..0000000000 --- a/packages/component/src/hooks/useSendEvent.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useSendEvent() { - return useWebChatUIContext().sendEvent; -} diff --git a/packages/component/src/hooks/useSendFiles.js b/packages/component/src/hooks/useSendFiles.js index 989930f2d8..f369cde835 100644 --- a/packages/component/src/hooks/useSendFiles.js +++ b/packages/component/src/hooks/useSendFiles.js @@ -1,12 +1,11 @@ /* eslint no-magic-numbers: ["error", { "ignore": [0, 1024] }] */ +import { hooks } from 'botframework-webchat-api'; import { useCallback } from 'react'; -import downscaleImageToDataURL from '../Utils/downscaleImageToDataURL'; -import useStyleOptions from '../hooks/useStyleOptions'; -import useTrackEvent from '../hooks/useTrackEvent'; -import useTrackTiming from '../hooks/useTrackTiming'; -import useWebChatUIContext from './internal/useWebChatUIContext'; +import downscaleImageToDataURL from '../Utils/downscaleImageToDataURL/index'; + +const { useSendFiles: useAPISendFiles, useStyleOptions, useTrackTiming } = hooks; function canMakeThumbnail({ name }) { return /\.(gif|jpe?g|png)$/iu.test(name); @@ -21,7 +20,7 @@ async function makeThumbnail(file, width, height, contentType, quality) { } export default function useSendFiles() { - const { sendFiles } = useWebChatUIContext(); + const sendFiles = useAPISendFiles(); const [ { enableUploadThumbnail, @@ -31,7 +30,6 @@ export default function useSendFiles() { uploadThumbnailWidth } ] = useStyleOptions(); - const trackEvent = useTrackEvent(); const trackTiming = useTrackTiming(); return useCallback( @@ -46,7 +44,7 @@ export default function useSendFiles() { [].map.call(files, async file => { let thumbnail; - if (enableUploadThumbnail && canMakeThumbnail(file)) { + if (downscaleImageToDataURL && enableUploadThumbnail && canMakeThumbnail(file)) { thumbnail = await trackTiming( 'sendFiles:makeThumbnail', makeThumbnail( @@ -69,17 +67,11 @@ export default function useSendFiles() { ); sendFiles(attachments); - - trackEvent('sendFiles', { - numFiles: files.length, - sumSizeInKB: Math.round(files.reduce((total, { size }) => total + size, 0) / 1024) - }); } }, [ enableUploadThumbnail, sendFiles, - trackEvent, trackTiming, uploadThumbnailContentType, uploadThumbnailHeight, diff --git a/packages/component/src/hooks/useSendMessage.js b/packages/component/src/hooks/useSendMessage.js deleted file mode 100644 index 9fc76ce578..0000000000 --- a/packages/component/src/hooks/useSendMessage.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useSendMessage() { - return useWebChatUIContext().sendMessage; -} diff --git a/packages/component/src/hooks/useSendMessageBack.js b/packages/component/src/hooks/useSendMessageBack.js deleted file mode 100644 index cab2adf271..0000000000 --- a/packages/component/src/hooks/useSendMessageBack.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useSendMessageBack() { - return useWebChatUIContext().sendMessageBack; -} diff --git a/packages/component/src/hooks/useSendPostBack.js b/packages/component/src/hooks/useSendPostBack.js deleted file mode 100644 index 3c8ae82a3a..0000000000 --- a/packages/component/src/hooks/useSendPostBack.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useSendPostBack() { - return useWebChatUIContext().sendPostBack; -} diff --git a/packages/component/src/hooks/useSetNotification.js b/packages/component/src/hooks/useSetNotification.js deleted file mode 100644 index 5c98e252db..0000000000 --- a/packages/component/src/hooks/useSetNotification.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useSetNotification() { - return useWebChatUIContext().setNotification; -} diff --git a/packages/component/src/hooks/useStartDictate.js b/packages/component/src/hooks/useStartDictate.js deleted file mode 100644 index d239864cb9..0000000000 --- a/packages/component/src/hooks/useStartDictate.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useStartDictate() { - return useWebChatUIContext().startDictate; -} diff --git a/packages/component/src/hooks/useStopDictate.js b/packages/component/src/hooks/useStopDictate.js deleted file mode 100644 index 755c39bd43..0000000000 --- a/packages/component/src/hooks/useStopDictate.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useStopDictate() { - return useWebChatUIContext().stopDictate; -} diff --git a/packages/component/src/hooks/useStyleOptions.js b/packages/component/src/hooks/useStyleOptions.js deleted file mode 100644 index 7370332786..0000000000 --- a/packages/component/src/hooks/useStyleOptions.js +++ /dev/null @@ -1,8 +0,0 @@ -import useStyleSet from './useStyleSet'; - -export default function useStyleOptions() { - // Today, the "styleSet.options" is patched with missing values and "styleOptions" are unpatched. - // Thus, we are using the "styleSet.options" version for now. - - return [useStyleSet()[0].options]; -} diff --git a/packages/component/src/hooks/useTrackDimension.js b/packages/component/src/hooks/useTrackDimension.js deleted file mode 100644 index a5c0c1480f..0000000000 --- a/packages/component/src/hooks/useTrackDimension.js +++ /dev/null @@ -1,7 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useTrackDimension() { - const { trackDimension } = useWebChatUIContext(); - - return trackDimension; -} diff --git a/packages/component/src/hooks/useUserID.js b/packages/component/src/hooks/useUserID.js deleted file mode 100644 index b081469fc4..0000000000 --- a/packages/component/src/hooks/useUserID.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useUserID() { - return [useWebChatUIContext().userID]; -} diff --git a/packages/component/src/hooks/useUsername.js b/packages/component/src/hooks/useUsername.js deleted file mode 100644 index 80c67e277a..0000000000 --- a/packages/component/src/hooks/useUsername.js +++ /dev/null @@ -1,5 +0,0 @@ -import useWebChatUIContext from './internal/useWebChatUIContext'; - -export default function useUsername() { - return [useWebChatUIContext().username]; -} diff --git a/packages/component/src/index.tsx b/packages/component/src/index.tsx index 9679c797ad..36f4848890 100644 --- a/packages/component/src/index.tsx +++ b/packages/component/src/index.tsx @@ -7,7 +7,6 @@ import BasicWebChat from './BasicWebChat'; import Avatar from './Activity/Avatar'; import Bubble from './Activity/Bubble'; import ErrorBox from './ErrorBox'; -import Localize, { localize } from './Localization/Localize'; import SendStatus, { connectSendStatus } from './Middleware/ActivityStatus/SendStatus/SendStatus'; import SpeakActivity, { connectSpeakActivity } from './Activity/Speak'; import Timestamp from './Middleware/ActivityStatus/Timestamp'; @@ -28,9 +27,8 @@ import SendTextBox, { connectSendTextBox } from './SendBox/TextBox'; import SuggestedActions, { connectSuggestedActions } from './SendBox/SuggestedActions'; import UploadButton, { connectUploadButton } from './SendBox/UploadButton'; -import concatMiddleware from './Middleware/concatMiddleware'; import connectToWebChat from './connectToWebChat'; -import Context from './WebChatUIContext'; +import Context from './hooks/internal/WebChatUIContext'; import createCoreActivityMiddleware from './Middleware/Activity/createCoreMiddleware'; import createCoreActivityStatusMiddleware from './Middleware/ActivityStatus/createCoreMiddleware'; import createCoreAttachmentMiddleware from './Middleware/Attachment/createCoreMiddleware'; @@ -38,7 +36,13 @@ import createStyleSet from './Styles/createStyleSet'; import defaultStyleOptions from './Styles/defaultStyleOptions'; import getTabIndex from './Utils/TypeFocusSink/getTabIndex'; -import * as hooks from './hooks/index'; +import { concatMiddleware, hooks as apiHooks, Localize, localize } from 'botframework-webchat-api'; +import * as componentHooks from './hooks/index'; + +const hooks = { + ...apiHooks, + ...componentHooks +}; const version = process.env.npm_package_version; diff --git a/packages/core/src/sagas/postActivitySaga.js b/packages/core/src/sagas/postActivitySaga.js index 85f5ab172b..23f0d6e819 100644 --- a/packages/core/src/sagas/postActivitySaga.js +++ b/packages/core/src/sagas/postActivitySaga.js @@ -82,7 +82,7 @@ function* postActivity(directLine, userID, username, numActivitiesPosted, { meta // Quirks: We might receive INCOMING_ACTIVITY before the postActivity call completed // So, we setup expectation first, then postActivity afterward - const echoBackCall = call(function*() { + const echoBackCall = call(function* () { for (;;) { const { payload: { activity } @@ -114,6 +114,8 @@ function* postActivity(directLine, userID, username, numActivitiesPosted, { meta yield put({ type: POST_ACTIVITY_FULFILLED, meta, payload: { activity: echoBack } }); } catch (err) { + console.error('botframework-webchat: Failed to post activity to chat adapter.', err); + yield put({ type: POST_ACTIVITY_REJECTED, error: true, meta, payload: err }); } finally { if (yield cancelled()) { diff --git a/packages/directlinespeech/src/DirectLineSpeech.js b/packages/directlinespeech/src/DirectLineSpeech.js index 0b2603cdb4..5560304937 100644 --- a/packages/directlinespeech/src/DirectLineSpeech.js +++ b/packages/directlinespeech/src/DirectLineSpeech.js @@ -84,7 +84,9 @@ export default class DirectLineSpeech { // Do not send the activity if it was from speech. if (!isSpeech) { - this.dialogServiceConnector.sendActivityAsync(activity); + // Starting from Speech SDK 1.13.0, they accept JSON text instead of JavaScript object. + // https://github.com/microsoft/cognitive-services-speech-sdk-js/commit/2f3a35446692b6d492a6c68e3237a48de67e293f + this.dialogServiceConnector.sendActivityAsync(JSON.stringify(activity)); } this._activityObserver &&