From 1e14526759e599e1dfb687d092695717def17aba Mon Sep 17 00:00:00 2001 From: mcallegari10 Date: Sun, 5 Apr 2020 20:09:22 -0300 Subject: [PATCH 1/6] - Add messages deletion - Add onTextInputChange new prop - Fix addLinkSnippet typing issue --- dev/App.tsx | 3 +- package-lock.json | 999 ++++++++++-------- .../Conversation/components/Header/style.scss | 2 +- .../Messages/components/Loader/styles.scss | 2 +- .../Messages/components/Message/styles.scss | 2 +- .../Messages/components/Snippet/styles.scss | 4 +- .../components/Messages/index.tsx | 5 +- .../components/Messages/styles.scss | 4 +- .../components/QuickButton/styles.scss | 2 +- .../components/QuickButtons/style.scss | 2 +- .../Conversation/components/Sender/index.tsx | 4 +- .../Conversation/components/Sender/style.scss | 2 +- .../Widget/components/Conversation/index.tsx | 5 +- .../Widget/components/Conversation/style.scss | 6 +- .../Launcher/components/Badge/style.scss | 3 +- .../Widget/components/Launcher/style.scss | 6 +- src/components/Widget/index.tsx | 5 +- src/components/Widget/layout.tsx | 5 +- src/components/Widget/style.scss | 9 +- src/index.tsx | 5 +- src/scss/{animation.scss => _animation.scss} | 6 +- src/scss/{common.scss => _common.scss} | 3 + .../_colors.scss} | 0 src/scss/variables/_sizes.scss | 1 + src/store/actions/index.ts | 52 +- src/store/actions/types.ts | 39 +- src/store/dispatcher.ts | 21 +- src/store/reducers/messagesReducer.ts | 10 +- src/store/types.ts | 7 + src/utils/messages.ts | 17 +- 30 files changed, 676 insertions(+), 555 deletions(-) rename src/scss/{animation.scss => _animation.scss} (80%) rename src/scss/{common.scss => _common.scss} (95%) rename src/scss/{variables.scss => variables/_colors.scss} (100%) create mode 100644 src/scss/variables/_sizes.scss diff --git a/dev/App.tsx b/dev/App.tsx index 7b33fdb9e..e4296bf17 100644 --- a/dev/App.tsx +++ b/dev/App.tsx @@ -1,10 +1,11 @@ import React, { Component } from 'react'; -import { Widget, addResponseMessage, setQuickButtons, toggleMsgLoader } from '../index'; +import { Widget, addResponseMessage, setQuickButtons, toggleMsgLoader, addLinkSnippet } from '../index'; export default class App extends Component { componentDidMount() { addResponseMessage('Welcome to this awesome chat!'); + addLinkSnippet({ link: 'https://google.com', title: 'Google' }); } handleNewUserMessage = (newMessage: any) => { diff --git a/package-lock.json b/package-lock.json index 3e4ad62f4..7d5baf3af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-chat-widget", - "version": "2.1.5", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1224,14 +1224,14 @@ "dev": true }, "@jest/console": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.3.tgz", - "integrity": "sha512-k+37B1aSvOt9tKHWbZZSOy1jdgzesB0bj96igCVUG1nAH1W5EoUfgc5EXbBVU08KSLvkVdWopLXaO3xfVGlxtQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.6.tgz", + "integrity": "sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==", "dev": true, "requires": { - "@jest/source-map": "^25.2.1", + "@jest/source-map": "^25.2.6", "chalk": "^3.0.0", - "jest-util": "^25.2.3", + "jest-util": "^25.2.6", "slash": "^3.0.0" }, "dependencies": { @@ -1294,33 +1294,33 @@ } }, "@jest/core": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.4.tgz", - "integrity": "sha512-WcWYShl0Bqfcb32oXtjwbiR78D/djhMdJW+ulp4/bmHgeODcsieqUJfUH+kEv8M7VNV77E6jds5aA+WuGh1nmg==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.7.tgz", + "integrity": "sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==", "dev": true, "requires": { - "@jest/console": "^25.2.3", - "@jest/reporters": "^25.2.4", - "@jest/test-result": "^25.2.4", - "@jest/transform": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/console": "^25.2.6", + "@jest/reporters": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.2.3", - "jest-config": "^25.2.4", - "jest-haste-map": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-regex-util": "^25.2.1", - "jest-resolve": "^25.2.3", - "jest-resolve-dependencies": "^25.2.4", - "jest-runner": "^25.2.4", - "jest-runtime": "^25.2.4", - "jest-snapshot": "^25.2.4", - "jest-util": "^25.2.3", - "jest-validate": "^25.2.3", - "jest-watcher": "^25.2.4", + "jest-changed-files": "^25.2.6", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-resolve-dependencies": "^25.2.7", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "jest-watcher": "^25.2.7", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "realpath-native": "^2.0.0", @@ -1449,40 +1449,40 @@ } }, "@jest/environment": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.4.tgz", - "integrity": "sha512-wA4xlhD19/gukkDpJ5HQsTle0pgnzI5qMFEjw267lpTDC8d9N7Ihqr5pI+l0p8Qn1SQhai+glSqxrGdzKy4jxw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.6.tgz", + "integrity": "sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==", "dev": true, "requires": { - "@jest/fake-timers": "^25.2.4", - "@jest/types": "^25.2.3", - "jest-mock": "^25.2.3" + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6" } }, "@jest/fake-timers": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.4.tgz", - "integrity": "sha512-oC1TJiwfMcBttVN7Wz+VZnqEAgYTiEMu0QLOXpypR89nab0uCB31zm/QeBZddhSstn20qe3yqOXygp6OwvKT/Q==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.6.tgz", + "integrity": "sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==", "dev": true, "requires": { - "@jest/types": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-mock": "^25.2.3", - "jest-util": "^25.2.3", + "@jest/types": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", "lolex": "^5.0.0" } }, "@jest/reporters": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.4.tgz", - "integrity": "sha512-VHbLxM03jCc+bTLOluW/IqHR2G0Cl0iATwIQbuZtIUast8IXO4fD0oy4jpVGpG5b20S6REA8U3BaQoCW/CeVNQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.6.tgz", + "integrity": "sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.2.3", - "@jest/test-result": "^25.2.4", - "@jest/transform": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/console": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -1492,10 +1492,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.2.3", - "jest-resolve": "^25.2.3", - "jest-util": "^25.2.3", - "jest-worker": "^25.2.1", + "jest-haste-map": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", @@ -1596,9 +1596,9 @@ } }, "@jest/source-map": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.1.tgz", - "integrity": "sha512-PgScGJm1U27+9Te/cxP4oUFqJ2PX6NhBL2a6unQ7yafCgs8k02c0LSyjSIx/ao0AwcAdCczfAPDf5lJ7zoB/7A==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", + "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -1615,46 +1615,45 @@ } }, "@jest/test-result": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.4.tgz", - "integrity": "sha512-AI7eUy+q2lVhFnaibDFg68NGkrxVWZdD6KBr9Hm6EvN0oAe7GxpEwEavgPfNHQjU2mi6g+NsFn/6QPgTUwM1qg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.6.tgz", + "integrity": "sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==", "dev": true, "requires": { - "@jest/console": "^25.2.3", - "@jest/transform": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/console": "^25.2.6", + "@jest/types": "^25.2.6", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.4.tgz", - "integrity": "sha512-TEZm/Rkd6YgskdpTJdYLBtu6Gc11tfWPuSpatq0duH77ekjU8dpqX2zkPdY/ayuHxztV5LTJoV5BLtI9mZfXew==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz", + "integrity": "sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==", "dev": true, "requires": { - "@jest/test-result": "^25.2.4", - "jest-haste-map": "^25.2.3", - "jest-runner": "^25.2.4", - "jest-runtime": "^25.2.4" + "@jest/test-result": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7" } }, "@jest/transform": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.4.tgz", - "integrity": "sha512-6eRigvb+G6bs4kW5j1/y8wu4nCrmVuIe0epPBbiWaYlwawJ8yi1EIyK3d/btDqmBpN5GpN4YhR6iPPnDmkYdTA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.6.tgz", + "integrity": "sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.2.3", - "jest-regex-util": "^25.2.1", - "jest-util": "^25.2.3", + "jest-haste-map": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.2.6", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", @@ -1822,9 +1821,9 @@ } }, "@jest/types": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.3.tgz", - "integrity": "sha512-6oLQwO9mKif3Uph3RX5J1i3S7X7xtDHWBaaaoeKw8hOzV6YUd0qDcYcHZ6QXMHDIzSr7zzrEa51o2Ovlj6AtKQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", + "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -1895,9 +1894,9 @@ } }, "@types/babel__core": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", - "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -2019,13 +2018,13 @@ } }, "@types/jest": { - "version": "25.1.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.4.tgz", - "integrity": "sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw==", + "version": "25.1.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.5.tgz", + "integrity": "sha512-FBmb9YZHoEOH56Xo/PIYtfuyTL0IzJLM3Hy0Sqc82nn5eqqXgefKcl/eMgChM8eSGVfoDee8cdlj7K74T8a6Yg==", "dev": true, "requires": { - "jest-diff": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-diff": "25.1.0", + "pretty-format": "25.1.0" } }, "@types/json-schema": { @@ -2041,9 +2040,9 @@ "dev": true }, "@types/node": { - "version": "13.9.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.8.tgz", - "integrity": "sha512-1WgO8hsyHynlx7nhP1kr0OFzsgKz5XDQL+Lfc3b1Q3qIln/n8cKD4m09NJ0+P1Rq7Zgnc7N0+SsMnoD1rEb0kA==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", + "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", "dev": true }, "@types/parse-json": { @@ -2065,9 +2064,9 @@ "dev": true }, "@types/react": { - "version": "16.9.30", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.30.tgz", - "integrity": "sha512-nx+ixghmJkzcDYhtqvmf/jPcBvyH87yfLM+dUDH2n8lE356t18p2flj3mzkT/VO0N1wh6RCjtmWGFI3r/KhCxw==", + "version": "16.9.32", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.32.tgz", + "integrity": "sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ==", "dev": true, "requires": { "@types/prop-types": "*", @@ -2075,9 +2074,9 @@ } }, "@types/react-dom": { - "version": "16.9.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz", - "integrity": "sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==", + "version": "16.9.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.6.tgz", + "integrity": "sha512-S6ihtlPMDotrlCJE9ST1fRmYrQNNwfgL61UB4I1W7M6kPulUKx9fXAleW5zpdIjUQ4fTaaog8uERezjsGUj9HQ==", "dev": true, "requires": { "@types/react": "*" @@ -4608,9 +4607,9 @@ "dev": true }, "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "collection-visit": { @@ -5498,9 +5497,9 @@ "dev": true }, "diff-sequences": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.1.tgz", - "integrity": "sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true }, "diffie-hellman": { @@ -5648,9 +5647,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.391", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.391.tgz", - "integrity": "sha512-WOi6loSnDmfICOqGRrgeK7bZeWDAbGjCptDhI5eyJAqSzWfoeRuOOU1rOTZRL29/9AaxTndZB6Uh8YrxRfZJqw==", + "version": "1.3.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz", + "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw==", "dev": true }, "elliptic": { @@ -6177,16 +6176,16 @@ } }, "eslint-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", - "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.4.tgz", + "integrity": "sha512-I496aBd+Hi23Y0Cx+sKvw+VwlJre4ScIRlkrvTO6Scq68X/UXbN6F3lAhN8b0Zv8atAyprkyrA42K5QBJtCyaw==", "dev": true, "requires": { "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", + "loader-fs-cache": "^1.0.3", "loader-utils": "^1.2.3", - "object-hash": "^2.0.1", - "schema-utils": "^2.6.1" + "object-hash": "^2.0.3", + "schema-utils": "^2.6.5" } }, "eslint-module-utils": { @@ -6618,17 +6617,17 @@ } }, "expect": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.4.tgz", - "integrity": "sha512-hfuPhPds4yOsZtIw4kwAg70r0hqGmpqekgA+VX7pf/3wZ6FY+xIOXZhNsPMMMsspYG/YIsbAiwqsdnD4Ht+bCA==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.7.tgz", + "integrity": "sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "ansi-styles": "^4.0.0", - "jest-get-type": "^25.2.1", - "jest-matcher-utils": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-regex-util": "^25.2.1" + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6" }, "dependencies": { "ansi-styles": { @@ -7232,29 +7231,25 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "bundled": true, "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "bundled": true, "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7264,15 +7259,13 @@ }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "bundled": true, "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7282,43 +7275,37 @@ }, "chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "bundled": true, "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "bundled": true, "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "bundled": true, "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "bundled": true, "dev": true, "optional": true }, "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=", + "bundled": true, "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7327,29 +7314,25 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "bundled": true, "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bundled": true, "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7358,15 +7341,13 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7382,8 +7363,7 @@ }, "glob": { "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7397,15 +7377,13 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7414,8 +7392,7 @@ }, "ignore-walk": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7424,8 +7401,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7435,22 +7411,19 @@ }, "inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "bundled": true, "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "bundled": true, "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7459,15 +7432,13 @@ }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7476,15 +7447,13 @@ }, "minimist": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "bundled": true, "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7494,8 +7463,7 @@ }, "minizlib": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7504,8 +7472,7 @@ }, "mkdirp": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7514,15 +7481,13 @@ }, "ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "bundled": true, "dev": true, "optional": true }, "needle": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", - "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7533,8 +7498,7 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7552,8 +7516,7 @@ }, "nopt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7563,8 +7526,7 @@ }, "npm-bundled": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7573,15 +7535,13 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "bundled": true, "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7592,8 +7552,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7605,22 +7564,19 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "bundled": true, "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7629,22 +7585,19 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7654,22 +7607,19 @@ }, "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=", + "bundled": true, "dev": true, "optional": true }, "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==", + "bundled": true, "dev": true, "optional": true }, "rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7681,8 +7631,7 @@ }, "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==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7697,8 +7646,7 @@ }, "rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7707,50 +7655,43 @@ }, "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==", + "bundled": true, "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "bundled": true, "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "bundled": true, "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bundled": true, "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7761,8 +7702,7 @@ }, "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==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7771,8 +7711,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7781,15 +7720,13 @@ }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "bundled": true, "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7804,15 +7741,13 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -7821,15 +7756,13 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "bundled": true, "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "bundled": true, "dev": true, "optional": true } @@ -9508,9 +9441,9 @@ } }, "istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -9518,14 +9451,14 @@ } }, "jest": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.4.tgz", - "integrity": "sha512-Lu4LXxf4+durzN/IFilcAoQSisOwgHIXgl9vffopePpSSwFqfj1Pj4y+k3nL8oTbnvjxgDIsEcepy6he4bWqnQ==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.7.tgz", + "integrity": "sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==", "dev": true, "requires": { - "@jest/core": "^25.2.4", + "@jest/core": "^25.2.7", "import-local": "^3.0.2", - "jest-cli": "^25.2.4" + "jest-cli": "^25.2.7" }, "dependencies": { "ansi-styles": { @@ -9570,21 +9503,21 @@ "dev": true }, "jest-cli": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.4.tgz", - "integrity": "sha512-zeY2pRDWKj2LZudIncvvguwLMEdcnJqc2jJbwza1beqi80qqLvkPF/BjbFkK2sIV3r+mfTJS+7ITrvK6pCdRjg==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.7.tgz", + "integrity": "sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==", "dev": true, "requires": { - "@jest/core": "^25.2.4", - "@jest/test-result": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/core": "^25.2.7", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "exit": "^0.1.2", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.2.4", - "jest-util": "^25.2.3", - "jest-validate": "^25.2.3", + "jest-config": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", "prompts": "^2.0.1", "realpath-native": "^2.0.0", "yargs": "^15.3.1" @@ -9602,12 +9535,12 @@ } }, "jest-changed-files": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.3.tgz", - "integrity": "sha512-EFxy94dvvbqRB36ezIPLKJ4fDIC+jAdNs8i8uTwFpaXd6H3LVc3ova1lNS4ZPWk09OCR2vq5kSdSQgar7zMORg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.6.tgz", + "integrity": "sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "execa": "^3.2.0", "throat": "^5.0.0" }, @@ -9704,28 +9637,28 @@ } }, "jest-config": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.4.tgz", - "integrity": "sha512-fxy3nIpwJqOUQJRVF/q+pNQb6dv5b9YufOeCbpPZJ/md1zXpiupbhfehpfODhnKOfqbzSiigtSLzlWWmbRxnqQ==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.7.tgz", + "integrity": "sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.2.4", - "@jest/types": "^25.2.3", - "babel-jest": "^25.2.4", + "@jest/test-sequencer": "^25.2.7", + "@jest/types": "^25.2.6", + "babel-jest": "^25.2.6", "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.2.4", - "jest-environment-node": "^25.2.4", - "jest-get-type": "^25.2.1", - "jest-jasmine2": "^25.2.4", - "jest-regex-util": "^25.2.1", - "jest-resolve": "^25.2.3", - "jest-util": "^25.2.3", - "jest-validate": "^25.2.3", + "jest-environment-jsdom": "^25.2.6", + "jest-environment-node": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", "micromatch": "^4.0.2", - "pretty-format": "^25.2.3", + "pretty-format": "^25.2.6", "realpath-native": "^2.0.0" }, "dependencies": { @@ -9740,16 +9673,16 @@ } }, "babel-jest": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.4.tgz", - "integrity": "sha512-+yDzlyJVWrqih9i2Cvjpt7COaN8vUwCsKGtxJLzg6I0xhxD54K8mvDUCliPKLufyzHh/c5C4MRj4Vk7VMjOjIg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.6.tgz", + "integrity": "sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==", "dev": true, "requires": { - "@jest/transform": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.2.1", + "babel-preset-jest": "^25.2.6", "chalk": "^3.0.0", "slash": "^3.0.0" } @@ -9768,23 +9701,23 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.1.tgz", - "integrity": "sha512-HysbCQfJhxLlyxDbKcB2ucGYV0LjqK4h6dBoI3RtFuOxTiTWK6XGZMsHb0tGh8iJdV4hC6Z2GCHzVvDeh9i0lQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", + "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz", - "integrity": "sha512-zXHJBM5iR8oEO4cvdF83AQqqJf3tJrXy3x8nfu2Nlqvn4cneg4Ca8M7cQvC5S9BzDDy1O0tZ9iXru9J6E3ym+A==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz", + "integrity": "sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==", "dev": true, "requires": { "@babel/plugin-syntax-bigint": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.2.1" + "babel-plugin-jest-hoist": "^25.2.6" } }, "braces": { @@ -9873,6 +9806,18 @@ "picomatch": "^2.0.5" } }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -9917,15 +9862,15 @@ } }, "jest-diff": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.3.tgz", - "integrity": "sha512-VtZ6LAQtaQpFsmEzps15dQc5ELbJxy4L2DOSo2Ev411TUEtnJPkAMD7JneVypeMJQ1y3hgxN9Ao13n15FAnavg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", "dev": true, "requires": { "chalk": "^3.0.0", - "diff-sequences": "^25.2.1", - "jest-get-type": "^25.2.1", - "pretty-format": "^25.2.3" + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" }, "dependencies": { "ansi-styles": { @@ -9987,16 +9932,16 @@ "dev": true }, "jest-each": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.3.tgz", - "integrity": "sha512-RTlmCjsBDK2c9T5oO4MqccA3/5Y8BUtiEy7OOQik1iyCgdnNdHbI0pNEpyapZPBG0nlvZ4mIu7aY6zNUvLraAQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.6.tgz", + "integrity": "sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", - "jest-get-type": "^25.2.1", - "jest-util": "^25.2.3", - "pretty-format": "^25.2.3" + "jest-get-type": "^25.2.6", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6" }, "dependencies": { "ansi-styles": { @@ -10040,6 +9985,18 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -10052,30 +10009,30 @@ } }, "jest-environment-jsdom": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.4.tgz", - "integrity": "sha512-5dm+tNwrLmhELdjAwiQnVGf/U9iFMWdTL4/wyrMg2HU6RQnCiuxpWbIigLHUhuP1P2Ak0F4k3xhjrikboKyShA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz", + "integrity": "sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==", "dev": true, "requires": { - "@jest/environment": "^25.2.4", - "@jest/fake-timers": "^25.2.4", - "@jest/types": "^25.2.3", - "jest-mock": "^25.2.3", - "jest-util": "^25.2.3", + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.4.tgz", - "integrity": "sha512-Jkc5Y8goyXPrLRHnrUlqC7P4o5zn2m4zw6qWoRJ59kxV1f2a5wK+TTGhrhCwnhW/Ckpdl/pm+LufdvhJkvJbiw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.6.tgz", + "integrity": "sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==", "dev": true, "requires": { - "@jest/environment": "^25.2.4", - "@jest/fake-timers": "^25.2.4", - "@jest/types": "^25.2.3", - "jest-mock": "^25.2.3", - "jest-util": "^25.2.3", + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", "semver": "^6.3.0" }, "dependencies": { @@ -10088,25 +10045,25 @@ } }, "jest-get-type": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.1.tgz", - "integrity": "sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true }, "jest-haste-map": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.3.tgz", - "integrity": "sha512-pAP22OHtPr4qgZlJJFks2LLgoQUr4XtM1a+F5UaPIZNiCRnePA0hM3L7aiJ0gzwiNIYwMTfKRwG/S1L28J3A3A==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.6.tgz", + "integrity": "sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.1", - "jest-util": "^25.2.3", - "jest-worker": "^25.2.1", + "jest-serializer": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", @@ -10185,27 +10142,27 @@ } }, "jest-jasmine2": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.4.tgz", - "integrity": "sha512-juoKrmNmLwaheNbAg71SuUF9ovwUZCFNTpKVhvCXWk+SSeORcIUMptKdPCoLXV3D16htzhTSKmNxnxSk4SrTjA==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz", + "integrity": "sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.2.4", - "@jest/source-map": "^25.2.1", - "@jest/test-result": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.2.4", + "expect": "^25.2.7", "is-generator-fn": "^2.0.0", - "jest-each": "^25.2.3", - "jest-matcher-utils": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-runtime": "^25.2.4", - "jest-snapshot": "^25.2.4", - "jest-util": "^25.2.3", - "pretty-format": "^25.2.3", + "jest-each": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6", "throat": "^5.0.0" }, "dependencies": { @@ -10250,6 +10207,18 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -10262,25 +10231,64 @@ } }, "jest-leak-detector": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.3.tgz", - "integrity": "sha512-yblCMPE7NJKl7778Cf/73yyFWAas5St0iiEBwq7RDyaz6Xd4WPFnPz2j7yDb/Qce71A1IbDoLADlcwD8zT74Aw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz", + "integrity": "sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==", "dev": true, "requires": { - "jest-get-type": "^25.2.1", - "pretty-format": "^25.2.3" + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } } }, "jest-matcher-utils": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.3.tgz", - "integrity": "sha512-ZmiXiwQRVM9MoKjGMP5YsGGk2Th5ncyRxfXKz5AKsmU8m43kgNZirckVzaP61MlSa9LKmXbevdYqVp1ZKAw2Rw==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz", + "integrity": "sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.2.3", - "jest-get-type": "^25.2.1", - "pretty-format": "^25.2.3" + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" }, "dependencies": { "ansi-styles": { @@ -10324,6 +10332,30 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "jest-diff": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", + "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + } + }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -10336,14 +10368,13 @@ } }, "jest-message-util": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.4.tgz", - "integrity": "sha512-9wWMH3Bf+GVTv0GcQLmH/FRr0x0toptKw9TA8U5YFLVXx7Tq9pvcNzTyJrcTJ+wLqNbMPPJlJNft4MnlcrtF5Q==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.6.tgz", + "integrity": "sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", "micromatch": "^4.0.2", @@ -10453,12 +10484,12 @@ } }, "jest-mock": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.3.tgz", - "integrity": "sha512-xlf+pyY0j47zoCs8zGGOGfWyxxLximE8YFOfEK8s4FruR8DtM/UjNj61um+iDuMAFEBDe1bhCXkqiKoCmWjJzg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.6.tgz", + "integrity": "sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==", "dev": true, "requires": { - "@jest/types": "^25.2.3" + "@jest/types": "^25.2.6" } }, "jest-pnp-resolver": { @@ -10468,18 +10499,18 @@ "dev": true }, "jest-regex-util": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.1.tgz", - "integrity": "sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, "jest-resolve": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.3.tgz", - "integrity": "sha512-1vZMsvM/DBH258PnpUNSXIgtzpYz+vCVCj9+fcy4akZl4oKbD+9hZSlfe9RIDpU0Fc28ozHQrmwX3EqFRRIHGg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.6.tgz", + "integrity": "sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", @@ -10540,39 +10571,39 @@ } }, "jest-resolve-dependencies": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.4.tgz", - "integrity": "sha512-qhUnK4PfNHzNdca7Ub1mbAqE0j5WNyMTwxBZZJjQlUrdqsiYho/QGK65FuBkZuSoYtKIIqriR9TpGrPEc3P5Gg==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz", + "integrity": "sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==", "dev": true, "requires": { - "@jest/types": "^25.2.3", - "jest-regex-util": "^25.2.1", - "jest-snapshot": "^25.2.4" + "@jest/types": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.2.7" } }, "jest-runner": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.4.tgz", - "integrity": "sha512-5xaIfqqxck9Wg2CV4b9KmJtf/sWO7zWQx7O+34GCLGPzoPcVmB3mZtdrQI1/jS3Reqjru9ycLjgLHSf6XoxRqA==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.7.tgz", + "integrity": "sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==", "dev": true, "requires": { - "@jest/console": "^25.2.3", - "@jest/environment": "^25.2.4", - "@jest/test-result": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-config": "^25.2.4", - "jest-docblock": "^25.2.3", - "jest-haste-map": "^25.2.3", - "jest-jasmine2": "^25.2.4", - "jest-leak-detector": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-resolve": "^25.2.3", - "jest-runtime": "^25.2.4", - "jest-util": "^25.2.3", - "jest-worker": "^25.2.1", + "jest-config": "^25.2.7", + "jest-docblock": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-leak-detector": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, @@ -10619,9 +10650,9 @@ "dev": true }, "jest-docblock": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.3.tgz", - "integrity": "sha512-d3/tmjLLrH5fpRGmIm3oFa3vOaD/IjPxtXVOrfujpfJ9y1tCDB1x/tvunmdOVAyF03/xeMwburl6ITbiQT1mVA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.6.tgz", + "integrity": "sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==", "dev": true, "requires": { "detect-newline": "^3.0.0" @@ -10655,32 +10686,32 @@ } }, "jest-runtime": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.4.tgz", - "integrity": "sha512-6ehOUizgIghN+aV5YSrDzTZ+zJ9omgEjJbTHj3Jqes5D52XHfhzT7cSfdREwkNjRytrR7mNwZ7pRauoyNLyJ8Q==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.7.tgz", + "integrity": "sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==", "dev": true, "requires": { - "@jest/console": "^25.2.3", - "@jest/environment": "^25.2.4", - "@jest/source-map": "^25.2.1", - "@jest/test-result": "^25.2.4", - "@jest/transform": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.3", - "jest-config": "^25.2.4", - "jest-haste-map": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-mock": "^25.2.3", - "jest-regex-util": "^25.2.1", - "jest-resolve": "^25.2.3", - "jest-snapshot": "^25.2.4", - "jest-util": "^25.2.3", - "jest-validate": "^25.2.3", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", @@ -10752,30 +10783,30 @@ } }, "jest-serializer": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.1.tgz", - "integrity": "sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", "dev": true }, "jest-snapshot": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.4.tgz", - "integrity": "sha512-nIwpW7FZCq5p0AE3Oyqyb6jL0ENJixXzJ5/CD/XRuOqp3gS5OM3O/k+NnTrniCXxPFV4ry6s9HNfiPQBi0wcoA==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.7.tgz", + "integrity": "sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.2.4", - "jest-diff": "^25.2.3", - "jest-get-type": "^25.2.1", - "jest-matcher-utils": "^25.2.3", - "jest-message-util": "^25.2.4", - "jest-resolve": "^25.2.3", + "expect": "^25.2.7", + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.2.3", + "pretty-format": "^25.2.6", "semver": "^6.3.0" }, "dependencies": { @@ -10820,6 +10851,18 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "jest-diff": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", + "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" + } + }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -10829,6 +10872,18 @@ "semver": "^6.0.0" } }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -10847,12 +10902,12 @@ } }, "jest-util": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.3.tgz", - "integrity": "sha512-7tWiMICVSo9lNoObFtqLt9Ezt5exdFlWs5fLe1G4XLY2lEbZc814cw9t4YHScqBkWMfzth8ASHKlYBxiX2rdCw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.6.tgz", + "integrity": "sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "is-ci": "^2.0.0", "make-dir": "^3.0.0" @@ -10926,17 +10981,17 @@ } }, "jest-validate": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.3.tgz", - "integrity": "sha512-GObn91jzU0B0Bv4cusAwjP6vnWy78hJUM8MOSz7keRfnac/ZhQWIsUjvk01IfeXNTemCwgR57EtdjQMzFZGREg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.6.tgz", + "integrity": "sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.2.6", "camelcase": "^5.3.1", "chalk": "^3.0.0", - "jest-get-type": "^25.2.1", + "jest-get-type": "^25.2.6", "leven": "^3.1.0", - "pretty-format": "^25.2.3" + "pretty-format": "^25.2.6" }, "dependencies": { "ansi-styles": { @@ -10980,6 +11035,18 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "pretty-format": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", + "dev": true, + "requires": { + "@jest/types": "^25.2.6", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -10992,16 +11059,16 @@ } }, "jest-watcher": { - "version": "25.2.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.4.tgz", - "integrity": "sha512-p7g7s3zqcy69slVzQYcphyzkB2FBmJwMbv6k6KjI5mqd6KnUnQPfQVKuVj2l+34EeuxnbXqnrjtUFmxhcL87rg==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.7.tgz", + "integrity": "sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==", "dev": true, "requires": { - "@jest/test-result": "^25.2.4", - "@jest/types": "^25.2.3", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.2.3", + "jest-util": "^25.2.6", "string-length": "^3.1.0" }, "dependencies": { @@ -11058,9 +11125,9 @@ } }, "jest-worker": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.1.tgz", - "integrity": "sha512-IHnpekk8H/hCUbBlfeaPZzU6v75bqwJp3n4dUrQuQOAgOneI4tx3jV2o8pvlXnDfcRsfkFIUD//HWXpCmR+evQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -11930,9 +11997,9 @@ } }, "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -15327,12 +15394,12 @@ } }, "pretty-format": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.3.tgz", - "integrity": "sha512-IP4+5UOAVGoyqC/DiomOeHBUKN6q00gfyT2qpAsRH64tgOKB2yF7FHJXC18OCiU0/YFierACup/zdCOWw0F/0w==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", "dev": true, "requires": { - "@jest/types": "^25.2.3", + "@jest/types": "^25.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -16285,9 +16352,9 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { "tslib": "^1.9.0" diff --git a/src/components/Widget/components/Conversation/components/Header/style.scss b/src/components/Widget/components/Conversation/components/Header/style.scss index ddd0b5c8a..9688c89fd 100644 --- a/src/components/Widget/components/Conversation/components/Header/style.scss +++ b/src/components/Widget/components/Conversation/components/Header/style.scss @@ -1,4 +1,4 @@ -@import 'variables'; +@import 'variables/colors'; @import 'common'; .rcw-conversation-container { diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Loader/styles.scss b/src/components/Widget/components/Conversation/components/Messages/components/Loader/styles.scss index eecb2c6ea..49c6eee5a 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Loader/styles.scss +++ b/src/components/Widget/components/Conversation/components/Messages/components/Loader/styles.scss @@ -1,4 +1,4 @@ -@import 'variables.scss'; +@import 'variables/colors'; .loader { margin: 10px; diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss b/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss index 6fa6262ab..9fdfa7ef6 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss +++ b/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss @@ -1,4 +1,4 @@ -@import 'variables'; +@import 'variables/colors'; @import 'common'; .rcw-message { diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Snippet/styles.scss b/src/components/Widget/components/Conversation/components/Messages/components/Snippet/styles.scss index b0e456d4f..77b9f8678 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Snippet/styles.scss +++ b/src/components/Widget/components/Conversation/components/Messages/components/Snippet/styles.scss @@ -1,5 +1,5 @@ -@import 'variables.scss'; -@import 'common.scss'; +@import 'variables/colors'; +@import 'common'; .rcw-snippet { @include message-bubble($grey-2); diff --git a/src/components/Widget/components/Conversation/components/Messages/index.tsx b/src/components/Widget/components/Conversation/components/Messages/index.tsx index d0ca56590..1235403b0 100644 --- a/src/components/Widget/components/Conversation/components/Messages/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/index.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useRef } from 'react'; import { useSelector, useDispatch } from 'react-redux'; +import { format } from 'date-fns'; import { scrollToBottom } from '../../../../../../utils/messages'; import { Message, Link, CustomCompMessage, GlobalState } from '../../../../../../store/types'; @@ -37,8 +38,8 @@ function Messages({ profileAvatar }: Props) { return (
- {messages?.map(message => -
+ {messages?.map((message, index) => +
{profileAvatar && message.showAvatar && profile diff --git a/src/components/Widget/components/Conversation/components/Messages/styles.scss b/src/components/Widget/components/Conversation/components/Messages/styles.scss index 2c54eaae0..da6eb3c60 100644 --- a/src/components/Widget/components/Conversation/components/Messages/styles.scss +++ b/src/components/Widget/components/Conversation/components/Messages/styles.scss @@ -1,5 +1,5 @@ -@import 'variables.scss'; -@import 'common.scss'; +@import 'variables/colors'; +@import 'common'; .rcw-messages-container { background-color: $white; diff --git a/src/components/Widget/components/Conversation/components/QuickButtons/components/QuickButton/styles.scss b/src/components/Widget/components/Conversation/components/QuickButtons/components/QuickButton/styles.scss index 7daef299d..22773f220 100644 --- a/src/components/Widget/components/Conversation/components/QuickButtons/components/QuickButton/styles.scss +++ b/src/components/Widget/components/Conversation/components/QuickButtons/components/QuickButton/styles.scss @@ -1,4 +1,4 @@ -@import "variables.scss"; +@import 'variables/colors'; .quick-button { background: none; diff --git a/src/components/Widget/components/Conversation/components/QuickButtons/style.scss b/src/components/Widget/components/Conversation/components/QuickButtons/style.scss index 44f97b1a6..aee4efd48 100644 --- a/src/components/Widget/components/Conversation/components/QuickButtons/style.scss +++ b/src/components/Widget/components/Conversation/components/QuickButtons/style.scss @@ -1,4 +1,4 @@ -@import "variables.scss"; +@import 'variables/colors'; .quick-buttons-container { background: $white; diff --git a/src/components/Widget/components/Conversation/components/Sender/index.tsx b/src/components/Widget/components/Conversation/components/Sender/index.tsx index 7e0650813..dd42ac6cf 100644 --- a/src/components/Widget/components/Conversation/components/Sender/index.tsx +++ b/src/components/Widget/components/Conversation/components/Sender/index.tsx @@ -12,9 +12,10 @@ type Props = { disabledInput: boolean; autofocus: boolean; sendMessage: () => void; + onTextInputChange?: (event: any) => void; } -function Sender({ sendMessage, placeholder, disabledInput, autofocus }: Props) { +function Sender({ sendMessage, placeholder, disabledInput, autofocus, onTextInputChange }: Props) { const showChat = useSelector((state: GlobalState) => state.behavior.showChat); const inputRef = useRef(null); @@ -32,6 +33,7 @@ function Sender({ sendMessage, placeholder, disabledInput, autofocus }: Props) { disabled={disabledInput} autoFocus={autofocus} autoComplete="off" + onChange={onTextInputChange} />
); diff --git a/src/index.tsx b/src/index.tsx index 46725ba1b..353fe6fa6 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React from 'react'; import { Provider } from 'react-redux'; import Widget from './components/Widget'; diff --git a/src/store/actions/index.ts b/src/store/actions/index.ts index 8ad945676..deb15f88a 100644 --- a/src/store/actions/index.ts +++ b/src/store/actions/index.ts @@ -82,3 +82,16 @@ export function deleteMessages(count: number, id?: string): actionsTypes.Message id } } + +export function setBadgeCount(count: number): actionsTypes.SetBadgeCount { + return { + type: actionsTypes.SET_BADGE_COUNT, + count + } +} + +export function markAllMessagesRead(): actionsTypes.MarkAllMessagesRead { + return { + type: actionsTypes.MARK_ALL_READ + } +} diff --git a/src/store/actions/types.ts b/src/store/actions/types.ts index ca6ab2ad7..d1003b3b0 100644 --- a/src/store/actions/types.ts +++ b/src/store/actions/types.ts @@ -5,6 +5,7 @@ import { LinkParams } from '../types'; export const TOGGLE_CHAT = 'BEHAVIOR/TOGGLE_CHAT'; export const TOGGLE_INPUT_DISABLED = 'BEHAVIOR/TOGGLE_INPUT_DISABLED'; export const TOGGLE_MESSAGE_LOADER = 'BEHAVIOR/TOGGLE_MSG_LOADER'; +export const SET_BADGE_COUNT = 'BEHAVIOR/SET_BADGE_COUNT'; export const ADD_NEW_USER_MESSAGE = 'MESSAGES/ADD_NEW_USER_MESSAGE'; export const ADD_NEW_RESPONSE_MESSAGE = 'MESSAGES/ADD_NEW_RESPONSE_MESSAGE'; export const ADD_NEW_LINK_SNIPPET = 'MESSAGES/ADD_NEW_LINK_SNIPPET'; @@ -12,6 +13,7 @@ export const ADD_COMPONENT_MESSAGE = 'MESSAGES/ADD_COMPONENT_MESSAGE'; export const DROP_MESSAGES = 'MESSAGES/DROP_MESSAGES'; export const HIDE_AVATAR = 'MESSAGES/HIDE_AVATAR'; export const DELETE_MESSAGES = 'MESSAGES/DELETE_MESSAGES'; +export const MARK_ALL_READ = 'MESSAGES/MARK_ALL_READ'; export const SET_QUICK_BUTTONS = 'SET_QUICK_BUTTONS'; export interface ToggleChat { @@ -68,8 +70,18 @@ export interface SetQuickButtons { buttons: Array<{ label: string, value: string | number }>; } +export interface SetBadgeCount { + type: typeof SET_BADGE_COUNT; + count: number; +} + +export interface MarkAllMessagesRead { + type: typeof MARK_ALL_READ; +} + export type BehaviorActions = ToggleChat | ToggleInputDisabled | ToggleMsgLoader; -export type MessagesActions = AddUserMessage | AddResponseMessage | AddLinkSnippet | RenderCustomComponent | DropMessages | HideAvatar | DeleteMessages; +export type MessagesActions = AddUserMessage | AddResponseMessage | AddLinkSnippet | RenderCustomComponent + | DropMessages | HideAvatar | DeleteMessages | MarkAllMessagesRead | SetBadgeCount; export type QuickButtonsActions = SetQuickButtons; diff --git a/src/store/reducers/messagesReducer.ts b/src/store/reducers/messagesReducer.ts index d280ef6e9..03c0ef5d1 100644 --- a/src/store/reducers/messagesReducer.ts +++ b/src/store/reducers/messagesReducer.ts @@ -11,35 +11,42 @@ import { ADD_COMPONENT_MESSAGE, DROP_MESSAGES, HIDE_AVATAR, - DELETE_MESSAGES + DELETE_MESSAGES, + MARK_ALL_READ, + SET_BADGE_COUNT } from '../actions/types'; const initialState = { - messages: [] + messages: [], + badgeCount: 0 }; const messagesReducer = { [ADD_NEW_USER_MESSAGE]: (state: MessagesState, { text }) => - ({ messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.CLIENT)] }), + ({ ...state, messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.CLIENT)] }), - [ADD_NEW_RESPONSE_MESSAGE]: (state: MessagesState, { text }) => - ({ messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.RESPONSE)] }), + [ADD_NEW_RESPONSE_MESSAGE]: (state: MessagesState, { text }) => + ({ ...state, messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.RESPONSE)], badgeCount: state.badgeCount + 1 }), [ADD_NEW_LINK_SNIPPET]: (state: MessagesState, { link }) => - ({ messages: [...state.messages, createLinkSnippet(link)] }), + ({ ...state, messages: [...state.messages, createLinkSnippet(link)] }), [ADD_COMPONENT_MESSAGE]: (state: MessagesState, { component, props, showAvatar }) => - ({ messages: [...state.messages, createComponentMessage(component, props, showAvatar)] }), + ({ ...state, messages: [...state.messages, createComponentMessage(component, props, showAvatar)] }), - [DROP_MESSAGES]: () => ({ messages: [] }), + [DROP_MESSAGES]: (state: MessagesState) => ({ ...state, messages: [] }), - [HIDE_AVATAR]: (state: MessagesState, { index }) => - state.messages[index].showAvatar = false, + [HIDE_AVATAR]: (state: MessagesState, { index }) => state.messages[index].showAvatar = false, [DELETE_MESSAGES]: (state: MessagesState, { count, id }) => { - if (id) return { messages: state.messages.filter(message => message.customId !== id) } - return { messages: state.messages.splice(state.messages.length - 1, count) } - } + if (id) return { ...state, messages: state.messages.filter(message => message.customId !== id) } + return { ...state, messages: state.messages.splice(state.messages.length - 1, count) } + }, + + [SET_BADGE_COUNT]: (state: MessagesState, { count }) => ({ ...state, badgeCount: count }), + + [MARK_ALL_READ]: (state: MessagesState) => + ({ ...state, messages: state.messages.map(message => ({ ...message, unread: false})), badgeCount: 0}) } export default (state = initialState, action: MessagesActions) => createReducer(messagesReducer, state, action); diff --git a/src/store/types.ts b/src/store/types.ts index a9e1fb08a..9eed44d5b 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -6,6 +6,7 @@ type BaseMessage = { sender: string; showAvatar: boolean; timestamp: Date; + unread: boolean; customId?: string; props?: any; } @@ -44,6 +45,7 @@ export interface BehaviorState { export interface MessagesState { messages: Array; + badgeCount: number; } export interface QuickButtonsState { diff --git a/src/utils/messages.ts b/src/utils/messages.ts index c9cb58d27..7b01c63ca 100644 --- a/src/utils/messages.ts +++ b/src/utils/messages.ts @@ -16,7 +16,8 @@ export function createNewMessage(text: string, sender: string, id?: string): Mes sender, timestamp: new Date(), showAvatar: sender === MESSAGE_SENDER.RESPONSE, - customId: id + customId: id, + unread: sender === MESSAGE_SENDER.RESPONSE }; } @@ -30,7 +31,8 @@ export function createLinkSnippet(link: LinkParams, id?: string) : Link { sender: MESSAGE_SENDER.RESPONSE, timestamp: new Date(), showAvatar: true, - customId: id + customId: id, + unread: true }; } @@ -42,7 +44,8 @@ export function createComponentMessage(component: ElementType, props: any, showA sender: MESSAGE_SENDER.RESPONSE, timestamp: new Date(), showAvatar, - customId: id + customId: id, + unread: true }; } diff --git a/tsconfig.json b/tsconfig.json index 0fc3eb1e3..6974085ce 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "strict": true, "baseUrl": ".", - "outDir": "./dist/", + "outDir": "./lib/", "sourceMap": true, "noImplicitAny": false, "esModuleInterop": true, @@ -24,5 +24,5 @@ }, "extends": "./tsconfig.paths.json", "include": ["src"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "lib"] } diff --git a/tsconfig.paths.json b/tsconfig.paths.json index abd20187d..1a54752f0 100644 --- a/tsconfig.paths.json +++ b/tsconfig.paths.json @@ -2,8 +2,9 @@ "compilerOptions": { "baseUrl": "src", "paths": { - "@assets": ["./src/assets"], + "@assets": ["./assets"], "@actions": ["./src/store/actions"], + "@types": ["./src/store/types"], "@scss/*": ["scss/*"], "@constants/*": ["constants/*"], "@utils/*": ["utils/*"], diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 888049722..3d5229702 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -9,7 +9,7 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const autoprefixer = require('autoprefixer'); module.exports = { - entry: './index.js', // TODO: Change to TS + entry: './index.js', output: { path: path.join(__dirname, '/lib'), filename: 'index.js', @@ -19,23 +19,24 @@ module.exports = { resolve: { extensions: ['.tsx', '.ts', '.js'] }, + target: 'web', mode: 'production', module: { rules: [ { test: /\.ts(x?)$/, - exclude: /node_modules/, + exclude: [/node_modules/, /dev/], use: ['babel-loader', 'ts-loader'] }, { - enforce: "pre", + enforce: 'pre', test: /\.js$/, - loader: "source-map-loader" + loader: 'source-map-loader' }, { test: /\.js$/, - loader: 'babel-loader', - exclude: /node_modules/ + exclude: /node_modules/, + loader: 'babel-loader' }, { test: /\.scss$/, @@ -83,8 +84,16 @@ module.exports = { }), ], externals: { - react: 'React', - 'react-dom': 'ReactDOM' + react: { + commonjs: 'React', + commonjs2: 'react', + amd: 'react' + }, + 'react-dom': { + commonjs: 'ReactDOM', + commonjs2: 'react-dom', + amd: 'react-dom' + } }, optimization: { minimizer: [ From 8d555a054fa9dac21d087f2442642def18c36426 Mon Sep 17 00:00:00 2001 From: mcallegari10 Date: Thu, 9 Apr 2020 17:52:58 -0300 Subject: [PATCH 3/6] - add accesibility features according to #120 - change date-fns import path - add dependency to useffect in Messages component - change messages reducer to ternary in delete messages handle --- dev/App.tsx | 2 +- .../Messages/components/Message/index.tsx | 2 +- .../Messages/components/Message/styles.scss | 1 + .../Messages/components/Snippet/index.tsx | 18 ++++++++++------- .../components/Messages/index.tsx | 5 ++--- .../Conversation/components/Sender/index.tsx | 10 +++++----- .../Conversation/components/Sender/style.scss | 9 +++++++++ .../Widget/components/Conversation/index.tsx | 7 +++++-- .../Widget/components/Launcher/index.tsx | 14 ++++++++----- .../Widget/components/Launcher/style.scss | 1 + src/components/Widget/index.tsx | 14 ++++++++++++- src/components/Widget/layout.tsx | 18 +++++++++++++++-- src/index.tsx | 20 +++++++++++++++++-- src/store/dispatcher.ts | 8 ++++++++ src/store/reducers/messagesReducer.ts | 11 ++++++---- src/store/types.ts | 4 ++-- 16 files changed, 109 insertions(+), 35 deletions(-) diff --git a/dev/App.tsx b/dev/App.tsx index 96c437239..e4296bf17 100644 --- a/dev/App.tsx +++ b/dev/App.tsx @@ -1,6 +1,6 @@ import React, { Component } from 'react'; -import { Widget, addResponseMessage, setQuickButtons, toggleMsgLoader, addLinkSnippet, toggleWidget } from '../index'; +import { Widget, addResponseMessage, setQuickButtons, toggleMsgLoader, addLinkSnippet } from '../index'; export default class App extends Component { componentDidMount() { diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx b/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx index b9b147cdf..1153a1878 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { format } from 'date-fns'; +import format from 'date-fns/format'; import markdownIt from 'markdown-it'; import markdownItSup from 'markdown-it-sup'; import markdownItSanitizer from 'markdown-it-sanitizer'; diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss b/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss index 9fdfa7ef6..93954550e 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss +++ b/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss @@ -9,6 +9,7 @@ .rcw-timestamp { font-size: 10px; + margin-top: 5px; } .rcw-client { diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx b/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx index 04d24e25b..a91f60d72 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx @@ -1,6 +1,7 @@ import React from 'react'; +import format from 'date-fns/format'; -import { Message, Link } from 'src/store/types'; +import { Link } from 'src/store/types'; import './styles.scss'; @@ -10,13 +11,16 @@ type Props = { function Snippet({ message }: Props) { return ( -
-
{message.title}
-
- - {message.link} - +
+
+
{message.title}
+
+ {format(message.timestamp, 'hh:mm')}
); } diff --git a/src/components/Widget/components/Conversation/components/Messages/index.tsx b/src/components/Widget/components/Conversation/components/Messages/index.tsx index f456aafd4..a5401e1b7 100644 --- a/src/components/Widget/components/Conversation/components/Messages/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/index.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useRef } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { format } from 'date-fns'; +import format from 'date-fns/format'; import { scrollToBottom } from '../../../../../../utils/messages'; import { Message, Link, CustomCompMessage, GlobalState } from '../../../../../../store/types'; @@ -24,11 +24,10 @@ function Messages({ profileAvatar }: Props) { const messageRef = useRef(null); useEffect(() => { - console.log(showChat) scrollToBottom(messageRef.current); if (showChat && badgeCount) dispatch(markAllMessagesRead()); else dispatch(setBadgeCount(messages.filter((message) => message.unread).length)); - }, [messages]); + }, [messages, badgeCount]); const getComponentToRender = (message: Message | Link | CustomCompMessage) => { const ComponentToRender = message.component; diff --git a/src/components/Widget/components/Conversation/components/Sender/index.tsx b/src/components/Widget/components/Conversation/components/Sender/index.tsx index dd42ac6cf..045e28c73 100644 --- a/src/components/Widget/components/Conversation/components/Sender/index.tsx +++ b/src/components/Widget/components/Conversation/components/Sender/index.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useEffect } from 'react'; +import React, { useRef, useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { GlobalState } from 'src/store/types'; @@ -11,12 +11,12 @@ type Props = { placeholder: string; disabledInput: boolean; autofocus: boolean; - sendMessage: () => void; + sendMessage: (event: any) => void; + buttonAlt: string; onTextInputChange?: (event: any) => void; } -function Sender({ sendMessage, placeholder, disabledInput, autofocus, onTextInputChange }: Props) { - +function Sender({ sendMessage, placeholder, disabledInput, autofocus, onTextInputChange, buttonAlt }: Props) { const showChat = useSelector((state: GlobalState) => state.behavior.showChat); const inputRef = useRef(null); // @ts-ignore @@ -36,7 +36,7 @@ function Sender({ sendMessage, placeholder, disabledInput, autofocus, onTextInpu onChange={onTextInputChange} /> ); diff --git a/src/components/Widget/components/Conversation/components/Sender/style.scss b/src/components/Widget/components/Conversation/components/Sender/style.scss index 2749f247a..6640f918f 100644 --- a/src/components/Widget/components/Conversation/components/Sender/style.scss +++ b/src/components/Widget/components/Conversation/components/Sender/style.scss @@ -7,6 +7,10 @@ height: 45px; padding: 5px; border-radius: 0 0 10px 10px; + + &.expand { + height: 55px; + } } .rcw-new-message { @@ -15,10 +19,15 @@ background-color: $grey-2; height: 30px; padding-left: 15px; + resize: none; &:focus { outline: none; } + + &.expand { + height: 40px; + } } .rcw-send { diff --git a/src/components/Widget/components/Conversation/index.tsx b/src/components/Widget/components/Conversation/index.tsx index 4505c318b..82fabdaaa 100644 --- a/src/components/Widget/components/Conversation/index.tsx +++ b/src/components/Widget/components/Conversation/index.tsx @@ -24,6 +24,7 @@ type Props = { titleAvatar?: string; onQuickButtonClicked?: AnyFunction; onTextInputChange?: (event: any) => void; + sendButtonAlt: string; }; function Conversation({ @@ -39,10 +40,11 @@ function Conversation({ profileAvatar, titleAvatar, onQuickButtonClicked, - onTextInputChange + onTextInputChange, + sendButtonAlt }: Props) { return ( -
+
); diff --git a/src/components/Widget/components/Launcher/index.tsx b/src/components/Widget/components/Launcher/index.tsx index 702ea854a..d299a26e3 100644 --- a/src/components/Widget/components/Launcher/index.tsx +++ b/src/components/Widget/components/Launcher/index.tsx @@ -12,26 +12,30 @@ const openLauncher = require('../../../../../assets/launcher_button.svg') as str const close = require('../../../../../assets/clear-button.svg') as string; type Props = { - toggle: () => void + toggle: () => void; + chatId: string; + openLabel: string; + closeLabel: string; } -function Launcher({ toggle }: Props) { +function Launcher({ toggle, chatId, openLabel, closeLabel }: Props) { const dispatch = useDispatch(); const { showChat, badgeCount } = useSelector((state: GlobalState) => ({ showChat: state.behavior.showChat, badgeCount: state.messages.badgeCount })); + const toggleChat = () => { toggle(); if (!showChat) dispatch(setBadgeCount(0)); } return ( - ); diff --git a/src/components/Widget/components/Launcher/style.scss b/src/components/Widget/components/Launcher/style.scss index abf3dbaab..6fb6dc18a 100644 --- a/src/components/Widget/components/Launcher/style.scss +++ b/src/components/Widget/components/Launcher/style.scss @@ -11,6 +11,7 @@ box-shadow: 0px 2px 10px 1px $grey-3; height: 60px; margin-top: 10px; + cursor: pointer; width: 60px; &:focus { diff --git a/src/components/Widget/index.tsx b/src/components/Widget/index.tsx index e9db8146d..30f247355 100644 --- a/src/components/Widget/index.tsx +++ b/src/components/Widget/index.tsx @@ -20,6 +20,10 @@ type Props = { handleNewUserMessage: AnyFunction; handleQuickButtonClicked: AnyFunction; handleTextInputChange?: (event: any) => void; + chatId: string; + launcherOpenLabel: string; + launcherCloseLabel: string; + sendButtonAlt: string; } function Widget({ @@ -35,7 +39,11 @@ function Widget({ customLauncher, handleNewUserMessage, handleQuickButtonClicked, - handleTextInputChange + handleTextInputChange, + chatId, + launcherOpenLabel, + launcherCloseLabel, + sendButtonAlt }: Props) { const dispatch = useDispatch(); @@ -74,6 +82,10 @@ function Widget({ autofocus={autofocus} customLauncher={customLauncher} onTextInputChange={handleTextInputChange} + chatId={chatId} + launcherOpenLabel={launcherOpenLabel} + launcherCloseLabel={launcherCloseLabel} + sendButtonAlt={sendButtonAlt} /> ); } diff --git a/src/components/Widget/layout.tsx b/src/components/Widget/layout.tsx index 4587f3a8a..af95f50c0 100644 --- a/src/components/Widget/layout.tsx +++ b/src/components/Widget/layout.tsx @@ -25,6 +25,10 @@ type Props = { autofocus: boolean; customLauncher?: AnyFunction; onTextInputChange?: (event: any) => void; + chatId: string; + launcherOpenLabel: string; + launcherCloseLabel: string; + sendButtonAlt: string; } function WidgetLayout({ @@ -40,7 +44,11 @@ function WidgetLayout({ fullScreenMode, autofocus, customLauncher, - onTextInputChange + onTextInputChange, + chatId, + launcherOpenLabel, + launcherCloseLabel, + sendButtonAlt }: Props) { const { dissableInput, showChat } = useSelector((state: GlobalState) => ({ showChat: state.behavior.showChat, @@ -63,11 +71,17 @@ function WidgetLayout({ className={showChat ? 'active' : 'hidden'} onQuickButtonClicked={onQuickButtonClicked} onTextInputChange={onTextInputChange} + sendButtonAlt={sendButtonAlt} /> {customLauncher ? customLauncher(onToggleConversation) : !fullScreenMode && - + }
); diff --git a/src/index.tsx b/src/index.tsx index 353fe6fa6..18b43ee4c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -21,6 +21,10 @@ type Props = { handleNewUserMessage: AnyFunction; handleQuickButtonClicked: AnyFunction; handleTextInputChange?: (event: any) => void; + chatId?: string; + launcherOpenLabel?: string, + launcherCloseLabel?: string, + sendButtonAlt?: string } & typeof defaultProps; function ConnectedWidget({ @@ -36,7 +40,11 @@ function ConnectedWidget({ launcher, handleNewUserMessage, handleQuickButtonClicked, - handleTextInputChange + handleTextInputChange, + chatId, + launcherOpenLabel, + launcherCloseLabel, + sendButtonAlt }: Props) { return ( @@ -54,6 +62,10 @@ function ConnectedWidget({ autofocus={autofocus} customLauncher={launcher} handleTextInputChange={handleTextInputChange} + chatId={chatId} + launcherOpenLabel={launcherOpenLabel} + launcherCloseLabel={launcherCloseLabel} + sendButtonAlt={sendButtonAlt} /> ); @@ -66,7 +78,11 @@ const defaultProps = { showCloseButton: true, fullScreenMode: false, badge: 0, - autofocus: true + autofocus: true, + chatId: 'rcw-chat-container', + launcherOpenLabel: 'Open chat', + launcherCloseLabel: 'Close chat', + sendButtonAlt: 'Send' }; ConnectedWidget.defaultProps = defaultProps; diff --git a/src/store/dispatcher.ts b/src/store/dispatcher.ts index a55e61b24..7a119021b 100644 --- a/src/store/dispatcher.ts +++ b/src/store/dispatcher.ts @@ -47,3 +47,11 @@ export function setQuickButtons(buttons: Array<{ label: string, value: string | export function deleteMessages(count: number, id?: string) { store.dispatch(actions.deleteMessages(count, id)); } + +export function markAllAsRead() { + store.dispatch(actions.markAllMessagesRead()); +} + +export function setBadgeCount(count: number) { + store.dispatch(actions.setBadgeCount(count)); +} diff --git a/src/store/reducers/messagesReducer.ts b/src/store/reducers/messagesReducer.ts index 03c0ef5d1..446704699 100644 --- a/src/store/reducers/messagesReducer.ts +++ b/src/store/reducers/messagesReducer.ts @@ -38,10 +38,13 @@ const messagesReducer = { [HIDE_AVATAR]: (state: MessagesState, { index }) => state.messages[index].showAvatar = false, - [DELETE_MESSAGES]: (state: MessagesState, { count, id }) => { - if (id) return { ...state, messages: state.messages.filter(message => message.customId !== id) } - return { ...state, messages: state.messages.splice(state.messages.length - 1, count) } - }, + [DELETE_MESSAGES]: (state: MessagesState, { count, id }) => + ({ + ...state, + messages: id ? + state.messages.filter(message => message.customId !== id) : + state.messages.splice(state.messages.length - 1, count) + }), [SET_BADGE_COUNT]: (state: MessagesState, { count }) => ({ ...state, badgeCount: count }), diff --git a/src/store/types.ts b/src/store/types.ts index 9eed44d5b..71daf09ff 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -44,12 +44,12 @@ export interface BehaviorState { }; export interface MessagesState { - messages: Array; + messages: (Message | Link | CustomCompMessage)[]; badgeCount: number; } export interface QuickButtonsState { - quickButtons: Array; + quickButtons: QuickButton[]; } export interface GlobalState { From 7e17444ceb084dddc70c633b6e802e6706c1db52 Mon Sep 17 00:00:00 2001 From: mcallegari10 Date: Mon, 13 Apr 2020 14:53:31 -0300 Subject: [PATCH 4/6] - add missing id parameter for the dispatcher - add new functions to the main export - remove badge prop --- dev/App.tsx | 1 - index.js | 10 ++++-- .../Messages/components/Message/index.tsx | 5 +-- .../Messages/components/Snippet/index.tsx | 5 +-- .../components/Messages/index.tsx | 6 ++-- .../Widget/components/Conversation/index.tsx | 6 ++-- src/components/Widget/index.tsx | 8 ++--- src/components/Widget/layout.tsx | 6 ++-- src/index.tsx | 18 +++++----- src/store/actions/index.ts | 21 ++++++----- src/store/actions/types.ts | 4 +++ src/store/dispatcher.ts | 16 ++++----- src/store/reducers/messagesReducer.ts | 16 ++++----- src/utils/messages.ts | 35 +++++++------------ 14 files changed, 85 insertions(+), 72 deletions(-) diff --git a/dev/App.tsx b/dev/App.tsx index e4296bf17..22c2989aa 100644 --- a/dev/App.tsx +++ b/dev/App.tsx @@ -33,7 +33,6 @@ export default class App extends Component { senderPlaceHolder="Escribe aquĆ­ ..." handleNewUserMessage={this.handleNewUserMessage} handleQuickButtonClicked={this.handleQuickButtonClicked} - badge={1} /> ); } diff --git a/index.js b/index.js index 5e7396e0a..2a9575f52 100644 --- a/index.js +++ b/index.js @@ -9,7 +9,10 @@ import { toggleMsgLoader, dropMessages, isWidgetOpened, - setQuickButtons + setQuickButtons, + deleteMessages, + markAllAsRead, + setBadgeCount } from './src/store/dispatcher'; export { @@ -23,5 +26,8 @@ export { toggleMsgLoader, dropMessages, isWidgetOpened, - setQuickButtons + setQuickButtons, + deleteMessages, + markAllAsRead, + setBadgeCount }; diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx b/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx index 1153a1878..d6c0e24e1 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/components/Message/index.tsx @@ -11,9 +11,10 @@ import './styles.scss'; type Props = { message: Message; + showTimeStamp: boolean; } -function Message({ message }: Props) { +function Message({ message, showTimeStamp }: Props) { const sanitizedHTML = markdownIt().use(markdownItSup) .use(markdownItSanitizer) .use(markdownItLinkAttributes, { attrs: { target: '_blank', rel: 'noopener' } }) @@ -22,7 +23,7 @@ function Message({ message }: Props) { return (
- {format(message.timestamp, 'hh:mm')} + {showTimeStamp && {format(message.timestamp, 'hh:mm')}}
); } diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx b/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx index a91f60d72..aa880e944 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/components/Snippet/index.tsx @@ -7,9 +7,10 @@ import './styles.scss'; type Props = { message: Link; + showTimeStamp: boolean; } -function Snippet({ message }: Props) { +function Snippet({ message, showTimeStamp }: Props) { return (
@@ -20,7 +21,7 @@ function Snippet({ message }: Props) {
- {format(message.timestamp, 'hh:mm')} + {showTimeStamp && {format(message.timestamp, 'hh:mm')}}
); } diff --git a/src/components/Widget/components/Conversation/components/Messages/index.tsx b/src/components/Widget/components/Conversation/components/Messages/index.tsx index a5401e1b7..fd2f83fbb 100644 --- a/src/components/Widget/components/Conversation/components/Messages/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/index.tsx @@ -10,10 +10,11 @@ import Loader from './components/Loader'; import './styles.scss'; type Props = { + showTimeStamp: boolean, profileAvatar?: string; } -function Messages({ profileAvatar }: Props) { +function Messages({ profileAvatar, showTimeStamp }: Props) { const dispatch = useDispatch(); const { messages, typing, showChat, badgeCount } = useSelector((state: GlobalState) => ({ messages: state.messages.messages, @@ -24,6 +25,7 @@ function Messages({ profileAvatar }: Props) { const messageRef = useRef(null); useEffect(() => { + // @ts-ignore scrollToBottom(messageRef.current); if (showChat && badgeCount) dispatch(markAllMessagesRead()); else dispatch(setBadgeCount(messages.filter((message) => message.unread).length)); @@ -34,7 +36,7 @@ function Messages({ profileAvatar }: Props) { if (message.type === 'component') { return ; } - return ; + return ; }; // TODO: Fix this function or change to move the avatar to last message from response diff --git a/src/components/Widget/components/Conversation/index.tsx b/src/components/Widget/components/Conversation/index.tsx index 82fabdaaa..76c44128a 100644 --- a/src/components/Widget/components/Conversation/index.tsx +++ b/src/components/Widget/components/Conversation/index.tsx @@ -25,6 +25,7 @@ type Props = { onQuickButtonClicked?: AnyFunction; onTextInputChange?: (event: any) => void; sendButtonAlt: string; + showTimeStamp: boolean; }; function Conversation({ @@ -41,7 +42,8 @@ function Conversation({ titleAvatar, onQuickButtonClicked, onTextInputChange, - sendButtonAlt + sendButtonAlt, + showTimeStamp }: Props) { return (
@@ -52,7 +54,7 @@ function Conversation({ showCloseButton={showCloseButton} titleAvatar={titleAvatar} /> - + ); } diff --git a/src/components/Widget/layout.tsx b/src/components/Widget/layout.tsx index af95f50c0..8718387de 100644 --- a/src/components/Widget/layout.tsx +++ b/src/components/Widget/layout.tsx @@ -21,7 +21,6 @@ type Props = { profileAvatar?: string; showCloseButton: boolean; fullScreenMode: boolean; - badge: number; autofocus: boolean; customLauncher?: AnyFunction; onTextInputChange?: (event: any) => void; @@ -29,6 +28,7 @@ type Props = { launcherOpenLabel: string; launcherCloseLabel: string; sendButtonAlt: string; + showTimeStamp: boolean; } function WidgetLayout({ @@ -48,7 +48,8 @@ function WidgetLayout({ chatId, launcherOpenLabel, launcherCloseLabel, - sendButtonAlt + sendButtonAlt, + showTimeStamp }: Props) { const { dissableInput, showChat } = useSelector((state: GlobalState) => ({ showChat: state.behavior.showChat, @@ -72,6 +73,7 @@ function WidgetLayout({ onQuickButtonClicked={onQuickButtonClicked} onTextInputChange={onTextInputChange} sendButtonAlt={sendButtonAlt} + showTimeStamp={showTimeStamp} /> {customLauncher ? customLauncher(onToggleConversation) : diff --git a/src/index.tsx b/src/index.tsx index 18b43ee4c..7c7e41e02 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -8,23 +8,23 @@ import store from './store'; import { AnyFunction } from './utils/types'; type Props = { + handleNewUserMessage: AnyFunction; + handleQuickButtonClicked: AnyFunction; title?: string; titleAvatar?: string; subtitle?: string; senderPlaceHolder?: string; showCloseButton?: boolean; fullScreenMode?: boolean; - badge?: number; autofocus?: boolean; profileAvatar?: string; launcher?: AnyFunction; - handleNewUserMessage: AnyFunction; - handleQuickButtonClicked: AnyFunction; handleTextInputChange?: (event: any) => void; chatId?: string; launcherOpenLabel?: string, launcherCloseLabel?: string, - sendButtonAlt?: string + sendButtonAlt?: string; + showTimeStamp?: boolean; } & typeof defaultProps; function ConnectedWidget({ @@ -34,7 +34,6 @@ function ConnectedWidget({ senderPlaceHolder, showCloseButton, fullScreenMode, - badge, autofocus, profileAvatar, launcher, @@ -44,7 +43,8 @@ function ConnectedWidget({ chatId, launcherOpenLabel, launcherCloseLabel, - sendButtonAlt + sendButtonAlt, + showTimeStamp }: Props) { return ( @@ -58,7 +58,6 @@ function ConnectedWidget({ profileAvatar={profileAvatar} showCloseButton={showCloseButton} fullScreenMode={fullScreenMode} - badge={badge} autofocus={autofocus} customLauncher={launcher} handleTextInputChange={handleTextInputChange} @@ -66,6 +65,7 @@ function ConnectedWidget({ launcherOpenLabel={launcherOpenLabel} launcherCloseLabel={launcherCloseLabel} sendButtonAlt={sendButtonAlt} + showTimeStamp={showTimeStamp} /> ); @@ -77,12 +77,12 @@ const defaultProps = { senderPlaceHolder: 'Type a message...', showCloseButton: true, fullScreenMode: false, - badge: 0, autofocus: true, chatId: 'rcw-chat-container', launcherOpenLabel: 'Open chat', launcherCloseLabel: 'Close chat', - sendButtonAlt: 'Send' + sendButtonAlt: 'Send', + showTimeStamp: true }; ConnectedWidget.defaultProps = defaultProps; diff --git a/src/store/actions/index.ts b/src/store/actions/index.ts index deb15f88a..d96fa080e 100644 --- a/src/store/actions/index.ts +++ b/src/store/actions/index.ts @@ -15,17 +15,19 @@ export function toggleInputDisabled(): actionsTypes.BehaviorActions { }; } -export function addUserMessage(text: string): actionsTypes.MessagesActions { +export function addUserMessage(text: string, id?: string): actionsTypes.MessagesActions { return { type: actionsTypes.ADD_NEW_USER_MESSAGE, - text + text, + id }; } -export function addResponseMessage(text: string): actionsTypes.MessagesActions { +export function addResponseMessage(text: string, id?: string): actionsTypes.MessagesActions { return { type: actionsTypes.ADD_NEW_RESPONSE_MESSAGE, - text + text, + id }; } @@ -35,23 +37,26 @@ export function toggleMsgLoader(): actionsTypes.BehaviorActions { } } -export function addLinkSnippet(link: LinkParams): actionsTypes.MessagesActions { +export function addLinkSnippet(link: LinkParams, id?: string): actionsTypes.MessagesActions { return { type: actionsTypes.ADD_NEW_LINK_SNIPPET, - link + link, + id }; } export function renderCustomComponent( component: ElementType, props: any, - showAvatar: boolean + showAvatar: boolean, + id?: string ): actionsTypes.MessagesActions { return { type: actionsTypes.ADD_COMPONENT_MESSAGE, component, props, - showAvatar + showAvatar, + id }; } diff --git a/src/store/actions/types.ts b/src/store/actions/types.ts index d1003b3b0..3358350f9 100644 --- a/src/store/actions/types.ts +++ b/src/store/actions/types.ts @@ -27,11 +27,13 @@ export interface ToggleInputDisabled { export interface AddUserMessage { type: typeof ADD_NEW_USER_MESSAGE; text: string; + id?: string; } export interface AddResponseMessage { type: typeof ADD_NEW_RESPONSE_MESSAGE; text: string; + id?: string; } export interface ToggleMsgLoader { @@ -41,6 +43,7 @@ export interface ToggleMsgLoader { export interface AddLinkSnippet { type: typeof ADD_NEW_LINK_SNIPPET; link: LinkParams; + id?: string; } export interface RenderCustomComponent { @@ -48,6 +51,7 @@ export interface RenderCustomComponent { component: ElementType; props: any; showAvatar: boolean; + id?: string; } export interface DropMessages { diff --git a/src/store/dispatcher.ts b/src/store/dispatcher.ts index 7a119021b..0d2ee5386 100644 --- a/src/store/dispatcher.ts +++ b/src/store/dispatcher.ts @@ -4,24 +4,24 @@ import store from '.'; import * as actions from './actions'; import { LinkParams } from './types'; -export function addUserMessage(text: string) { - store.dispatch(actions.addUserMessage(text)); +export function addUserMessage(text: string, id?: string) { + store.dispatch(actions.addUserMessage(text, id)); } -export function addResponseMessage(text: string) { - store.dispatch(actions.addResponseMessage(text)); +export function addResponseMessage(text: string, id?: string) { + store.dispatch(actions.addResponseMessage(text, id)); } -export function addLinkSnippet(link: LinkParams) { - store.dispatch(actions.addLinkSnippet(link)); +export function addLinkSnippet(link: LinkParams, id?: string) { + store.dispatch(actions.addLinkSnippet(link, id)); } export function toggleMsgLoader() { store.dispatch(actions.toggleMsgLoader()); } -export function renderCustomComponent(component: ElementType, props: any, showAvatar = false) { - store.dispatch(actions.renderCustomComponent(component, props, showAvatar)); +export function renderCustomComponent(component: ElementType, props: any, showAvatar = false, id?: string) { + store.dispatch(actions.renderCustomComponent(component, props, showAvatar, id)); } export function toggleWidget() { diff --git a/src/store/reducers/messagesReducer.ts b/src/store/reducers/messagesReducer.ts index 446704699..c7deebb20 100644 --- a/src/store/reducers/messagesReducer.ts +++ b/src/store/reducers/messagesReducer.ts @@ -22,17 +22,17 @@ const initialState = { }; const messagesReducer = { - [ADD_NEW_USER_MESSAGE]: (state: MessagesState, { text }) => - ({ ...state, messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.CLIENT)] }), + [ADD_NEW_USER_MESSAGE]: (state: MessagesState, { text, id }) => + ({ ...state, messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.CLIENT, id)] }), - [ADD_NEW_RESPONSE_MESSAGE]: (state: MessagesState, { text }) => - ({ ...state, messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.RESPONSE)], badgeCount: state.badgeCount + 1 }), + [ADD_NEW_RESPONSE_MESSAGE]: (state: MessagesState, { text, id }) => + ({ ...state, messages: [...state.messages, createNewMessage(text, MESSAGE_SENDER.RESPONSE, id)], badgeCount: state.badgeCount + 1 }), - [ADD_NEW_LINK_SNIPPET]: (state: MessagesState, { link }) => - ({ ...state, messages: [...state.messages, createLinkSnippet(link)] }), + [ADD_NEW_LINK_SNIPPET]: (state: MessagesState, { link, id }) => + ({ ...state, messages: [...state.messages, createLinkSnippet(link, id)] }), - [ADD_COMPONENT_MESSAGE]: (state: MessagesState, { component, props, showAvatar }) => - ({ ...state, messages: [...state.messages, createComponentMessage(component, props, showAvatar)] }), + [ADD_COMPONENT_MESSAGE]: (state: MessagesState, { component, props, showAvatar, id }) => + ({ ...state, messages: [...state.messages, createComponentMessage(component, props, showAvatar, id)] }), [DROP_MESSAGES]: (state: MessagesState) => ({ ...state, messages: [] }), diff --git a/src/utils/messages.ts b/src/utils/messages.ts index 7b01c63ca..f4f896bb3 100644 --- a/src/utils/messages.ts +++ b/src/utils/messages.ts @@ -59,15 +59,8 @@ export function createQuickButton(button: { label: string, value: string | numbe // TODO: Clean functions and window use for SSR -/** - * Easing Functions - * @param {*} t timestamp - * @param {*} b begining - * @param {*} c change - * @param {*} d duration - */ -function sinEaseOut(t, b, c, d) { - return c * ((t = t / d - 1) * t * t + 1) + b; +function sinEaseOut(timestamp: any, begining: any, change: any, duration: any) { + return change * ((timestamp = timestamp / duration - 1) * timestamp * timestamp + 1) + begining; } /** @@ -76,29 +69,27 @@ function sinEaseOut(t, b, c, d) { * @param {*} scrollStart * @param {*} scroll scroll distance */ -function scrollWithSlowMotion(target, scrollStart, scroll: number) { - const raf = window.webkitRequestAnimationFrame || window.requestAnimationFrame - let start = 0 +function scrollWithSlowMotion(target: any, scrollStart: any, scroll: number) { + const raf = window?.requestAnimationFrame; + let start = 0; const step = (timestamp) => { if (!start) { - start = timestamp + start = timestamp; } - let stepScroll = sinEaseOut(timestamp - start, 0, scroll, MESSAGE_BOX_SCROLL_DURATION) - let total = scrollStart + stepScroll + let stepScroll = sinEaseOut(timestamp - start, 0, scroll, MESSAGE_BOX_SCROLL_DURATION); + let total = scrollStart + stepScroll; target.scrollTop = total; if (total < scrollStart + scroll) { - raf(step) + raf(step); } } - raf(step) + raf(step); } -export function scrollToBottom(messagesDiv) { +export function scrollToBottom(messagesDiv: HTMLDivElement) { if (!messagesDiv) return; const screenHeight = messagesDiv.clientHeight; const scrollTop = messagesDiv.scrollTop; - - const scrollOffset = messagesDiv.scrollHeight - (scrollTop + screenHeight) - - scrollOffset && scrollWithSlowMotion(messagesDiv, scrollTop, scrollOffset); + const scrollOffset = messagesDiv.scrollHeight - (scrollTop + screenHeight); + if (scrollOffset) scrollWithSlowMotion(messagesDiv, scrollTop, scrollOffset); } From 841d3ce4177e71186903267acb405d3ef54e5ba6 Mon Sep 17 00:00:00 2001 From: mcallegari10 Date: Mon, 13 Apr 2020 16:46:20 -0300 Subject: [PATCH 5/6] - change action types return - add align start to timestamp in response messages - fix production build to not add the devtools --- package.json | 2 +- .../Messages/components/Message/styles.scss | 1 + src/store/actions/index.ts | 22 +++++++++---------- src/store/index.ts | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 97e832ff1..9c2b62eca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-chat-widget", - "version": "3.0.0-beta.4", + "version": "3.0.0-beta.5", "description": "Chat web widget for React apps", "main": "lib/index.js", "repository": "git@github.com:Wolox/react-chat-widget.git", diff --git a/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss b/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss index 93954550e..533296076 100644 --- a/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss +++ b/src/components/Widget/components/Conversation/components/Messages/components/Message/styles.scss @@ -29,6 +29,7 @@ .rcw-response { display: flex; flex-direction: column; + align-items: flex-start; .rcw-message-text { @include message-bubble($grey-2); diff --git a/src/store/actions/index.ts b/src/store/actions/index.ts index d96fa080e..e56d72dfe 100644 --- a/src/store/actions/index.ts +++ b/src/store/actions/index.ts @@ -3,19 +3,19 @@ import { ElementType } from 'react'; import * as actionsTypes from './types'; import { LinkParams } from '../types'; -export function toggleChat(): actionsTypes.BehaviorActions { +export function toggleChat(): actionsTypes.ToggleChat { return { type: actionsTypes.TOGGLE_CHAT }; } -export function toggleInputDisabled(): actionsTypes.BehaviorActions { +export function toggleInputDisabled(): actionsTypes.ToggleInputDisabled { return { type: actionsTypes.TOGGLE_INPUT_DISABLED }; } -export function addUserMessage(text: string, id?: string): actionsTypes.MessagesActions { +export function addUserMessage(text: string, id?: string): actionsTypes.AddUserMessage { return { type: actionsTypes.ADD_NEW_USER_MESSAGE, text, @@ -23,7 +23,7 @@ export function addUserMessage(text: string, id?: string): actionsTypes.Messages }; } -export function addResponseMessage(text: string, id?: string): actionsTypes.MessagesActions { +export function addResponseMessage(text: string, id?: string): actionsTypes.AddResponseMessage { return { type: actionsTypes.ADD_NEW_RESPONSE_MESSAGE, text, @@ -31,13 +31,13 @@ export function addResponseMessage(text: string, id?: string): actionsTypes.Mess }; } -export function toggleMsgLoader(): actionsTypes.BehaviorActions { +export function toggleMsgLoader(): actionsTypes.ToggleMsgLoader { return { type: actionsTypes.TOGGLE_MESSAGE_LOADER } } -export function addLinkSnippet(link: LinkParams, id?: string): actionsTypes.MessagesActions { +export function addLinkSnippet(link: LinkParams, id?: string): actionsTypes.AddLinkSnippet { return { type: actionsTypes.ADD_NEW_LINK_SNIPPET, link, @@ -50,7 +50,7 @@ export function renderCustomComponent( props: any, showAvatar: boolean, id?: string -): actionsTypes.MessagesActions { +): actionsTypes.RenderCustomComponent { return { type: actionsTypes.ADD_COMPONENT_MESSAGE, component, @@ -60,27 +60,27 @@ export function renderCustomComponent( }; } -export function dropMessages(): actionsTypes.MessagesActions { +export function dropMessages(): actionsTypes.DropMessages { return { type: actionsTypes.DROP_MESSAGES }; } -export function hideAvatar(index: number): actionsTypes.MessagesActions { +export function hideAvatar(index: number): actionsTypes.HideAvatar { return { type: actionsTypes.HIDE_AVATAR, index }; } -export function setQuickButtons(buttons: Array<{ label: string, value: string | number }>): actionsTypes.QuickButtonsActions { +export function setQuickButtons(buttons: Array<{ label: string, value: string | number }>): actionsTypes.SetQuickButtons { return { type: actionsTypes.SET_QUICK_BUTTONS, buttons } } -export function deleteMessages(count: number, id?: string): actionsTypes.MessagesActions { +export function deleteMessages(count: number, id?: string): actionsTypes.DeleteMessages { return { type: actionsTypes.DELETE_MESSAGES, count, diff --git a/src/store/index.ts b/src/store/index.ts index 24bd1a9ed..dca1fdd06 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -10,7 +10,7 @@ declare global { } } -const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +const composeEnhancers = (process.env.NODE_ENV !== 'production' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose; const reducer = combineReducers({ behavior, messages, quickButtons }); export default createStore(reducer, composeEnhancers()); From d1feb1317f4725c85c426f80a9249961168adfdd Mon Sep 17 00:00:00 2001 From: mcallegari10 Date: Tue, 14 Apr 2020 15:37:51 -0300 Subject: [PATCH 6/6] add dependency on useEffect in Messages component --- .../components/Conversation/components/Messages/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Widget/components/Conversation/components/Messages/index.tsx b/src/components/Widget/components/Conversation/components/Messages/index.tsx index fd2f83fbb..ac15f6dfa 100644 --- a/src/components/Widget/components/Conversation/components/Messages/index.tsx +++ b/src/components/Widget/components/Conversation/components/Messages/index.tsx @@ -29,7 +29,7 @@ function Messages({ profileAvatar, showTimeStamp }: Props) { scrollToBottom(messageRef.current); if (showChat && badgeCount) dispatch(markAllMessagesRead()); else dispatch(setBadgeCount(messages.filter((message) => message.unread).length)); - }, [messages, badgeCount]); + }, [messages, badgeCount, showChat]); const getComponentToRender = (message: Message | Link | CustomCompMessage) => { const ComponentToRender = message.component;