diff --git a/app/react/App/App.js b/app/react/App/App.js
index bdc795f74c..74a91f86af 100644
--- a/app/react/App/App.js
+++ b/app/react/App/App.js
@@ -15,7 +15,7 @@ import { Menu } from './Menu';
import { AppMainContext } from './AppMainContext';
import SiteName from './SiteName';
import GoogleAnalytics from './GoogleAnalytics';
-import Matomo from './Matomo';
+import { Matomo } from './Matomo';
import 'bootstrap/dist/css/bootstrap.css';
import 'react-widgets/lib/scss/react-widgets.scss';
import 'nprogress/nprogress.css';
diff --git a/app/react/App/Matomo.js b/app/react/App/Matomo.js
index 35445fb367..b12895cbf5 100644
--- a/app/react/App/Matomo.js
+++ b/app/react/App/Matomo.js
@@ -1,48 +1,44 @@
+import { useEffect } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
-import React, { Component } from 'react';
-export class Matomo extends Component {
- render() {
- if (!this.props.id && !this.props.url) {
- return false;
+const MatomoComponent = ({ id, url }) => {
+ useEffect(() => {
+ if (id && url) {
+ const matomoUrl = url.replace(/\/?$/, '/');
+
+ const script = document.createElement('script');
+
+ script.innerHTML = `
+ var _paq = _paq || [];
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ var u="${matomoUrl}";
+ _paq.push(['setTrackerUrl', u+'piwik.php']);
+ _paq.push(['setSiteId', '${id}']);
+ var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+ g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
+ })();`;
+
+ document.body.appendChild(script);
}
+ }, [id, url]);
- const url = this.props.url.replace(/\/?$/, '/');
-
- return (
-
- );
- }
-}
+ return undefined;
+};
-Matomo.defaultProps = {
+MatomoComponent.defaultProps = {
id: '',
url: '',
};
-Matomo.propTypes = {
+MatomoComponent.propTypes = {
id: PropTypes.string,
url: PropTypes.string,
};
-export function mapStateToProps({ settings }) {
+function mapStateToProps({ settings }) {
try {
const { id, url } = JSON.parse(settings.collection.get('matomoConfig'));
return { id, url };
@@ -51,4 +47,6 @@ export function mapStateToProps({ settings }) {
}
}
-export default connect(mapStateToProps)(Matomo);
+const Matomo = connect(mapStateToProps)(MatomoComponent);
+
+export { Matomo, MatomoComponent, mapStateToProps };
diff --git a/app/react/App/specs/Matomo.spec.js b/app/react/App/specs/Matomo.spec.js
index 01377a3475..f2ada34217 100644
--- a/app/react/App/specs/Matomo.spec.js
+++ b/app/react/App/specs/Matomo.spec.js
@@ -1,34 +1,47 @@
+/**
+ * @jest-environment jsdom
+ */
+
import Immutable from 'immutable';
import React from 'react';
-
-import { shallow } from 'enzyme';
-
-import { mapStateToProps, Matomo } from '../Matomo';
+import { mount } from 'enzyme';
+import { mapStateToProps, MatomoComponent } from '../Matomo';
describe('Matomo', () => {
- let props;
- beforeEach(() => {
- props = {
- url: 'url/',
- id: 'id',
- };
+ it.each`
+ url | id
+ ${'url/'} | ${'id1'}
+ ${'url'} | ${'id2'}
+ `('should include matomo script when url and id are set', ({ url, id }) => {
+ window._paq = undefined;
+
+ mount();
+ expect(window._paq).toEqual([
+ ['trackPageView'],
+ ['enableLinkTracking'],
+ ['setTrackerUrl', 'url/piwik.php'],
+ ['setSiteId', id],
+ ]);
});
- it('should include matomo script when url and id are set', () => {
- const component = shallow();
- expect(component).toMatchSnapshot();
- });
+ it('should not include script when id or url are not set', () => {
+ window._paq = undefined;
- it('should add "/" at the end of url when not set', () => {
- props.url = 'url';
- const component = shallow();
- expect(component).toMatchSnapshot();
+ mount();
+ expect(window._paq).toEqual(undefined);
});
- it('should not include script when id or url are not set', () => {
- props = {};
- const component = shallow();
- expect(component).toMatchSnapshot();
+ it('should not pollute existing keys in the window object', () => {
+ window._paq = [['googleTracker', 'idForTracker']];
+
+ mount();
+ expect(window._paq).toEqual([
+ ['googleTracker', 'idForTracker'],
+ ['trackPageView'],
+ ['enableLinkTracking'],
+ ['setTrackerUrl', 'url/piwik.php'],
+ ['setSiteId', 'id'],
+ ]);
});
describe('mapStateToProps', () => {
diff --git a/app/react/App/specs/__snapshots__/Matomo.spec.js.snap b/app/react/App/specs/__snapshots__/Matomo.spec.js.snap
deleted file mode 100644
index 5e33b1d25f..0000000000
--- a/app/react/App/specs/__snapshots__/Matomo.spec.js.snap
+++ /dev/null
@@ -1,47 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Matomo should add "/" at the end of url when not set 1`] = `
-
-`;
-
-exports[`Matomo should include matomo script when url and id are set 1`] = `
-
-`;
-
-exports[`Matomo should not include script when id or url are not set 1`] = `""`;
diff --git a/app/react/App/styles/globals.css b/app/react/App/styles/globals.css
index 8bf5cc1169..b4ddcc5597 100644
--- a/app/react/App/styles/globals.css
+++ b/app/react/App/styles/globals.css
@@ -434,6 +434,179 @@ video {
display: none;
}
+.tooltip-arrow,.tooltip-arrow:before {
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ background: inherit;
+}
+
+.tooltip-arrow {
+ visibility: hidden;
+}
+
+.tooltip-arrow:before {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+}
+
+[data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+.tooltip[data-popper-placement^='top'] > .tooltip-arrow {
+ bottom: -4px;
+}
+
+.tooltip[data-popper-placement^='bottom'] > .tooltip-arrow {
+ top: -4px;
+}
+
+.tooltip[data-popper-placement^='left'] > .tooltip-arrow {
+ right: -4px;
+}
+
+.tooltip[data-popper-placement^='right'] > .tooltip-arrow {
+ left: -4px;
+}
+
+.tooltip.invisible > .tooltip-arrow:before {
+ visibility: hidden;
+}
+
+[data-popper-arrow],[data-popper-arrow]:before {
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ background: inherit;
+}
+
+[data-popper-arrow] {
+ visibility: hidden;
+}
+
+[data-popper-arrow]:before {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+}
+
+[data-popper-arrow]:after {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+ position: absolute;
+ width: 9px;
+ height: 9px;
+ background: inherit;
+}
+
+[role="tooltip"] > [data-popper-arrow]:before {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+.dark [role="tooltip"] > [data-popper-arrow]:before {
+ border-style: solid;
+ border-color: #4b5563;
+}
+
+[role="tooltip"] > [data-popper-arrow]:after {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+.dark [role="tooltip"] > [data-popper-arrow]:after {
+ border-style: solid;
+ border-color: #4b5563;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] {
+ bottom: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] {
+ top: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] {
+ right: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] {
+ left: -5px;
+}
+
+[role="tooltip"].invisible > [data-popper-arrow]:before {
+ visibility: hidden;
+}
+
+[role="tooltip"].invisible > [data-popper-arrow]:after {
+ visibility: hidden;
+}
+
[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
-webkit-appearance: none;
-moz-appearance: none;
@@ -483,10 +656,10 @@ input::placeholder,textarea::placeholder {
}
select:not([size]) {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
- background-position: right 0.5rem center;
+ background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 10 6'%3e %3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3e %3c/svg%3e");
+ background-position: right 0.75rem center;
background-repeat: no-repeat;
- background-size: 1.5em 1.5em;
+ background-size: 0.75em 0.75em;
padding-right: 2.5rem;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
@@ -548,26 +721,38 @@ select:not([size]) {
[type='checkbox']:checked,[type='radio']:checked,.dark [type='checkbox']:checked,.dark [type='radio']:checked {
border-color: transparent;
background-color: currentColor;
- background-size: 100% 100%;
+ background-size: 0.55em 0.55em;
background-position: center;
background-repeat: no-repeat;
}
[type='checkbox']:checked {
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
+ background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e");
+ background-repeat: no-repeat;
+ background-size: 0.55em 0.55em;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
}
[type='radio']:checked {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
+ background-size: 1em 1em;
+}
+
+.dark [type='radio']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
+ background-size: 1em 1em;
}
[type='checkbox']:indeterminate {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
- border-color: transparent;
+ background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e");
background-color: currentColor;
- background-size: 100% 100%;
+ border-color: transparent;
background-position: center;
background-repeat: no-repeat;
+ background-size: 0.55em 0.55em;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
}
[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
@@ -723,162 +908,6 @@ input:checked + .toggle-bg {
border-color: #4f46e5;
}
-[data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before {
- border-style: solid;
- border-color: #e5e7eb;
-}
-
-[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before {
- border-bottom-width: 1px;
- border-right-width: 1px;
-}
-
-[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before {
- border-bottom-width: 1px;
- border-left-width: 1px;
-}
-
-[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before {
- border-top-width: 1px;
- border-left-width: 1px;
-}
-
-[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before {
- border-top-width: 1px;
- border-right-width: 1px;
-}
-
-.tooltip[data-popper-placement^='top'] > .tooltip-arrow {
- bottom: -4px;
-}
-
-.tooltip[data-popper-placement^='bottom'] > .tooltip-arrow {
- top: -4px;
-}
-
-.tooltip[data-popper-placement^='left'] > .tooltip-arrow {
- right: -4px;
-}
-
-.tooltip[data-popper-placement^='right'] > .tooltip-arrow {
- left: -4px;
-}
-
-.tooltip.invisible > .tooltip-arrow:before {
- visibility: hidden;
-}
-
-[data-popper-arrow],[data-popper-arrow]:before {
- position: absolute;
- width: 8px;
- height: 8px;
- background: inherit;
-}
-
-[data-popper-arrow] {
- visibility: hidden;
-}
-
-[data-popper-arrow]:before {
- content: "";
- visibility: visible;
- transform: rotate(45deg);
-}
-
-[data-popper-arrow]:after {
- content: "";
- visibility: visible;
- transform: rotate(45deg);
- position: absolute;
- width: 9px;
- height: 9px;
- background: inherit;
-}
-
-[role="tooltip"] > [data-popper-arrow]:before {
- border-style: solid;
- border-color: #e5e7eb;
-}
-
-.dark [role="tooltip"] > [data-popper-arrow]:before {
- border-style: solid;
- border-color: #4b5563;
-}
-
-[role="tooltip"] > [data-popper-arrow]:after {
- border-style: solid;
- border-color: #e5e7eb;
-}
-
-.dark [role="tooltip"] > [data-popper-arrow]:after {
- border-style: solid;
- border-color: #4b5563;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before {
- border-bottom-width: 1px;
- border-right-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after {
- border-bottom-width: 1px;
- border-right-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before {
- border-bottom-width: 1px;
- border-left-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after {
- border-bottom-width: 1px;
- border-left-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before {
- border-top-width: 1px;
- border-left-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after {
- border-top-width: 1px;
- border-left-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before {
- border-top-width: 1px;
- border-right-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after {
- border-top-width: 1px;
- border-right-width: 1px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] {
- bottom: -5px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] {
- top: -5px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] {
- right: -5px;
-}
-
-[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] {
- left: -5px;
-}
-
-[role="tooltip"].invisible > [data-popper-arrow]:before {
- visibility: hidden;
-}
-
-[role="tooltip"].invisible > [data-popper-arrow]:after {
- visibility: hidden;
-}
-
.tw-content * {
font-family: 'Inter', sans-serif !important;
}
@@ -1674,6 +1703,10 @@ input:checked + .toggle-bg {
bottom: 1.25rem;
}
+.bottom-\[60px\] {
+ bottom: 60px;
+}
+
.bottom-\[6px\] {
bottom: 6px;
}
@@ -1738,6 +1771,14 @@ input:checked + .toggle-bg {
z-index: 20;
}
+.z-30 {
+ z-index: 30;
+}
+
+.z-40 {
+ z-index: 40;
+}
+
.z-50 {
z-index: 50;
}
@@ -2023,6 +2064,10 @@ input:checked + .toggle-bg {
height: 2rem;
}
+.h-9 {
+ height: 2.25rem;
+}
+
.h-96 {
height: 24rem;
}
@@ -2102,6 +2147,10 @@ input:checked + .toggle-bg {
width: 8.333333%;
}
+.w-1\/2 {
+ width: 50%;
+}
+
.w-1\/3 {
width: 33.333333%;
}
@@ -2312,6 +2361,10 @@ input:checked + .toggle-bg {
flex: none;
}
+.flex-shrink {
+ flex-shrink: 1;
+}
+
.flex-shrink-0 {
flex-shrink: 0;
}
@@ -2353,16 +2406,36 @@ input:checked + .toggle-bg {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
+.-translate-x-full {
+ --tw-translate-x: -100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
.-translate-y-1\/2 {
--tw-translate-y: -50%;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
+.-translate-y-full {
+ --tw-translate-y: -100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
.translate-x-0 {
--tw-translate-x: 0px;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
+.translate-x-full {
+ --tw-translate-x: 100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-y-full {
+ --tw-translate-y: 100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
.rotate-180 {
--tw-rotate: 180deg;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -2389,6 +2462,10 @@ input:checked + .toggle-bg {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
+.transform-none {
+ transform: none;
+}
+
@keyframes spin {
to {
transform: rotate(360deg);
@@ -2399,6 +2476,10 @@ input:checked + .toggle-bg {
animation: spin 1s linear infinite;
}
+.cursor-default {
+ cursor: default;
+}
+
.cursor-grab {
cursor: grab;
}
@@ -2425,6 +2506,10 @@ input:checked + .toggle-bg {
user-select: none;
}
+.resize {
+ resize: both;
+}
+
.snap-x {
scroll-snap-type: x var(--tw-scroll-snap-strictness);
}
@@ -2463,6 +2548,14 @@ input:checked + .toggle-bg {
grid-auto-flow: column;
}
+.grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+}
+
+.grid-cols-7 {
+ grid-template-columns: repeat(7, minmax(0, 1fr));
+}
+
.flex-row {
flex-direction: row;
}
@@ -2829,6 +2922,16 @@ input:checked + .toggle-bg {
border-color: rgb(165 180 252 / var(--tw-border-opacity));
}
+.border-blue-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(79 70 229 / var(--tw-border-opacity));
+}
+
+.border-blue-700 {
+ --tw-border-opacity: 1;
+ border-color: rgb(67 56 202 / var(--tw-border-opacity));
+}
+
.border-error-300 {
--tw-border-opacity: 1;
border-color: rgb(252 165 165 / var(--tw-border-opacity));
@@ -3042,6 +3145,11 @@ input:checked + .toggle-bg {
background-color: rgb(238 242 255 / var(--tw-bg-opacity));
}
+.bg-blue-700 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(67 56 202 / var(--tw-bg-opacity));
+}
+
.bg-error-100 {
--tw-bg-opacity: 1;
background-color: rgb(254 226 226 / var(--tw-bg-opacity));
@@ -3817,6 +3925,14 @@ input:checked + .toggle-bg {
line-height: 1rem;
}
+.leading-6 {
+ line-height: 1.5rem;
+}
+
+.leading-9 {
+ line-height: 2.25rem;
+}
+
.leading-none {
line-height: 1;
}
@@ -4260,6 +4376,11 @@ input:checked + .toggle-bg {
--tw-ring-color: rgb(250 202 21 / var(--tw-ring-opacity));
}
+.blur {
+ --tw-blur: blur(8px);
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
.drop-shadow-md {
--tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
@@ -4293,6 +4414,12 @@ input:checked + .toggle-bg {
transition-duration: 150ms;
}
+.transition-transform {
+ transition-property: transform;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
.duration-100 {
transition-duration: 100ms;
}
@@ -4471,6 +4598,11 @@ input:checked + .toggle-bg {
border-color: rgb(165 180 252 / var(--tw-border-opacity));
}
+.hover\:bg-blue-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 48 163 / var(--tw-bg-opacity));
+}
+
.hover\:bg-error-800:hover {
--tw-bg-opacity: 1;
background-color: rgb(153 27 27 / var(--tw-bg-opacity));
@@ -4565,6 +4697,11 @@ input:checked + .toggle-bg {
background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));
}
+.hover\:text-blue-600:hover {
+ --tw-text-opacity: 1;
+ color: rgb(79 70 229 / var(--tw-text-opacity));
+}
+
.hover\:text-gray-600:hover {
--tw-text-opacity: 1;
color: rgb(75 85 99 / var(--tw-text-opacity));
@@ -4645,6 +4782,11 @@ input:checked + .toggle-bg {
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
+.focus\:ring-blue-300:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(165 180 252 / var(--tw-ring-opacity));
+}
+
.focus\:ring-blue-500:focus {
--tw-ring-opacity: 1;
--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));
@@ -5153,6 +5295,11 @@ input:checked + .toggle-bg {
border-style: none;
}
+:is(.dark .dark\:border-blue-500) {
+ --tw-border-opacity: 1;
+ border-color: rgb(99 102 241 / var(--tw-border-opacity));
+}
+
:is(.dark .dark\:border-gray-600) {
--tw-border-opacity: 1;
border-color: rgb(75 85 99 / var(--tw-border-opacity));
@@ -5208,6 +5355,10 @@ input:checked + .toggle-bg {
border-color: rgb(4 116 129 / var(--tw-border-opacity));
}
+:is(.dark .dark\:border-transparent) {
+ border-color: transparent;
+}
+
:is(.dark .dark\:border-white) {
--tw-border-opacity: 1;
border-color: rgb(255 255 255 / var(--tw-border-opacity));
@@ -5228,6 +5379,11 @@ input:checked + .toggle-bg {
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
}
+:is(.dark .dark\:bg-blue-600) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(79 70 229 / var(--tw-bg-opacity));
+}
+
:is(.dark .dark\:bg-gray-200) {
--tw-bg-opacity: 1;
background-color: rgb(229 231 235 / var(--tw-bg-opacity));
@@ -5393,6 +5549,11 @@ input:checked + .toggle-bg {
fill: #D1D5DB;
}
+:is(.dark .dark\:text-blue-500) {
+ --tw-text-opacity: 1;
+ color: rgb(99 102 241 / var(--tw-text-opacity));
+}
+
:is(.dark .dark\:text-gray-100) {
--tw-text-opacity: 1;
color: rgb(243 244 246 / var(--tw-text-opacity));
@@ -5638,6 +5799,11 @@ input:checked + .toggle-bg {
border-color: rgb(107 114 128 / var(--tw-border-opacity));
}
+:is(.dark .dark\:hover\:bg-blue-700:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(67 56 202 / var(--tw-bg-opacity));
+}
+
:is(.dark .dark\:hover\:bg-gray-300:hover) {
--tw-bg-opacity: 1;
background-color: rgb(209 213 219 / var(--tw-bg-opacity));
@@ -5693,6 +5859,11 @@ input:checked + .toggle-bg {
background-color: rgb(250 202 21 / var(--tw-bg-opacity));
}
+:is(.dark .dark\:hover\:text-blue-500:hover) {
+ --tw-text-opacity: 1;
+ color: rgb(99 102 241 / var(--tw-text-opacity));
+}
+
:is(.dark .dark\:hover\:text-gray-300:hover) {
--tw-text-opacity: 1;
color: rgb(209 213 219 / var(--tw-text-opacity));
diff --git a/cypress/e2e/settings/users.cy.ts b/cypress/e2e/settings/users.cy.ts
index 2839e271c6..d05a97f0e2 100644
--- a/cypress/e2e/settings/users.cy.ts
+++ b/cypress/e2e/settings/users.cy.ts
@@ -57,11 +57,7 @@ describe('Users', () => {
});
it('edit user', () => {
- cy.get('table tbody tr')
- .eq(0)
- .within(() => {
- cy.get('td:nth-child(6) button').click();
- });
+ cy.contains('td', 'Carmen').siblings().last().click();
cy.get('aside').within(() => {
cy.get('#username').should('have.value', 'Carmen');
cy.get('#email').should('have.value', 'carmen@huridocs.org');
@@ -74,11 +70,7 @@ describe('Users', () => {
});
it('delete user', () => {
- cy.get('table tbody tr')
- .eq(3)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
+ cy.contains('td', 'User_1').siblings().first().click();
cy.contains('button', 'Delete').click();
cy.contains('[data-testid="modal"] button', 'Accept').click();
cy.contains('span', 'User_1').should('not.exist');
@@ -141,11 +133,9 @@ describe('Users', () => {
describe('reset password and 2fa', () => {
it('reset password', () => {
cy.intercept('GET', '/api/users').as('updateUsers');
- cy.get('table tbody tr')
- .eq(0)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
+
+ cy.contains('td', 'Carmen_edited').siblings().first().click();
+
cy.contains('button', 'Reset Password').click();
cy.contains('[data-testid="modal"] button', 'Accept').click();
cy.contains('div', 'Instructions to reset the password were sent to the user');
@@ -156,11 +146,9 @@ describe('Users', () => {
it('Reset 2fa', () => {
cy.intercept('GET', '/api/users').as('updateUsers');
cy.contains('span', 'Password + 2fa');
- cy.get('table tbody tr')
- .eq(4)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
+
+ cy.contains('td', 'blocky').siblings().first().click();
+
cy.contains('button', 'Reset 2FA').click();
cy.contains('[data-testid="modal"] button', 'Accept').click();
cy.get('table tbody tr')
@@ -176,11 +164,8 @@ describe('Users', () => {
describe('unblock user', () => {
it('should unblock a user', () => {
cy.intercept('GET', '/api/users').as('updateUsers');
- cy.get('table tbody tr')
- .eq(4)
- .within(() => {
- cy.get('td:nth-child(6) button').click();
- });
+
+ cy.contains('td', 'blocky').siblings().contains('button', 'Edit').click();
cy.contains('button', 'Unlock account').click();
cy.wait('@updateUsers');
@@ -204,45 +189,42 @@ describe('Users', () => {
});
it('bulk password reset', () => {
- cy.get('table tbody tr')
- .eq(0)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
- cy.get('table tbody tr')
- .eq(1)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
+ cy.contains('td', 'Carmen_edited').siblings().first().click();
+ cy.contains('td', 'Cynthia').siblings().first().click();
+
cy.contains('button', 'Reset Password').click();
+
cy.getByTestId('modal').within(() => {
cy.contains('h1', 'Reset passwords');
cy.contains('li', 'Carmen_edited');
cy.contains('li', 'Cynthia');
cy.contains('button', 'Accept').click();
});
+
cy.contains('div', 'Instructions to reset the password were sent to the user');
+
cy.contains('button', 'Dismiss').click();
});
it('bulk reset 2FA', () => {
- cy.get('table tbody tr')
- .eq(0)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
- cy.get('table tbody tr')
- .eq(2)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
+ cy.intercept('GET', '/api/user*').as('getUsers');
+
+ cy.contains('td', 'Carmen_edited').siblings().first().click();
+ cy.contains('td', 'Mike').siblings().first().click();
+
cy.contains('button', 'Reset 2FA').click();
+
cy.getByTestId('modal').within(() => {
cy.contains('h1', 'Reset 2FA');
cy.contains('li', 'Carmen_edited');
cy.contains('li', 'Mike');
cy.contains('button', 'Accept').click();
});
+
+ cy.wait('@getUsers');
+
+ cy.contains('button', 'Dismiss').click();
+
cy.get('table tbody tr')
.eq(0)
.within(() => {
@@ -258,31 +240,29 @@ describe('Users', () => {
.within(() => {
cy.contains('span', 'Password + 2fa').should('not.exist');
});
- cy.contains('button', 'Dismiss').click();
});
it('bulk delete', () => {
- cy.get('table tbody tr')
- .eq(0)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
- cy.get('table tbody tr')
- .eq(2)
- .within(() => {
- cy.get('td input').eq(0).click();
- });
+ cy.intercept('GET', '/api/users').as('getUsers');
+ cy.intercept('GET', '/api/usergroups').as('getGroups');
+
+ cy.contains('td', 'Carmen_edited').siblings().first().click();
+ cy.contains('td', 'Mike').siblings().first().click();
+
cy.contains('button', 'Delete').click();
+
cy.getByTestId('modal').within(() => {
cy.contains('h1', 'Delete');
cy.contains('li', 'Carmen_edited');
cy.contains('li', 'Mike');
cy.contains('button', 'Accept').click();
});
- cy.contains('span', 'Carmen_edited').should('not.exist');
- cy.contains('span', 'Mike').should('not.exist');
- cy.contains('button', 'Dismiss').click();
- namesShouldMatch(['Cynthia', 'admin', 'blocky', 'colla', 'editor']);
+
+ cy.wait('@getUsers');
+
+ cy.wait('@getGroups').then(() => {
+ namesShouldMatch(['Cynthia', 'admin', 'blocky', 'colla', 'editor']);
+ });
});
});
});
diff --git a/e2e/suite1/convert-entity-template.test.ts b/e2e/suite1/convert-entity-template.test.ts
index a5f22c2729..3b4c844f37 100644
--- a/e2e/suite1/convert-entity-template.test.ts
+++ b/e2e/suite1/convert-entity-template.test.ts
@@ -31,6 +31,8 @@ describe('Image is rendered when editing an entity in document view', () => {
it('Should select image for image property from supporting files', async () => {
await expect(page).toClick('.metadata-sidepanel.is-active a', { text: 'View' });
+ await expect(page).toMatchElement('h1.item-name', { text: 'With image' });
+
await expect(page).toClick('.metadata-sidepanel button.edit-metadata', {
text: 'Edit',
});
diff --git a/e2e/suite2/smokePrivateInstance.test.ts b/e2e/suite2/smokePrivateInstance.test.ts
index 5676c2b209..a3a2cf6e49 100644
--- a/e2e/suite2/smokePrivateInstance.test.ts
+++ b/e2e/suite2/smokePrivateInstance.test.ts
@@ -25,6 +25,7 @@ describe('Private instance', () => {
await expect(page).toClick('a', { text: 'Collection' });
await expect(page).toClick(selectors.collection.togglePrivate);
await expect(page).toClick('button', { text: 'Save' });
+ await expect(page).toClick('div.alert', { text: 'Settings updated.' });
});
it('shoud log out and be redirected to login page instead of library page', async () => {
diff --git a/e2e/suite2/uploads.test.ts b/e2e/suite2/uploads.test.ts
index 9dee950ae2..8a21742c57 100644
--- a/e2e/suite2/uploads.test.ts
+++ b/e2e/suite2/uploads.test.ts
@@ -78,7 +78,9 @@ describe('Uploads', () => {
page.waitForFileChooser(),
page.click('label[for="pdf-upload-button"]'),
]);
+
await fileChooser.accept([`${__dirname}/../test_files/invalid.pdf`]);
+ await expect(page).toMatchElement('span', { text: 'Invalid' });
await expectDocumentCountAfterSearch(page, 3);
const title = await getText(entityTitle(firstEntitySelector));
diff --git a/package.json b/package.json
index d23374cde3..27e0076f37 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "uwazi",
- "version": "1.142.1",
+ "version": "1.143.0",
"description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.",
"keywords": [
"react"
@@ -143,7 +143,7 @@
"express-session": "1.17.3",
"filesize": "^10.0.7",
"flag-icon-css": "^4.1.7",
- "flowbite": "^1.6.6",
+ "flowbite": "^2.0.0",
"flowbite-react": "^0.5.0",
"formatcoords": "^1.1.3",
"franc": "5.0.0",
diff --git a/yarn.lock b/yarn.lock
index 6dca907a74..8bd4096c5c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7216,7 +7216,7 @@ asn1.js@^4.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
-asn1.js@^5.4.1:
+asn1.js@^5.2.0, asn1.js@^5.4.1:
version "5.4.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
@@ -7599,11 +7599,16 @@ bmp-js@^0.1.0:
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9:
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+bn.js@^5.0.0, bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
body-parser@1.20.1:
version "1.20.1"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668"
@@ -7732,17 +7737,28 @@ browserify-rsa@^4.0.0:
bn.js "^4.1.0"
randombytes "^2.0.1"
-browserify-sign@^4.0.0:
- version "4.0.4"
- resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz"
+browserify-rsa@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
dependencies:
- bn.js "^4.1.1"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.2"
- elliptic "^6.0.0"
- inherits "^2.0.1"
- parse-asn1 "^5.0.0"
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e"
+ integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==
+ dependencies:
+ bn.js "^5.2.1"
+ browserify-rsa "^4.1.0"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.4"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.6"
+ readable-stream "^3.6.2"
+ safe-buffer "^5.2.1"
browserify-zlib@^0.1.4:
version "0.1.4"
@@ -8682,7 +8698,7 @@ create-ecdh@^4.0.0:
bn.js "^4.1.0"
elliptic "^6.0.0"
-create-hash@^1.1.0, create-hash@^1.1.2:
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"
dependencies:
@@ -8692,7 +8708,7 @@ create-hash@^1.1.0, create-hash@^1.1.2:
ripemd160 "^2.0.1"
sha.js "^2.4.0"
-create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
version "1.1.7"
resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
dependencies:
@@ -9768,7 +9784,7 @@ electron-to-chromium@^1.4.431:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9"
integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA==
-elliptic@^6.0.0:
+elliptic@^6.0.0, elliptic@^6.5.4:
version "6.5.4"
resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
@@ -11251,6 +11267,14 @@ flowbite@^1.6.6:
"@popperjs/core" "^2.9.3"
mini-svg-data-uri "^1.4.3"
+flowbite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/flowbite/-/flowbite-2.0.0.tgz#f149f63f4752722d888b1300a5f5071a6bf98b7d"
+ integrity sha512-gP/iC/WuznQ5XBzikhaSs4RDs49zrvoAdHbWMHSY3l7nVJX0xJz+dELIlLjh+czLdEVTMLxUjuARYYwCb5q34A==
+ dependencies:
+ "@popperjs/core" "^2.9.3"
+ mini-svg-data-uri "^1.4.3"
+
fn.name@1.x.x:
version "1.1.0"
resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz"
@@ -16032,6 +16056,17 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
+parse-asn1@^5.1.6:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
parse-bmfont-ascii@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
@@ -17619,6 +17654,15 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
+readable-stream@^3.6.2:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
readable-stream@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.1.0.tgz#280d0a29f559d3fb684a277254e02b6f61ae0631"
@@ -18212,7 +18256,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==