From 3b7e3be6a715828f857c361ad4c76ef42b9847de Mon Sep 17 00:00:00 2001 From: Josh Salisbury Date: Tue, 2 Nov 2021 16:38:50 -0500 Subject: [PATCH 01/79] Add topic/reasons graph widget * pull bar graph into it's own component * bar graph now scrolls just the graph content, allows title/labels to still be shown when the graph is scrolled * add topic/reason freq widget. Can switch between display of reasons or topics * added backend test helpers to quickly (as in how long to code) create activity reports and destroy them for tests, along with any needed associations --- frontend/package.json | 2 + frontend/src/components/ButtonSelect.js | 5 +- .../src/pages/ActivityReport/constants.js | 4 +- frontend/src/pages/GranteeRecord/index.js | 37 +- .../pages/GranteeRecord/pages/TTAHistory.js | 30 +- frontend/src/setupTests.js | 3 + frontend/src/widgets/BarGraph.css | 4 + frontend/src/widgets/BarGraph.js | 136 + frontend/src/widgets/DashboardOverview.js | 10 +- frontend/src/widgets/FrequencyGraph.js | 131 + frontend/src/widgets/__tests__/BarGraph.js | 47 + .../src/widgets/__tests__/FrequencyGraph.js | 73 + frontend/src/widgets/withWidgetData.js | 5 +- frontend/yarn.lock | 2768 ++++++++++++++++- src/constants.js | 62 + src/testUtils.js | 207 ++ src/widgets/frequencyGraph.js | 49 + src/widgets/frequencyGraph.test.js | 71 + src/widgets/index.js | 2 + src/widgets/topicFrequencyGraph.js | 47 +- 20 files changed, 3583 insertions(+), 110 deletions(-) create mode 100644 frontend/src/widgets/BarGraph.css create mode 100644 frontend/src/widgets/BarGraph.js create mode 100644 frontend/src/widgets/FrequencyGraph.js create mode 100644 frontend/src/widgets/__tests__/BarGraph.js create mode 100644 frontend/src/widgets/__tests__/FrequencyGraph.js create mode 100644 src/testUtils.js create mode 100644 src/widgets/frequencyGraph.js create mode 100644 src/widgets/frequencyGraph.test.js diff --git a/frontend/package.json b/frontend/package.json index ddf0606bb2..ebd3487cea 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "lodash": "^4.17.20", "moment": "^2.29.1", "moment-timezone": "^0.5.33", + "plotly.js": "^2.5.1", "plotly.js-basic-dist": "^2.2.1", "prop-types": "^15.7.2", "query-string": "^7.0.0", @@ -34,6 +35,7 @@ "react-idle-timer": "^4.4.2", "react-input-autosize": "^3.0.0", "react-js-pagination": "^3.0.3", + "react-plotly.js": "^2.5.1", "react-responsive": "^8.1.1", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", diff --git a/frontend/src/components/ButtonSelect.js b/frontend/src/components/ButtonSelect.js index 8ba2d14bab..52dffcada5 100644 --- a/frontend/src/components/ButtonSelect.js +++ b/frontend/src/components/ButtonSelect.js @@ -27,6 +27,7 @@ function ButtonSelect(props) { endDatePickerId, dateRange, disabled, + className, } = props; const [checked, setChecked] = useState(applied); @@ -160,7 +161,7 @@ function ButtonSelect(props) { const ariaLabel = `${menuIsOpen ? 'press escape to close ' : 'Open '} ${ariaName}`; return ( -
+
+ + + + { showAccessibleData + ? ( + + ) + : } + + ); +} + +FrequencyGraph.propTypes = { + data: PropTypes.oneOfType([ + PropTypes.arrayOf( + PropTypes.shape({ + topic: PropTypes.string, + count: PropTypes.number, + }), + ), PropTypes.shape({}), + ]), + loading: PropTypes.bool.isRequired, +}; + +FrequencyGraph.defaultProps = { + data: { topic: [], reason: [] }, +}; + +export default withWidgetData(FrequencyGraph, 'frequencyGraph'); diff --git a/frontend/src/widgets/__tests__/BarGraph.js b/frontend/src/widgets/__tests__/BarGraph.js new file mode 100644 index 0000000000..67e30f45c3 --- /dev/null +++ b/frontend/src/widgets/__tests__/BarGraph.js @@ -0,0 +1,47 @@ +/* eslint-disable jest/no-disabled-tests */ +import '@testing-library/jest-dom'; +import React from 'react'; +import { + render, + screen, +} from '@testing-library/react'; +import BarGraph from '../BarGraph'; + +const TEST_DATA = [{ + category: 'one', + count: 1, +}, +{ + category: 'two', + count: 2, +}, +{ + category: 'three', + count: 0, +}]; + +const renderBarGraph = async () => ( + render() +); + +describe('Bar Graph', () => { + it('is shown', async () => { + renderBarGraph(); + await screen.findByText('xaxis'); + const point1 = document.querySelector('g.xtick'); + // eslint-disable-next-line no-underscore-dangle + expect(point1.__data__.text).toBe(' one'); + }); + + it('has the correct x axis label', async () => { + renderBarGraph(); + const axis = await screen.findByText('xaxis'); + expect(axis).toBeInTheDocument(); + }); + + it('has the correct y axis label', async () => { + renderBarGraph(); + const axis = await screen.findByText('yaxis'); + expect(axis).toBeInTheDocument(); + }); +}); diff --git a/frontend/src/widgets/__tests__/FrequencyGraph.js b/frontend/src/widgets/__tests__/FrequencyGraph.js new file mode 100644 index 0000000000..eb3c71f0ef --- /dev/null +++ b/frontend/src/widgets/__tests__/FrequencyGraph.js @@ -0,0 +1,73 @@ +/* eslint-disable jest/no-disabled-tests */ +import '@testing-library/jest-dom'; +import React from 'react'; +import { + render, + screen, +} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { FrequencyGraph } from '../FrequencyGraph'; + +const TEST_DATA = { + topic: [ + { + category: 'first category', + count: 1, + }, + { + category: 'b', + count: 2, + }, + { + category: 'c', + count: 0, + }, + ], + reason: [ + { + category: 'one', + count: 1, + }, + { + category: 'two', + count: 2, + }, + { + category: 'three', + count: 0, + }, + ], +}; + +const renderFrequencyGraph = async () => ( + render() +); + +describe('Frequency Graph', () => { + it('shows topics by default', async () => { + renderFrequencyGraph(); + const topics = await screen.findByText('Topics'); + expect(topics).toBeInTheDocument(); + }); + + it('can switch to show reasons', async () => { + renderFrequencyGraph(); + const topics = await screen.findByText('Topics'); + + userEvent.click(topics); + const reasonBtn = await screen.findByText('Reasons'); + userEvent.click(reasonBtn); + const apply = await screen.findByText('Apply'); + userEvent.click(apply); + + const reasons = await screen.findByText('Reasons'); + expect(reasons).toBeInTheDocument(); + }); + + it('can show accessible data', async () => { + renderFrequencyGraph(); + const accessibleBtn = await screen.findByText('Display table'); + userEvent.click(accessibleBtn); + expect(await screen.findByText('first category')).toBeInTheDocument(); + }); +}); diff --git a/frontend/src/widgets/withWidgetData.js b/frontend/src/widgets/withWidgetData.js index 2976dd92d2..5be7fc5403 100644 --- a/frontend/src/widgets/withWidgetData.js +++ b/frontend/src/widgets/withWidgetData.js @@ -7,8 +7,7 @@ import { filtersToQueryString } from '../components/Filter'; /* `withWidgetData` wraps widgets providing the widget with data when successfully retrieved from the API. It handles error and - loading states and (only temporarily) accepts loading and error - overrides so loading and error states can be worked on. + loading states. */ const withWidgetData = (Widget, widgetId) => { const WidgetWrapper = (props) => { @@ -39,7 +38,7 @@ const withWidgetData = (Widget, widgetId) => { if (error) { return (
- {error || 'Errors set to always show'} + {error}
); } diff --git a/frontend/yarn.lock b/frontend/yarn.lock index d89cee3044..7b968a2ff1 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,6 +2,15 @@ # yarn lockfile v1 +"3d-view@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/3d-view/-/3d-view-2.0.1.tgz#2e174571c48215736b376bb66938a3513dad2179" + integrity sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA== + dependencies: + matrix-camera-controller "^2.1.1" + orbit-camera-controller "^4.0.0" + turntable-camera-controller "^3.0.0" + "@babel/code-frame@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -1201,6 +1210,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@choojs/findup@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" + integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== + dependencies: + commander "^2.15.1" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1591,6 +1607,56 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@mapbox/geojson-rewind@^0.5.0": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz#adbe16dc683eb40e90934c51a5e28c7bbf44f4e1" + integrity sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA== + dependencies: + get-stream "^6.0.1" + minimist "^1.2.5" + +"@mapbox/geojson-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" + integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== + +"@mapbox/jsonlint-lines-primitives@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= + +"@mapbox/mapbox-gl-supported@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" + integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= + +"@mapbox/tiny-sdf@^1.1.1": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" + integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== + "@material-ui/core@^4.11.2": version "4.12.3" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz#80d665caf0f1f034e52355c5450c0e38b099d3ca" @@ -1699,6 +1765,46 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@plotly/d3-sankey-circular@0.33.1": + version "0.33.1" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" + integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== + dependencies: + d3-array "^1.2.1" + d3-collection "^1.0.4" + d3-shape "^1.2.0" + elementary-circuits-directed-graph "^1.0.4" + +"@plotly/d3-sankey@0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" + integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== + dependencies: + d3-array "1" + d3-collection "1" + d3-shape "^1.2.0" + +"@plotly/d3@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@plotly/d3/-/d3-3.8.0.tgz#760d41985ad76de4cbabe6c0a785bc713bea8433" + integrity sha512-L10iHgzvw3uSic/nQpYehlNzxUQvImwms5U7S95pJAEhrllzkrdQNy1Mc5DW9ab881Yr4fh300gJztKXWZDfkQ== + +"@plotly/point-cluster@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@plotly/point-cluster/-/point-cluster-3.1.9.tgz#8ffec77fbf5041bf15401079e4fdf298220291c1" + integrity sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw== + dependencies: + array-bounds "^1.0.1" + binary-search-bounds "^2.0.4" + clamp "^1.0.1" + defined "^1.0.0" + dtype "^2.0.0" + flatten-vertex-data "^1.0.2" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + "@pmmmwh/react-refresh-webpack-plugin@0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" @@ -1981,6 +2087,42 @@ resolved "https://registry.yarnpkg.com/@trussworks/react-uswds/-/react-uswds-1.11.0.tgz#f5f01247038792e8fec40c828e32bc78bcc04c95" integrity sha512-wIFzLM/1aJ0enyt42YFcJRSlEALfRU2qPaVK5955mHmP083l9o2CrnmJDK7La8ebrNxtyhhgrx76K3PwFgRCjQ== +"@turf/area@^6.4.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" + integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/bbox@^6.4.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" + integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/centroid@^6.0.2": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" + integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== + dependencies: + "@turf/helpers" "^6.5.0" + "@turf/meta" "^6.5.0" + +"@turf/helpers@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" + integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== + +"@turf/meta@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" + integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== + dependencies: + "@turf/helpers" "^6.5.0" + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -2517,11 +2659,25 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +a-big-triangle@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" + integrity sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q= + dependencies: + gl-buffer "^2.1.1" + gl-vao "^1.2.0" + weak-map "^1.0.5" + abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== +abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2563,6 +2719,13 @@ acorn@^8.2.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== +add-line-numbers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" + integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= + dependencies: + pad-left "^1.0.2" + address@1.1.2, address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" @@ -2576,6 +2739,13 @@ adjust-sourcemap-loader@3.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" +affine-hull@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" + integrity sha1-dj/x040GPOt+Jy8X7k17vK+QXF0= + dependencies: + robust-orientation "^1.1.3" + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2636,6 +2806,27 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" +almost-equal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" + integrity sha1-+FHGMROHV5lCdqou++jfowZszN0= + +alpha-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-complex/-/alpha-complex-1.0.0.tgz#90865870d6b0542ae73c0c131d4ef989669b72d2" + integrity sha1-kIZYcNawVCrnPAwTHU75iWabctI= + dependencies: + circumradius "^1.0.0" + delaunay-triangulate "^1.1.6" + +alpha-shape@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/alpha-shape/-/alpha-shape-1.0.0.tgz#c83109923ecfda667d2163fe4f26fe24726f64a9" + integrity sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk= + dependencies: + alpha-complex "^1.0.0" + simplicial-complex-boundary "^1.0.0" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" @@ -2753,6 +2944,16 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-bounds@^1.0.0, array-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" + integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== + +array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2774,6 +2975,23 @@ array-includes@^3.1.1, array-includes@^3.1.3: get-intrinsic "^1.1.1" is-string "^1.0.5" +array-normalize@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" + integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== + dependencies: + array-bounds "^1.0.0" + +array-range@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" + integrity sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w= + +array-rearrange@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" + integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2905,6 +3123,16 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atob-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" + integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= + +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -3138,6 +3366,13 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +barycentric@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/barycentric/-/barycentric-1.0.1.tgz#f1562bb891b26f4fec463a82eeda3657800ec688" + integrity sha1-8VYruJGyb0/sRjqC7to2V4AOxog= + dependencies: + robust-linear-solve "^1.0.0" + base64-js@^1.0.2: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3171,6 +3406,15 @@ bfj@^7.0.2: hoopy "^0.1.4" tryer "^1.0.1" +big-rat@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/big-rat/-/big-rat-1.0.4.tgz#768d093bb57930dd18ed575c7fca27dc5391adea" + integrity sha1-do0JO7V5MN0Y7Vdcf8on3FORreo= + dependencies: + bit-twiddle "^1.0.2" + bn.js "^4.11.6" + double-bits "^1.1.1" + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3186,6 +3430,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz#125e5bd399882f71e6660d4bf1186384e989fba7" + integrity sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA== + bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -3193,6 +3442,31 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" + integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= + +bit-twiddle@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" + integrity sha1-wurruVKjuUrMFASX4c3NLxoz9Y4= + +bitmap-sdf@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" + integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== + dependencies: + clamp "^1.0.1" + +bl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" + integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -3205,7 +3479,7 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.6, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== @@ -3248,6 +3522,26 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +boundary-cells@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.2.tgz#ed28c5a2eb36500413e5714f8eec862ad8ffec14" + integrity sha512-/S48oUFYEgZMNvdqC87iYRbLBAPHYijPRNrNpm/sS8u7ijIViKm/hrV3YD4sx/W68AsG5zLMyBEditVHApHU5w== + +box-intersect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/box-intersect/-/box-intersect-1.0.2.tgz#4693ad63e828868d0654b114e09364d6281f3fbd" + integrity sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw== + dependencies: + bit-twiddle "^1.0.2" + typedarray-pool "^1.1.0" + +"box-intersect@github:plotly/box-intersect#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/box-intersect/tar.gz/1c21ef897c37eb69e5c1efeca7087726dd8d6a23" + dependencies: + bit-twiddle "^1.0.2" + typedarray-pool "^1.1.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3554,6 +3848,13 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can dependencies: nanocolors "^0.1.0" +canvas-fit@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" + integrity sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8= + dependencies: + element-size "^1.1.1" + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3566,6 +3867,20 @@ case-sensitive-paths-webpack-plugin@2.3.0: resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== +cdt2d@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cdt2d/-/cdt2d-1.0.0.tgz#4f212434bcd67bdb3d68b8fef4acdc2c54415141" + integrity sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE= + dependencies: + binary-search-bounds "^2.0.3" + robust-in-sphere "^1.1.3" + robust-orientation "^1.1.3" + +cell-orientation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cell-orientation/-/cell-orientation-1.0.1.tgz#b504ad96a66ad286d9edd985a2253d03b80d2850" + integrity sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA= + chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3663,11 +3978,31 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circumcenter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumcenter/-/circumcenter-1.0.0.tgz#20d7aa13b17fbac52f52da4f54c6ac8b906ee529" + integrity sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk= + dependencies: + dup "^1.0.0" + robust-linear-solve "^1.0.0" + +circumradius@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/circumradius/-/circumradius-1.0.0.tgz#706c447e3e55cd1ed3d11bd133e37c252cc305b5" + integrity sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU= + dependencies: + circumcenter "^1.0.0" + cjs-module-lexer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +clamp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" + integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -3700,6 +4035,19 @@ clean-css@^4.2.3: dependencies: source-map "~0.6.0" +clean-pslg@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/clean-pslg/-/clean-pslg-1.1.2.tgz#bd35c7460b7e8ab5a9f761a5ed51796aa3c86c11" + integrity sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE= + dependencies: + big-rat "^1.0.3" + box-intersect "^1.0.1" + nextafter "^1.0.0" + rat-vec "^1.1.1" + robust-segment-intersect "^1.0.1" + union-find "^1.0.2" + uniq "^1.0.1" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3755,6 +4103,20 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" +color-alpha@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.0.4.tgz#c141dc926e95fc3db647d0e14e5bc3651c29e040" + integrity sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A== + dependencies: + color-parse "^1.3.8" + +color-alpha@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" + integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== + dependencies: + color-parse "^1.4.1" + color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3769,6 +4131,13 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-id@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" + integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== + dependencies: + clamp "^1.0.1" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -3779,6 +4148,64 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-normalize@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.0.tgz#ee610af9acb15daf73e77a945a847b18e40772da" + integrity sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw== + dependencies: + clamp "^1.0.1" + color-rgba "^2.1.1" + dtype "^2.0.0" + +color-normalize@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" + integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== + dependencies: + color-rgba "^2.2.0" + dtype "^2.0.0" + +color-parse@1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.3.8.tgz#eaf54cd385cb34c0681f18c218aca38478082fa3" + integrity sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA== + dependencies: + color-name "^1.0.0" + defined "^1.0.0" + is-plain-obj "^1.1.0" + +color-parse@^1.3.8, color-parse@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" + integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== + dependencies: + color-name "^1.0.0" + +color-rgba@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.1.1.tgz#4633b83817c7406c90b3d7bf4d1acfa48dde5c83" + integrity sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw== + dependencies: + clamp "^1.0.1" + color-parse "^1.3.8" + color-space "^1.14.6" + +color-rgba@^2.1.1, color-rgba@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.3.0.tgz#d5eb481d7933d2542d1f222ea10ad40d159e9d35" + integrity sha512-z/5fMOY8/IzrBHPBk+n3ATNSM/1atXcHCRPTGPLlzYJ4fn7CRD46zzt3lkLtQ44cL8UIUU4JBXDVrhWj1khiwg== + dependencies: + color-parse "^1.4.1" + color-space "^1.14.6" + +color-space@^1.14.6: + version "1.16.0" + resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" + integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== + dependencies: + hsluv "^0.0.3" + mumath "^3.3.4" + color-string@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" @@ -3800,6 +4227,13 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== +colormap@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/colormap/-/colormap-2.3.2.tgz#4422c1178ce563806e265b96782737be85815abf" + integrity sha512-jDOjaoEEmA9AgA11B/jCSAvYE95r3wRoAyTf3LEHGiUVlNHJaL1mRkf5AyLSpQBVGfTEPwGEqCIzL+kgr2WgNA== + dependencies: + lerp "^1.0.3" + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3807,7 +4241,7 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^2.20.0: +commander@2, commander@^2.15.1, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3827,6 +4261,30 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-angle@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-angle/-/compare-angle-1.0.1.tgz#a4eb63416ea3c747fc6bd6c8b63668b4de4fa129" + integrity sha1-pOtjQW6jx0f8a9bItjZotN5PoSk= + dependencies: + robust-orientation "^1.0.2" + robust-product "^1.0.0" + robust-sum "^1.0.0" + signum "^0.0.0" + two-sum "^1.0.0" + +compare-cell@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/compare-cell/-/compare-cell-1.0.0.tgz#a9eb708f6e0e41aef7aa566b130f1968dc9e1aaa" + integrity sha1-qetwj24OQa73qlZrEw8ZaNyeGqo= + +compare-oriented-cell@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz#6a149feef9dfc4f8fc62358e51dd42effbbdc39e" + integrity sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -3859,6 +4317,17 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" +compute-dims@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" + integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== + dependencies: + utils-copy "^1.0.0" + validate.io-array "^1.0.6" + validate.io-matrix-like "^1.0.2" + validate.io-ndarray-like "^1.0.0" + validate.io-positive-integer "^1.0.0" + compute-scroll-into-view@^1.0.9: version "1.0.17" resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab" @@ -3869,7 +4338,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3910,6 +4379,16 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-2.0.2.tgz#da8d8f8c2b232831413d9e190dc11669c79f4a91" integrity sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ== +const-max-uint32@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" + integrity sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY= + +const-pinf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" + integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -3946,6 +4425,15 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +convex-hull@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" + integrity sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8= + dependencies: + affine-hull "^1.0.0" + incremental-convex-hull "^1.0.1" + monotone-convex-hull-2d "^1.0.1" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -4033,6 +4521,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +country-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" + integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -4140,6 +4633,46 @@ css-declaration-sorter@^4.0.1: postcss "^7.0.1" timsort "^0.3.0" +css-font-size-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" + integrity sha1-hUh1rOmspqjS7g00WkSq6btttss= + +css-font-stretch-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" + integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA= + +css-font-style-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" + integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ= + +css-font-weight-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" + integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc= + +css-font@^1.0.0, css-font@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" + integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== + dependencies: + css-font-size-keywords "^1.0.0" + css-font-stretch-keywords "^1.0.1" + css-font-style-keywords "^1.0.1" + css-font-weight-keywords "^1.0.0" + css-global-keywords "^1.0.1" + css-system-font-keywords "^1.0.0" + pick-by-alias "^1.2.0" + string-split-by "^1.0.0" + unquote "^1.1.0" + +css-global-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" + integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= + css-has-pseudo@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" @@ -4204,6 +4737,11 @@ css-select@^4.1.3: domutils "^2.6.0" nth-check "^2.0.0" +css-system-font-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" + integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0= + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -4262,6 +4800,11 @@ css@^3.0.0: source-map "^0.6.1" source-map-resolve "^0.6.0" +csscolorparser@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= + cssdb@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" @@ -4379,11 +4922,121 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== +cubic-hermite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" + integrity sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU= + +cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" + integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= + dependencies: + uniq "^1.0.0" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +d3-array@1, d3-array@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-collection@1, d3-collection@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +d3-force@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-format@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +d3-geo-projection@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz#826db62f748e8ecd67cd00aced4c26a236ec030c" + integrity sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ== + dependencies: + commander "2" + d3-array "1" + d3-geo "^1.12.0" + resolve "^1.1.10" + +d3-geo@^1.12.0, d3-geo@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-hierarchy@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-interpolate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-time-format@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" + integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== + dependencies: + d3-time "1" + +d3-time@1, d3-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" @@ -4411,7 +5064,7 @@ date-fns@^1.29.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4516,6 +5169,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -4543,6 +5201,14 @@ del@^6.0.0: rimraf "^3.0.2" slash "^3.0.0" +delaunay-triangulate@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz#5bbca21b078198d4bc3c75796a35cbb98c25954c" + integrity sha1-W7yiGweBmNS8PHV5ajXLuYwllUw= + dependencies: + incremental-convex-hull "^1.0.1" + uniq "^1.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4571,6 +5237,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-kerning@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" + integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -4779,6 +5450,11 @@ dotenv@8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +double-bits@^1.1.0, double-bits@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" + integrity sha1-WKu6RUlNpND6Nrc60RoobJGEscY= + downshift@3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/downshift/-/downshift-3.2.7.tgz#0c40d78d1cbc24753c7a622cfc664df1c9480b4a" @@ -4808,12 +5484,30 @@ draftjs-utils@^0.10.2: resolved "https://registry.yarnpkg.com/draftjs-utils/-/draftjs-utils-0.10.2.tgz#a7f16d2c1c174ac38ba3bbf700c256f176b2699c" integrity sha512-EstHqr3R3JVcilJrBaO/A+01GvwwKmC7e4TCjC7S94ZeMh4IVmf60OuQXtHHpwItK8C2JCi3iljgN5KHkJboUg== +draw-svg-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" + integrity sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k= + dependencies: + abs-svg-path "~0.1.1" + normalize-svg-path "~0.1.0" + +dtype@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" + integrity sha1-zQUjI84GFETs0uj1dI9popvihDQ= + +dup@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" + integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= + duplexer@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^3.4.2, duplexify@^3.6.0: +duplexify@^3.4.2, duplexify@^3.4.5, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== @@ -4823,6 +5517,18 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +earcut@^2.1.5, earcut@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" + integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== + +edges-to-adjacency-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz#c146d2e084addfba74a51293c6e0199a49f757f1" + integrity sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E= + dependencies: + uniq "^1.0.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4843,8 +5549,20 @@ element-closest@^2.0.1: resolved "https://registry.yarnpkg.com/element-closest/-/element-closest-2.0.2.tgz#72a740a107453382e28df9ce5dbb5a8df0f966ec" integrity sha1-cqdAoQdFM4LijfnOXbtajfD5Zuw= -elliptic@^6.5.3: - version "6.5.4" +element-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" + integrity sha1-ZOXxWdlxIWMYRby67K8nnDm1404= + +elementary-circuits-directed-graph@^1.0.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz#31c5a1c69517de833127247e5460472168e9e1c1" + integrity sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ== + dependencies: + strongly-connected-components "^1.0.1" + +elliptic@^6.5.3: + version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: @@ -4986,7 +5704,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: version "0.10.53" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== @@ -4995,7 +5713,7 @@ es5-ext@^0.10.35, es5-ext@^0.10.50: es6-symbol "~3.1.3" next-tick "~1.0.0" -es6-iterator@2.0.3, es6-iterator@~2.0.3: +es6-iterator@2.0.3, es6-iterator@^2.0.3, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= @@ -5012,6 +5730,16 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5037,6 +5765,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -5306,7 +6046,7 @@ esrecurse@^4.1.0, esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -5346,7 +6086,7 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: +events@^3.0.0, events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -5501,6 +6241,21 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-frustum-planes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" + integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= + +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5517,6 +6272,13 @@ fast-glob@^3.1.1: merge2 "^1.3.0" micromatch "^4.0.4" +fast-isnumeric@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" + integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== + dependencies: + is-string-blank "^1.0.1" + fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -5649,6 +6411,14 @@ filter-obj@^1.1.0: resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= +filtered-vector@^1.2.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/filtered-vector/-/filtered-vector-1.2.5.tgz#5a831278c159721dd3be34ef017842836ef3d461" + integrity sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw== + dependencies: + binary-search-bounds "^2.0.0" + cubic-hermite "^1.0.0" + final-form-arrays@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/final-form-arrays/-/final-form-arrays-3.0.2.tgz#9f3bef778dec61432357744eb6f3abef7e7f3847" @@ -5727,11 +6497,23 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +flatten-vertex-data@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" + integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== + dependencies: + dtype "^2.0.0" + flatten@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flip-pixels@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" + integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -5745,11 +6527,30 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== +font-atlas@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" + integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== + dependencies: + css-font "^1.0.0" + +font-measure@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" + integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== + dependencies: + css-font "^1.2.0" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + fork-ts-checker-webpack-plugin@4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" @@ -5789,7 +6590,7 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.0: +from2@^2.1.0, from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -5885,7 +6686,7 @@ function.prototype.name@^1.1.2: es-abstract "^1.18.0-next.2" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: +functional-red-black-tree@^1.0.0, functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= @@ -5895,16 +6696,31 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== +gamma@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/gamma/-/gamma-0.1.0.tgz#3315643403bf27906ca80ab37c36ece9440ef330" + integrity sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA= + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +geojson-vt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== + get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-canvas-context@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" + integrity sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM= + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -5938,6 +6754,11 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -5951,6 +6772,363 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +gl-axes3d@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.3.tgz#47e3dd6c21356a59349910ec01af58e28ea69fe9" + integrity sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ== + dependencies: + bit-twiddle "^1.0.2" + dup "^1.0.0" + extract-frustum-planes "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-state "^1.0.0" + gl-vao "^1.3.0" + gl-vec4 "^1.0.1" + glslify "^7.0.0" + robust-orientation "^1.1.3" + split-polygon "^1.0.0" + vectorize-text "^3.2.1" + +gl-buffer@^2.1.1, gl-buffer@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" + integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.1.0" + typedarray-pool "^1.0.0" + +gl-cone3d@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.5.2.tgz#66af5c33b7d5174034dfa3654a88e995998d92bc" + integrity sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw== + dependencies: + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + gl-vec3 "^1.1.3" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" + integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= + +gl-error3d@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.16.tgz#88a94952f5303d9cf5cb86806789a360777c5446" + integrity sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + +gl-fbo@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" + integrity sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI= + dependencies: + gl-texture2d "^2.0.0" + +gl-format-compiler-error@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" + integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= + dependencies: + add-line-numbers "^1.0.1" + gl-constants "^1.0.0" + glsl-shader-name "^1.0.0" + sprintf-js "^1.0.3" + +gl-heatmap2d@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.1.1.tgz#dbbb2c288bfe277002fa50985155b0403d87640f" + integrity sha512-6Vo1fPIB1vQFWBA/MR6JAA16XuQuhwvZRbSjYEq++m4QV33iqjGS2HcVIRfJGX+fomd5eiz6bwkVZcKm69zQPw== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + iota-array "^1.0.0" + typedarray-pool "^1.2.0" + +gl-line3d@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.2.1.tgz#632fc5b931a84a315995322b271aaf497e292609" + integrity sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + ndarray "^1.0.18" + +gl-mat3@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-mat3/-/gl-mat3-1.0.0.tgz#89633219ca429379a16b9185d95d41713453b912" + integrity sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI= + +gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2, gl-mat4@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" + integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== + +gl-matrix@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== + +gl-mesh3d@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz#087a93c5431df923570ca51cfc691bab0d21a6b8" + integrity sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA== + dependencies: + barycentric "^1.0.1" + colormap "^2.3.1" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + ndarray "^1.0.18" + normals "^1.1.0" + polytope-closest-point "^1.0.0" + simplicial-complex-contour "^1.0.2" + typedarray-pool "^1.1.0" + +gl-plot2d@^1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.5.tgz#6412b8b3f8df3e7d89c5955daac7059e04d657d4" + integrity sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog== + dependencies: + binary-search-bounds "^2.0.4" + gl-buffer "^2.1.2" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + glsl-inverse "^1.0.0" + glslify "^7.0.0" + text-cache "^4.2.2" + +gl-plot3d@^2.4.7: + version "2.4.7" + resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-2.4.7.tgz#b66e18c5affdd664f42c884acf7b82c60b41ee78" + integrity sha512-mLDVWrl4Dj0O0druWyHUK5l7cBQrRIJRn2oROEgrRuOgbbrLAzsREKefwMO0bA0YqkiZMFMnV5VvPA9j57X5Xg== + dependencies: + "3d-view" "^2.0.0" + a-big-triangle "^1.0.3" + gl-axes3d "^1.5.3" + gl-fbo "^2.0.5" + gl-mat4 "^1.2.0" + gl-select-static "^2.0.7" + gl-shader "^4.2.1" + gl-spikes3d "^1.0.10" + glslify "^7.0.0" + has-passive-events "^1.0.0" + is-mobile "^2.2.1" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + ndarray "^1.0.19" + right-now "^1.0.0" + +gl-pointcloud2d@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz#f37e215f21ccb2e17f0604664e99fc3d6a4e611d" + integrity sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + typedarray-pool "^1.1.0" + +gl-quat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-quat/-/gl-quat-1.0.0.tgz#0945ec923386f45329be5dc357b1c8c2d47586c5" + integrity sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU= + dependencies: + gl-mat3 "^1.0.0" + gl-vec3 "^1.0.3" + gl-vec4 "^1.0.0" + +gl-scatter3d@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz#83d63700ec2fe4e95b3d1cd613e86de9a6b5f603" + integrity sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw== + dependencies: + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + is-string-blank "^1.0.1" + typedarray-pool "^1.1.0" + vectorize-text "^3.2.1" + +gl-select-box@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.4.tgz#47c11caa2b84f81e8bbfde08c6e39eeebb53d3d8" + integrity sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + glslify "^7.0.0" + +gl-select-static@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.7.tgz#ce7eb05ae0139009c15e2d2d0d731600b3dae5c0" + integrity sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw== + dependencies: + bit-twiddle "^1.0.2" + gl-fbo "^2.0.5" + ndarray "^1.0.18" + typedarray-pool "^1.1.0" + +gl-shader@4.3.1, gl-shader@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.3.1.tgz#56094cf3c06e802ac6c286b3b2166abce901d882" + integrity sha512-xLoN6XtRLlg97SEqtuzfKc+pVWpVkQ3YjDI1kuCale8tF7+zMhiKlMfmG4IMQPMdKJZQbIc/Ny8ZusEpfh5U+w== + dependencies: + gl-format-compiler-error "^1.0.2" + weakmap-shim "^1.1.0" + +gl-spikes2d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" + integrity sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA== + +gl-spikes3d@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz#e3b2b677a6f51750f23c064447af4f093da79305" + integrity sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg== + dependencies: + gl-buffer "^2.1.2" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glslify "^7.0.0" + +gl-state@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gl-state/-/gl-state-1.0.0.tgz#262faa75835b0b9c532c12f38adc425d1d30cd17" + integrity sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc= + dependencies: + uniq "^1.0.0" + +gl-streamtube3d@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz#bd2b725e00aa96989ce34b06ebf66a76f93e35ae" + integrity sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA== + dependencies: + gl-cone3d "^1.5.2" + gl-vec3 "^1.1.3" + gl-vec4 "^1.0.1" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glsl-specular-cook-torrance "^2.0.1" + glslify "^7.0.0" + +gl-surface3d@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.6.0.tgz#5fc915759a91e9962dcfbf3982296c462a032526" + integrity sha512-x15+u4712ysnB85G55RLJEml6mOB4VaDn0VTlXCc9JcjRl5Es10Tk7lhGGyiPtkCfHwvhnkxzYA1/rHHYN7Y0A== + dependencies: + binary-search-bounds "^2.0.4" + bit-twiddle "^1.0.2" + colormap "^2.3.1" + dup "^1.0.0" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" + gl-texture2d "^2.1.0" + gl-vao "^1.3.0" + glsl-out-of-range "^1.0.4" + glsl-specular-beckmann "^1.1.2" + glslify "^7.0.0" + ndarray "^1.0.18" + ndarray-gradient "^1.0.0" + ndarray-ops "^1.2.2" + ndarray-pack "^1.2.1" + ndarray-scratch "^1.2.0" + surface-nets "^1.0.2" + typedarray-pool "^1.1.0" + +gl-text@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" + integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== + dependencies: + bit-twiddle "^1.0.2" + color-normalize "^1.5.0" + css-font "^1.2.0" + detect-kerning "^2.1.2" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + font-atlas "^2.1.0" + font-measure "^1.2.2" + gl-util "^3.1.2" + is-plain-obj "^1.1.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + parse-unit "^1.0.1" + pick-by-alias "^1.2.0" + regl "^2.0.0" + to-px "^1.0.1" + typedarray-pool "^1.1.0" + +gl-texture2d@^2.0.0, gl-texture2d@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" + integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= + dependencies: + ndarray "^1.0.15" + ndarray-ops "^1.2.2" + typedarray-pool "^1.1.0" + +gl-util@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" + integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== + dependencies: + is-browser "^2.0.1" + is-firefox "^1.0.3" + is-plain-obj "^1.1.0" + number-is-integer "^1.0.1" + object-assign "^4.1.0" + pick-by-alias "^1.2.0" + weak-map "^1.0.5" + +gl-vao@^1.2.0, gl-vao@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" + integrity sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM= + +gl-vec3@^1.0.2, gl-vec3@^1.0.3, gl-vec3@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" + integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== + +gl-vec4@^1.0.0, gl-vec4@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gl-vec4/-/gl-vec4-1.0.1.tgz#97d96878281b14b532cbce101785dfd1cb340964" + integrity sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ= + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -6054,11 +7232,173 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +glsl-inject-defines@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" + integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= + dependencies: + glsl-token-inject-block "^1.0.0" + glsl-token-string "^1.0.1" + glsl-tokenizer "^2.0.2" + +glsl-inverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" + integrity sha1-EsCx0GX1WERNHm/q95td34qRiuY= + +glsl-out-of-range@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" + integrity sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ== + +glsl-resolve@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" + integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= + dependencies: + resolve "^0.6.1" + xtend "^2.1.2" + +glsl-shader-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" + integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= + dependencies: + atob-lite "^1.0.0" + glsl-tokenizer "^2.0.2" + +glsl-specular-beckmann@^1.1.1, glsl-specular-beckmann@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz#fce9056933ecdf2456278376a54d082893e775f1" + integrity sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE= + +glsl-specular-cook-torrance@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz#a891cc06c8c7b4f4728702b4824fdacbb967d78f" + integrity sha1-qJHMBsjHtPRyhwK0gk/ay7ln148= + dependencies: + glsl-specular-beckmann "^1.1.1" + +glsl-token-assignments@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" + integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= + +glsl-token-defines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" + integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= + dependencies: + glsl-tokenizer "^2.0.0" + +glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" + integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= + +glsl-token-descope@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" + integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= + dependencies: + glsl-token-assignments "^2.0.0" + glsl-token-depth "^1.1.0" + glsl-token-properties "^1.0.0" + glsl-token-scope "^1.1.0" + +glsl-token-inject-block@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" + integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= + +glsl-token-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" + integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= + +glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" + integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= + +glsl-token-string@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" + integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= + +glsl-token-whitespace-trim@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" + integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= + +glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + +glslify-bundle@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" + integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== + dependencies: + glsl-inject-defines "^1.0.1" + glsl-token-defines "^1.0.0" + glsl-token-depth "^1.1.1" + glsl-token-descope "^1.0.2" + glsl-token-scope "^1.1.1" + glsl-token-string "^1.0.1" + glsl-token-whitespace-trim "^1.0.0" + glsl-tokenizer "^2.0.2" + murmurhash-js "^1.0.0" + shallow-copy "0.0.1" + +glslify-deps@^1.2.5: + version "1.3.2" + resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" + integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== + dependencies: + "@choojs/findup" "^0.2.0" + events "^3.2.0" + glsl-resolve "0.0.1" + glsl-tokenizer "^2.0.0" + graceful-fs "^4.1.2" + inherits "^2.0.1" + map-limit "0.0.1" + resolve "^1.0.0" + +glslify@^7.0.0, glslify@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" + integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== + dependencies: + bl "^2.2.1" + concat-stream "^1.5.2" + duplexify "^3.4.5" + falafel "^2.1.0" + from2 "^2.3.0" + glsl-resolve "0.0.1" + glsl-token-whitespace-trim "^1.0.0" + glslify-bundle "^5.0.0" + glslify-deps "^1.2.5" + minimist "^1.2.5" + resolve "^1.1.5" + stack-trace "0.0.9" + static-eval "^2.0.5" + through2 "^2.0.1" + xtend "^4.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +grid-index@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -6097,6 +7437,20 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-hover@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" + integrity sha1-PZdDeusZnGK4rAisvcU9O8UsF/c= + dependencies: + is-browser "^2.0.1" + +has-passive-events@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" + integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== + dependencies: + is-browser "^2.0.1" + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" @@ -6232,6 +7586,11 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= +hsluv@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" + integrity sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw= + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -6396,7 +7755,7 @@ hyphenate-style-name@^1.0.0, hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== -iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6417,7 +7776,7 @@ identity-obj-proxy@3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.4: +ieee754@^1.1.12, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6437,6 +7796,15 @@ ignore@^5.1.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +image-palette@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" + integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== + dependencies: + color-id "^1.1.0" + pxls "^2.0.0" + quantize "^1.0.2" + immer@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" @@ -6503,6 +7871,21 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +incremental-convex-hull@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" + integrity sha1-UUKMFMudmmFEv+abKFH7N3M0vh4= + dependencies: + robust-orientation "^1.1.2" + simplicial-complex "^1.0.0" + +"incremental-convex-hull@github:plotly/incremental-convex-hull#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/incremental-convex-hull/tar.gz/352d9e73861913695fd4e1a4c6ad79898c0c8268" + dependencies: + robust-orientation "^1.1.2" + simplicial-complex "^1.0.0" + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -6568,6 +7951,23 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +interval-tree-1d@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz#b44f657de7ddae69ea3f98e0a9ad4bb046b07d11" + integrity sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ== + dependencies: + binary-search-bounds "^2.0.0" + +invert-permutation@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-permutation/-/invert-permutation-1.0.0.tgz#a0a78042eadb36bc17551e787efd1439add54933" + integrity sha1-oKeAQurbNrwXVR54fv0UOa3VSTM= + +iota-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" + integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= + ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -6625,6 +8025,11 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-base64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" + integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -6646,6 +8051,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-blob@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" + integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== + is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" @@ -6654,11 +8064,21 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: +is-browser@^2.0.1, is-browser@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" + integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== + +is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-buffer@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -6756,6 +8176,21 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-firefox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" + integrity sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI= + +is-float-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" + integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -6785,11 +8220,21 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-iexplorer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" + integrity sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY= + is-in-browser@^1.0.2, is-in-browser@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= +is-mobile@^2.2.1, is-mobile@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" + integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -6853,7 +8298,7 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -6908,6 +8353,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string-blank@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" + integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -6920,6 +8370,11 @@ is-subset@^0.1.1: resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= +is-svg-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" + integrity sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA= + is-symbol@^1.0.1, is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" @@ -6964,6 +8419,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7689,6 +9149,11 @@ jss@10.8.0, jss@^10.5.1: array-includes "^3.1.3" object.assign "^4.1.2" +kdbush@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" + integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== + keyboardevent-key-polyfill@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/keyboardevent-key-polyfill/-/keyboardevent-key-polyfill-1.1.0.tgz#8a319d8e45a13172fca56286372f90c1d4c7014c" @@ -7753,6 +9218,11 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" +lerp@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lerp/-/lerp-1.0.3.tgz#a18c8968f917896de15ccfcc28d55a6b731e776e" + integrity sha1-oYyJaPkXiW3hXM/MKNVaa3Med24= + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -7993,6 +9463,13 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-limit@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= + dependencies: + once "~1.3.0" + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -8000,6 +9477,68 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +mapbox-gl@1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" + integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== + dependencies: + "@mapbox/geojson-rewind" "^0.5.0" + "@mapbox/geojson-types" "^1.0.2" + "@mapbox/jsonlint-lines-primitives" "^2.0.2" + "@mapbox/mapbox-gl-supported" "^1.5.0" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/tiny-sdf" "^1.1.1" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.1.0" + csscolorparser "~1.0.3" + earcut "^2.2.2" + geojson-vt "^3.2.1" + gl-matrix "^3.2.1" + grid-index "^1.1.0" + minimist "^1.2.5" + murmurhash-js "^1.0.0" + pbf "^3.2.1" + potpack "^1.0.1" + quickselect "^2.0.0" + rw "^1.3.3" + supercluster "^7.0.0" + tinyqueue "^2.0.3" + vt-pbf "^3.1.1" + +marching-simplex-table@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz#bc16256e0f8f9b558aa9b2872f8832d9433f52ea" + integrity sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo= + dependencies: + convex-hull "^1.0.3" + +mat4-decompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-decompose/-/mat4-decompose-1.0.4.tgz#65eb4fe39d70878f7a444eb4624d52f7e7eb2faf" + integrity sha1-ZetP451wh496RE60Yk1S9+frL68= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + +mat4-interpolate@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz#55ffe9eb3c35295e2c0d5a9f7725d9068a89ff74" + integrity sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q= + dependencies: + gl-mat4 "^1.0.1" + gl-vec3 "^1.0.2" + mat4-decompose "^1.0.3" + mat4-recompose "^1.0.3" + quat-slerp "^1.0.0" + +mat4-recompose@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mat4-recompose/-/mat4-recompose-1.0.4.tgz#3953c230ff2473dc772ee014a52c925cf81b0e4d" + integrity sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0= + dependencies: + gl-mat4 "^1.0.1" + matches-selector@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/matches-selector/-/matches-selector-1.2.0.tgz#d1814e7e8f43e69d22ac33c9af727dc884ecf12a" @@ -8012,6 +9551,21 @@ matchmediaquery@^0.3.0: dependencies: css-mediaquery "^0.1.2" +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + integrity sha1-+4lBvl9evol55xjmJzsXjlhpRWU= + +matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz#d316ae5e99fe801610c1d7842ab54566d4c62411" + integrity sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA== + dependencies: + binary-search-bounds "^2.0.0" + gl-mat4 "^1.1.2" + gl-vec3 "^1.0.3" + mat4-interpolate "^1.0.3" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -8278,6 +9832,39 @@ moment-timezone@^0.5.33: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== +monotone-convex-hull-2d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" + integrity sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw= + dependencies: + robust-orientation "^1.1.3" + +mouse-change@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" + integrity sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8= + dependencies: + mouse-event "^1.0.0" + +mouse-event-offset@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" + integrity sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ= + +mouse-event@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" + integrity sha1-s3ie23EJmX1aky0dAdqhVDpQFzI= + +mouse-wheel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" + integrity sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w= + dependencies: + right-now "^1.0.0" + signum "^1.0.0" + to-px "^1.0.1" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -8323,6 +9910,18 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" +mumath@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" + integrity sha1-SNSg8P2MrU57Mglu6JsWGmPTC78= + dependencies: + almost-equal "^1.1.0" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + mutationobserver-shim@^0.3.7: version "0.3.7" resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz#8bf633b0c0b0291a1107255ed32c13088a8c5bf3" @@ -8360,6 +9959,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + integrity sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE= + native-url@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" @@ -8372,6 +9976,108 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +ndarray-extract-contour@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz#0aee113a3a33b226b90c4888cf877bf4751305e4" + integrity sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ= + dependencies: + typedarray-pool "^1.0.0" + +"ndarray-extract-contour@github:plotly/ndarray-extract-contour#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/ndarray-extract-contour/tar.gz/0d8ed3a2fee873f08868c35894d608794e8e9d83" + dependencies: + typedarray-pool "^1.0.0" + +ndarray-gradient@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-gradient/-/ndarray-gradient-1.0.1.tgz#16126a78ac241162248224aa662b6db6a5885402" + integrity sha512-+xONVi7xxTCGL6KOb11Yyoe0tPNqAUKF39CvFoRjL5pdOmPd2G2pckK9lD5bpLF3q45LLnYNyiUSJSdNmQ2MTg== + dependencies: + cwise-compiler "^1.0.0" + dup "^1.0.0" + +"ndarray-gradient@github:plotly/ndarray-gradient#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/ndarray-gradient/tar.gz/c43b0856d77084cfac7c9d96c6ddc73aeddc0bd8" + dependencies: + dup "^1.0.0" + +ndarray-linear-interpolate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz#78bc92b85b9abc15b6e67ee65828f9e2137ae72b" + integrity sha1-eLySuFuavBW25n7mWCj54hN65ys= + +ndarray-ops@^1.1.0, ndarray-ops@^1.2.1, ndarray-ops@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" + integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= + dependencies: + cwise-compiler "^1.0.0" + +"ndarray-ops@github:plotly/ndarray-ops#v1.3.0": + version "1.3.0" + resolved "https://codeload.github.com/plotly/ndarray-ops/tar.gz/afac881492696196c9966f77507558737f60c716" + +ndarray-pack@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" + integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= + dependencies: + cwise-compiler "^1.1.2" + ndarray "^1.0.13" + +"ndarray-pack@github:plotly/ndarray-pack#v1.3.0": + version "1.3.0" + resolved "https://codeload.github.com/plotly/ndarray-pack/tar.gz/b0cd1f835c2b623f860a3dbb0c5709c98b30aea0" + dependencies: + ndarray "^1.0.13" + +ndarray-scratch@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz#6304636d62eba93db4727ac13c693341dba50e01" + integrity sha1-YwRjbWLrqT20cnrBPGkzQdulDgE= + dependencies: + ndarray "^1.0.14" + ndarray-ops "^1.2.1" + typedarray-pool "^1.0.2" + +ndarray-sort@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ndarray-sort/-/ndarray-sort-1.0.1.tgz#fea05b4cb834c7f4e0216a354f3ca751300dfd6a" + integrity sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo= + dependencies: + typedarray-pool "^1.0.0" + +"ndarray-sort@github:plotly/ndarray-sort#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/ndarray-sort/tar.gz/8b3c03c0c58906640a0551505601544c9775a87a" + dependencies: + typedarray-pool "^1.0.0" + +ndarray@^1.0.11, ndarray@^1.0.13, ndarray@^1.0.14, ndarray@^1.0.15, ndarray@^1.0.18, ndarray@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" + integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== + dependencies: + iota-array "^1.0.0" + is-buffer "^1.0.2" + +"ndarray@github:plotly/ndarray#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/ndarray/tar.gz/70ec67233be65de444307a6916aba2655e28bd84" + dependencies: + is-buffer "^1.0.2" + +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -8387,6 +10093,13 @@ next-tick@~1.0.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +nextafter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" + integrity sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo= + dependencies: + double-bits "^1.1.0" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -8511,6 +10224,18 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= +normalize-svg-path@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" + integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-svg-path@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" + integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= + normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -8526,6 +10251,11 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normals@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" + integrity sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA= + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -8559,6 +10289,18 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= +number-is-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" + integrity sha1-5ZvKFy/+0nMY55x862y3LAlbIVI= + dependencies: + is-finite "^1.0.1" + +numeric@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/numeric/-/numeric-1.2.6.tgz#765b02bef97988fcf880d4eb3f36b80fa31335aa" + integrity sha1-dlsCvvl5iPz4gNTrPza4D6MTNao= + nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -8591,7 +10333,7 @@ object-is@^1.0.1, object-is@^1.1.2: call-bind "^1.0.2" define-properties "^1.1.3" -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.9, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -8689,6 +10431,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -8743,6 +10492,14 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +orbit-camera-controller@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz#6e2b36f0e7878663c330f50da9b7ce686c277005" + integrity sha1-bis28OeHhmPDMPUNqbfOaGwncAU= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.3" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -8836,6 +10593,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pad-left@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" + integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= + dependencies: + repeat-string "^1.3.0" + paginator@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/paginator/-/paginator-1.0.0.tgz#7565702af9ab9616dca61fc22c70eba2a4357265" @@ -8870,6 +10634,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parenthesis@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.7.tgz#01c89b603a2a6a262ec47554e74ed154a9be2aa6" + integrity sha512-iMtu+HCbLXVrpf6Ys/4YKhcFxbux3xK4ZVB9r+a2kMSqeeQWQoDNYlXIsOjwlT2ldYXZ3k5PVeBnYn7fbAo/Bg== + parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" @@ -8899,6 +10668,23 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-rect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" + integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== + dependencies: + pick-by-alias "^1.2.0" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= + +parse-unit@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" + integrity sha1-fhu21b7zh0wo45JSaiVBFwKR7s8= + parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -8996,6 +10782,14 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbf@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== + dependencies: + ieee754 "^1.1.12" + resolve-protobuf-schema "^2.1.0" + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -9012,6 +10806,26 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +permutation-parity@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-parity/-/permutation-parity-1.0.0.tgz#0174d51fca704b11b9a4b152b23d537fdc6b5ef4" + integrity sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ= + dependencies: + typedarray-pool "^1.0.0" + +permutation-rank@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/permutation-rank/-/permutation-rank-1.0.0.tgz#9fd98bbcecf08fbf5994b5eadc94a62e679483b5" + integrity sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U= + dependencies: + invert-permutation "^1.0.0" + typedarray-pool "^1.0.0" + +pick-by-alias@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" + integrity sha1-X3yysfIabh6ISgyHhVqko3NhEHs= + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -9086,11 +10900,123 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +planar-dual@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/planar-dual/-/planar-dual-1.0.2.tgz#b6a4235523b1b0cb79e5f926f8ea335dd982d563" + integrity sha1-tqQjVSOxsMt55fkm+OozXdmC1WM= + dependencies: + compare-angle "^1.0.0" + dup "^1.0.0" + +planar-graph-to-polyline@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.6.tgz#ed300620c33001ee2cca0ac6d1dae8d02d23f009" + integrity sha512-h8a9kdAjo7mRhC0X6HZ42xzFp7vKDZA+Hygyhsq/08Qi4vVAQYJaLLYLvKUUzRbVKvdYqq0reXHyV0EygyEBHA== + dependencies: + edges-to-adjacency-list "^1.0.0" + planar-dual "^1.0.0" + point-in-big-polygon "^2.0.1" + robust-orientation "^1.0.1" + robust-sum "^1.0.0" + two-product "^1.0.0" + uniq "^1.0.0" + plotly.js-basic-dist@^2.2.1: version "2.5.1" resolved "https://registry.yarnpkg.com/plotly.js-basic-dist/-/plotly.js-basic-dist-2.5.1.tgz#3652cce69c69241887f04b94d96fd5f672aa8601" integrity sha512-UeJEKrJl5m0DllgvKLV8qFk83BOOJZv9SA37a/7lvfyNeXIdj+gpVe56+0Bm0oLpqZI/Uqf9vNABuXXnNgMVMQ== +plotly.js@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-2.5.1.tgz#9cdb05fcb3860adfc130dc6778f757ff92c04f96" + integrity sha512-nAQKUwO3jwh9aBq/TSTdw5le1QZvU8EgFQSgpVzq/xEnyNiNvYdcWMKM+8Ku6sji7N5FLb/mbsktrQON/n59+A== + dependencies: + "@plotly/d3" "3.8.0" + "@plotly/d3-sankey" "0.7.2" + "@plotly/d3-sankey-circular" "0.33.1" + "@plotly/point-cluster" "^3.1.9" + "@turf/area" "^6.4.0" + "@turf/bbox" "^6.4.0" + "@turf/centroid" "^6.0.2" + alpha-shape "^1.0.0" + box-intersect plotly/box-intersect#v1.1.0 + canvas-fit "^1.5.0" + color-alpha "1.0.4" + color-normalize "1.5.0" + color-parse "1.3.8" + color-rgba "2.1.1" + convex-hull "^1.0.3" + country-regex "^1.1.0" + d3-force "^1.2.1" + d3-format "^1.4.5" + d3-geo "^1.12.1" + d3-geo-projection "^2.9.0" + d3-hierarchy "^1.1.9" + d3-interpolate "^1.4.0" + d3-time "^1.1.0" + d3-time-format "^2.2.3" + delaunay-triangulate "^1.1.6" + fast-isnumeric "^1.1.4" + gl-cone3d "^1.5.2" + gl-error3d "^1.0.16" + gl-heatmap2d "^1.1.1" + gl-line3d "1.2.1" + gl-mat4 "^1.2.0" + gl-mesh3d "^2.3.1" + gl-plot2d "^1.4.5" + gl-plot3d "^2.4.7" + gl-pointcloud2d "^1.0.3" + gl-scatter3d "^1.2.3" + gl-select-box "^1.0.4" + gl-shader "4.3.1" + gl-spikes2d "^1.0.2" + gl-streamtube3d "^1.4.1" + gl-surface3d "^1.6.0" + gl-text "^1.3.1" + glslify "^7.1.1" + has-hover "^1.0.1" + has-passive-events "^1.0.0" + incremental-convex-hull plotly/incremental-convex-hull#v1.1.0 + is-mobile "^2.2.2" + mapbox-gl "1.10.1" + matrix-camera-controller "^2.1.4" + mouse-change "^1.4.0" + mouse-event-offset "^3.0.2" + mouse-wheel "^1.2.0" + native-promise-only "^0.8.1" + ndarray plotly/ndarray#v1.1.0 + ndarray-extract-contour plotly/ndarray-extract-contour#v1.1.0 + ndarray-gradient plotly/ndarray-gradient#v1.1.0 + ndarray-linear-interpolate "^1.0.0" + ndarray-ops plotly/ndarray-ops#v1.3.0 + ndarray-pack plotly/ndarray-pack#v1.3.0 + ndarray-sort plotly/ndarray-sort#v1.1.0 + parse-svg-path "^0.1.2" + polybooljs "^1.2.0" + probe-image-size "^7.2.1" + regl "^2.1.0" + regl-error2d "^2.0.12" + regl-line2d "^3.1.2" + regl-scatter2d "^3.2.8" + regl-splom "^1.0.14" + right-now "^1.0.0" + robust-determinant plotly/robust-determinant#v1.2.1 + robust-in-sphere "1.2.1" + robust-linear-solve plotly/robust-linear-solve#v1.1.1 + robust-orientation "1.2.1" + simplicial-complex-contour plotly/simplicial-complex-contour#v1.1.0 + strongly-connected-components "^1.0.1" + superscript-text "^1.0.0" + surface-nets plotly/surface-nets#v1.1.1 + svg-path-sdf "^1.1.3" + tinycolor2 "^1.4.2" + to-px "1.0.1" + topojson-client "^3.1.0" + vectorize-text "3.2.2" + webgl-context "^2.2.0" + world-calendars "^1.0.3" + zero-crossings plotly/zero-crossings#v1.1.0 + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -9098,6 +11024,28 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" +point-in-big-polygon@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/point-in-big-polygon/-/point-in-big-polygon-2.0.1.tgz#69d293010cead58af08c3082ad1d23f600ef10af" + integrity sha512-DtrN8pa2VfMlvmWlCcypTFeBE4+OYz1ojDNJLKCWa4doiVAD6PRBbxFYAT71tsp5oKaRXT5sxEiHCAQKb1zr2Q== + dependencies: + binary-search-bounds "^2.0.0" + interval-tree-1d "^1.0.1" + robust-orientation "^1.1.3" + slab-decomposition "^1.0.1" + +polybooljs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" + integrity sha1-tDkMLgedTCYtOyUExiiNlbp6R1g= + +polytope-closest-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" + integrity sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8= + dependencies: + numeric "^1.2.6" + popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" @@ -9775,6 +11723,11 @@ postcss@^8.1.0: nanoid "^3.1.25" source-map-js "^0.6.2" +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9823,6 +11776,15 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.2.0: ansi-styles "^5.0.0" react-is "^17.0.1" +probe-image-size@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.1.tgz#df0c924e67e247bc94f8fcb0fad7f0081061fc44" + integrity sha512-d+6L3NvQBCNt4peRDoEfA7r9bPm6/qy18FnLKwg4NWBC5JrJm0pMLRg1kF4XNsPe1bUdt3WIMonPJzQWN2HXjQ== + dependencies: + lodash.merge "^4.6.2" + needle "^2.5.2" + stream-parser "~0.3.1" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9896,6 +11858,11 @@ prop-types-exact@^1.2.0: object-assign "^4.1.1" react-is "^16.8.1" +protocol-buffers-schema@^3.3.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== + proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -9966,6 +11933,18 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pxls@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" + integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== + dependencies: + arr-flatten "^1.1.0" + compute-dims "^1.1.0" + flip-pixels "^1.0.2" + is-browser "^2.1.0" + is-buffer "^2.0.3" + to-uint8 "^1.4.1" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -9976,6 +11955,18 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +quantize@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" + integrity sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4= + +quat-slerp@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" + integrity sha1-K6oVzjprvcMkHZcusXKDE57Wnyk= + dependencies: + gl-quat "^1.0.0" + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -10028,6 +12019,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== + ra-core@^3.18.2: version "3.18.2" resolved "https://registry.yarnpkg.com/ra-core/-/ra-core-3.18.2.tgz#bdc15248d29ebaac579b0e2729c83c330c272602" @@ -10102,6 +12098,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +rat-vec@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/rat-vec/-/rat-vec-1.1.1.tgz#0dde2b66b7b34bb1bcd2a23805eac806d87fd17f" + integrity sha1-Dd4rZrezS7G80qI4BerIBth/0X8= + dependencies: + big-rat "^1.0.3" + raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -10327,6 +12330,13 @@ react-outside-click-handler@^1.2.4: object.values "^1.1.0" prop-types "^15.7.2" +react-plotly.js@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/react-plotly.js/-/react-plotly.js-2.5.1.tgz#11182bf599ef11a0dbfcd171c6f5645535a2b486" + integrity sha512-Oya14whSHvPsYXdI0nHOGs1pZhMzV2edV7HAW1xFHD58Y73m/LbG2Encvyz1tztL0vfjph0JNhiwO8cGBJnlhg== + dependencies: + prop-types "^15.7.2" + react-portal@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/react-portal/-/react-portal-4.2.1.tgz#12c1599238c06fb08a9800f3070bea2a3f78b1a6" @@ -10603,7 +12613,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -10616,6 +12626,16 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -10666,6 +12686,15 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reduce-simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz#74d696a2f835f7a6dcd92065fd8c5181f2edf8bc" + integrity sha1-dNaWovg196bc2SBl/YxRgfLt+Lw= + dependencies: + cell-orientation "^1.0.1" + compare-cell "^1.0.0" + compare-oriented-cell "^1.0.1" + redux-saga@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112" @@ -10727,6 +12756,11 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== +regex-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" + integrity sha1-kEih6uuHD01IDavHb8Qs3MC8OnI= + regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" @@ -10764,6 +12798,78 @@ regjsparser@^0.7.0: dependencies: jsesc "~0.5.0" +regl-error2d@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" + integrity sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA== + dependencies: + array-bounds "^1.0.1" + color-normalize "^1.5.0" + flatten-vertex-data "^1.0.2" + object-assign "^4.1.1" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-line2d@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.1.2.tgz#2bedef7f44c1f7fae75c90f9918258723ca84c1c" + integrity sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ== + dependencies: + array-bounds "^1.0.1" + array-find-index "^1.0.2" + array-normalize "^1.1.4" + color-normalize "^1.5.0" + earcut "^2.1.5" + es6-weak-map "^2.0.3" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + +regl-scatter2d@^3.2.3, regl-scatter2d@^3.2.8: + version "3.2.8" + resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz#a1360e803e3fdf628ca09a72a435a0b7d4cf5675" + integrity sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig== + dependencies: + "@plotly/point-cluster" "^3.1.9" + array-range "^1.0.1" + array-rearrange "^2.2.2" + clamp "^1.0.1" + color-id "^1.1.0" + color-normalize "^1.5.0" + color-rgba "^2.1.1" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + image-palette "^2.1.0" + is-iexplorer "^1.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + to-float32 "^1.1.0" + update-diff "^1.1.0" + +regl-splom@^1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.14.tgz#58800b7bbd7576aa323499a1966868a6c9ea1456" + integrity sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw== + dependencies: + array-bounds "^1.0.1" + array-range "^1.0.1" + color-alpha "^1.0.4" + flatten-vertex-data "^1.0.2" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + raf "^3.4.1" + regl-scatter2d "^3.2.3" + +regl@^2.0.0, regl@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/regl/-/regl-2.1.0.tgz#7dae71e9ff20f29c4f42f510c70cd92ebb6b657c" + integrity sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg== + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -10790,7 +12896,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.6.1: +repeat-string@^1.3.0, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -10859,6 +12965,13 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== +resolve-protobuf-schema@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== + dependencies: + protocol-buffers-schema "^3.3.1" + resolve-url-loader@^3.1.2: version "3.1.4" resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" @@ -10888,7 +13001,12 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= + +resolve@^1.0.0, resolve@^1.1.10, resolve@^1.1.5, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -10942,6 +13060,11 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +right-now@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" + integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= + rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -10964,6 +13087,104 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +robust-compress@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-compress/-/robust-compress-1.0.0.tgz#4cf62c4b318d8308516012bb8c11752f39329b1b" + integrity sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs= + +robust-determinant@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/robust-determinant/-/robust-determinant-1.1.0.tgz#8ecae79b79caab3e74f6debe2237e5391a27e9c7" + integrity sha1-jsrnm3nKqz509t6+IjflORon6cc= + dependencies: + robust-compress "^1.0.0" + robust-scale "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +"robust-determinant@github:plotly/robust-determinant#v1.2.1": + version "1.2.1" + resolved "https://codeload.github.com/plotly/robust-determinant/tar.gz/7cb499bb02411de80ae1a90e54893e46af82ca5e" + dependencies: + robust-compress "^1.0.0" + robust-scale "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-dot-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-dot-product/-/robust-dot-product-1.0.0.tgz#c9ba0178bd2c304bfd725f58e889f1d946004553" + integrity sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM= + dependencies: + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-in-sphere@1.2.1, robust-in-sphere@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/robust-in-sphere/-/robust-in-sphere-1.2.1.tgz#ece3c2ae0fdf36b351680566adea7e93c6ba46da" + integrity sha512-3zJdcMIOP1gdwux93MKTS0RiMYEGwQBoE5R1IW/9ZQmGeZzP7f7i4+xdcK8ujJvF/dEOS1WPuI9IB1WNFbj3Cg== + dependencies: + robust-scale "^1.0.0" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.0" + +robust-linear-solve@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz#0cd6ac5040691a6f2aa3cd6311d728905ca3a1f1" + integrity sha1-DNasUEBpGm8qo81jEdcokFyjofE= + dependencies: + robust-determinant "^1.1.0" + +"robust-linear-solve@github:plotly/robust-linear-solve#v1.1.1": + version "1.1.1" + resolved "https://codeload.github.com/plotly/robust-linear-solve/tar.gz/90ad6de2ce011a1e0b53d9e9f6bf8d117053c492" + dependencies: + robust-determinant "^1.1.0" + +robust-orientation@1.2.1, robust-orientation@^1.0.1, robust-orientation@^1.0.2, robust-orientation@^1.1.2, robust-orientation@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.2.1.tgz#f6c2b00a5df5f1cb9597be63a45190f273899361" + integrity sha512-FuTptgKwY6iNuU15nrIJDLjXzCChWB+T4AvksRtwPS/WZ3HuP1CElCm1t+OBfgQKfWbtZIawip+61k7+buRKAg== + dependencies: + robust-scale "^1.0.2" + robust-subtract "^1.0.0" + robust-sum "^1.0.0" + two-product "^1.0.2" + +robust-product@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-product/-/robust-product-1.0.0.tgz#685250007cdbba7cf1de75bff6d2927011098abe" + integrity sha1-aFJQAHzbunzx3nW/9tKScBEJir4= + dependencies: + robust-scale "^1.0.0" + robust-sum "^1.0.0" + +robust-scale@^1.0.0, robust-scale@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" + integrity sha1-d1Ey7QlULQKOWLLMecBikLz3jDI= + dependencies: + two-product "^1.0.2" + two-sum "^1.0.0" + +robust-segment-intersect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz#3252b6a0fc1ba14ade6915ccbe09cbce9aab1c1c" + integrity sha1-MlK2oPwboUreaRXMvgnLzpqrHBw= + dependencies: + robust-orientation "^1.1.3" + +robust-subtract@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" + integrity sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo= + +robust-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" + integrity sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k= + rollup-plugin-babel@^4.3.3: version "4.4.0" resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" @@ -11018,6 +13239,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -11071,7 +13297,7 @@ sass-loader@^10.0.5: schema-utils "^3.0.0" semver "^7.3.2" -sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11256,6 +13482,11 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-copy@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + shallow-equal@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" @@ -11314,6 +13545,16 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== +signum@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-0.0.0.tgz#ab551b1003351070a704783f1a09c5e7691f9cf6" + integrity sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY= + +signum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" + integrity sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc= + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -11321,11 +13562,69 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simplicial-complex-boundary@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz#72c9ff1e24deaa374c9bb2fa0cbf0c081ebef815" + integrity sha1-csn/HiTeqjdMm7L6DL8MCB6++BU= + dependencies: + boundary-cells "^2.0.0" + reduce-simplicial-complex "^1.0.0" + +simplicial-complex-contour@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz#890aacac284365340110545cf2629a26e04bf9d1" + integrity sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE= + dependencies: + marching-simplex-table "^1.0.0" + ndarray "^1.0.15" + ndarray-sort "^1.0.0" + typedarray-pool "^1.1.0" + +"simplicial-complex-contour@github:plotly/simplicial-complex-contour#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/simplicial-complex-contour/tar.gz/3c09d0c163385b874fedc0a366b29b6e713bfd99" + dependencies: + ndarray "^1.0.15" + ndarray-sort "^1.0.0" + +simplicial-complex@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-0.3.3.tgz#4c30cad57f9e45729dd8f306c8753579f46be99e" + integrity sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4= + dependencies: + bit-twiddle "~0.0.1" + union-find "~0.0.3" + +simplicial-complex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" + integrity sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE= + dependencies: + bit-twiddle "^1.0.0" + union-find "^1.0.0" + +simplify-planar-graph@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz#bc85893725f32e8fa8ae25681398446d2cbcf766" + integrity sha1-vIWJNyXzLo+oriVoE5hEbSy892Y= + dependencies: + robust-orientation "^1.0.1" + simplicial-complex "^0.3.3" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slab-decomposition@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/slab-decomposition/-/slab-decomposition-1.0.3.tgz#0345b3d364d78dad3f400cd5c8e0424547d23e7c" + integrity sha512-1EfR304JHvX9vYQkUi4AKqN62mLsjk6W45xTk/TxwN8zd3HGwS7PVj9zj0I6fgCZqfGlimDEY+RzzASHn97ZmQ== + dependencies: + binary-search-bounds "^2.0.0" + functional-red-black-tree "^1.0.0" + robust-orientation "^1.1.3" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -11514,6 +13813,14 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== +split-polygon@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" + integrity sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc= + dependencies: + robust-dot-product "^1.0.0" + robust-sum "^1.0.0" + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -11521,6 +13828,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11545,6 +13857,11 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + stack-utils@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" @@ -11557,6 +13874,13 @@ stackframe@^1.1.1: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== +static-eval@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -11597,6 +13921,13 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-parser@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= + dependencies: + debug "2" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" @@ -11625,6 +13956,21 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +string-split-by@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" + integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== + dependencies: + parenthesis "^3.1.5" + +string-to-arraybuffer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" + integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== + dependencies: + atob-lite "^2.0.0" + is-base64 "^0.1.0" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -11689,6 +14035,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -11766,6 +14117,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strongly-connected-components@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" + integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= + style-loader@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -11797,6 +14153,18 @@ subscribe-ui-event@^2.0.6: lodash "^4.17.15" raf "^3.0.0" +supercluster@^7.0.0: + version "7.1.4" + resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.4.tgz#6762aabfd985d3390b49f13b815567d5116a828a" + integrity sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g== + dependencies: + kdbush "^3.0.0" + +superscript-text@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" + integrity sha1-58snUlZzYN9QvrBhDOjfPXHY39g= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11826,11 +14194,53 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +surface-nets@^1.0.0, surface-nets@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/surface-nets/-/surface-nets-1.0.2.tgz#e433c8cbba94a7274c6f4c99552b461bf1fc7a4b" + integrity sha1-5DPIy7qUpydMb0yZVStGG/H8eks= + dependencies: + ndarray-extract-contour "^1.0.0" + triangulate-hypercube "^1.0.0" + zero-crossings "^1.0.0" + +"surface-nets@github:plotly/surface-nets#v1.1.1": + version "1.1.1" + resolved "https://codeload.github.com/plotly/surface-nets/tar.gz/d80900ed4c39a1b07f9d8577180960945236d996" + dependencies: + ndarray-extract-contour "^1.0.0" + zero-crossings "^1.0.0" + +svg-arc-to-cubic-bezier@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" + integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== + svg-parser@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +svg-path-bounds@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz#00312f672b08afc432a66ddfbd06db40cec8d0d0" + integrity sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ== + dependencies: + abs-svg-path "^0.1.1" + is-svg-path "^1.0.1" + normalize-svg-path "^1.0.0" + parse-svg-path "^0.1.2" + +svg-path-sdf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" + integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== + dependencies: + bitmap-sdf "^1.0.0" + draw-svg-path "^1.0.0" + is-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + svg-path-bounds "^1.0.1" + svgo@^1.0.0, svgo@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" @@ -11972,6 +14382,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-cache@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.2.tgz#d0d30ba89b7312ea1c1a31cd9a4db56c1cef7fe7" + integrity sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ== + dependencies: + vectorize-text "^3.2.1" + text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -11982,7 +14399,15 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through2@^2.0.0: +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -12017,11 +14442,30 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinycolor2@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" + integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== + +tinyqueue@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== + tmpl@1.0.x: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-array-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" + integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== + dependencies: + flatten-vertex-data "^1.0.2" + is-blob "^2.0.1" + string-to-arraybuffer "^1.0.0" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -12032,6 +14476,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-float32@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" + integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -12039,6 +14488,20 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-px@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" + integrity sha1-W7rtXl1PdkRbzJA8KTojB90yRkY= + dependencies: + parse-unit "^1.0.1" + +to-px@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" + integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== + dependencies: + parse-unit "^1.0.1" + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -12064,11 +14527,29 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-uint8@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" + integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== + dependencies: + arr-flatten "^1.1.0" + clamp "^1.0.1" + is-base64 "^0.1.0" + is-float-array "^1.0.0" + to-array-buffer "^3.0.0" + toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +topojson-client@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" + integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== + dependencies: + commander "2" + tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -12097,6 +14578,22 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +triangulate-hypercube@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz#d8071db2ebfcfd51f308d0bcf2a5c48a5b36d137" + integrity sha1-2Acdsuv8/VHzCNC88qXEils20Tc= + dependencies: + gamma "^0.1.0" + permutation-parity "^1.0.0" + permutation-rank "^1.0.0" + +triangulate-polyline@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz#bf8ba877a85054103feb9fa5a61b4e8d7017814d" + integrity sha1-v4uod6hQVBA/65+lphtOjXAXgU0= + dependencies: + cdt2d "^1.0.0" + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -12139,6 +14636,25 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +turntable-camera-controller@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz#8dbd3fe00550191c65164cb888971049578afd99" + integrity sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk= + dependencies: + filtered-vector "^1.2.1" + gl-mat4 "^1.0.2" + gl-vec3 "^1.0.2" + +two-product@^1.0.0, two-product@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" + integrity sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo= + +two-sum@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" + integrity sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q= + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -12191,6 +14707,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type-name@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" + integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= + type@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" @@ -12201,6 +14722,14 @@ type@^2.5.0: resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== +typedarray-pool@^1.0.0, typedarray-pool@^1.0.2, typedarray-pool@^1.1.0, typedarray-pool@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" + integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== + dependencies: + bit-twiddle "^1.0.0" + dup "^1.0.0" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -12275,6 +14804,16 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== +union-find@^1.0.0, union-find@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" + integrity sha1-KSusQV5q06iVNdI3AQ20pTYoTlg= + +union-find@~0.0.3: + version "0.0.4" + resolved "https://registry.yarnpkg.com/union-find/-/union-find-0.0.4.tgz#b854b3301619bdad144b0014c78f96eac0d2f0f6" + integrity sha1-uFSzMBYZva0USwAUx4+W6sDS8PY= + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -12285,7 +14824,7 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -uniq@^1.0.1: +uniq@^1.0.0, uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= @@ -12331,7 +14870,7 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unquote@~1.1.1: +unquote@^1.1.0, unquote@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= @@ -12349,6 +14888,11 @@ upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" + integrity sha1-9RAYLYHugZ+4LDprIrYrve2ngI8= + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -12459,11 +15003,50 @@ utila@~0.4: resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= +utils-copy-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" + integrity sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U= + dependencies: + object-keys "^1.0.9" + utils-copy "^1.1.0" + +utils-copy@^1.0.0, utils-copy@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" + integrity sha1-biuXmCqozXPhGCo+b4vsPA9AWKc= + dependencies: + const-pinf-float64 "^1.0.0" + object-keys "^1.0.9" + type-name "^2.0.0" + utils-copy-error "^1.0.0" + utils-indexof "^1.0.0" + utils-regex-from-string "^1.0.0" + validate.io-array "^1.0.3" + validate.io-buffer "^1.0.1" + validate.io-nonnegative-integer "^1.0.0" + +utils-indexof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" + integrity sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w= + dependencies: + validate.io-array-like "^1.0.1" + validate.io-integer-primitive "^1.0.0" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +utils-regex-from-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" + integrity sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk= + dependencies: + regex-regex "^1.0.0" + validate.io-string-primitive "^1.0.0" + uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -12496,6 +15079,77 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate.io-array-like@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" + integrity sha1-evn363tRcVvrIhVmjsXM5U+t21o= + dependencies: + const-max-uint32 "^1.0.2" + validate.io-integer-primitive "^1.0.0" + +validate.io-array@^1.0.3, validate.io-array@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= + +validate.io-buffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" + integrity sha1-hS1nNAIZFNXROvwyUxdh43IO1E4= + +validate.io-integer-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" + integrity sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY= + dependencies: + validate.io-number-primitive "^1.0.0" + +validate.io-integer@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= + dependencies: + validate.io-number "^1.0.3" + +validate.io-matrix-like@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" + integrity sha1-XsMqddCInaxzbepovdYUWxVe38M= + +validate.io-ndarray-like@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" + integrity sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk= + +validate.io-nonnegative-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" + integrity sha1-gGkkOgjF+Y6VQTySnf17GPP28p8= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-number-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" + integrity sha1-0uAfICmJNp3PEVVElWQgOv5YTlU= + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= + +validate.io-positive-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" + integrity sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI= + dependencies: + validate.io-integer "^1.0.5" + +validate.io-string-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" + integrity sha1-uBNbn7E3K94C/dU60dDM1t55j+4= + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -12506,6 +15160,19 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +vectorize-text@3.2.2, vectorize-text@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.2.tgz#3e978889df4ae333975d38669529c942a63e1f65" + integrity sha512-34NVOCpMMQVXujU4vb/c6u98h6djI0jGdtC202H4Huvzn48B6ARsR7cmGh1xsAc0pHNQiUKGK/aHF05VtGv+eA== + dependencies: + cdt2d "^1.0.0" + clean-pslg "^1.1.0" + ndarray "^1.0.11" + planar-graph-to-polyline "^1.0.6" + simplify-planar-graph "^2.0.1" + surface-nets "^1.0.0" + triangulate-polyline "^1.0.0" + vendors@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" @@ -12516,6 +15183,15 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vt-pbf@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== + dependencies: + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.2.1" + w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -12569,6 +15245,23 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= + +weakmap-shim@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" + integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= + +webgl-context@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" + integrity sha1-jzfXJXz23xzQpJ5qextyG5TMhqA= + dependencies: + get-canvas-context "^1.0.1" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -12953,6 +15646,13 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" +world-calendars@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" + integrity sha1-slxQMrokEo/8QdCfr0pewbnBQzU= + dependencies: + object-assign "^4.1.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -13013,11 +15713,16 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.0, xtend@~4.0.1: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xtend@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -13091,3 +15796,14 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zero-crossings@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/zero-crossings/-/zero-crossings-1.0.1.tgz#c562bd3113643f3443a245d12406b88b69b9a9ff" + integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= + dependencies: + cwise-compiler "^1.0.0" + +"zero-crossings@github:plotly/zero-crossings#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/plotly/zero-crossings/tar.gz/4746771f490344e21c84d1f631cb661d8c5ff508" diff --git a/src/constants.js b/src/constants.js index 7963b7712a..a208f5a4d1 100644 --- a/src/constants.js +++ b/src/constants.js @@ -27,3 +27,65 @@ export const APPROVER_STATUSES = { APPROVED: 'approved', NEEDS_ACTION: 'needs_action', }; + +// copied from /frontend/src/pages/ActivityReports/constants.js +export const TOPICS = [ + 'Behavioral / Mental Health / Trauma', + 'Child Assessment, Development, Screening', + 'CLASS: Classroom Organization', + 'CLASS: Emotional Support', + 'CLASS: Instructional Support', + 'Coaching', + 'Communication', + 'Community and Self-Assessment', + 'Culture & Language', + 'Curriculum (Instructional or Parenting)', + 'Data and Evaluation', + 'ERSEA', + 'Environmental Health and Safety / EPRR', + 'Equity', + 'Facilities', + 'Family Support Services', + 'Fiscal / Budget', + 'Five-Year Grant', + 'Home Visiting', + 'Human Resources', + 'Leadership / Governance', + 'Learning Environments', + 'Nutrition', + 'Oral Health', + 'Parent and Family Engagement', + 'Partnerships and Community Engagement', + 'Physical Health and Screenings', + 'Pregnancy Services / Expectant Families', + 'Program Planning and Services', + 'Quality Improvement Plan / QIP', + 'Recordkeeping and Reporting', + 'Safety Practices', + 'Staff Wellness', + 'Teaching Practices / Teacher-Child Interactions', + 'Technology and Information Systems', + 'Transition Practices', + 'Transportation', +]; + +// copied from /frontend/src/pages/ActivityReports/constants.js +export const REASONS = [ + 'Below Competitive Threshold (CLASS)', + 'Below Quality Threshold (CLASS)', + 'Change in Scope', + 'Child Incidents', + 'Complaint', + 'COVID-19 response', + 'Full Enrollment', + 'New Grantee', + 'New Director or Management', + 'New Program Option', + 'New Staff / Turnover', + 'Ongoing Quality Improvement', + 'Planning/Coordination (also TTA Plan Agreement)', + 'School Readiness Goals', + 'Monitoring | Area of Concern', + 'Monitoring | Noncompliance', + 'Monitoring | Deficiency', +]; diff --git a/src/testUtils.js b/src/testUtils.js new file mode 100644 index 0000000000..5f7c9479ab --- /dev/null +++ b/src/testUtils.js @@ -0,0 +1,207 @@ +import faker from 'faker'; + +import { REPORT_STATUSES } from './constants'; +import { + ActivityReport, + ActivityRecipient, + User, + Grantee, + Grant, + Region, +} from './models'; + +function defaultReport() { + return { + activityRecipientType: 'grantee', + submissionStatus: REPORT_STATUSES.SUBMITTED, + calculatedStatus: REPORT_STATUSES.APPROVED, + ECLKCResourcesUsed: [faker.random.words(1)], + numberOfParticipants: faker.datatype.number({ min: 1, max: 20 }), + deliveryMethod: 'in-person', + duration: faker.datatype.number({ min: 1, max: 10 }), + regionId: 20, + endDate: '2021-01-01T12:00:00Z', + startDate: '2021-01-01T12:00:00Z', + requester: 'requester', + programTypes: ['type'], + targetPopulations: ['pop'], + reason: ['reason'], + participants: ['participants', 'genies'], + topics: ['Program Planning and Services'], + ttaType: ['technical-assistance'], + }; +} + +function defaultUser() { + return { + homeRegionId: 5, + hsesUsername: faker.internet.email(), + hsesUserId: `fake${faker.unique(() => faker.datatype.number({ min: 1, max: 10000 }))}`, + email: faker.internet.email(), + phoneNumber: faker.phone.phoneNumber(), + name: faker.name.findName(), + role: ['Grants Specialist'], + }; +} + +async function createUser(user) { + return User.create({ ...defaultUser(), ...user }); +} + +function defaultRegion() { + const number = faker.datatype.number({ min: 1, max: 12 }); + return { + id: faker.unique(() => number), + name: number, + }; +} + +async function createRegion(region) { + return Region.create({ ...defaultRegion(), ...region }); +} + +function defaultGrant() { + return { + id: faker.datatype.number({ min: 10000, max: 100000 }), + number: `0${faker.datatype.number({ min: 1, max: 9 })}${faker.animal.type()}`, + regionId: 10, + status: 'Active', + startDate: new Date('2021/01/01'), + }; +} + +async function createGrantee(grantee) { + return Grantee.create({ + id: faker.datatype.number({ min: 10000, max: 100000 }), + name: faker.company.companyName(), + ...grantee, + }); +} + +async function createGrant(grant) { + let g = await Grantee.findByPk(grant.granteeId); + if (!g) { + g = await createGrantee({}); + } + + return Grant.create({ ...defaultGrant(), ...grant, granteeId: g.id }); +} + +export async function createReport(report) { + const { + activityRecipients, + userId, + regionId, + ...reportData + } = report; + const grantIds = activityRecipients.map((recipient) => recipient.grantId); + const region = regionId || defaultReport().regionId; + + let foundRegion = await Region.findByPk(region); + if (!foundRegion) { + foundRegion = await createRegion({ id: region }); + } + + const recipients = await Promise.all(grantIds.map(async (gId) => { + let foundGrant = await Grant.findByPk(gId); + + if (!foundGrant) { + foundGrant = await createGrant({ id: gId, regionId: foundRegion.id }); + } + return foundGrant.id; + })); + + let foundUser = await User.findByPk(userId); + if (!foundUser) { + foundUser = await createUser(); + } + + const createdReport = await ActivityReport.create({ + ...defaultReport(), + ...reportData, + regionId: foundRegion.id, + userId: foundUser.id, + }); + + Promise.all(recipients.map((grantId) => ActivityRecipient.create({ + activityReportId: createdReport.id, + grantId, + }))); + + return createdReport; +} + +export async function destroyReport(report) { + const dbReport = await ActivityReport.findByPk(report.id, { + include: [{ + model: ActivityRecipient, + as: 'activityRecipients', + include: [{ + model: Grant, + as: 'grant', + include: [{ + model: Grantee, + as: 'grantee', + }], + }], + }], + }); + + await ActivityRecipient.destroy({ + where: { + activityReportId: dbReport.id, + }, + }); + + try { + User.destroy({ + where: { + id: dbReport.userId, + }, + }); + } catch (error) { + // ignore fk errors + } + + const destroys = dbReport.activityRecipients.map(async (recipient) => { + const grant = await Grant.findByPk(recipient.grantId); + + try { + await ActivityRecipient.destroy({ + where: { + id: recipient.id, + }, + }); + + await Grant.destroy({ + where: { + id: grant.id, + }, + }); + + await Grantee.destroy({ + where: { + id: grant.granteeId, + }, + }); + } catch (e) { + // ignore fk errors + } + }); + + await Promise.all(destroys); + await ActivityReport.destroy({ + where: { + id: report.id, + }, + }); + try { + await Region.destroy({ + where: { + id: report.regionId, + }, + }); + } catch (e) { + // ignore fk errors + } +} diff --git a/src/widgets/frequencyGraph.js b/src/widgets/frequencyGraph.js new file mode 100644 index 0000000000..e2e8104565 --- /dev/null +++ b/src/widgets/frequencyGraph.js @@ -0,0 +1,49 @@ +import { Op } from 'sequelize'; +import { + ActivityReport, + sequelize, +} from '../models'; +import { REPORT_STATUSES, TOPICS, REASONS } from '../constants'; + +async function countOccurrences(scopes, column, possibilities) { + const allOccurrences = await ActivityReport.findAll({ + attributes: [ + [sequelize.fn('unnest', sequelize.col(column)), column], + ], + where: { + [Op.and]: [scopes], + calculatedStatus: REPORT_STATUSES.APPROVED, + }, + nest: true, + raw: true, + }); + + const result = possibilities.reduce((prev, current) => ({ + ...prev, + [current]: 0, + }), {}); + + allOccurrences.forEach((row) => { + const occurrence = row[column]; + if (occurrence in result) { + result[occurrence] += 1; + } else { + result[occurrence] = 1; + } + }); + + return Object.entries(result).map(([key, value]) => ({ + category: key, + count: value, + })); +} + +export default async function topicFrequencyGraph(scopes) { + const topic = await countOccurrences(scopes, 'topics', TOPICS); + const reason = await countOccurrences(scopes, 'reason', REASONS); + + return { + topic, + reason, + }; +} diff --git a/src/widgets/frequencyGraph.test.js b/src/widgets/frequencyGraph.test.js new file mode 100644 index 0000000000..b2cea3e28d --- /dev/null +++ b/src/widgets/frequencyGraph.test.js @@ -0,0 +1,71 @@ +import frequencyGraph from './frequencyGraph'; +import db from '../models'; +import { createReport, destroyReport } from '../testUtils'; + +describe('frequency graph widget', () => { + let reportOne; + let reportTwo; + let reportThree; + let reportFour; + + beforeAll(async () => { + reportOne = await createReport({ + reason: ['Change in Scope'], + topics: ['Home Visiting'], + activityRecipients: [{ grantId: 555 }], + }); + reportTwo = await createReport({ + reason: ['Change in Scope', 'Complaint'], + topics: ['Five-Year Grant', 'Home Visiting'], + activityRecipients: [{ grantId: 555 }], + }); + reportThree = await createReport({ + reason: ['Child Incidents'], + topics: ['Fiscal / Budget'], + activityRecipients: [{ grantId: 555 }], + }); + reportFour = await createReport({ + reason: ['Change in Scope', 'Child Incidents'], + topics: ['Five-Year Grant', 'Home Visiting', 'Fiscal / Budget'], + activityRecipients: [{ grantId: 555 }], + }); + }); + + afterAll(async () => { + await destroyReport(reportOne); + await destroyReport(reportTwo); + await destroyReport(reportThree); + await destroyReport(reportFour); + await db.sequelize.close(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('returns count of topics', async () => { + const res = await frequencyGraph([{ + id: [reportOne.id, reportTwo.id, reportThree.id, reportFour.id], + }]); + + const { topic } = res; + + expect(topic.find((r) => r.category === 'Home Visiting').count).toBe(3); + expect(topic.find((r) => r.category === 'Five-Year Grant').count).toBe(2); + expect(topic.find((r) => r.category === 'Fiscal / Budget').count).toBe(2); + expect(topic.find((r) => r.category === 'Nutrition').count).toBe(0); + }); + + it('returns count of reasons', async () => { + const res = await frequencyGraph([{ + id: [reportOne.id, reportTwo.id, reportThree.id, reportFour.id], + }]); + + const { reason } = res; + + expect(reason.find((r) => r.category === 'Change in Scope').count).toBe(3); + expect(reason.find((r) => r.category === 'Complaint').count).toBe(1); + expect(reason.find((r) => r.category === 'Child Incidents').count).toBe(2); + expect(reason.find((r) => r.category === 'Full Enrollment').count).toBe(0); + }); +}); diff --git a/src/widgets/index.js b/src/widgets/index.js index 72f8ebbe35..e91739e08a 100644 --- a/src/widgets/index.js +++ b/src/widgets/index.js @@ -3,6 +3,7 @@ import overview from './overview'; import totalHrsAndGranteeGraph from './totalHrsAndGranteeGraph'; import reasonList from './reasonList'; import topicFrequencyGraph from './topicFrequencyGraph'; +import frequencyGraph from './frequencyGraph'; /* All widgets need to be added to this object @@ -13,4 +14,5 @@ export default { totalHrsAndGranteeGraph, reasonList, topicFrequencyGraph, + frequencyGraph, }; diff --git a/src/widgets/topicFrequencyGraph.js b/src/widgets/topicFrequencyGraph.js index a4c6da2544..7a74234a6c 100644 --- a/src/widgets/topicFrequencyGraph.js +++ b/src/widgets/topicFrequencyGraph.js @@ -2,48 +2,7 @@ import { Op } from 'sequelize'; import { ActivityReport, } from '../models'; -import { REPORT_STATUSES } from '../constants'; - -// copied from /frontend/src/pages/ActivityReports/constants.js -export const topics = [ - 'Behavioral / Mental Health / Trauma', - 'Child Assessment, Development, Screening', - 'CLASS: Classroom Organization', - 'CLASS: Emotional Support', - 'CLASS: Instructional Support', - 'Coaching', - 'Communication', - 'Community and Self-Assessment', - 'Culture & Language', - 'Curriculum (Instructional or Parenting)', - 'Data and Evaluation', - 'ERSEA', - 'Environmental Health and Safety / EPRR', - 'Equity', - 'Facilities', - 'Family Support Services', - 'Fiscal / Budget', - 'Five-Year Grant', - 'Home Visiting', - 'Human Resources', - 'Leadership / Governance', - 'Learning Environments', - 'Nutrition', - 'Oral Health', - 'Parent and Family Engagement', - 'Partnerships and Community Engagement', - 'Physical Health and Screenings', - 'Pregnancy Services / Expectant Families', - 'Program Planning and Services', - 'Quality Improvement Plan / QIP', - 'Recordkeeping and Reporting', - 'Safety Practices', - 'Staff Wellness', - 'Teaching Practices / Teacher-Child Interactions', - 'Technology and Information Systems', - 'Transition Practices', - 'Transportation', -]; +import { REPORT_STATUSES, TOPICS } from '../constants'; export default async function topicFrequencyGraph(scopes) { const topicsAndParticipants = await ActivityReport.findAll({ @@ -58,13 +17,13 @@ export default async function topicFrequencyGraph(scopes) { raw: true, }); - const topicsResponse = topics.map((topic) => ({ + const topicsResponse = TOPICS.map((topic) => ({ topic, count: 0, })); topicsAndParticipants.forEach((topicAndParticipant) => { - topics.forEach((topic, index) => { + TOPICS.forEach((topic, index) => { if (topicAndParticipant.topics.includes(topic)) { topicsResponse[index].count += 1; } From 0e254d385db7d7bd151a5c2348eeaba936a79957 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Nov 2021 19:34:55 +0000 Subject: [PATCH 02/79] Bump validator from 13.6.0 to 13.7.0 Bumps [validator](https://github.com/validatorjs/validator.js) from 13.6.0 to 13.7.0. - [Release notes](https://github.com/validatorjs/validator.js/releases) - [Changelog](https://github.com/validatorjs/validator.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/validatorjs/validator.js/compare/13.6.0...13.7.0) --- updated-dependencies: - dependency-name: validator dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a29e9f6f2..b4c292bb69 100644 --- a/package.json +++ b/package.json @@ -206,7 +206,7 @@ "throng": "^5.0.0", "url-join": "^4.0.1", "uuid": "^8.3.2", - "validator": "^13.5.2", + "validator": "^13.7.0", "winston": "^3.3.3", "xml2json": "^0.12.0", "yargs": "^16.1.1", diff --git a/yarn.lock b/yarn.lock index aab798c30a..0e0eae141b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10323,10 +10323,10 @@ validator@^10.11.0: resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228" integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw== -validator@^13.5.2: - version "13.6.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059" - integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg== +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== vary@~1.1.2: version "1.1.2" From b2d6cf27c6de83a83b97cf3b4d0d509ae00804be Mon Sep 17 00:00:00 2001 From: Josh Salisbury Date: Thu, 4 Nov 2021 12:30:17 -0500 Subject: [PATCH 03/79] Feedback from PR --- frontend/src/components/ButtonSelect.js | 4 +- .../pages/GranteeRecord/pages/TTAHistory.js | 2 +- frontend/src/widgets/FrequencyGraph.css | 52 +++++++++++++++++++ frontend/src/widgets/FrequencyGraph.js | 8 +-- src/widgets/frequencyGraph.js | 40 +------------- src/widgets/helper.js | 40 ++++++++++++++ 6 files changed, 101 insertions(+), 45 deletions(-) create mode 100644 frontend/src/widgets/FrequencyGraph.css create mode 100644 src/widgets/helper.js diff --git a/frontend/src/components/ButtonSelect.js b/frontend/src/components/ButtonSelect.js index 52dffcada5..2b2242eb63 100644 --- a/frontend/src/components/ButtonSelect.js +++ b/frontend/src/components/ButtonSelect.js @@ -161,7 +161,7 @@ function ButtonSelect(props) { const ariaLabel = `${menuIsOpen ? 'press escape to close ' : 'Open '} ${ariaName}`; return ( -
+
+ + )} + {showFilter && } + 0} + onExportAll={handleDownloadAllReports} + onExportSelected={handleDownloadClick} + count={reportsCount} + /> + + + + + {renderTotal(offset, perPage, activePage, reportsCount)} + + + + +
+ + + + + + {renderColumnHeader('Report ID', 'regionId')} + {renderColumnHeader('Grantee', 'activityRecipients')} + {renderColumnHeader('Start date', 'startDate')} + {renderColumnHeader('Creator', 'author')} + {renderColumnHeader('Topic(s)', 'topics')} + {renderColumnHeader('Collaborator(s)', 'collaborators')} + {renderColumnHeader('Last saved', 'updatedAt')} + {renderColumnHeader('Status', 'calculatedStatus')} + + + + {displayReports.map((report, index) => ( + displayReports.length - 1} + /> + ))} + +
+ {tableCaption} +

with sorting and pagination

+
+ + +
+
+ + + ); +} + +ActivityReportsTable.propTypes = { + filters: PropTypes.arrayOf( + PropTypes.shape({ + condition: PropTypes.string, + id: PropTypes.string, + query: PropTypes.string, + topic: PropTypes.string, + }), + ).isRequired, + showFilter: PropTypes.bool.isRequired, + onUpdateFilters: PropTypes.func.isRequired, + tableCaption: PropTypes.string.isRequired, +}; + +export default ActivityReportsTable; diff --git a/frontend/src/components/ActivityReportsTable/mocks.js b/frontend/src/components/ActivityReportsTable/mocks.js new file mode 100644 index 0000000000..60d40d4f36 --- /dev/null +++ b/frontend/src/components/ActivityReportsTable/mocks.js @@ -0,0 +1,315 @@ +const activityReports = [ + { + startDate: '02/08/2021', + lastSaved: '02/05/2021', + id: 1, + displayId: 'R14-AR-1', + regionId: 14, + topics: ['Behavioral / Mental Health', 'CLASS: Instructional Support'], + calculatedStatus: 'draft', + pendingApprovals: '1 of 3', + approvers: [{ User: { fullName: 'Approver Manager 1' } }, { User: { fullName: 'Approver Manager 2' } }, { User: { fullName: 'Approver Manager 3' } }], + activityRecipients: [ + { + activityRecipientId: 5, + name: 'Johnston-Romaguera - 14CH00003', + id: 1, + grant: { + id: 5, + number: '14CH00003', + grantee: { + name: 'Johnston-Romaguera', + }, + }, + nonGrantee: null, + }, + { + activityRecipientId: 4, + name: 'Johnston-Romaguera - 14CH00002', + id: 2, + grant: { + id: 4, + number: '14CH00002', + grantee: { + name: 'Johnston-Romaguera', + }, + }, + nonGrantee: null, + }, + { + activityRecipientId: 1, + name: 'Grantee Name - 14CH1234', + id: 3, + grant: { + id: 1, + number: '14CH1234', + grantee: { + name: 'Grantee Name', + }, + }, + nonGrantee: null, + }, + ], + author: { + fullName: 'Kiwi, GS', + name: 'Kiwi', + role: 'Grants Specialist', + homeRegionId: 14, + }, + collaborators: [ + { + fullName: 'Orange, GS', + name: 'Orange', + role: 'Grants Specialist', + }, + { + fullName: 'Hermione Granger, SS', + name: 'Hermione Granger', + role: 'System Specialist', + }, + ], + }, + { + startDate: '02/01/2021', + lastSaved: '02/04/2021', + id: 2, + displayId: 'R14-AR-2', + regionId: 14, + topics: [], + pendingApprovals: '2 of 2', + approvers: [{ User: { fullName: 'Approver Manager 4' } }, { User: { fullName: 'Approver Manager 5' } }], + calculatedStatus: 'needs_action', + activityRecipients: [ + { + activityRecipientId: 3, + name: 'QRIS System', + id: 31, + grant: null, + nonGrantee: { + id: 3, + name: 'QRIS System', + createdAt: '2021-02-03T21:00:57.149Z', + updatedAt: '2021-02-03T21:00:57.149Z', + }, + }, + ], + author: { + fullName: 'Kiwi, GS', + name: 'Kiwi', + role: 'Grants Specialist', + homeRegionId: 14, + }, + collaborators: [ + { + fullName: 'Cucumber User, GS', + name: 'Cucumber User', + role: 'Grantee Specialist', + }, + { + fullName: 'Hermione Granger, SS', + name: 'Hermione Granger', + role: 'System Specialist', + }, + ], + }, +]; + +export const activityReportsSorted = [ + { + startDate: '02/01/2021', + lastSaved: '02/04/2021', + id: 2, + displayId: 'R14-AR-2', + regionId: 14, + topics: [], + calculatedStatus: 'needs_action', + activityRecipients: [ + { + activityRecipientId: 3, + name: 'QRIS System', + id: 31, + grant: null, + nonGrantee: { + id: 3, + name: 'QRIS System', + createdAt: '2021-02-03T21:00:57.149Z', + updatedAt: '2021-02-03T21:00:57.149Z', + }, + }, + ], + author: { + fullName: 'Kiwi, GS', + name: 'Kiwi', + role: 'Grants Specialist', + homeRegionId: 14, + }, + collaborators: [ + { + fullName: 'Cucumber User, GS', + name: 'Cucumber User', + role: 'Grantee Specialist', + }, + { + fullName: 'Hermione Granger, SS', + name: 'Hermione Granger', + role: 'System Specialist', + }, + ], + }, + { + startDate: '02/08/2021', + lastSaved: '02/05/2021', + id: 1, + displayId: 'R14-AR-1', + regionId: 14, + topics: ['Behavioral / Mental Health', 'CLASS: Instructional Support'], + calculatedStatus: 'draft', + activityRecipients: [ + { + activityRecipientId: 5, + name: 'Johnston-Romaguera - 14CH00003', + id: 1, + grant: { + id: 5, + number: '14CH00003', + grantee: { + name: 'Johnston-Romaguera', + }, + }, + nonGrantee: null, + }, + { + activityRecipientId: 4, + name: 'Johnston-Romaguera - 14CH00002', + id: 2, + grant: { + id: 4, + number: '14CH00002', + grantee: { + name: 'Johnston-Romaguera', + }, + }, + nonGrantee: null, + }, + { + activityRecipientId: 1, + name: 'Grantee Name - 14CH1234', + id: 3, + grant: { + id: 1, + number: '14CH1234', + grantee: { + name: 'Grantee Name', + }, + }, + nonGrantee: null, + }, + ], + author: { + fullName: 'Kiwi, TTAC', + name: 'Kiwi', + role: 'Grants Specialist', + homeRegionId: 14, + }, + collaborators: [ + { + fullName: 'Orange, GS', + name: 'Orange', + role: 'Grants Specialist', + }, + { + fullName: 'Hermione Granger, SS', + name: 'Hermione Granger', + role: 'System Specialist', + }, + ], + }, +]; + +export const generateXFakeReports = (count) => { + const result = []; + for (let i = 1; i <= count; i += 1) { + result.push( + { + startDate: '02/08/2021', + lastSaved: '02/05/2021', + id: i, + displayId: 'R14-AR-1', + regionId: 14, + topics: ['Behavioral / Mental Health', 'CLASS: Instructional Support'], + calculatedStatus: 'draft', + activityRecipients: [ + { + activityRecipientId: 5, + name: 'Johnston-Romaguera - 14CH00003', + id: 1, + grant: { + id: 5, + number: '14CH00003', + grantee: { + name: 'Johnston-Romaguera', + }, + }, + nonGrantee: null, + }, + { + activityRecipientId: 4, + name: 'Johnston-Romaguera - 14CH00002', + id: 2, + grant: { + id: 4, + number: '14CH00002', + grantee: { + name: 'Johnston-Romaguera', + }, + }, + nonGrantee: null, + }, + { + activityRecipientId: 1, + name: 'Grantee Name - 14CH1234', + id: 3, + grant: { + id: 1, + number: '14CH1234', + grantee: { + name: 'Grantee Name', + }, + }, + nonGrantee: null, + }, + ], + author: { + fullName: 'Kiwi, GS', + name: 'Kiwi', + role: 'Grants Specialist', + homeRegionId: 14, + }, + collaborators: [ + { + fullName: 'Orange, GS', + name: 'Orange', + role: 'Grants Specialist', + }, + { + fullName: 'Hermione Granger, SS', + name: 'Hermione Granger', + role: 'System Specialist', + }, + ], + }, + ); + } + return result; +}; + +export const overviewRegionOne = { + numReports: '1', + numGrants: '2', + numNonGrantees: '2', + numTotalGrants: '4', + numParticipants: '3', + sumDuration: '0.5', +}; + +export default activityReports; diff --git a/frontend/src/pages/GranteeRecord/__tests__/index.js b/frontend/src/pages/GranteeRecord/__tests__/index.js index 0c7c15a3e3..9fcaa6cc8b 100644 --- a/frontend/src/pages/GranteeRecord/__tests__/index.js +++ b/frontend/src/pages/GranteeRecord/__tests__/index.js @@ -86,6 +86,7 @@ describe('grantee record page', () => { fetchMock.get('/api/user', user); fetchMock.get('/api/widgets/overview', overview); fetchMock.get('/api/widgets/overview?region.in[]=45&granteeId.in[]=1', overview); + fetchMock.get('/api/activity-reports?sortBy=updatedAt&sortDir=desc&offset=0&limit=10®ion.in[]=45&granteeId.in[]=1', { count: 0, rows: [] }); }); afterEach(() => { fetchMock.restore(); diff --git a/frontend/src/pages/GranteeRecord/index.js b/frontend/src/pages/GranteeRecord/index.js index 3423725bf7..918cb10995 100644 --- a/frontend/src/pages/GranteeRecord/index.js +++ b/frontend/src/pages/GranteeRecord/index.js @@ -23,7 +23,21 @@ export default function GranteeRecord({ match, location }) { 'grants.number': '', granteeId, }); - const [filters, setFilters] = useState([]); + const [filters, setFilters] = useState([ + { + id: uuidv4(), + topic: 'region', + condition: 'Contains', + query: regionId, + }, + { + id: uuidv4(), + topic: 'granteeId', + condition: 'Contains', + query: granteeId, + }, + ]); + const [error, setError] = useState(); useEffect(() => { @@ -91,7 +105,11 @@ export default function GranteeRecord({ match, location }) { } + render={() => ( + + )} /> - + {}} + tableCaption="Activity Reports" + />
); } diff --git a/frontend/src/pages/GranteeRecord/pages/__tests__/TTAHistory.js b/frontend/src/pages/GranteeRecord/pages/__tests__/TTAHistory.js index 88a67dda7a..2d9a1b62bd 100644 --- a/frontend/src/pages/GranteeRecord/pages/__tests__/TTAHistory.js +++ b/frontend/src/pages/GranteeRecord/pages/__tests__/TTAHistory.js @@ -2,28 +2,37 @@ import '@testing-library/jest-dom'; import React from 'react'; import { render, screen, act } from '@testing-library/react'; import fetchMock from 'fetch-mock'; +import { Router } from 'react-router'; +import { createMemoryHistory } from 'history'; import TTAHistory from '../TTAHistory'; +const memoryHistory = createMemoryHistory(); + describe('Grantee Record - TTA History', () => { - const response = { + const overviewResponse = { numReports: '1', numGrants: '1', inPerson: '0', sumDuration: '1.0', numParticipants: '1', }; + const tableResponse = { + count: 0, + rows: [], + }; + const filtersToApply = [ { - id: 1, + id: '1', topic: 'region', condition: 'Contains', - query: 400, + query: '400', }, { - id: 2, + id: '2', topic: 'granteeId', condition: 'Contains', - query: 100, + query: '100', }, { - id: 3, + id: '3', topic: 'modelType', condition: 'Is', query: 'grant', @@ -31,12 +40,18 @@ describe('Grantee Record - TTA History', () => { ]; const renderTTAHistory = (filters = filtersToApply) => { - render(); + render( + + + , + ); }; beforeEach(async () => { - const url = '/api/widgets/overview?region.in[]=400&granteeId.in[]=100&modelType.is=grant'; - fetchMock.get(url, response); + const overviewUrl = '/api/widgets/overview?region.in[]=400&granteeId.in[]=100&modelType.is=grant'; + const tableUrl = '/api/activity-reports?sortBy=updatedAt&sortDir=desc&offset=0&limit=10®ion.in[]=400&granteeId.in[]=100&modelType.is=grant'; + fetchMock.get(overviewUrl, overviewResponse); + fetchMock.get(tableUrl, tableResponse); }); afterEach(() => { @@ -48,4 +63,10 @@ describe('Grantee Record - TTA History', () => { const onePointOh = await screen.findByText('1.0'); expect(onePointOh).toBeInTheDocument(); }); + + it('renders the activity reports table', async () => { + renderTTAHistory(); + const reports = await screen.findByText('Activity Reports'); + expect(reports).toBeInTheDocument(); + }); }); diff --git a/frontend/src/pages/Landing/__tests__/index.js b/frontend/src/pages/Landing/__tests__/index.js index b10c53cc5d..7727057d1f 100644 --- a/frontend/src/pages/Landing/__tests__/index.js +++ b/frontend/src/pages/Landing/__tests__/index.js @@ -2,7 +2,7 @@ import '@testing-library/jest-dom'; import React from 'react'; import { - render, screen, fireEvent, waitFor, act, + render, screen, fireEvent, waitFor, } from '@testing-library/react'; import { MemoryRouter } from 'react-router'; import fetchMock from 'fetch-mock'; @@ -12,12 +12,10 @@ import UserContext from '../../../UserContext'; import AriaLiveContext from '../../../AriaLiveContext'; import Landing from '../index'; import activityReports, { activityReportsSorted, generateXFakeReports, overviewRegionOne } from '../mocks'; -import { getReportsDownloadURL, getAllReportsDownloadURL, getAllAlertsDownloadURL } from '../../../fetchers/helpers'; +import { getAllAlertsDownloadURL } from '../../../fetchers/helpers'; jest.mock('../../../fetchers/helpers'); -const oldWindowLocation = window.location; - const mockAnnounce = jest.fn(); const withRegionOne = '®ion.in[]=1'; @@ -29,8 +27,8 @@ const defaultBaseUrl = `${base}${withAllRegions}`; const defaultBaseAlertsUrlWithRegionOne = `${baseAlerts}${withRegionOne}`; const defaultBaseUrlWithRegionOne = `${base}${withRegionOne}`; const defaultOverviewUrl = '/api/widgets/overview'; -const overviewUrlWithRegionOne = `${defaultOverviewUrl}?${withRegionOne}`; -const overviewUrlWithAllRegions = `${defaultOverviewUrl}?${withAllRegions}`; +const overviewUrlWithRegionOne = `${defaultOverviewUrl}?region.in[]=1&startDate.aft=2020/08/31`; +const overviewUrlWithAllRegions = `${defaultOverviewUrl}?region.in[]=14&startDate.aft=2020/08/31`; const mockFetchWithRegionOne = () => { fetchMock.get(defaultBaseUrlWithRegionOne, { count: 2, rows: activityReports }); @@ -84,6 +82,7 @@ describe('Landing Page', () => { test('displays a dismissable alert with a status message for a report, if provided', async () => { const user = { name: 'test@test.com', + homeRegionId: 1, permissions: [ { scopeId: 3, @@ -241,452 +240,7 @@ describe('Landing Page', () => { }); }); -describe('Landing Page sorting', () => { - afterEach(() => fetchMock.restore()); - - beforeEach(async () => { - mockFetchWithRegionOne(); - const user = { - name: 'test@test.com', - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - { - scopeId: 2, - regionId: 1, - }, - ], - }; - - renderLanding(user); - await screen.findByText('Activity Reports'); - }); - - it('clicking status column header will sort by status', async () => { - const statusColumnHeader = await screen.findByText(/status/i); - fetchMock.reset(); - fetchMock.get(defaultBaseAlertsUrlWithRegionOne, - { alertsCount: 0, alerts: [] }); - fetchMock.get( - '/api/activity-reports?sortBy=calculatedStatus&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(statusColumnHeader); - await waitFor(() => expect(screen.getAllByRole('cell')[7]).toHaveTextContent(/needs action/i)); - await waitFor(() => expect(screen.getAllByRole('cell')[16]).toHaveTextContent(/draft/i)); - - fetchMock.get( - '/api/activity-reports?sortBy=calculatedStatus&sortDir=desc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReports }, - ); - - fireEvent.click(statusColumnHeader); - await waitFor(() => expect(screen.getAllByRole('cell')[7]).toHaveTextContent(/draft/i)); - await waitFor(() => expect(screen.getAllByRole('cell')[16]).toHaveTextContent(/needs action/i)); - }); - - it('clicking Last saved column header will sort by updatedAt', async () => { - const columnHeader = await screen.findByText(/last saved/i); - - fetchMock.get( - '/api/activity-reports?sortBy=updatedAt&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(columnHeader); - await waitFor(() => expect(screen.getAllByRole('cell')[6]).toHaveTextContent(/02\/04\/2021/i)); - await waitFor(() => expect(screen.getAllByRole('cell')[15]).toHaveTextContent(/02\/05\/2021/i)); - }); - - it('clicking Collaborators column header will sort by collaborators', async () => { - const columnHeader = await screen.findByText(/collaborator\(s\)/i); - - fetchMock.get( - '/api/activity-reports?sortBy=collaborators&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - await act(async () => fireEvent.click(columnHeader)); - await waitFor(() => expect(screen.getAllByRole('cell')[5]).toHaveTextContent('Cucumber User, GS Hermione Granger, SS')); - await waitFor(() => expect(screen.getAllByRole('cell')[14]).toHaveTextContent('Orange, GS Hermione Granger, SS')); - }); - - it('clicking Topics column header will sort by topics', async () => { - const columnHeader = await screen.findByText(/topic\(s\)/i); - - fetchMock.get( - '/api/activity-reports?sortBy=topics&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - await act(async () => fireEvent.click(columnHeader)); - await waitFor(() => expect(screen.getAllByRole('cell')[4]).toHaveTextContent('')); - await waitFor(() => expect(screen.getAllByRole('cell')[13]).toHaveTextContent(/Behavioral \/ Mental Health CLASS: Instructional Support click to visually reveal the topics for R14-AR-1$/i)); - }); - - it('clicking Creator column header will sort by author', async () => { - const columnHeader = await screen.findByText(/creator/i); - - fetchMock.get( - '/api/activity-reports?sortBy=author&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(columnHeader); - await waitFor(() => expect(screen.getAllByRole('cell')[3]).toHaveTextContent('Kiwi, GS')); - await waitFor(() => expect(screen.getAllByRole('cell')[12]).toHaveTextContent('Kiwi, TTAC')); - }); - - it('clicking Start date column header will sort by start date', async () => { - const columnHeader = await screen.findByText(/start date/i); - - fetchMock.get( - '/api/activity-reports?sortBy=startDate&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(columnHeader); - await waitFor(() => expect(screen.getAllByRole('cell')[2]).toHaveTextContent('02/01/2021')); - await waitFor(() => expect(screen.getAllByRole('cell')[11]).toHaveTextContent('02/08/2021')); - }); - - it('clicking Grantee column header will sort by grantee', async () => { - const columnHeader = await screen.findByRole('button', { - name: /grantee\. activate to sort ascending/i, - }); - - fetchMock.get( - '/api/activity-reports?sortBy=activityRecipients&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(columnHeader); - await waitFor(() => expect(screen.getAllByRole('cell')[1]).toHaveTextContent('Johnston-Romaguera Johnston-Romaguera Grantee Name')); - }); - - it('clicking Report id column header will sort by region and id', async () => { - const columnHeader = await screen.findByText(/report id/i); - - fetchMock.get( - '/api/activity-reports?sortBy=regionId&sortDir=asc&offset=0&limit=10®ion.in[]=1', - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(columnHeader); - await waitFor(() => expect(screen.getAllByRole('link')[4]).toHaveTextContent('R14-AR-2')); - await waitFor(() => expect(screen.getAllByRole('link')[5]).toHaveTextContent('R14-AR-1')); - }); - - it('Pagination links are visible', async () => { - const prevLink = await screen.findByRole('link', { - name: /go to previous page/i, - }); - const pageOne = await screen.findByRole('link', { - name: /go to page number 1/i, - }); - const nextLink = await screen.findByRole('link', { - name: /go to next page/i, - }); - - expect(prevLink).toBeVisible(); - expect(pageOne).toBeVisible(); - expect(nextLink).toBeVisible(); - }); - - it('clicking on pagination page works', async () => { - const pageOne = await screen.findByRole('link', { - name: /go to page number 1/i, - }); - fetchMock.reset(); - fetchMock.get(defaultBaseAlertsUrlWithRegionOne, - { alertsCount: 0, alerts: [] }); - fetchMock.get( - defaultBaseUrl, - { count: 2, rows: activityReportsSorted }, - ); - - fireEvent.click(pageOne); - await waitFor(() => expect(screen.getAllByRole('cell')[6]).toHaveTextContent(/02\/05\/2021/i)); - await waitFor(() => expect(screen.getAllByRole('cell')[15]).toHaveTextContent(/02\/04\/2021/i)); - }); - - it('clicking on the second page updates to, from and total', async () => { - expect(generateXFakeReports(10).length).toBe(10); - await screen.findByRole('link', { - name: /go to page number 1/i, - }); - fetchMock.reset(); - fetchMock.get(defaultBaseAlertsUrl, - { alertsCount: 0, alerts: [] }); - fetchMock.get( - defaultBaseUrl, - { count: 17, rows: generateXFakeReports(10) }, - ); - fetchMock.get( - '/api/activity-reports?sortBy=updatedAt&sortDir=desc&offset=10&limit=10®ion.in[]=14', - { count: 17, rows: generateXFakeReports(10) }, - ); - fetchMock.get( - overviewUrlWithAllRegions, - overviewRegionOne, - ); - const user = { - name: 'test@test.com', - homeRegionId: 14, - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - ], - }; - - renderLanding(user); - - const pageTwo = await screen.findByRole('link', { - name: /go to page number 2/i, - }); - - fetchMock.get( - '/api/activity-reports?sortBy=updatedAt&sortDir=desc&offset=10&limit=10®ion.in[]=1', - { count: 17, rows: generateXFakeReports(10) }, - ); - - fireEvent.click(pageTwo); - await waitFor(() => expect(screen.getByText(/11-17 of 17/i)).toBeVisible()); - }); -}); - describe('Landing page table menus & selections', () => { - describe('Table row context menu', () => { - beforeAll(() => { - delete global.window.location; - - global.window.location = { - ...oldWindowLocation, - assign: jest.fn(), - }; - }); - - beforeEach(async () => { - fetchMock.reset(); - mockFetchWithRegionOne(); - fetchMock.get( - defaultBaseUrl, - { count: 10, rows: generateXFakeReports(10) }, - ); - const user = { - name: 'test@test.com', - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - { - scopeId: 2, - regionId: 1, - }, - ], - }; - - renderLanding(user); - await screen.findByText('Activity Reports'); - }); - - afterEach(() => { - window.location.assign.mockReset(); - getReportsDownloadURL.mockClear(); - fetchMock.restore(); - }); - - afterAll(() => { - window.location = oldWindowLocation; - }); - - it('can trigger an activity report download', async () => { - const contextMenus = await screen.findAllByRole('button', { name: /actions for activity report /i }); - - await waitFor(() => { - expect(contextMenus.length).not.toBe(0); - }); - - const menu = contextMenus[0]; - - await waitFor(() => { - expect(menu).toBeVisible(); - }); - - fireEvent.click(menu); - - const viewButton = await screen.findByRole('button', { name: 'Download' }); - - await waitFor(() => { - expect(viewButton).toBeVisible(); - }); - - fireEvent.click(viewButton); - - await waitFor(() => { - expect(window.location.assign).toHaveBeenCalled(); - }); - }); - }); - - describe('Table row checkboxes', () => { - afterEach(() => fetchMock.restore()); - - beforeEach(async () => { - fetchMock.reset(); - fetchMock.get(defaultBaseAlertsUrl, - { alertsCount: 0, alerts: [] }); - fetchMock.get( - defaultBaseUrl, - { count: 10, rows: generateXFakeReports(10) }, - ); - fetchMock.get( - overviewUrlWithAllRegions, - overviewRegionOne, - ); - const user = { - name: 'test@test.com', - homeRegionId: 14, - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - ], - }; - - renderLanding(user); - await screen.findByText('Activity Reports'); - }); - - it('Can select and deselect a single checkbox', async () => { - const reportCheckboxes = await screen.findAllByRole('checkbox', { name: /select /i }); - - // Element 0 is 'Select all', so we want 1 or later - const singleReportCheck = reportCheckboxes[1]; - expect(singleReportCheck.value).toEqual('1'); - - fireEvent.click(singleReportCheck); - expect(singleReportCheck.checked).toBe(true); - - fireEvent.click(singleReportCheck); - expect(singleReportCheck.checked).toBe(false); - }); - }); - - describe('Table header checkbox', () => { - afterEach(() => fetchMock.restore()); - - beforeEach(async () => { - fetchMock.reset(); - fetchMock.get(defaultBaseAlertsUrl, - { alertsCount: 0, alerts: [] }); - fetchMock.get( - defaultBaseUrl, - { count: 10, rows: generateXFakeReports(10) }, - ); - fetchMock.get( - overviewUrlWithAllRegions, - overviewRegionOne, - ); - const user = { - name: 'test@test.com', - homeRegionId: 14, - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - ], - }; - - renderLanding(user); - await screen.findByText('Activity Reports'); - }); - - it('Selects all reports when checked', async () => { - const selectAllCheckbox = await screen.findByLabelText(/select or de-select all reports/i); - - fireEvent.click(selectAllCheckbox); - - await waitFor(() => { - const checkboxes = screen.getAllByRole('checkbox'); - expect(checkboxes).toHaveLength(11); // 1 selectAllCheckbox + 10 report checkboxes - checkboxes.forEach((c) => expect(c).toBeChecked()); - }); - }); - - it('De-selects all reports if all are already selected', async () => { - const selectAllCheckbox = await screen.findByLabelText(/select or de-select all reports/i); - - fireEvent.click(selectAllCheckbox); - - await waitFor(() => { - const checkboxes = screen.getAllByRole('checkbox'); - expect(checkboxes).toHaveLength(11); // 1 selectAllCheckbox + 10 report checkboxes - checkboxes.forEach((c) => expect(c).toBeChecked()); - }); - - fireEvent.click(selectAllCheckbox); - - await waitFor(() => { - const checkboxes = screen.getAllByRole('checkbox'); - expect(checkboxes).toHaveLength(11); // 1 selectAllCheckbox + 10 report checkboxes - checkboxes.forEach((c) => expect(c).not.toBeChecked()); - }); - }); - }); - - describe('Selected count badge', () => { - it('can de-select all reports', async () => { - fetchMock.reset(); - fetchMock.get(defaultBaseAlertsUrl, - { alertsCount: 0, alerts: [] }); - fetchMock.get( - defaultBaseUrl, - { count: 10, rows: generateXFakeReports(10) }, - ); - fetchMock.get( - overviewUrlWithAllRegions, - overviewRegionOne, - ); - const user = { - name: 'test@test.com', - homeRegionId: 14, - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - ], - }; - - renderLanding(user); - await screen.findByText('Activity Reports'); - const selectAllCheckbox = await screen.findByLabelText(/select or de-select all reports/i); - userEvent.click(selectAllCheckbox); - await waitFor(() => { - const checkboxes = screen.getAllByRole('checkbox'); - expect(checkboxes).toHaveLength(11); // 1 selectAllCheckbox + 10 report checkboxes - checkboxes.forEach((c) => expect(c).toBeChecked()); - }); - - const deselect = await screen.findByRole('button', { name: 'deselect all reports' }); - fireEvent.click(deselect); - await waitFor(() => { - const checkboxes = screen.getAllByRole('checkbox'); - expect(checkboxes).toHaveLength(11); // 1 selectAllCheckbox + 10 report checkboxes - checkboxes.forEach((c) => expect(c).not.toBeChecked()); - }); - }); - }); - describe('download all alerts button', () => { describe('downloads all alerts', () => { afterAll(() => { @@ -730,44 +284,6 @@ describe('Landing page table menus & selections', () => { }); }); }); - - describe('download all reports button', () => { - afterAll(() => { - getAllReportsDownloadURL.mockClear(); - }); - - beforeAll(async () => { - fetchMock.reset(); - fetchMock.get( - defaultBaseAlertsUrlWithRegionOne, - { count: 10, alerts: generateXFakeReports(10) }, - ); - fetchMock.get( - defaultBaseUrlWithRegionOne, - { count: 10, rows: [] }, - ); - fetchMock.get(overviewUrlWithRegionOne, overviewRegionOne); - }); - - it('downloads all reports', async () => { - const user = { - name: 'test@test.com', - permissions: [ - { - scopeId: 3, - regionId: 1, - }, - ], - }; - - renderLanding(user); - const reportMenu = await screen.findByLabelText(/reports menu/i); - userEvent.click(reportMenu); - const downloadButton = await screen.findByRole('menuitem', { name: /export table data/i }); - userEvent.click(downloadButton); - expect(getAllReportsDownloadURL).toHaveBeenCalledWith('region.in[]=1'); - }); - }); }); describe('My alerts sorting', () => { @@ -790,6 +306,7 @@ describe('My alerts sorting', () => { fetchMock.get(defaultOverviewUrl, overviewRegionOne); const user = { name: 'test@test.com', + homeRegionId: 1, permissions: [ { scopeId: 3, @@ -1002,6 +519,7 @@ describe('handleApplyFilters', () => { it('calls AriaLiveContext.announce', async () => { const user = { name: 'test@test.com', + homeRegionId: 1, permissions: [ { scopeId: 2, diff --git a/frontend/src/pages/Landing/index.js b/frontend/src/pages/Landing/index.js index b7f1dc78e9..6a493b4416 100644 --- a/frontend/src/pages/Landing/index.js +++ b/frontend/src/pages/Landing/index.js @@ -4,149 +4,28 @@ import React, { } from 'react'; import PropTypes from 'prop-types'; import { - Tag, Table, Alert, Grid, Button, Checkbox, + Alert, Grid, Button, } from '@trussworks/react-uswds'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faTimesCircle } from '@fortawesome/free-solid-svg-icons'; import { Helmet } from 'react-helmet'; import { Link, useHistory } from 'react-router-dom'; -import Pagination from 'react-js-pagination'; - import AriaLiveContext from '../../AriaLiveContext'; -import ContextMenu from '../../components/ContextMenu'; -import Container from '../../components/Container'; -import { getReports, getReportAlerts } from '../../fetchers/activityReports'; -import { getReportsDownloadURL, getAllReportsDownloadURL, getAllAlertsDownloadURL } from '../../fetchers/helpers'; +import { getReportAlerts } from '../../fetchers/activityReports'; +import { getAllAlertsDownloadURL } from '../../fetchers/helpers'; import NewReport from './NewReport'; import 'uswds/dist/css/uswds.css'; import '@trussworks/react-uswds/lib/index.css'; import './index.css'; import MyAlerts from './MyAlerts'; import { hasReadWrite, allRegionsUserHasPermissionTo } from '../../permissions'; -import { REPORTS_PER_PAGE, ALERTS_PER_PAGE } from '../../Constants'; -import Filter, { filtersToQueryString } from '../../components/Filter'; -import ReportMenu from './ReportMenu'; +import { ALERTS_PER_PAGE } from '../../Constants'; +import { filtersToQueryString } from '../../components/Filter'; import Overview from '../../widgets/Overview'; import RegionalSelect from '../../components/RegionalSelect'; import './TouchPoints.css'; -import TooltipWithCollection from '../../components/TooltipWithCollection'; - -function renderReports(reports, history, reportCheckboxes, handleReportSelect) { - const emptyReport = { - id: '', - displayId: '', - activityRecipients: [], - startDate: '', - author: '', - topics: [], - collaborators: [], - lastSaved: '', - calculatedStatus: '', - }; - - const displayReports = reports.length ? reports : [emptyReport]; - - return displayReports.map((report, index, { length }) => { - const { - id, - displayId, - activityRecipients, - startDate, - author, - topics, - collaborators, - lastSaved, - calculatedStatus, - legacyId, - } = report; - - const authorName = author ? author.fullName : ''; - - const recipients = activityRecipients && activityRecipients.map((ar) => ( - ar.grant ? ar.grant.grantee.name : ar.name - )); - - const collaboratorNames = collaborators && collaborators.map((collaborator) => ( - collaborator.fullName)); - - const viewOrEditLink = calculatedStatus === 'approved' ? `/activity-reports/view/${id}` : `/activity-reports/${id}`; - - const linkTarget = legacyId ? `/activity-reports/legacy/${legacyId}` : viewOrEditLink; - - const menuItems = [ - { - label: 'View', - onClick: () => { history.push(linkTarget); }, - }, - ]; - - if (navigator.clipboard) { - menuItems.push({ - label: 'Copy URL', - onClick: async () => { - await navigator.clipboard.writeText(`${window.location.origin}${linkTarget}`); - }, - }); - } - - if (!legacyId) { - const downloadMenuItem = { - label: 'Download', - onClick: () => { - const downloadURL = getReportsDownloadURL([id]); - window.location.assign(downloadURL); - }, - }; - menuItems.push(downloadMenuItem); - } - - const contextMenuLabel = `Actions for activity report ${displayId}`; - - const selectId = `report-${id}`; - const isChecked = reportCheckboxes[id] || false; - return ( - - - - - - - {displayId} - - - - - - {startDate} - - - {authorName} - - - - - - - - - {lastSaved} - - - {calculatedStatus === 'needs_action' ? 'Needs action' : calculatedStatus} - - - - - - - ); - }); -} +import ActivityReportsTable from '../../components/ActivityReportsTable'; export function renderTotal(offset, perPage, activePage, reportsCount) { const from = offset >= reportsCount ? 0 : offset + 1; @@ -160,23 +39,21 @@ export function renderTotal(offset, perPage, activePage, reportsCount) { return `${from}-${to} of ${reportsCount}`; } +function regionFilter(regionId) { + return { + topic: 'region', + condition: 'Contains', + query: regionId.toString(), + }; +} + function Landing({ user }) { const regions = allRegionsUserHasPermissionTo(user); const history = useHistory(); - const [loading, setLoading] = useState(true); const [alertsLoading, setAlertsLoading] = useState(true); - const [reports, updateReports] = useState([]); const [reportAlerts, updateReportAlerts] = useState([]); const [error, updateError] = useState(); const [showAlert, updateShowAlert] = useState(true); - const [sortConfig, setSortConfig] = React.useState({ - sortBy: 'updatedAt', - direction: 'desc', - }); - const [offset, setOffset] = useState(0); - const [perPage] = useState(REPORTS_PER_PAGE); - const [activePage, setActivePage] = useState(1); - const [reportsCount, setReportsCount] = useState(0); const [alertsSortConfig, setAlertsSortConfig] = React.useState({ sortBy: 'startDate', @@ -186,7 +63,6 @@ function Landing({ user }) { const [alertsPerPage] = useState(ALERTS_PER_PAGE); const [alertsActivePage, setAlertsActivePage] = useState(1); const [alertReportsCount, setAlertReportsCount] = useState(0); - const [filters, setFilters] = useState([]); const [alertFilters, setAlertFilters] = useState([]); const defaultRegion = regions[0] || user.homeRegionId || 0; @@ -195,52 +71,13 @@ function Landing({ user }) { appliedRegion, updateAppliedRegion, ] = useState(user.homeRegionId === 14 ? 14 : defaultRegion); + const [filters, setFilters] = useState([ + regionFilter(appliedRegion), + ]); - const [reportCheckboxes, setReportCheckboxes] = useState({}); - const [allReportsChecked, setAllReportsChecked] = useState(false); const [regionLabel, setRegionLabel] = useState(''); const ariaLiveContext = useContext(AriaLiveContext); - const makeReportCheckboxes = (reportsArr, checked) => ( - reportsArr.reduce((obj, r) => ({ ...obj, [r.id]: checked }), {}) - ); - - // The all-reports checkbox can select/deselect all visible reports - const toggleSelectAll = (event) => { - const { target: { checked = null } = {} } = event; - - if (checked === true) { - setReportCheckboxes(makeReportCheckboxes(reports, true)); - setAllReportsChecked(true); - } else { - setReportCheckboxes(makeReportCheckboxes(reports, false)); - setAllReportsChecked(false); - } - }; - - const handleReportSelect = (event) => { - const { target: { checked = null, value = null } = {} } = event; - if (checked === true) { - setReportCheckboxes({ ...reportCheckboxes, [value]: true }); - } else { - setReportCheckboxes({ ...reportCheckboxes, [value]: false }); - } - }; - - const requestSort = (sortBy) => { - let direction = 'asc'; - if ( - sortConfig - && sortConfig.sortBy === sortBy - && sortConfig.direction === 'asc' - ) { - direction = 'desc'; - } - setActivePage(1); - setOffset(0); - setSortConfig({ sortBy, direction }); - }; - const requestAlertsSort = (sortBy) => { let direction = 'asc'; if ( @@ -257,13 +94,19 @@ function Landing({ user }) { const onApplyRegion = (region) => { const regionId = region ? region.value : appliedRegion; + const filtersToApply = filters.filter((f) => f.topic !== 'region'); + filtersToApply.push( + regionFilter(regionId), + ); + + setFilters(filtersToApply); updateAppliedRegion(regionId); }; // Update ariaLiveContext outside of effects to avoid infinite re-renders and // the initial "0 filters applied" on first render const handleApplyFilters = (newFilters) => { - setFilters(newFilters); + setFilters([...newFilters, regionFilter(appliedRegion)]); ariaLiveContext.announce(`${newFilters.length} filter${newFilters.length !== 1 ? 's' : ''} applied to reports`); }; @@ -272,29 +115,11 @@ function Landing({ user }) { ariaLiveContext.announce(`${newFilters.length} filter${newFilters.length !== 1 ? 's' : ''} applied to my alerts`); }; - useEffect(() => { - async function fetchReports() { - setLoading(true); - const filterQuery = filtersToQueryString(filters, appliedRegion); - try { - const { count, rows } = await getReports( - sortConfig.sortBy, - sortConfig.direction, - offset, - perPage, - filterQuery, - ); - updateReports(rows); - setReportsCount(count || 0); - } catch (e) { - // eslint-disable-next-line no-console - console.log(e); - updateError('Unable to fetch reports'); - } - setLoading(false); - } - fetchReports(); - }, [sortConfig, offset, perPage, filters, appliedRegion]); + const handleDownloadAllAlerts = () => { + const filterQuery = filtersToQueryString(alertFilters, appliedRegion); + const downloadURL = getAllAlertsDownloadURL(filterQuery); + window.location.assign(downloadURL); + }; useEffect(() => { async function fetchAlertReports() { @@ -312,7 +137,6 @@ function Landing({ user }) { if (alertsCount) { setAlertReportsCount(alertsCount); } - setAllReportsChecked(false); } catch (e) { // eslint-disable-next-line no-console console.log(e); @@ -323,95 +147,10 @@ function Landing({ user }) { fetchAlertReports(); }, [alertsSortConfig, alertsOffset, alertsPerPage, alertFilters, appliedRegion]); - // When reports are updated, make sure all checkboxes are unchecked - useEffect(() => { - setReportCheckboxes(makeReportCheckboxes(reports, false)); - }, [reports]); - useEffect(() => { setRegionLabel(appliedRegion === 14 ? 'All' : appliedRegion.toString()); }, [appliedRegion]); - useEffect(() => { - const checkValues = Object.values(reportCheckboxes); - if (checkValues.every((v) => v === true)) { - setAllReportsChecked(true); - } else if (allReportsChecked === true) { - setAllReportsChecked(false); - } - }, [reportCheckboxes, allReportsChecked]); - - const handleDownloadClick = () => { - const toDownloadableReportIds = (accumulator, entry) => { - if (!reports) return accumulator; - const [key, value] = entry; - if (value === false) return accumulator; - accumulator.push(key); - return accumulator; - }; - - const downloadable = Object.entries(reportCheckboxes).reduce(toDownloadableReportIds, []); - if (downloadable.length) { - const downloadURL = getReportsDownloadURL(downloadable); - window.location.assign(downloadURL); - } - }; - - const handleDownloadAllReports = () => { - const filterQuery = filtersToQueryString(filters, appliedRegion); - const downloadURL = getAllReportsDownloadURL(filterQuery); - window.location.assign(downloadURL); - }; - - const handleDownloadAllAlerts = () => { - const filterQuery = filtersToQueryString(alertFilters, appliedRegion); - const downloadURL = getAllAlertsDownloadURL(filterQuery); - window.location.assign(downloadURL); - }; - - const getClassNamesFor = (name) => (sortConfig.sortBy === name ? sortConfig.direction : ''); - const numberOfSelectedReports = Object.values(reportCheckboxes).filter((c) => c).length; - - const renderColumnHeader = (displayName, name) => { - const sortClassName = getClassNamesFor(name); - let fullAriaSort; - switch (sortClassName) { - case 'asc': - fullAriaSort = 'ascending'; - break; - case 'desc': - fullAriaSort = 'descending'; - break; - default: - fullAriaSort = 'none'; - break; - } - return ( - - { - requestSort(name); - }} - onKeyPress={() => requestSort(name)} - className={`sortable ${sortClassName}`} - aria-label={`${displayName}. Activate to sort ${sortClassName === 'asc' ? 'descending' : 'ascending' - }`} - > - {displayName} - - - ); - }; - - const handlePageChange = (pageNumber) => { - if (!loading) { - setActivePage(pageNumber); - setOffset((pageNumber - 1) * perPage); - } - }; - let msg; const message = history.location.state && history.location.state.message; if (message) { @@ -529,106 +268,12 @@ function Landing({ user }) { handleDownloadAllAlerts={handleDownloadAllAlerts} message={message} /> - - - {numberOfSelectedReports > 0 - && ( - - {numberOfSelectedReports} - {' '} - selected - {' '} - - - )} - - 0} - onExportAll={handleDownloadAllReports} - onExportSelected={handleDownloadClick} - count={reportsCount} - /> - - - - - {renderTotal(offset, perPage, activePage, reportsCount)} - - - - -
- - - - - - {renderColumnHeader('Report ID', 'regionId')} - {renderColumnHeader('Grantee', 'activityRecipients')} - {renderColumnHeader('Start date', 'startDate')} - {renderColumnHeader('Creator', 'author')} - {renderColumnHeader('Topic(s)', 'topics')} - {renderColumnHeader('Collaborator(s)', 'collaborators')} - {renderColumnHeader('Last saved', 'updatedAt')} - {renderColumnHeader('Status', 'calculatedStatus')} - - - - {renderReports( - reports, - history, - reportCheckboxes, - handleReportSelect, - )} - -
- {`Region ${regionLabel} Activity reports`} -

with sorting and pagination

-
- - -
-
-
+ ); diff --git a/frontend/src/widgets/withWidgetData.js b/frontend/src/widgets/withWidgetData.js index 2976dd92d2..e2649156e5 100644 --- a/frontend/src/widgets/withWidgetData.js +++ b/frontend/src/widgets/withWidgetData.js @@ -1,5 +1,6 @@ /* eslint-disable react/jsx-props-no-spreading */ -import React, { useState, useEffect } from 'react'; +import React, { useState } from 'react'; +import useDeepCompareEffect from 'use-deep-compare-effect'; import PropTypes from 'prop-types'; import fetchWidget from '../fetchers/Widgets'; import { filtersToQueryString } from '../components/Filter'; @@ -18,7 +19,7 @@ const withWidgetData = (Widget, widgetId) => { const { filters } = props; - useEffect(() => { + useDeepCompareEffect(() => { const fetch = async () => { try { updateLoading(true); From d4069c1d1e49832e12edcf9484bfb6b4dcf3e03e Mon Sep 17 00:00:00 2001 From: Josh Salisbury Date: Mon, 8 Nov 2021 11:06:06 -0600 Subject: [PATCH 08/79] Accessibility updates --- frontend/src/widgets/BarGraph.js | 2 +- frontend/src/widgets/FrequencyGraph.css | 35 ------------------------- frontend/src/widgets/FrequencyGraph.js | 9 +++++-- 3 files changed, 8 insertions(+), 38 deletions(-) diff --git a/frontend/src/widgets/BarGraph.js b/frontend/src/widgets/BarGraph.js index 8076e7c6d9..cd197fd36f 100644 --- a/frontend/src/widgets/BarGraph.js +++ b/frontend/src/widgets/BarGraph.js @@ -105,7 +105,7 @@ function BarGraph({ data, yAxisLabel, xAxisLabel }) {
{/* eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex */}
- graph receives focus so keyboard users can scroll it + Use the arrow keys to scroll graph + + {selectedGraphString} + {' '} + in Activity reports by frequency + -

+

in Activity Reports by Frequency

From 1fb7bc62a0ddcba4298b5d7b48b613d7fee739d8 Mon Sep 17 00:00:00 2001 From: Josh Salisbury Date: Mon, 8 Nov 2021 11:23:43 -0600 Subject: [PATCH 09/79] Pluralize frequency graph type --- frontend/src/widgets/FrequencyGraph.js | 7 +++++-- src/widgets/frequencyGraph.js | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frontend/src/widgets/FrequencyGraph.js b/frontend/src/widgets/FrequencyGraph.js index 0f23696bbc..bcf1a2a884 100644 --- a/frontend/src/widgets/FrequencyGraph.js +++ b/frontend/src/widgets/FrequencyGraph.js @@ -28,6 +28,9 @@ function sortData(data, order) { const TOPIC = 0; const REASON = 1; +const TOPIC_STR = 'topics'; +const REASON_STR = 'reasons'; + const HEADINGS = { [TOPIC]: ['Topic', 'Count'], [REASON]: ['Reason', 'Count'], @@ -37,7 +40,7 @@ export function FreqGraph({ data, loading }) { // whether to show the data as accessible widget data or not const [showAccessibleData, updateShowAccessibleData] = useState(false); const [selectedGraph, updateSelectedGraph] = useState(TOPIC); - const selectedGraphString = selectedGraph === TOPIC ? 'topic' : 'reason'; + const selectedGraphString = selectedGraph === TOPIC ? TOPIC_STR : REASON_STR; const selectedData = data[selectedGraphString]; const sortedData = sortData(selectedData, SORT_ORDER.DESC); @@ -130,7 +133,7 @@ FreqGraph.propTypes = { }; FreqGraph.defaultProps = { - data: { topic: [], reason: [] }, + data: { [TOPIC_STR]: [], [REASON_STR]: [] }, }; export default withWidgetData(FreqGraph, 'frequencyGraph'); diff --git a/src/widgets/frequencyGraph.js b/src/widgets/frequencyGraph.js index a5025aef40..321eff95e7 100644 --- a/src/widgets/frequencyGraph.js +++ b/src/widgets/frequencyGraph.js @@ -3,11 +3,11 @@ import { TOPICS, REASONS } from '../constants'; import { countOccurrences } from './helper'; export default async function topicFrequencyGraph(scopes) { - const topic = await countOccurrences(scopes, 'topics', TOPICS); - const reason = await countOccurrences(scopes, 'reason', REASONS); + const topics = await countOccurrences(scopes, 'topics', TOPICS); + const reasons = await countOccurrences(scopes, 'reason', REASONS); return { - topic, - reason, + topics, + reasons, }; } From b6d4218b1d1e33c08b227eaad14577d51c73bf03 Mon Sep 17 00:00:00 2001 From: Josh Salisbury Date: Mon, 8 Nov 2021 12:06:37 -0600 Subject: [PATCH 10/79] Fix tests --- .../src/widgets/__tests__/FrequencyGraph.js | 14 ++++++------- src/widgets/frequencyGraph.test.js | 20 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frontend/src/widgets/__tests__/FrequencyGraph.js b/frontend/src/widgets/__tests__/FrequencyGraph.js index dfb959b004..6cab066373 100644 --- a/frontend/src/widgets/__tests__/FrequencyGraph.js +++ b/frontend/src/widgets/__tests__/FrequencyGraph.js @@ -9,7 +9,7 @@ import userEvent from '@testing-library/user-event'; import { FreqGraph } from '../FrequencyGraph'; const TEST_DATA = { - topic: [ + topics: [ { category: 'first category', count: 1, @@ -23,7 +23,7 @@ const TEST_DATA = { count: 0, }, ], - reason: [ + reasons: [ { category: 'one', count: 1, @@ -46,13 +46,13 @@ const renderFrequencyGraph = async () => ( describe('Frequency Graph', () => { it('shows topics by default', async () => { renderFrequencyGraph(); - const topics = await screen.findByText('Topics'); - expect(topics).toBeInTheDocument(); + const topics = await screen.findByRole('button', { name: 'Open change graph type menu' }); + expect(topics.textContent).toBe('Topics'); }); it('can switch to show reasons', async () => { renderFrequencyGraph(); - const topics = await screen.findByText('Topics'); + const topics = await screen.findByRole('button', { name: 'Open change graph type menu' }); userEvent.click(topics); const reasonBtn = await screen.findByText('Reasons'); @@ -60,8 +60,8 @@ describe('Frequency Graph', () => { const apply = await screen.findByText('Apply'); userEvent.click(apply); - const reasons = await screen.findByText('Reasons'); - expect(reasons).toBeInTheDocument(); + const reasons = await screen.findByRole('button', { name: 'Open change graph type menu' }); + expect(reasons.textContent).toBe('Reasons'); }); it('can show accessible data', async () => { diff --git a/src/widgets/frequencyGraph.test.js b/src/widgets/frequencyGraph.test.js index b2cea3e28d..85ec06c143 100644 --- a/src/widgets/frequencyGraph.test.js +++ b/src/widgets/frequencyGraph.test.js @@ -48,12 +48,12 @@ describe('frequency graph widget', () => { id: [reportOne.id, reportTwo.id, reportThree.id, reportFour.id], }]); - const { topic } = res; + const { topics } = res; - expect(topic.find((r) => r.category === 'Home Visiting').count).toBe(3); - expect(topic.find((r) => r.category === 'Five-Year Grant').count).toBe(2); - expect(topic.find((r) => r.category === 'Fiscal / Budget').count).toBe(2); - expect(topic.find((r) => r.category === 'Nutrition').count).toBe(0); + expect(topics.find((r) => r.category === 'Home Visiting').count).toBe(3); + expect(topics.find((r) => r.category === 'Five-Year Grant').count).toBe(2); + expect(topics.find((r) => r.category === 'Fiscal / Budget').count).toBe(2); + expect(topics.find((r) => r.category === 'Nutrition').count).toBe(0); }); it('returns count of reasons', async () => { @@ -61,11 +61,11 @@ describe('frequency graph widget', () => { id: [reportOne.id, reportTwo.id, reportThree.id, reportFour.id], }]); - const { reason } = res; + const { reasons } = res; - expect(reason.find((r) => r.category === 'Change in Scope').count).toBe(3); - expect(reason.find((r) => r.category === 'Complaint').count).toBe(1); - expect(reason.find((r) => r.category === 'Child Incidents').count).toBe(2); - expect(reason.find((r) => r.category === 'Full Enrollment').count).toBe(0); + expect(reasons.find((r) => r.category === 'Change in Scope').count).toBe(3); + expect(reasons.find((r) => r.category === 'Complaint').count).toBe(1); + expect(reasons.find((r) => r.category === 'Child Incidents').count).toBe(2); + expect(reasons.find((r) => r.category === 'Full Enrollment').count).toBe(0); }); }); From 872fb8a42ce3940b41f169a048f146f8c9c9004f Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Mon, 8 Nov 2021 15:38:35 -0500 Subject: [PATCH 11/79] final changes to export message from accessibility spec. --- frontend/src/pages/Landing/ReportMenu.js | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/frontend/src/pages/Landing/ReportMenu.js b/frontend/src/pages/Landing/ReportMenu.js index 1b8b40f441..d3015f572a 100644 --- a/frontend/src/pages/Landing/ReportMenu.js +++ b/frontend/src/pages/Landing/ReportMenu.js @@ -56,7 +56,7 @@ function ReportMenu({ aria-label={label} onClick={() => updateOpen((current) => !current)} > - Reports + Export reports {' '} {count > MAXIMUM_EXPORTED_REPORTS ? ( <> -
- -

This export has @@ -116,7 +104,7 @@ function ReportMenu({ type="button" className="usa-button usa-button--unstyled smart-hub--reports-button smart-hub--button__no-margin" > - Export table data... + Export table data ) } {hasSelectedReports && onExportSelected && ( @@ -126,7 +114,7 @@ function ReportMenu({ type="button" className="usa-button usa-button--unstyled smart-hub--reports-button smart-hub--button__no-margin margin-top-2" > - Export selected reports... + Export selected reports )} From 396d600d8cd57cb303ad4f31d83058c8af56f461 Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Mon, 8 Nov 2021 18:45:15 -0500 Subject: [PATCH 12/79] welcoming robots in certain situations --- .circleci/config.yml | 15 ++++++++++++++- bin/robot-factory | 7 +++++++ frontend/public/robots.txt | 5 ++++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100755 bin/robot-factory diff --git a/.circleci/config.yml b/.circleci/config.yml index 75fe862a14..a61e7134db 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -168,7 +168,7 @@ parameters: default: "kw-disable-hses-staging" type: string sandbox_git_branch: # change to feature branch to test deployment - default: "kw-delete-reports-script" + default: "TTAHUB276" type: string prod_new_relic_app_id: default: "877570491" @@ -333,6 +333,19 @@ jobs: - run: name: Build backend assets command: yarn build + - when: + condition: + and: + # testing in sandbox + - equal: [<< pipeline.project.git_url >>, << pipeline.parameters.sandbox_git_url >>] + - equal: [<< pipeline.git.branch >>, << pipeline.parameters.sandbox_git_branch >>] + # uncomment for production + # - equal: [<< pipeline.project.git_url >>, << pipeline.parameters.prod_git_url >>] + # - equal: [<< pipeline.git.branch >>, << pipeline.parameters.prod_git_branch >>] + steps: + - run: + name: Create production robot + command: ./bin/robot-factory - run: name: Build frontend assets command: yarn --cwd frontend run build diff --git a/bin/robot-factory b/bin/robot-factory new file mode 100755 index 0000000000..144ad8f8ad --- /dev/null +++ b/bin/robot-factory @@ -0,0 +1,7 @@ +#!/bin/bash + +cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 09:32:43 -0500 Subject: [PATCH 13/79] Update known vulnerabilities --- frontend/yarn-audit-known-issues | 28 ---------------------------- yarn-audit-known-issues | 1 + 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/frontend/yarn-audit-known-issues b/frontend/yarn-audit-known-issues index 78ad308d54..1cf24cc051 100644 --- a/frontend/yarn-audit-known-issues +++ b/frontend/yarn-audit-known-issues @@ -1,33 +1,5 @@ -{"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"jest-junit>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["jest-junit>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["jest-junit>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["jest-junit>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["jest-junit>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["jest-junit>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["jest-junit>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>string-width>strip-ansi>ansi-regex","react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>strip-ansi>ansi-regex"]},{"version":"4.1.0","paths":["react-scripts>webpack-dev-server>yargs>cliui>wrap-ansi>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002423,"path":"react-scripts>@svgr/webpack>@svgr/plugin-svgo>svgo>css-select>nth-check","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"1.0.2","paths":["react-scripts>@svgr/webpack>@svgr/plugin-svgo>svgo>css-select>nth-check","react-scripts>optimize-css-assets-webpack-plugin>cssnano>cssnano-preset-default>postcss-svgo>svgo>css-select>nth-check"]}],"metadata":null,"vulnerable_versions":"<2.0.1","module_name":"nth-check","severity":"moderate","github_advisory_id":"GHSA-rp65-9cf3-cjxr","cves":["CVE-2021-3803"],"access":"public","patched_versions":">=2.0.1","updated":"2021-09-20T20:15:09.000Z","recommendation":"Upgrade to version 2.0.1 or later","cwe":"CWE-1333","found_by":null,"deleted":null,"id":1002423,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3803\n- https://github.com/advisories/GHSA-rp65-9cf3-cjxr","created":"2021-10-07T07:31:50.506Z","reported_by":null,"title":"Inefficient Regular Expression Complexity in nth-check","npm_advisory_id":null,"overview":"nth-check is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-rp65-9cf3-cjxr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002423,"path":"react-scripts>optimize-css-assets-webpack-plugin>cssnano>cssnano-preset-default>postcss-svgo>svgo>css-select>nth-check","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"1.0.2","paths":["react-scripts>@svgr/webpack>@svgr/plugin-svgo>svgo>css-select>nth-check","react-scripts>optimize-css-assets-webpack-plugin>cssnano>cssnano-preset-default>postcss-svgo>svgo>css-select>nth-check"]}],"metadata":null,"vulnerable_versions":"<2.0.1","module_name":"nth-check","severity":"moderate","github_advisory_id":"GHSA-rp65-9cf3-cjxr","cves":["CVE-2021-3803"],"access":"public","patched_versions":">=2.0.1","updated":"2021-09-20T20:15:09.000Z","recommendation":"Upgrade to version 2.0.1 or later","cwe":"CWE-1333","found_by":null,"deleted":null,"id":1002423,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3803\n- https://github.com/advisories/GHSA-rp65-9cf3-cjxr","created":"2021-10-07T07:31:50.506Z","reported_by":null,"title":"Inefficient Regular Expression Complexity in nth-check","npm_advisory_id":null,"overview":"nth-check is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-rp65-9cf3-cjxr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002475,"path":"react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.0.1","paths":["react-scripts>webpack>micromatch>snapdragon>base>cache-base>set-value","react-scripts>webpack>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>react-dev-utils>fork-ts-checker-webpack-plugin>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>webpack-dev-server>chokidar>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>@jest/reporters>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>braces>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>set-value","react-scripts>jest>jest-cli>@jest/core>jest-runner>jest-runtime>jest-config>babel-jest>@jest/transform>jest-haste-map>sane>anymatch>micromatch>extglob>expand-brackets>snapdragon>base>cache-base>union-value>set-value"]}],"metadata":null,"vulnerable_versions":"<4.0.1","module_name":"set-value","severity":"high","github_advisory_id":"GHSA-4jqc-8m5r-9rpr","cves":["CVE-2021-23440"],"access":"public","patched_versions":">=4.0.1","updated":"2021-09-13T19:33:19.000Z","recommendation":"Upgrade to version 4.0.1 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002475,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23440\n- https://github.com/advisories/GHSA-4jqc-8m5r-9rpr","created":"2021-10-07T07:31:50.512Z","reported_by":null,"title":"Prototype Pollution in set-value","npm_advisory_id":null,"overview":"This affects the package set-value before 4.0.1. A type confusion vulnerability can lead to a bypass of CVE-2019-10747 when the user-provided keys used in the path parameter are arrays.","url":"https://github.com/advisories/GHSA-4jqc-8m5r-9rpr"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002487,"path":"react-scripts>react-dev-utils>immer","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"8.0.1","paths":["react-scripts>react-dev-utils>immer"]}],"metadata":null,"vulnerable_versions":"<9.0.6","module_name":"immer","severity":"high","github_advisory_id":"GHSA-c36v-fmgq-m8hx","cves":["CVE-2021-3757"],"access":"public","patched_versions":">=9.0.6","updated":"2021-09-03T20:17:22.000Z","recommendation":"Upgrade to version 9.0.6 or later","cwe":"CWE-915","found_by":null,"deleted":null,"id":1002487,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3757\n- https://github.com/advisories/GHSA-c36v-fmgq-m8hx","created":"2021-10-07T07:31:50.514Z","reported_by":null,"title":"Prototype Pollution in immer","npm_advisory_id":null,"overview":"immer is vulnerable to Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution')","url":"https://github.com/advisories/GHSA-c36v-fmgq-m8hx"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002492,"path":"react-scripts>react-dev-utils>immer","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"8.0.1","paths":["react-scripts>react-dev-utils>immer"]}],"metadata":null,"vulnerable_versions":"<9.0.6","module_name":"immer","severity":"critical","github_advisory_id":"GHSA-33f9-j839-rf8h","cves":["CVE-2021-23436"],"access":"public","patched_versions":">=9.0.6","updated":"2021-09-02T16:57:32.000Z","recommendation":"Upgrade to version 9.0.6 or later","cwe":"CWE-843","found_by":null,"deleted":null,"id":1002492,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23436\n- https://github.com/advisories/GHSA-33f9-j839-rf8h","created":"2021-10-07T07:31:50.514Z","reported_by":null,"title":"Prototype Pollution in immer","npm_advisory_id":null,"overview":"This affects the package immer before 9.0.6. A type confusion vulnerability can lead to a bypass of CVE-2020-28477 when the user-provided keys used in the path parameter are arrays. In particular, this bypass is possible because the condition (p === \"__proto__\" || p === \"constructor\") in applyPatches_ returns false if p is ['__proto__'] (or ['constructor']). The === operator (strict equality operator) returns false if the operands have different type.","url":"https://github.com/advisories/GHSA-33f9-j839-rf8h"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002503,"path":"react-js-pagination>tar","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.2.2","paths":["react-js-pagination>tar"]}],"metadata":null,"vulnerable_versions":"<4.4.18","module_name":"tar","severity":"high","github_advisory_id":"GHSA-5955-9wpr-37jh","cves":["CVE-2021-37713"],"access":"public","patched_versions":">=4.4.18","updated":"2021-08-31T16:02:33.000Z","recommendation":"Upgrade to version 4.4.18 or later","cwe":"CWE-22","found_by":null,"deleted":null,"id":1002503,"references":"- https://github.com/npm/node-tar/security/advisories/GHSA-5955-9wpr-37jh\n- https://nvd.nist.gov/vuln/detail/CVE-2021-37713\n- https://github.com/advisories/GHSA-5955-9wpr-37jh","created":"2021-10-07T07:31:50.519Z","reported_by":null,"title":"Arbitrary File Creation/Overwrite on Windows via insufficient relative path sanitization","npm_advisory_id":null,"overview":"### Impact\n\nArbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution\n\nnode-tar aims to guarantee that any file whose location would be outside of the extraction target directory is not extracted. This is, in part, accomplished by sanitizing absolute paths of entries within the archive, skipping archive entries that contain `..` path portions, and resolving the sanitized paths against the extraction target directory.\n\nThis logic was insufficient on Windows systems when extracting tar files that contained a path that was not an absolute path, but specified a drive letter different from the extraction target, such as `C:some\\path`. If the drive letter does not match the extraction target, for example `D:\\extraction\\dir`, then the result of `path.resolve(extractionDirectory, entryPath)` would resolve against the current working directory on the `C:` drive, rather than the extraction target directory.\n\nAdditionally, a `..` portion of the path could occur immediately after the drive letter, such as `C:../foo`, and was not properly sanitized by the logic that checked for `..` within the normalized and split portions of the path.\n\nThis only affects users of `node-tar` on Windows systems.\n\n### Patches\n\n4.4.18 || 5.0.10 || 6.1.9\n\n### Workarounds\n\nThere is no reasonable way to work around this issue without performing the same path normalization procedures that node-tar now does.\n\nUsers are encouraged to upgrade to the latest patched versions of node-tar, rather than attempt to sanitize paths themselves.\n\n### Fix\n\nThe fixed versions strip path roots from all paths prior to being resolved against the extraction target folder, even if such paths are not \"absolute\".\n\nAdditionally, a path starting with a drive letter and then two dots, like `c:../`, would bypass the check for `..` path portions. This is checked properly in the patched versions.\n\nFinally, a defense in depth check is added, such that if the `entry.absolute` is outside of the extraction taret, and we are not in preservePaths:true mode, a warning is raised on that entry, and it is skipped. Currently, it is believed that this check is redundant, but it did catch some oversights in development.\n","url":"https://github.com/advisories/GHSA-5955-9wpr-37jh"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002506,"path":"react-js-pagination>tar","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.2.2","paths":["react-js-pagination>tar"]}],"metadata":null,"vulnerable_versions":"<4.4.18","module_name":"tar","severity":"high","github_advisory_id":"GHSA-qq89-hq3f-393p","cves":["CVE-2021-37712"],"access":"public","patched_versions":">=4.4.18","updated":"2021-08-31T16:02:05.000Z","recommendation":"Upgrade to version 4.4.18 or later","cwe":"CWE-22","found_by":null,"deleted":null,"id":1002506,"references":"- https://github.com/npm/node-tar/security/advisories/GHSA-qq89-hq3f-393p\n- https://nvd.nist.gov/vuln/detail/CVE-2021-37712\n- https://github.com/advisories/GHSA-qq89-hq3f-393p","created":"2021-10-07T07:31:50.519Z","reported_by":null,"title":"Arbitrary File Creation/Overwrite via insufficient symlink protection due to directory cache poisoning using symbolic links","npm_advisory_id":null,"overview":"### Impact\nArbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution\n\nnode-tar aims to guarantee that any file whose location would be modified by a symbolic link is not extracted. This is, in part, achieved by ensuring that extracted directories are not symlinks. Additionally, in order to prevent unnecessary stat calls to determine whether a given path is a directory, paths are cached when directories are created.\n\nThis logic was insufficient when extracting tar files that contained two directories and a symlink with names containing unicode values that normalized to the same value. Additionally, on Windows systems, long path portions would resolve to the same file system entities as their 8.3 \"short path\" counterparts. A specially crafted tar archive could thus include directories with two forms of the path that resolve to the same file system entity, followed by a symbolic link with a name in the first form, lastly followed by a file using the second form. It led to bypassing node-tar symlink checks on directories, essentially allowing an untrusted tar file to symlink into an arbitrary location and subsequently extracting arbitrary files into that location, thus allowing arbitrary file creation and overwrite.\n\nThe v3 branch of `node-tar` has been deprecated and did not receive patches for these issues. If you are still using a v3 release we recommend you update to a more recent version of `node-tar`. If this is not possible, a workaround is available below.\n\n### Patches\n\n6.1.9 || 5.0.10 || 4.4.18\n\n### Workarounds\n\nUsers may work around this vulnerability without upgrading by creating a custom filter method which prevents the extraction of symbolic links.\n\n```js\nconst tar = require('tar')\n\ntar.x({\n file: 'archive.tgz',\n filter: (file, entry) => {\n if (entry.type === 'SymbolicLink') {\n return false\n } else {\n return true\n }\n }\n})\n```\n\nUsers are encouraged to upgrade to the latest patched versions, rather than attempt to sanitize tar input themselves.\n\n#### Fix\n\nThe problem is addressed in the following ways, when comparing paths in the directory cache and path reservation systems:\n\n1. The `String.normalize('NFKD')` method is used to first normalize all unicode to its maximally compatible and multi-code-point form.\n2. All slashes are normalized to `/` on Windows systems (on posix systems, `\\` is a valid filename character, and thus left intact).\n3. When a symbolic link is encountered on Windows systems, the entire directory cache is cleared. Collisions related to use of 8.3 short names to replace directories with other (non-symlink) types of entries may make archives fail to extract properly, but will not result in arbitrary file writes.\n","url":"https://github.com/advisories/GHSA-qq89-hq3f-393p"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002509,"path":"react-js-pagination>tar","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.2.2","paths":["react-js-pagination>tar"]}],"metadata":null,"vulnerable_versions":"<4.4.16","module_name":"tar","severity":"high","github_advisory_id":"GHSA-9r2w-394v-53qc","cves":["CVE-2021-37701"],"access":"public","patched_versions":">=4.4.16","updated":"2021-08-31T16:01:51.000Z","recommendation":"Upgrade to version 4.4.16 or later","cwe":"CWE-22","found_by":null,"deleted":null,"id":1002509,"references":"- https://github.com/npm/node-tar/security/advisories/GHSA-9r2w-394v-53qc\n- https://nvd.nist.gov/vuln/detail/CVE-2021-37701\n- https://github.com/advisories/GHSA-9r2w-394v-53qc","created":"2021-10-07T07:31:50.520Z","reported_by":null,"title":"Arbitrary File Creation/Overwrite via insufficient symlink protection due to directory cache poisoning using symbolic links","npm_advisory_id":null,"overview":"### Impact\n\nArbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution\n\n`node-tar` aims to guarantee that any file whose location would be modified by a symbolic link is not extracted. This is, in part, achieved by ensuring that extracted directories are not symlinks. Additionally, in order to prevent unnecessary stat calls to determine whether a given path is a directory, paths are cached when directories are created.\n\nThis logic was insufficient when extracting tar files that contained both a directory and a symlink with the same name as the directory, where the symlink and directory names in the archive entry used backslashes as a path separator on posix systems. The cache checking logic used both `\\` and `/` characters as path separators, however `\\` is a valid filename character on posix systems.\n\nBy first creating a directory, and then replacing that directory with a symlink, it was thus possible to bypass node-tar symlink checks on directories, essentially allowing an untrusted tar file to symlink into an arbitrary location and subsequently extracting arbitrary files into that location, thus allowing arbitrary file creation and overwrite.\n\nAdditionally, a similar confusion could arise on case-insensitive filesystems. If a tar archive contained a directory at `FOO`, followed by a symbolic link named `foo`, then on case-insensitive file systems, the creation of the symbolic link would remove the directory from the filesystem, but _not_ from the internal directory cache, as it would not be treated as a cache hit. A subsequent file entry within the `FOO` directory would then be placed in the target of the symbolic link, thinking that the directory had already been created. \n\nThese issues were addressed in releases 4.4.16, 5.0.8 and 6.1.7.\n\nThe v3 branch of `node-tar` has been deprecated and did not receive patches for these issues. If you are still using a v3 release we recommend you update to a more recent version of `node-tar`. If this is not possible, a workaround is available below.\n\n### Patches\n\n4.4.16 || 5.0.8 || 6.1.7\n\n### Workarounds\n\nUsers may work around this vulnerability without upgrading by creating a custom filter method which prevents the extraction of symbolic links.\n\n```js\nconst tar = require('tar')\n\ntar.x({\n file: 'archive.tgz',\n filter: (file, entry) => {\n if (entry.type === 'SymbolicLink') {\n return false\n } else {\n return true\n }\n }\n})\n```\n\nUsers are encouraged to upgrade to the latest patched versions, rather than attempt to sanitize tar input themselves.\n\n### Fix\n\nThe problem is addressed in the following ways:\n\n1. All paths are normalized to use `/` as a path separator, replacing `\\` with `/` on Windows systems, and leaving `\\` intact in the path on posix systems. This is performed in depth, at every level of the program where paths are consumed.\n2. Directory cache pruning is performed case-insensitively. This _may_ result in undue cache misses on case-sensitive file systems, but the performance impact is negligible.\n\n#### Caveat\n\nNote that this means that the `entry` objects exposed in various parts of tar's API will now always use `/` as a path separator, even on Windows systems. This is not expected to cause problems, as `/` is a valid path separator on Windows systems, but _may_ result in issues if `entry.path` is compared against a path string coming from some other API such as `fs.realpath()` or `path.resolve()`.\n\nUsers are encouraged to always normalize paths using a well-tested method such as `path.resolve()` before comparing paths to one another.","url":"https://github.com/advisories/GHSA-9r2w-394v-53qc"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002542,"path":"react-js-pagination>tar","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.2.2","paths":["react-js-pagination>tar"]}],"metadata":null,"vulnerable_versions":"<3.2.2","module_name":"tar","severity":"high","github_advisory_id":"GHSA-3jfq-g458-7qm9","cves":["CVE-2021-32804"],"access":"public","patched_versions":">=3.2.2","updated":"2021-08-03T19:06:16.000Z","recommendation":"Upgrade to version 3.2.2 or later","cwe":"CWE-22","found_by":null,"deleted":null,"id":1002542,"references":"- https://github.com/npm/node-tar/security/advisories/GHSA-3jfq-g458-7qm9\n- https://nvd.nist.gov/vuln/detail/CVE-2021-32804\n- https://github.com/advisories/GHSA-3jfq-g458-7qm9","created":"2021-10-07T07:31:50.525Z","reported_by":null,"title":"Arbitrary File Creation/Overwrite due to insufficient absolute path sanitization","npm_advisory_id":null,"overview":"### Impact\n\nArbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution\n\n`node-tar` aims to prevent extraction of absolute file paths by turning absolute paths into relative paths when the `preservePaths` flag is not set to `true`. This is achieved by stripping the absolute path root from any absolute file paths contained in a tar file. For example `/home/user/.bashrc` would turn into `home/user/.bashrc`. \n\nThis logic was insufficient when file paths contained repeated path roots such as `////home/user/.bashrc`. `node-tar` would only strip a single path root from such paths. When given an absolute file path with repeating path roots, the resulting path (e.g. `///home/user/.bashrc`) would still resolve to an absolute path, thus allowing arbitrary file creation and overwrite. \n\n### Patches\n\n3.2.2 || 4.4.14 || 5.0.6 || 6.1.1\n\nNOTE: an adjacent issue [CVE-2021-32803](https://github.com/npm/node-tar/security/advisories/GHSA-r628-mhmh-qjhw) affects this release level. Please ensure you update to the latest patch levels that address CVE-2021-32803 as well if this adjacent issue affects your `node-tar` use case.\n\n### Workarounds\n\nUsers may work around this vulnerability without upgrading by creating a custom `onentry` method which sanitizes the `entry.path` or a `filter` method which removes entries with absolute paths.\n\n```js\nconst path = require('path')\nconst tar = require('tar')\n\ntar.x({\n file: 'archive.tgz',\n // either add this function...\n onentry: (entry) => {\n if (path.isAbsolute(entry.path)) {\n entry.path = sanitizeAbsolutePathSomehow(entry.path)\n entry.absolute = path.resolve(entry.path)\n }\n },\n\n // or this one\n filter: (file, entry) => {\n if (path.isAbsolute(entry.path)) {\n return false\n } else {\n return true\n }\n }\n})\n```\n\nUsers are encouraged to upgrade to the latest patch versions, rather than attempt to sanitize tar input themselves.","url":"https://github.com/advisories/GHSA-3jfq-g458-7qm9"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002546,"path":"react-js-pagination>tar","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"2.2.2","paths":["react-js-pagination>tar"]}],"metadata":null,"vulnerable_versions":"<3.2.3","module_name":"tar","severity":"high","github_advisory_id":"GHSA-r628-mhmh-qjhw","cves":["CVE-2021-32803"],"access":"public","patched_versions":">=3.2.3","updated":"2021-08-03T18:59:59.000Z","recommendation":"Upgrade to version 3.2.3 or later","cwe":"CWE-22","found_by":null,"deleted":null,"id":1002546,"references":"- https://github.com/npm/node-tar/security/advisories/GHSA-r628-mhmh-qjhw\n- https://nvd.nist.gov/vuln/detail/CVE-2021-32803\n- https://github.com/advisories/GHSA-r628-mhmh-qjhw","created":"2021-10-07T07:31:50.526Z","reported_by":null,"title":"Arbitrary File Creation/Overwrite via insufficient symlink protection due to directory cache poisoning","npm_advisory_id":null,"overview":"### Impact\n\nArbitrary File Creation, Arbitrary File Overwrite, Arbitrary Code Execution\n\n`node-tar` aims to guarantee that any file whose location would be modified by a symbolic link is not extracted. This is, in part, achieved by ensuring that extracted directories are not symlinks. Additionally, in order to prevent unnecessary `stat` calls to determine whether a given path is a directory, paths are cached when directories are created.\n\nThis logic was insufficient when extracting tar files that contained both a directory and a symlink with the same name as the directory. This order of operations resulted in the directory being created and added to the `node-tar` directory cache. When a directory is present in the directory cache, subsequent calls to mkdir for that directory are skipped. However, this is also where `node-tar` checks for symlinks occur.\n\nBy first creating a directory, and then replacing that directory with a symlink, it was thus possible to bypass `node-tar` symlink checks on directories, essentially allowing an untrusted tar file to symlink into an arbitrary location and subsequently extracting arbitrary files into that location, thus allowing arbitrary file creation and overwrite.\n\nThis issue was addressed in releases 3.2.3, 4.4.15, 5.0.7 and 6.1.2.\n\n### Patches\n\n3.2.3 || 4.4.15 || 5.0.7 || 6.1.2\n\n### Workarounds\n\nUsers may work around this vulnerability without upgrading by creating a custom `filter` method which prevents the extraction of symbolic links.\n\n```js\nconst tar = require('tar')\n\ntar.x({\n file: 'archive.tgz',\n filter: (file, entry) => {\n if (entry.type === 'SymbolicLink') {\n return false\n } else {\n return true\n }\n }\n})\n```\n\nUsers are encouraged to upgrade to the latest patch versions, rather than attempt to sanitize tar input themselves.","url":"https://github.com/advisories/GHSA-r628-mhmh-qjhw"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002522,"path":"react-scripts>@pmmmwh/react-refresh-webpack-plugin>ansi-html","dev":false,"bundled":false,"optional":false},"advisory":{"findings":[{"version":"0.0.7","paths":["react-scripts>@pmmmwh/react-refresh-webpack-plugin>ansi-html"]}],"metadata":null,"vulnerable_versions":"<=0.0.7","module_name":"ansi-html","severity":"high","github_advisory_id":"GHSA-whgm-jr23-g3j9","cves":["CVE-2021-23424"],"access":"public","patched_versions":"<0.0.0","updated":"2021-08-26T14:50:46.000Z","recommendation":"None","cwe":"CWE-400","found_by":null,"deleted":null,"id":1002522,"references":"- https://github.com/ioet/time-tracker-ui/security/advisories/GHSA-4fjc-8q3h-8r69\n- https://nvd.nist.gov/vuln/detail/CVE-2021-23424\n- https://github.com/advisories/GHSA-whgm-jr23-g3j9","created":"2021-10-07T07:31:50.522Z","reported_by":null,"title":"Uncontrolled Resource Consumption in ansi-html","npm_advisory_id":null,"overview":"This affects all versions of package ansi-html. If an attacker provides a malicious string, it will get stuck processing the input for an extremely long time.","url":"https://github.com/advisories/GHSA-whgm-jr23-g3j9"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002627,"path":"react-scripts>webpack-dev-server>chokidar>glob-parent","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"3.1.0","paths":["react-scripts>webpack-dev-server>chokidar>glob-parent","react-scripts>webpack>watchpack>watchpack-chokidar2>chokidar>glob-parent"]}],"metadata":null,"vulnerable_versions":"<5.1.2","module_name":"glob-parent","severity":"high","github_advisory_id":"GHSA-ww39-953v-wcq6","cves":["CVE-2020-28469"],"access":"public","patched_versions":">=5.1.2","updated":"2021-06-04T18:30:46.000Z","recommendation":"Upgrade to version 5.1.2 or later","cwe":"CWE-400","found_by":null,"deleted":null,"id":1002627,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2020-28469\n- https://github.com/advisories/GHSA-ww39-953v-wcq6","created":"2021-10-07T07:31:50.540Z","reported_by":null,"title":"Regular expression denial of service","npm_advisory_id":null,"overview":"This affects the package glob-parent before 5.1.2. The enclosure regex used to check for strings ending in enclosure containing path separator.","url":"https://github.com/advisories/GHSA-ww39-953v-wcq6"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002627,"path":"react-scripts>webpack>watchpack>watchpack-chokidar2>chokidar>glob-parent","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"3.1.0","paths":["react-scripts>webpack-dev-server>chokidar>glob-parent","react-scripts>webpack>watchpack>watchpack-chokidar2>chokidar>glob-parent"]}],"metadata":null,"vulnerable_versions":"<5.1.2","module_name":"glob-parent","severity":"high","github_advisory_id":"GHSA-ww39-953v-wcq6","cves":["CVE-2020-28469"],"access":"public","patched_versions":">=5.1.2","updated":"2021-06-04T18:30:46.000Z","recommendation":"Upgrade to version 5.1.2 or later","cwe":"CWE-400","found_by":null,"deleted":null,"id":1002627,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2020-28469\n- https://github.com/advisories/GHSA-ww39-953v-wcq6","created":"2021-10-07T07:31:50.540Z","reported_by":null,"title":"Regular expression denial of service","npm_advisory_id":null,"overview":"This affects the package glob-parent before 5.1.2. The enclosure regex used to check for strings ending in enclosure containing path separator.","url":"https://github.com/advisories/GHSA-ww39-953v-wcq6"}}} -{"type":"auditAdvisory","data":{"resolution":{"id":1002655,"path":"react-scripts>react-dev-utils>browserslist","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.14.2","paths":["react-scripts>react-dev-utils>browserslist"]}],"metadata":null,"vulnerable_versions":">=4.0.0 <4.16.5","module_name":"browserslist","severity":"moderate","github_advisory_id":"GHSA-w8qv-6jwh-64r5","cves":["CVE-2021-23364"],"access":"public","patched_versions":">=4.16.5","updated":"2021-05-20T22:03:37.000Z","recommendation":"Upgrade to version 4.16.5 or later","cwe":"CWE-400","found_by":null,"deleted":null,"id":1002655,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-23364\n- https://github.com/advisories/GHSA-w8qv-6jwh-64r5","created":"2021-10-07T07:31:50.542Z","reported_by":null,"title":"Regular Expression Denial of Service in browserslist","npm_advisory_id":null,"overview":"The package browserslist from 4.0.0 and before 4.16.5 are vulnerable to Regular Expression Denial of Service (ReDoS) during parsing of queries.","url":"https://github.com/advisories/GHSA-w8qv-6jwh-64r5"}}} diff --git a/yarn-audit-known-issues b/yarn-audit-known-issues index b3b91e9dd7..c48b2e2147 100644 --- a/yarn-audit-known-issues +++ b/yarn-audit-known-issues @@ -1,3 +1,4 @@ {"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"sequelize-cli>yargs>string-width>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["sequelize-cli>yargs>string-width>strip-ansi>ansi-regex","sequelize-cli>yargs>cliui>string-width>strip-ansi>ansi-regex","sequelize-cli>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"sequelize-cli>yargs>cliui>string-width>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["sequelize-cli>yargs>string-width>strip-ansi>ansi-regex","sequelize-cli>yargs>cliui>string-width>strip-ansi>ansi-regex","sequelize-cli>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} {"type":"auditAdvisory","data":{"resolution":{"id":1002401,"path":"sequelize-cli>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"4.1.0","paths":["sequelize-cli>yargs>string-width>strip-ansi>ansi-regex","sequelize-cli>yargs>cliui>string-width>strip-ansi>ansi-regex","sequelize-cli>yargs>cliui>wrap-ansi>string-width>strip-ansi>ansi-regex"]}],"metadata":null,"vulnerable_versions":">2.1.1 <5.0.1","module_name":"ansi-regex","severity":"moderate","github_advisory_id":"GHSA-93q8-gq69-wqmw","cves":["CVE-2021-3807"],"access":"public","patched_versions":">=5.0.1","updated":"2021-09-23T15:45:50.000Z","recommendation":"Upgrade to version 5.0.1 or later","cwe":"CWE-918","found_by":null,"deleted":null,"id":1002401,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3807\n- https://github.com/advisories/GHSA-93q8-gq69-wqmw","created":"2021-10-07T07:31:50.502Z","reported_by":null,"title":" Inefficient Regular Expression Complexity in chalk/ansi-regex","npm_advisory_id":null,"overview":"ansi-regex is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-93q8-gq69-wqmw"}}} +{"type":"auditAdvisory","data":{"resolution":{"id":1004784,"path":"sequelize>validator","dev":false,"optional":false,"bundled":false},"advisory":{"findings":[{"version":"10.11.0","paths":["sequelize>validator"]}],"metadata":null,"vulnerable_versions":"<13.7.0","module_name":"validator","severity":"moderate","github_advisory_id":"GHSA-qgmg-gppg-76g5","cves":["CVE-2021-3765"],"access":"public","patched_versions":">=13.7.0","updated":"2021-11-03T14:46:01.000Z","recommendation":"Upgrade to version 13.7.0 or later","cwe":"CWE-1333","found_by":null,"deleted":null,"id":1004784,"references":"- https://nvd.nist.gov/vuln/detail/CVE-2021-3765\n- https://github.com/advisories/GHSA-qgmg-gppg-76g5","created":"2021-11-03T18:00:36.336Z","reported_by":null,"title":"Inefficient Regular Expression Complexity in validator.js","npm_advisory_id":null,"overview":"validator.js prior to 13.7.0 is vulnerable to Inefficient Regular Expression Complexity","url":"https://github.com/advisories/GHSA-qgmg-gppg-76g5"}}} From 4058cf3ede3c4b2aec0f4ac5e11b91175f4e7b07 Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Tue, 9 Nov 2021 10:26:59 -0500 Subject: [PATCH 14/79] trying a different approach in the config --- .circleci/config.yml | 21 ++++++++------------- bin/robot-factory | 9 ++++++--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a61e7134db..c83b9d3dd8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -333,19 +333,14 @@ jobs: - run: name: Build backend assets command: yarn build - - when: - condition: - and: - # testing in sandbox - - equal: [<< pipeline.project.git_url >>, << pipeline.parameters.sandbox_git_url >>] - - equal: [<< pipeline.git.branch >>, << pipeline.parameters.sandbox_git_branch >>] - # uncomment for production - # - equal: [<< pipeline.project.git_url >>, << pipeline.parameters.prod_git_url >>] - # - equal: [<< pipeline.git.branch >>, << pipeline.parameters.prod_git_branch >>] - steps: - - run: - name: Create production robot - command: ./bin/robot-factory + - run: + name: Create production robot + environment: + SANDBOX_GIT_URL: pipeline.parameters.sandbox_git_url + CURRENT_GIT_URL: pipeline.project.git_url + SANDBOX_GIT_BRANCH: sandbox_git_branch + CURRENT_GIT_BRANCH: pipeline.git.branch + command: ./bin/robot-factory - run: name: Build frontend assets command: yarn --cwd frontend run build diff --git a/bin/robot-factory b/bin/robot-factory index 144ad8f8ad..1915e3e5b4 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,7 +1,10 @@ #!/bin/bash -cat >frontend/public/robots.txt <frontend/public/robots.txt < Date: Tue, 9 Nov 2021 10:56:26 -0500 Subject: [PATCH 15/79] is this how we set vars? --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c83b9d3dd8..d78c491f1f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -336,10 +336,10 @@ jobs: - run: name: Create production robot environment: - SANDBOX_GIT_URL: pipeline.parameters.sandbox_git_url - CURRENT_GIT_URL: pipeline.project.git_url - SANDBOX_GIT_BRANCH: sandbox_git_branch - CURRENT_GIT_BRANCH: pipeline.git.branch + SANDBOX_GIT_URL: <> + CURRENT_GIT_URL: <> + SANDBOX_GIT_BRANCH: <> + CURRENT_GIT_BRANCH: <> command: ./bin/robot-factory - run: name: Build frontend assets From eef44862f3382b3ec8096c37ca9ccf584bc5a618 Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Tue, 9 Nov 2021 10:58:25 -0500 Subject: [PATCH 16/79] fix var name --- .circleci/config.yml | 2 +- bin/robot-factory | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d78c491f1f..46a01aa9a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -338,7 +338,7 @@ jobs: environment: SANDBOX_GIT_URL: <> CURRENT_GIT_URL: <> - SANDBOX_GIT_BRANCH: <> + SANDBOX_GIT_BRANCH: <> CURRENT_GIT_BRANCH: <> command: ./bin/robot-factory - run: diff --git a/bin/robot-factory b/bin/robot-factory index 1915e3e5b4..6a5b975d62 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,5 +1,10 @@ #!/bin/bash +echo $CURRENT_GIT_BRANCH +echo $SANDBOX_GIT_BRANCH +echo $CURRENT_GIT_URL +echo $SANDBOX_GIT_URL + if [$CURRENT_GIT_URL == $SANDBOX_GIT_URL] && [$SANDBOX_GIT_BRANCH != $CURRENT_GIT_BRANCH]; then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 11:09:20 -0500 Subject: [PATCH 17/79] fix ui tests --- .../src/pages/Landing/__tests__/ReportMenu.js | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/frontend/src/pages/Landing/__tests__/ReportMenu.js b/frontend/src/pages/Landing/__tests__/ReportMenu.js index 57f8b1d6a0..14e19b0a55 100644 --- a/frontend/src/pages/Landing/__tests__/ReportMenu.js +++ b/frontend/src/pages/Landing/__tests__/ReportMenu.js @@ -25,7 +25,7 @@ describe('ReportMenu', () => { render(); const button = await screen.findByRole('button'); userEvent.click(button); - const report = await screen.findByText('Reports'); + const report = await screen.findByText('Export reports'); expect(report).toHaveClass('smart-hub--menu-button__open'); }); @@ -34,7 +34,7 @@ describe('ReportMenu', () => { render(); const button = await screen.findByRole('button'); userEvent.click(button); - const exportButton = await screen.findByRole('menuitem', { name: 'Export table data...' }); + const exportButton = await screen.findByRole('menuitem', { name: 'Export table data' }); userEvent.click(exportButton); expect(onExport).toHaveBeenCalled(); }); @@ -45,7 +45,7 @@ describe('ReportMenu', () => { render(); const button = await screen.findByRole('button'); userEvent.click(button); - const exportButton = await screen.findByRole('menuitem', { name: 'Export selected reports...' }); + const exportButton = await screen.findByRole('menuitem', { name: 'Export selected reports' }); userEvent.click(exportButton); expect(onExport).toHaveBeenCalled(); }); @@ -59,26 +59,25 @@ describe('ReportMenu', () => { // first, open the menu const button = await screen.findByRole('button'); userEvent.click(button); - report = await screen.findByText('Reports'); + report = await screen.findByText('Export reports'); expect(report).toHaveClass('smart-hub--menu-button__open'); menu = screen.queryByRole('menu'); expect(menu).toBeInTheDocument(); // Focus on the menu button should close the menu button.focus(); - report = await screen.findByText('Reports'); + report = await screen.findByText('Export reports'); expect(report).not.toHaveClass('smart-hub--menu-button__open'); menu = screen.queryByRole('menu'); expect(menu).not.toBeInTheDocument(); }); - it('disables the button and shows the error message when there are too many reports', async () => { + it('shows the error message when there are too many reports', async () => { render(); const button = await screen.findByRole('button'); userEvent.click(button); const label = /this export has 5,001 reports\. you can only export 5,000 reports at a time\./i; - const exportButton = await screen.findByRole('menuitem', { name: label }); - expect(exportButton).toBeDisabled(); + expect(screen.getByText(label)).toBeVisible(); }); it('closes when the Escape key is pressed', async () => { @@ -89,21 +88,21 @@ describe('ReportMenu', () => { // first, open the menu const button = await screen.findByRole('button'); userEvent.click(button); - report = await screen.findByText('Reports'); + report = await screen.findByText('Export reports'); expect(report).toHaveClass('smart-hub--menu-button__open'); menu = screen.queryByRole('menu'); expect(menu).toBeInTheDocument(); // Keypress with the keys other than 'Escape' should NOT close the menu fireEvent.keyDown(document.activeElement || document.body, { key: ' ' }); - report = await screen.findByText('Reports'); + report = await screen.findByText('Export reports'); expect(report).toHaveClass('smart-hub--menu-button__open'); menu = screen.queryByRole('menu'); expect(menu).toBeInTheDocument(); // Keypress with the escape key should close the menu fireEvent.keyDown(document.activeElement || document.body, { key: 'Escape' }); - report = await screen.findByText('Reports'); + report = await screen.findByText('Export reports'); expect(report).not.toHaveClass('smart-hub--menu-button__open'); menu = screen.queryByRole('menu'); expect(menu).not.toBeInTheDocument(); From a8a74e3662c7fd581137203759adcde91c1fbb4e Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Tue, 9 Nov 2021 11:11:58 -0500 Subject: [PATCH 18/79] test on dev since sandbox does not do what I thought --- .circleci/config.yml | 6 +++--- bin/robot-factory | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 46a01aa9a4..891db13945 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -165,7 +165,7 @@ parameters: type: string dev_git_branch: # change to feature branch to test deployment description: "Name of github branch that will deploy to dev" - default: "kw-disable-hses-staging" + default: "TTAHUB276" type: string sandbox_git_branch: # change to feature branch to test deployment default: "TTAHUB276" @@ -336,9 +336,9 @@ jobs: - run: name: Create production robot environment: - SANDBOX_GIT_URL: <> + DEV_GIT_URL: <> CURRENT_GIT_URL: <> - SANDBOX_GIT_BRANCH: <> + DEV_GIT_BRANCH: <> CURRENT_GIT_BRANCH: <> command: ./bin/robot-factory - run: diff --git a/bin/robot-factory b/bin/robot-factory index 6a5b975d62..d732b92995 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,11 +1,11 @@ #!/bin/bash echo $CURRENT_GIT_BRANCH -echo $SANDBOX_GIT_BRANCH +echo $DEV_GIT_BRANCH echo $CURRENT_GIT_URL -echo $SANDBOX_GIT_URL +echo $DEV_GIT_URL -if [$CURRENT_GIT_URL == $SANDBOX_GIT_URL] && [$SANDBOX_GIT_BRANCH != $CURRENT_GIT_BRANCH]; +if [$CURRENT_GIT_URL == $DEV_GIT_URL] && [$DEV_GIT_BRANCH != $CURRENT_GIT_BRANCH]; then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 11:18:00 -0500 Subject: [PATCH 19/79] update trusworks with modal changes --- frontend/package.json | 2 +- frontend/src/components/DeleteReportModal.css | 26 ----- frontend/src/components/DeleteReportModal.js | 67 ----------- frontend/src/components/FileUploader.js | 32 +++--- frontend/src/components/IdleModal.js | 54 ++++----- frontend/src/components/Modal.css | 21 ++-- frontend/src/components/Modal.js | 105 +++++++++--------- .../components/__tests__/DeleteReportModal.js | 75 ------------- .../src/pages/ApprovedActivityReport/index.js | 26 ++--- frontend/src/pages/Landing/MyAlerts.js | 45 ++++---- frontend/yarn.lock | 8 +- 11 files changed, 140 insertions(+), 321 deletions(-) delete mode 100644 frontend/src/components/DeleteReportModal.css delete mode 100644 frontend/src/components/DeleteReportModal.js delete mode 100644 frontend/src/components/__tests__/DeleteReportModal.js diff --git a/frontend/package.json b/frontend/package.json index ddf0606bb2..21aa79ac53 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,7 +10,7 @@ "@fortawesome/free-solid-svg-icons": "^5.15.1", "@fortawesome/react-fontawesome": "^0.1.11", "@hookform/error-message": "^0.0.5", - "@trussworks/react-uswds": "1.11.0", + "@trussworks/react-uswds": "2.4.1", "@use-it/interval": "^1.0.0", "draft-js": "^0.11.7", "draftjs-to-html": "^0.9.1", diff --git a/frontend/src/components/DeleteReportModal.css b/frontend/src/components/DeleteReportModal.css deleted file mode 100644 index 75e4094818..0000000000 --- a/frontend/src/components/DeleteReportModal.css +++ /dev/null @@ -1,26 +0,0 @@ -#deleteDialog div { - border-style: none; - padding: 3px 0px 17px 15px; - margin: 7px 0px 0px 3px; - text-align: left; - line-height: 20px; - font-size: 14px; -} - -#deleteDialog h2 { - font-size: 22px; - margin-top: 20px; - margin-bottom: -10px; -} - -#deleteDialog button { - margin-left: 0px; - margin-right: 14px; - padding: 9px 38px 9px 38px; - font-size: medium; - font-weight: 600; -} - -#deleteDialog .usa-button--secondary { - background-color: #D42240; -} diff --git a/frontend/src/components/DeleteReportModal.js b/frontend/src/components/DeleteReportModal.js deleted file mode 100644 index 25682a3851..0000000000 --- a/frontend/src/components/DeleteReportModal.js +++ /dev/null @@ -1,67 +0,0 @@ -import React, { useCallback, useEffect, useRef } from 'react'; -import PropTypes from 'prop-types'; -import { Button, Modal } from '@trussworks/react-uswds'; - -import { ESCAPE_KEY_CODES } from '../Constants'; -import './DeleteReportModal.css'; - -const DeleteModal = ({ - onDelete, onClose, closeModal, -}) => { - const modalRef = useRef(null); - - const onEscape = useCallback((event) => { - if (ESCAPE_KEY_CODES.includes(event.key)) { - closeModal(); - } - }, [closeModal]); - - useEffect(() => { - document.addEventListener('keydown', onEscape, false); - return () => { - document.removeEventListener('keydown', onEscape, false); - }; - }, [onEscape]); - - useEffect(() => { - const button = modalRef.current.querySelector('button'); - if (button) { - button.focus(); - } - }); - - return ( -

- ); -}; - -DeleteModal.propTypes = { - onDelete: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, - closeModal: PropTypes.func.isRequired, -}; - -export default DeleteModal; diff --git a/frontend/src/components/FileUploader.js b/frontend/src/components/FileUploader.js index 871e7edf16..1157e3c68e 100644 --- a/frontend/src/components/FileUploader.js +++ b/frontend/src/components/FileUploader.js @@ -11,7 +11,7 @@ import { useDropzone } from 'react-dropzone'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faTrash } from '@fortawesome/free-solid-svg-icons'; import { - Button, Alert, Modal, connectModal, + Button, Alert, Modal, ModalToggleButton, } from '@trussworks/react-uswds'; import { uploadFile, deleteFile } from '../fetchers/File'; @@ -157,12 +157,12 @@ export const getStatus = (status) => { }; const DeleteFileModal = ({ - onFileRemoved, files, index, closeModal, + modalRef, onFileRemoved, files, index, }) => { const deleteModal = useRef(null); - const onClose = () => { + const onDeleteFile = () => { onFileRemoved(index) - .then(closeModal()); + .then(modalRef.current.toggleModal(false)); }; useEffect(() => { deleteModal.current.querySelector('button').focus(); @@ -173,10 +173,10 @@ const DeleteFileModal = ({ title={

Delete File

} actions={( <> - - @@ -196,32 +196,30 @@ const DeleteFileModal = ({ }; DeleteFileModal.propTypes = { + modalRef: PropTypes.oneOfType([ + PropTypes.func, + PropTypes.shape({ current: PropTypes.instanceOf(Element) }), + ]).isRequired, onFileRemoved: PropTypes.func.isRequired, - closeModal: PropTypes.func.isRequired, index: PropTypes.number.isRequired, files: PropTypes.arrayOf(PropTypes.object).isRequired, }; -const ConnectedDeleteFileModal = connectModal(DeleteFileModal); - const FileTable = ({ onFileRemoved, files }) => { const [index, setIndex] = useState(null); - const [isOpen, setIsOpen] = useState(false); - const closeModal = () => setIsOpen(false); - + const modalRef = useRef(); const handleDelete = (newIndex) => { setIndex(newIndex); - setIsOpen(true); + modalRef.current.toggleModal(true); }; return (
- diff --git a/frontend/src/components/IdleModal.js b/frontend/src/components/IdleModal.js index 5c25e0deb6..c49e12c448 100644 --- a/frontend/src/components/IdleModal.js +++ b/frontend/src/components/IdleModal.js @@ -4,12 +4,11 @@ milliseconds the logout prop is called. */ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import PropTypes from 'prop-types'; import { useIdleTimer } from 'react-idle-timer'; -import { - Button, Modal, connectModal, useModal, Alert, -} from '@trussworks/react-uswds'; +import { Alert } from '@trussworks/react-uswds'; +import Modal from './Modal'; // list of events to determine activity // https://github.com/SupremeTechnopriest/react-idle-timer#default-events @@ -28,7 +27,7 @@ const EVENTS = [ function IdleModal({ modalTimeout, logoutTimeout, logoutUser }) { const [inactiveTimeout, updateInactiveTimeout] = useState(); - const { isOpen, openModal, closeModal } = useModal(); + const modalRef = useRef(); const modalVisibleTime = logoutTimeout - modalTimeout; const timeoutMinutes = Math.floor(modalVisibleTime / 1000 / 60); @@ -41,28 +40,6 @@ function IdleModal({ modalTimeout, logoutTimeout, logoutUser }) { timeToLogoutMsg = `${timeoutMinutes} minutes`; } - const Connected = connectModal(() => ( - Are you still there?} - actions={( - - )} - > - - You will be automatically logged out due to inactivity in - {' '} - { timeToLogoutMsg } - {' '} - unless you become active again. - - Press any key to continue your session - - - - )); - // Make sure we clean up any timeout functions when this component // is unmounted useEffect(() => function cleanup() { @@ -73,15 +50,15 @@ function IdleModal({ modalTimeout, logoutTimeout, logoutUser }) { const onIdle = () => { const timer = setTimeout(() => { - closeModal(); + modalRef.current.toggleModal(false); logoutUser(true); }, modalVisibleTime); - openModal(); + modalRef.current.toggleModal(true); updateInactiveTimeout(timer); }; const onActive = () => { - closeModal(); + modalRef.current.toggleModal(false); clearTimeout(inactiveTimeout); }; @@ -94,7 +71,22 @@ function IdleModal({ modalTimeout, logoutTimeout, logoutUser }) { }); return ( - + {}} + modalId="IdleReportModal" + title="Are you still there?" + showOkButton={false} + cancelButtonText="Stay logged in" + > + + You will be automatically logged out due to inactivity in + {' '} + {timeToLogoutMsg} + {' '} + unless you become active again. + + ); } diff --git a/frontend/src/components/Modal.css b/frontend/src/components/Modal.css index 5d33eb0e3e..d3c4590178 100644 --- a/frontend/src/components/Modal.css +++ b/frontend/src/components/Modal.css @@ -1,16 +1,5 @@ -#popup-modal div { - border-style: none; - padding: 3px 0px 17px 15px; - margin: 7px 0px 0px 3px; - text-align: left; - line-height: 1.2; - font-size: 14px; -} - #popup-modal h2 { - font-size: 22px; - margin-top: 20px; - margin-bottom: -10px; + font-family: 'Source Sans Pro Web', 'Helvetica Neue', Helvetica, 'Roboto, Arial', sans-serif; } #popup-modal button { @@ -21,6 +10,10 @@ font-weight: 600; } -#popup-modal .usa-button--secondary { - background-color: #D42240; +.popup-modal:not(.show-close-x) .usa-modal__close { + display: none; } + +.popup-modal:not(.show-ok-button) .usa-button--secondary { + display: none; +} \ No newline at end of file diff --git a/frontend/src/components/Modal.js b/frontend/src/components/Modal.js index cf4114246f..9475b63398 100644 --- a/frontend/src/components/Modal.js +++ b/frontend/src/components/Modal.js @@ -1,68 +1,71 @@ -import React, { useCallback, useEffect, useRef } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; -import { Button, Modal as TrussWorksModal } from '@trussworks/react-uswds'; -import { ESCAPE_KEY_CODES } from '../Constants'; +import { + Button, Modal as TrussWorksModal, ModalHeading, ModalFooter, ButtonGroup, ModalToggleButton, +} from '@trussworks/react-uswds'; import './Modal.css'; const Modal = ({ - onOk, onClose, closeModal, title, okButtonText, okButtonAriaLabel, children, -}) => { - const modalRef = useRef(null); - - const onEscape = useCallback((event) => { - if (ESCAPE_KEY_CODES.includes(event.key)) { - closeModal(); - } - }, [closeModal]); - - useEffect(() => { - document.addEventListener('keydown', onEscape, false); - return () => { - document.removeEventListener('keydown', onEscape, false); - }; - }, [onEscape]); - - useEffect(() => { - const button = modalRef.current.querySelector('button'); - if (button) { - button.focus(); - } - }); - - return ( - +); Modal.propTypes = { - onOk: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, - closeModal: PropTypes.func.isRequired, + modalRef: PropTypes.oneOfType([ + PropTypes.func, + PropTypes.shape({ current: PropTypes.elementType }), + ]).isRequired, + modalId: PropTypes.number.isRequired, + onOk: PropTypes.func, title: PropTypes.string.isRequired, - okButtonText: PropTypes.string.isRequired, + okButtonText: PropTypes.string, okButtonAriaLabel: PropTypes.string, + showOkButton: PropTypes.bool, + cancelButtonText: PropTypes.string, + showCloseX: PropTypes.bool, children: PropTypes.node.isRequired, }; Modal.defaultProps = { + onOk: () => {}, okButtonAriaLabel: null, + okButtonText: '', + showCloseX: false, + showOkButton: true, + cancelButtonText: 'Cancel', + }; export default Modal; diff --git a/frontend/src/components/__tests__/DeleteReportModal.js b/frontend/src/components/__tests__/DeleteReportModal.js deleted file mode 100644 index bfedf09546..0000000000 --- a/frontend/src/components/__tests__/DeleteReportModal.js +++ /dev/null @@ -1,75 +0,0 @@ -import '@testing-library/jest-dom'; -import React from 'react'; -import { - render, screen, -} from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import { useModal, connectModal, Button } from '@trussworks/react-uswds'; - -import DeleteReportModal from '../DeleteReportModal'; - -const SomeComponent = () => { - const { isOpen, openModal, closeModal } = useModal(); - const ConnectModal = connectModal(DeleteReportModal); - - return ( -
- {}} - onClose={() => {}} - closeModal={closeModal} - isOpen={isOpen} - /> - -
- ); -}; - -describe('DeleteReportModal', () => { - it('shows two buttons', async () => { - // Given a page with a modal - render( {}} - onClose={() => {}} - closeModal={() => {}} - isOpen - />); - // When the modal is triggered - const buttons = await screen.findAllByRole('button'); - - // Then we see our options - expect(buttons.length).toBe(2); - }); - - it('exits when escape key is pressed', async () => { - // Given a page with a modal - render(); - - // When the modal is triggered - const button = await screen.findByText('Open'); - userEvent.click(button); - - const modal = await screen.findByTestId('modal'); - expect(modal).toBeVisible(); - - // And the modal can closeclose the modal via the escape key - userEvent.type(modal, '{esc}', { skipClick: true }); - expect(screen.queryByTestId('modal')).not.toBeTruthy(); - }); - - it('does not escape when any other key is pressed', async () => { - // Given a page with a modal - render(); - - // When the modal is triggered - const button = await screen.findByText('Open'); - userEvent.click(button); - - const modal = await screen.findByTestId('modal'); - expect(modal).toBeVisible(); - - // And the modal can closeclose the modal via the escape key - userEvent.type(modal, '{enter}', { skipClick: true }); - expect(screen.queryByTestId('modal')).toBeTruthy(); - }); -}); diff --git a/frontend/src/pages/ApprovedActivityReport/index.js b/frontend/src/pages/ApprovedActivityReport/index.js index b47b92fbb0..1f108dd26d 100644 --- a/frontend/src/pages/ApprovedActivityReport/index.js +++ b/frontend/src/pages/ApprovedActivityReport/index.js @@ -1,7 +1,7 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; import PropTypes from 'prop-types'; import ReactRouterPropTypes from 'react-router-prop-types'; -import { Grid, useModal, connectModal } from '@trussworks/react-uswds'; +import { Grid, ModalToggleButton } from '@trussworks/react-uswds'; import { Redirect } from 'react-router-dom'; import moment from 'moment-timezone'; import { Helmet } from 'react-helmet'; @@ -145,11 +145,10 @@ export default function ApprovedActivityReport({ match, user }) { const [granteeNextSteps, setGranteeNextSteps] = useState([]); const [specialistNextSteps, setSpecialistNextSteps] = useState([]); - const { isOpen, openModal, closeModal } = useModal(); - const ConnectModal = connectModal(Modal); - const [justUnlocked, updatedJustUnlocked] = useState(false); + const modalRef = useRef(); + useEffect(() => { const allowedRegions = allRegionsUserHasPermissionTo(user); @@ -271,7 +270,7 @@ export default function ApprovedActivityReport({ match, user }) { const onUnlock = async () => { await unlockReport(reportId); - closeModal(); + modalRef.current.toggleModal(false); updatedJustUnlocked(true); }; @@ -323,19 +322,16 @@ export default function ApprovedActivityReport({ match, user }) { : null} {navigator && navigator.clipboard - ? + ? : null} - + {user && user.permissions && canUnlockReports(user) - ? + ? Unlock Report : null} - onUnlock()} - onClose={closeModal} - isOpen={isOpen} - openModal={openModal} - closeModal={closeModal} modalId="UnlockReportModal" title="Unlock Activity Report" okButtonText="Unlock" @@ -354,7 +350,7 @@ export default function ApprovedActivityReport({ match, user }) {
must be re-submitted for approval. -
+

TTA Activity report diff --git a/frontend/src/pages/Landing/MyAlerts.js b/frontend/src/pages/Landing/MyAlerts.js index 77b858de56..545402119f 100644 --- a/frontend/src/pages/Landing/MyAlerts.js +++ b/frontend/src/pages/Landing/MyAlerts.js @@ -1,12 +1,9 @@ /* eslint-disable jsx-a11y/anchor-is-valid */ -import React, { useState } from 'react'; +import React, { useState, useRef } from 'react'; import PropTypes from 'prop-types'; -import { - Tag, Table, useModal, connectModal, -} from '@trussworks/react-uswds'; +import { Tag, Table } from '@trussworks/react-uswds'; import { Link, useHistory } from 'react-router-dom'; - -import DeleteReportModal from '../../components/DeleteReportModal'; +import Modal from '../../components/Modal'; import Container from '../../components/Container'; import ContextMenu from '../../components/ContextMenu'; import NewReport from './NewReport'; @@ -22,15 +19,12 @@ import Tooltip from '../../components/Tooltip'; function ReportsRow({ reports, removeAlert, message }) { const history = useHistory(); - const { isOpen, openModal, closeModal } = useModal(); - const ConnectModal = connectModal(DeleteReportModal); - const [idToDelete, updateIdToDelete] = useState(0); + const modalRef = useRef(); const onDelete = async (reportId) => { await deleteReport(reportId); removeAlert(reportId); - closeModal(); }; const tableRows = reports.map((report, index, { length }) => { @@ -74,7 +68,7 @@ function ReportsRow({ reports, removeAlert, message }) { }, { label: 'Delete', - onClick: () => { updateIdToDelete(id); openModal(); }, + onClick: () => { updateIdToDelete(id); modalRef.current.toggleModal(true); }, }, ]; @@ -108,7 +102,7 @@ function ReportsRow({ reports, removeAlert, message }) { buttonLabel={`pending approvals: ${approversToolTipText}. Click button to visually reveal this information.`} /> ) - : '' } + : ''}

- onDelete(idToDelete)} - onClose={closeModal} - isOpen={isOpen} - openModal={openModal} - closeModal={closeModal} - /> + onDelete(idToDelete)} + modalId="DeleteReportModal" + title="Delete Activity Report" + okButtonText="Delete" + okButtonAriaLabel="This button will permanently delete the report." + > +
+ Are you sure you want to delete this activity report? +
+ This action + {' '} + cannot + {' '} + be undone. +
+
{tableRows} ); @@ -219,7 +224,7 @@ function MyAlerts(props) { onKeyPress={() => sortHandler(name)} className={`sortable ${sortClassName}`} aria-label={`${displayName}. Activate to sort ${sortClassName === 'asc' ? 'descending' : 'ascending' - }`} + }`} > {displayName} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index d89cee3044..f960629938 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -1976,10 +1976,10 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@trussworks/react-uswds@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@trussworks/react-uswds/-/react-uswds-1.11.0.tgz#f5f01247038792e8fec40c828e32bc78bcc04c95" - integrity sha512-wIFzLM/1aJ0enyt42YFcJRSlEALfRU2qPaVK5955mHmP083l9o2CrnmJDK7La8ebrNxtyhhgrx76K3PwFgRCjQ== +"@trussworks/react-uswds@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@trussworks/react-uswds/-/react-uswds-2.4.1.tgz#62604c86940492564465286c8214ae22a4bb5e2b" + integrity sha512-jjzBV3nVH3ee0UhWJmQr8+5k/bOTQREUWMi0U75dhF6z+kalw20c9yWBA4DlsE6ePu5d55y3ye2Rz7F+4dO+dA== "@types/aria-query@^4.2.0": version "4.2.2" From f8833c19d1ad1be25a25edfef6b5b65c7e56caf9 Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Tue, 9 Nov 2021 11:34:43 -0500 Subject: [PATCH 20/79] need to learn how to do bash --- bin/robot-factory | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/bin/robot-factory b/bin/robot-factory index d732b92995..2c225f5a3b 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,11 +1,6 @@ #!/bin/bash -echo $CURRENT_GIT_BRANCH -echo $DEV_GIT_BRANCH -echo $CURRENT_GIT_URL -echo $DEV_GIT_URL - -if [$CURRENT_GIT_URL == $DEV_GIT_URL] && [$DEV_GIT_BRANCH != $CURRENT_GIT_BRANCH]; +if ["$CURRENT_GIT_URL" == "$DEV_GIT_URL"] && ["$DEV_GIT_BRANCH" != "$CURRENT_GIT_BRANCH"]; then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 11:48:30 -0500 Subject: [PATCH 21/79] more bash better --- bin/robot-factory | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/robot-factory b/bin/robot-factory index 2c225f5a3b..40c4b39a3c 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,6 +1,6 @@ #!/bin/bash -if ["$CURRENT_GIT_URL" == "$DEV_GIT_URL"] && ["$DEV_GIT_BRANCH" != "$CURRENT_GIT_BRANCH"]; +if [["$CURRENT_GIT_URL" == "$DEV_GIT_URL" && "$DEV_GIT_BRANCH" == "$CURRENT_GIT_BRANCH" ]]; then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 12:06:59 -0500 Subject: [PATCH 22/79] tweak the export limit --- frontend/src/pages/Landing/ReportMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/Landing/ReportMenu.js b/frontend/src/pages/Landing/ReportMenu.js index d3015f572a..5ec8a632ed 100644 --- a/frontend/src/pages/Landing/ReportMenu.js +++ b/frontend/src/pages/Landing/ReportMenu.js @@ -6,7 +6,7 @@ import Container from '../../components/Container'; import './ReportMenu.css'; -const MAXIMUM_EXPORTED_REPORTS = 5000; +const MAXIMUM_EXPORTED_REPORTS = 4000; function ReportMenu({ onExportAll, From 7116b319c4c7719a69e218325f605609d26b658d Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Tue, 9 Nov 2021 12:10:10 -0500 Subject: [PATCH 23/79] for christmas sake --- bin/robot-factory | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/robot-factory b/bin/robot-factory index 40c4b39a3c..a425602931 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,6 +1,6 @@ #!/bin/bash -if [["$CURRENT_GIT_URL" == "$DEV_GIT_URL" && "$DEV_GIT_BRANCH" == "$CURRENT_GIT_BRANCH" ]]; +if [[ "$CURRENT_GIT_URL" == "$DEV_GIT_URL" && "$DEV_GIT_BRANCH" == "$CURRENT_GIT_BRANCH" ]]; then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 12:46:14 -0500 Subject: [PATCH 24/79] testing complete --- .circleci/config.yml | 4 ++-- bin/robot-factory | 2 +- frontend/public/robots.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 891db13945..50604aecc2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -336,9 +336,9 @@ jobs: - run: name: Create production robot environment: - DEV_GIT_URL: <> + PROD_GIT_URL: <> CURRENT_GIT_URL: <> - DEV_GIT_BRANCH: <> + PROD_GIT_BRANCH: <> CURRENT_GIT_BRANCH: <> command: ./bin/robot-factory - run: diff --git a/bin/robot-factory b/bin/robot-factory index a425602931..af5291a151 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -5,6 +5,6 @@ then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 13:00:09 -0500 Subject: [PATCH 25/79] fix ui test --- frontend/src/pages/Landing/__tests__/ReportMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/Landing/__tests__/ReportMenu.js b/frontend/src/pages/Landing/__tests__/ReportMenu.js index 14e19b0a55..d373796e48 100644 --- a/frontend/src/pages/Landing/__tests__/ReportMenu.js +++ b/frontend/src/pages/Landing/__tests__/ReportMenu.js @@ -76,7 +76,7 @@ describe('ReportMenu', () => { render(); const button = await screen.findByRole('button'); userEvent.click(button); - const label = /this export has 5,001 reports\. you can only export 5,000 reports at a time\./i; + const label = /this export has 5,001 reports\. you can only export 4,000 reports at a time\./i; expect(screen.getByText(label)).toBeVisible(); }); From ece825e70503be14289505c6895ae558e7de7ac5 Mon Sep 17 00:00:00 2001 From: Matt Bevilacqua Date: Tue, 9 Nov 2021 13:01:40 -0500 Subject: [PATCH 26/79] fix bash script var names --- bin/robot-factory | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/robot-factory b/bin/robot-factory index af5291a151..590bc0d131 100755 --- a/bin/robot-factory +++ b/bin/robot-factory @@ -1,6 +1,6 @@ #!/bin/bash -if [[ "$CURRENT_GIT_URL" == "$DEV_GIT_URL" && "$DEV_GIT_BRANCH" == "$CURRENT_GIT_BRANCH" ]]; +if [[ "$CURRENT_GIT_URL" == "$PROD_GIT_URL" && "$PROD_GIT_BRANCH" == "$CURRENT_GIT_BRANCH" ]]; then cat >frontend/public/robots.txt < Date: Tue, 9 Nov 2021 13:51:17 -0600 Subject: [PATCH 27/79] Fix plotly import --- .circleci/config.yml | 2 +- frontend/src/widgets/BarGraph.js | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 75fe862a14..3ae21da724 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -165,7 +165,7 @@ parameters: type: string dev_git_branch: # change to feature branch to test deployment description: "Name of github branch that will deploy to dev" - default: "kw-disable-hses-staging" + default: "js-fix-plotly-import" type: string sandbox_git_branch: # change to feature branch to test deployment default: "kw-delete-reports-script" diff --git a/frontend/src/widgets/BarGraph.js b/frontend/src/widgets/BarGraph.js index cd197fd36f..549afddc4c 100644 --- a/frontend/src/widgets/BarGraph.js +++ b/frontend/src/widgets/BarGraph.js @@ -1,8 +1,12 @@ import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; -import Plot from 'react-plotly.js'; +// https://github.com/plotly/react-plotly.js/issues/135#issuecomment-501398125 +import Plotly from 'plotly.js-basic-dist'; +import createPlotlyComponent from 'react-plotly.js/factory'; + import './BarGraph.css'; +const Plot = createPlotlyComponent(Plotly); const WIDGET_PER_CATEGORY = 180; /** From 6f59aa46d038c545a7c6dc468ce7ade4a9fe3130 Mon Sep 17 00:00:00 2001 From: Adam Levin Date: Tue, 9 Nov 2021 16:03:07 -0500 Subject: [PATCH 28/79] updated file uploader modal --- frontend/src/components/FileUploader.js | 65 ++++++++++++------------- frontend/src/components/Modal.js | 4 +- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/frontend/src/components/FileUploader.js b/frontend/src/components/FileUploader.js index 1157e3c68e..be4bc32c4c 100644 --- a/frontend/src/components/FileUploader.js +++ b/frontend/src/components/FileUploader.js @@ -5,15 +5,14 @@ // react-dropzone examples all use prop spreading. Disabling the eslint no prop spreading // rules https://github.com/react-dropzone/react-dropzone /* eslint-disable react/jsx-props-no-spreading */ -import React, { useState, useRef, useEffect } from 'react'; +import React, { useState, useRef } from 'react'; import PropTypes from 'prop-types'; import { useDropzone } from 'react-dropzone'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faTrash } from '@fortawesome/free-solid-svg-icons'; -import { - Button, Alert, Modal, ModalToggleButton, -} from '@trussworks/react-uswds'; +import { Button, Alert } from '@trussworks/react-uswds'; import { uploadFile, deleteFile } from '../fetchers/File'; +import Modal from './Modal'; import './FileUploader.css'; @@ -111,17 +110,17 @@ function Dropzone(props) { Upload Resources {errorMessage - && ( - - This is an error - - )} + && ( + + This is an error + + )} {fileRejections.length > 0 - && ( - - - - )} + && ( + + + + )} ); } @@ -159,52 +158,48 @@ export const getStatus = (status) => { const DeleteFileModal = ({ modalRef, onFileRemoved, files, index, }) => { - const deleteModal = useRef(null); const onDeleteFile = () => { onFileRemoved(index) .then(modalRef.current.toggleModal(false)); }; - useEffect(() => { - deleteModal.current.querySelector('button').focus(); - }); + return ( -
+ <> Delete File} - actions={( - <> - - Cancel - - - - )} + modalRef={modalRef} + onOk={onDeleteFile} + modalId="DeleteFileModal" + title="Delete File" + okButtonText="Delete" + okButtonAriaLabel="This button will permanently delete the file." >

Are you sure you want to delete {' '} - {files[index].originalFileName} + { files[index] ? files[index].originalFileName : null } {' '} ?

This action cannot be undone.

-
+ ); }; DeleteFileModal.propTypes = { modalRef: PropTypes.oneOfType([ PropTypes.func, - PropTypes.shape({ current: PropTypes.instanceOf(Element) }), + PropTypes.shape(), ]).isRequired, onFileRemoved: PropTypes.func.isRequired, - index: PropTypes.number.isRequired, + index: PropTypes.number, files: PropTypes.arrayOf(PropTypes.object).isRequired, }; +DeleteFileModal.defaultProps = { + index: null, +}; + const FileTable = ({ onFileRemoved, files }) => { const [index, setIndex] = useState(null); const modalRef = useRef(); @@ -271,7 +266,7 @@ const FileTable = ({ onFileRemoved, files }) => {
{files.length === 0 && ( -

No files uploaded

+

No files uploaded

)}
); diff --git a/frontend/src/components/Modal.js b/frontend/src/components/Modal.js index 9475b63398..6d5b211af2 100644 --- a/frontend/src/components/Modal.js +++ b/frontend/src/components/Modal.js @@ -45,9 +45,9 @@ const Modal = ({ Modal.propTypes = { modalRef: PropTypes.oneOfType([ PropTypes.func, - PropTypes.shape({ current: PropTypes.elementType }), + PropTypes.shape(), ]).isRequired, - modalId: PropTypes.number.isRequired, + modalId: PropTypes.string.isRequired, onOk: PropTypes.func, title: PropTypes.string.isRequired, okButtonText: PropTypes.string, From 78c046afb4b8f165ae87a4e6bbe56963f9830229 Mon Sep 17 00:00:00 2001 From: Adam Levin Date: Tue, 9 Nov 2021 18:12:58 -0500 Subject: [PATCH 29/79] updated external resource modal --- .../src/components/ExternalResourceModal.js | 99 +++++-------------- frontend/src/components/Modal.js | 4 + .../__tests__/ExternalResourceModal.js | 2 +- .../ActivityReport/Pages/Review/ReviewItem.js | 2 +- frontend/src/pages/Landing/MyAlerts.js | 2 +- 5 files changed, 31 insertions(+), 78 deletions(-) diff --git a/frontend/src/components/ExternalResourceModal.js b/frontend/src/components/ExternalResourceModal.js index 79d68f3f80..a5ce089ec7 100644 --- a/frontend/src/components/ExternalResourceModal.js +++ b/frontend/src/components/ExternalResourceModal.js @@ -1,75 +1,18 @@ -import React, { useCallback, useEffect, useRef } from 'react'; +import React, { useRef } from 'react'; import PropTypes from 'prop-types'; -import { - Button, Modal, Alert, useModal, connectModal, -} from '@trussworks/react-uswds'; - +import { Alert } from '@trussworks/react-uswds'; +import Modal from './Modal'; import { isValidURL, isInternalGovernmentLink } from '../utils'; -const ESCAPE_KEY_CODE = 27; - -const ExternalResourceModal = ({ onOpen, onClose }) => ( - External Resources Disclaimer} - actions={( - <> - - - - - )} - > - - Note: - {' '} - This link is hosted outside of an OHS-led system. - OHS does not have responsibility for external content or - the privacy policies of non-government websites. - - -); - -ExternalResourceModal.propTypes = { - onOpen: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, -}; - const ExternalLink = ({ to, children }) => { const modalRef = useRef(null); - const { isOpen, openModal, closeModal } = useModal(); - - const onEscape = useCallback((event) => { - if (event.keyCode === ESCAPE_KEY_CODE) { - closeModal(); - } - }, [closeModal]); - - useEffect(() => { - document.addEventListener('keydown', onEscape, false); - return () => { - document.removeEventListener('keydown', onEscape, false); - }; - }, [onEscape]); - - useEffect(() => { - if (!modalRef.current) return; - - const button = modalRef.current.querySelector('button'); - if (button) { - button.focus(); - } - }); if (!isValidURL(to)) { return to; } - const onClick = () => { - closeModal(); + const openResource = () => { + modalRef.current.toggleModal(false); window.open(to, '_blank'); }; @@ -78,19 +21,29 @@ const ExternalLink = ({ to, children }) => { if (isInternalGovernmentLink(to)) { window.open(to, '_blank'); } else { - openModal(); + modalRef.current.toggleModal(true); } }; - const ConnectModal = connectModal(() => ( - - )); - return ( <> -
- -
+ + + Note: + {' '} + This link is hosted outside of an OHS-led system. + OHS does not have responsibility for external content or + the privacy policies of non-government websites. + + {children} {' '} @@ -103,8 +56,4 @@ ExternalLink.propTypes = { to: PropTypes.string.isRequired, children: PropTypes.node.isRequired, }; - -export { - ExternalResourceModal, - ExternalLink, -}; +export default ExternalLink; diff --git a/frontend/src/components/Modal.js b/frontend/src/components/Modal.js index 6d5b211af2..56c80e6ba7 100644 --- a/frontend/src/components/Modal.js +++ b/frontend/src/components/Modal.js @@ -15,12 +15,14 @@ const Modal = ({ showOkButton, cancelButtonText, showCloseX, + isLarge, children, }) => (