diff --git a/.gitignore b/.gitignore
index 5db4c8fb4b..715ff70323 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,7 @@
.DS_Store
.idea
*.iml
+.vscode/*
# debug
npm-debug.log*
diff --git a/components/common/UpdateNotice.js b/components/common/UpdateNotice.js
index 27ec562a50..7565d15313 100644
--- a/components/common/UpdateNotice.js
+++ b/components/common/UpdateNotice.js
@@ -7,21 +7,21 @@ import Button from './Button';
import useForceUpdate from '../../hooks/useForceUpdate';
export default function UpdateNotice() {
- const forceUpdte = useForceUpdate();
- const { hasUpdate, latest, updateCheck } = useVersion();
+ const forceUpdate = useForceUpdate();
+ const { hasUpdate, checked, latest, updateCheck } = useVersion(true);
function handleViewClick() {
location.href = 'https://github.com/mikecao/umami/releases';
updateCheck();
- forceUpdte();
+ forceUpdate();
}
function handleDismissClick() {
updateCheck();
- forceUpdte();
+ forceUpdate();
}
- if (!hasUpdate) {
+ if (!hasUpdate || checked) {
return null;
}
diff --git a/components/layout/Footer.js b/components/layout/Footer.js
index 7bd1ebd390..30782de026 100644
--- a/components/layout/Footer.js
+++ b/components/layout/Footer.js
@@ -2,9 +2,10 @@ import React from 'react';
import { FormattedMessage } from 'react-intl';
import Link from 'components/common/Link';
import styles from './Footer.module.css';
+import useVersion from 'hooks/useVersion';
export default function Footer() {
- const version = process.env.VERSION;
+ const { current } = useVersion();
return (
);
diff --git a/components/pages/WebsiteList.js b/components/pages/WebsiteList.js
index 0df24877ec..73d20c98ea 100644
--- a/components/pages/WebsiteList.js
+++ b/components/pages/WebsiteList.js
@@ -1,16 +1,14 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
-import { useRouter } from 'next/router';
+import Link from 'components/common/Link';
import WebsiteChart from 'components/metrics/WebsiteChart';
import Page from 'components/layout/Page';
-import Button from 'components/common/Button';
import EmptyPlaceholder from 'components/common/EmptyPlaceholder';
import useFetch from 'hooks/useFetch';
import Arrow from 'assets/arrow-right.svg';
import styles from './WebsiteList.module.css';
export default function WebsiteList({ userId }) {
- const router = useRouter();
const { data } = useFetch('/api/websites', { user_id: userId });
if (!data) {
@@ -33,9 +31,9 @@ export default function WebsiteList({ userId }) {
/>
}
>
- } size="medium" onClick={() => router.push('/settings')}>
+ } iconRight>
-
+
)}
diff --git a/hooks/useVersion.js b/hooks/useVersion.js
index d8e3d699e9..79b97a3432 100644
--- a/hooks/useVersion.js
+++ b/hooks/useVersion.js
@@ -1,27 +1,23 @@
import { useEffect, useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
-import semver from 'semver';
-import { getItem, setItem } from 'lib/web';
import { checkVersion } from 'redux/actions/app';
import { VERSION_CHECK } from 'lib/constants';
+import { getItem, setItem } from 'lib/web';
-export default function useVersion() {
+export default function useVersion(check) {
const dispatch = useDispatch();
const versions = useSelector(state => state.app.versions);
- const lastCheck = getItem(VERSION_CHECK);
-
- const { current, latest } = versions;
- const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
+ const checked = versions.latest === getItem(VERSION_CHECK)?.version;
const updateCheck = useCallback(() => {
- setItem(VERSION_CHECK, { version: latest, time: Date.now() });
+ setItem(VERSION_CHECK, { version: versions.latest, time: Date.now() });
}, [versions]);
useEffect(() => {
- if (!versions.latest) {
+ if (check && !versions.latest) {
dispatch(checkVersion());
}
- }, [versions]);
+ }, [versions, check]);
- return { ...versions, hasUpdate, updateCheck };
+ return { ...versions, checked, updateCheck };
}
diff --git a/lang/nb-NO.json b/lang/nb-NO.json
new file mode 100644
index 0000000000..dcd97d477e
--- /dev/null
+++ b/lang/nb-NO.json
@@ -0,0 +1,97 @@
+{
+ "button.add-account": "Legg til konto",
+ "button.add-website": "Legg til nettsted",
+ "button.back": "Tilbake",
+ "button.cancel": "Avvis",
+ "button.change-password": "Bytt passord",
+ "button.copy-to-clipboard": "Kopier til utklippstavle",
+ "button.date-range": "Datointervall",
+ "button.delete": "Slett",
+ "button.dismiss": "Avbryt",
+ "button.edit": "Rediger",
+ "button.login": "Logg inn",
+ "button.more": "Mer",
+ "button.refresh": "Oppdater",
+ "button.reset": "Nullstill",
+ "button.save": "Lagre",
+ "button.single-day": "Enkelt dag",
+ "button.view-details": "Vis detaljer",
+ "label.accounts": "Kontoer",
+ "label.administrator": "Administrator",
+ "label.confirm-password": "Godkjenn passord",
+ "label.current-password": "Nåværende passord",
+ "label.custom-range": "Egendefinert utvalg",
+ "label.dashboard": "Dashboard",
+ "label.default-date-range": "Standard datoperiode",
+ "label.domain": "Domene",
+ "label.enable-share-url": "Aktiver delings-URL",
+ "label.invalid": "Ugyldig",
+ "label.invalid-domain": "Ugyldig domene",
+ "label.last-days": "Siste {x} dager",
+ "label.last-hours": "Siste {x} timer",
+ "label.logged-in-as": "Logget på som {brukernavn}",
+ "label.logout": "Logg ut",
+ "label.name": "Navn",
+ "label.new-password": "Nytt passord",
+ "label.password": "Passord",
+ "label.passwords-dont-match": "Passordene er ikke like",
+ "label.profile": "Profil",
+ "label.required": "Påkrevd",
+ "label.settings": "Innstillinger",
+ "label.this-month": "Denne måneden",
+ "label.this-week": "Denne uka",
+ "label.this-year": "I år",
+ "label.timezone": "Tidssone",
+ "label.today": "I dag",
+ "label.unknown": "Ukjent",
+ "label.username": "Brukernavn",
+ "label.websites": "Nettsteder",
+ "message.active-users": "{x} {x, plural, one {besøkende} other {besøkende}} nå",
+ "message.confirm-delete": "Er du sikker på at du vil slette {target}?",
+ "message.copied": "Kopiert!",
+ "message.delete-warning": "Alle tilknyttede data slettes også.",
+ "message.failure": "Noe gikk galt.",
+ "message.get-share-url": "Få delings-URL",
+ "message.get-tracking-code": "Få sporingskode",
+ "message.go-to-settings": "Gå til innstillinger",
+ "message.incorrect-username-password": "Ugyldig brukernavn/passord.",
+ "message.new-version-available": "En ny versjon av umami {version} er tilgjengelig!",
+ "message.no-data-available": "Ingen data tilgjengelig.",
+ "message.no-websites-configured": "Du har ikke satt opp noen nettsteder.",
+ "message.page-not-found": "Side ikke funnet.",
+ "message.powered-by": "Drevet av {name}",
+ "message.save-success": "Lagret!",
+ "message.share-url": "Dette er den offentlige delings-URL-en for {target}.",
+ "message.track-stats": "For å spore statistikk for {target}, plasser følgende kode i {head}-delen av nettstedet ditt.",
+ "message.type-delete": "Skriv inn {delete} i boksen nedenfor for å bekrefte.",
+ "metrics.actions": "Handlinger",
+ "metrics.average-visit-time": "Gjennomsnittlig besøkelsestid",
+ "metrics.bounce-rate": "Avvisningsfrekvens",
+ "metrics.browsers": "Nettlesere",
+ "metrics.countries": "Land",
+ "metrics.device.desktop": "Desktop",
+ "metrics.device.laptop": "Laptop",
+ "metrics.device.mobile": "Mobiltelefon",
+ "metrics.device.tablet": "Nettbrett",
+ "metrics.devices": "Enheter",
+ "metrics.events": "Arrangementer",
+ "metrics.filter.combined": "Kombinert",
+ "metrics.filter.domain-only": "Bare domene",
+ "metrics.filter.raw": "Rå",
+ "metrics.operating-systems": "Operativsystemer",
+ "metrics.page-views": "Sidevisninger",
+ "metrics.pages": "Sider",
+ "metrics.referrers": "Referanser",
+ "metrics.unique-visitors": "Unike besøkende",
+ "metrics.views": "Visninger",
+ "metrics.visitors": "Besøkende",
+ "title.add-account": "Legg til konto",
+ "title.add-website": "Legg til nettsted",
+ "title.change-password": "Bytt passord",
+ "title.delete-account": "Slett konto",
+ "title.delete-website": "Slett nettstedet",
+ "title.edit-account": "Rediger konto",
+ "title.edit-website": "Rediger nettsted",
+ "title.share-url": "Del URL",
+ "title.tracking-code": "Sporingskode"
+}
diff --git a/lib/lang.js b/lib/lang.js
index 02dd5141c4..a6d311b5fc 100644
--- a/lib/lang.js
+++ b/lib/lang.js
@@ -1,5 +1,5 @@
import { format } from 'date-fns';
-import { enUS, nl, zhCN, tr, ru, de, ja, es, fr, da, sv, el, pt, ro } from 'date-fns/locale';
+import { enUS, nl, zhCN, tr, ru, de, ja, es, fr, da, sv, el, pt, ro, nb } from 'date-fns/locale';
import enMessages from 'lang-compiled/en-US.json';
import nlMessages from 'lang-compiled/nl-NL.json';
import zhCNMessages from 'lang-compiled/zh-CN.json';
@@ -16,6 +16,7 @@ import grMessages from 'lang-compiled/el-GR.json';
import foMessages from 'lang-compiled/fo-FO.json';
import ptMessages from 'lang-compiled/pt-PT.json';
import roMessages from 'lang-compiled/ro-RO.json';
+import nbNOMessages from 'lang-compiled/nb-NO.json';
export const messages = {
'en-US': enMessages,
@@ -34,6 +35,7 @@ export const messages = {
'fo-FO': foMessages,
'pt-PT': ptMessages,
'ro-RO': roMessages,
+ 'nb-NO': nbNOMessages,
};
export const dateLocales = {
@@ -53,6 +55,7 @@ export const dateLocales = {
'fo-FO': da,
'pt-PT': pt,
'ro-RO': ro,
+ 'nb-NO': nb,
};
export const menuOptions = [
@@ -67,6 +70,7 @@ export const menuOptions = [
{ label: '日本語', value: 'ja-JP', display: 'ja' },
{ label: 'Монгол', value: 'mn-MN', display: 'mn' },
{ label: 'Nederlands', value: 'nl-NL', display: 'nl' },
+ { label: 'Norsk Bokmål', value: 'nb-NO', display: 'nb' },
{ label: 'Português', value: 'pt-PT', display: 'pt' },
{ label: 'Русский', value: 'ru-RU', display: 'ru' },
{ label: 'Română', value: 'ro-RO', display: 'ro' },
diff --git a/lib/queries.js b/lib/queries.js
index d10777fd4d..7c0bb6e7ee 100644
--- a/lib/queries.js
+++ b/lib/queries.js
@@ -25,7 +25,7 @@ export async function runQuery(query) {
});
}
-export async function rawQuery(query, params) {
+export async function rawQuery(query, params = []) {
const db = getDatabase();
if (db !== POSTGRESQL && db !== MYSQL) {
diff --git a/package.json b/package.json
index 92c8b34f6f..656e535c33 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "umami",
- "version": "0.68.0",
+ "version": "0.70.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao ",
"license": "MIT",
@@ -31,7 +31,10 @@
"merge-lang": "node scripts/merge-lang.js",
"format-lang": "node scripts/format-lang.js",
"compile-lang": "formatjs compile-folder --ast build lang-compiled",
- "check-lang": "node scripts/check-lang.js"
+ "check-lang": "node scripts/check-lang.js",
+ "loadtest": "node scripts/loadtest.js",
+ "loadtest:medium": "node scripts/loadtest.js --weight=medium",
+ "loadtest:heavy": "node scripts/loadtest.js --weight=heavy --verbose"
},
"lint-staged": {
"**/*.js": [
@@ -63,7 +66,8 @@
"date-fns": "^2.16.1",
"date-fns-tz": "^1.0.10",
"detect-browser": "^5.1.1",
- "formik": "^2.1.6",
+ "dotenv": "^8.2.0",
+ "formik": "^2.1.7",
"immer": "^7.0.9",
"is-localhost-ip": "^1.4.0",
"isbot-fast": "^1.2.0",
@@ -73,7 +77,7 @@
"next": "^9.5.3",
"react": "^16.13.1",
"react-dom": "^16.13.1",
- "react-intl": "^5.8.3",
+ "react-intl": "^5.8.4",
"react-redux": "^7.2.1",
"react-simple-maps": "^2.1.2",
"react-spring": "^8.0.27",
@@ -89,7 +93,7 @@
"uuid": "^8.3.0"
},
"devDependencies": {
- "@formatjs/cli": "^2.12.0",
+ "@formatjs/cli": "^2.13.0",
"@prisma/cli": "2.8.0",
"@rollup/plugin-buble": "^0.21.3",
"@rollup/plugin-node-resolve": "^9.0.0",
@@ -97,7 +101,6 @@
"@svgr/webpack": "^5.4.0",
"cross-env": "^7.0.2",
"del": "^6.0.0",
- "dotenv": "^8.2.0",
"dotenv-cli": "^4.0.0",
"eslint": "^7.10.0",
"eslint-config-prettier": "^6.12.0",
@@ -107,6 +110,7 @@
"extract-react-intl-messages": "^4.1.1",
"husky": "^4.3.0",
"lint-staged": "^10.4.0",
+ "loadtest": "5.1.0",
"npm-run-all": "^4.1.5",
"postcss-flexbugs-fixes": "^4.2.1",
"postcss-import": "^12.0.1",
diff --git a/public/country/nb-NO.json b/public/country/nb-NO.json
new file mode 100644
index 0000000000..894493294d
--- /dev/null
+++ b/public/country/nb-NO.json
@@ -0,0 +1 @@
+{"AF":"Afghanistan","AL":"Albania","DZ":"Algerie","AS":"Amerikansk Samoa","AD":"Andorra","AO":"Angola","AI":"Anguilla","AQ":"Antarktis","AG":"Antigua og Barbuda","AR":"Argentina","AM":"Armenia","AW":"Aruba","AZ":"Aserbajdsjan","AU":"Australia","BS":"Bahamas","BH":"Bahrain","BD":"Bangladesh","BB":"Barbados","BE":"Belgia","BZ":"Belize","BJ":"Benin","BM":"Bermuda","BT":"Bhutan","BO":"Bolivia","BA":"Bosnia-Hercegovina","BW":"Botswana","BV":"Bouvet\u00f8ya","BR":"Brasil","BN":"Brunei","BG":"Bulgaria","BF":"Burkina Faso","BI":"Burundi","CA":"Canada","KY":"Cayman\u00f8yene","CL":"Chile","CX":"Christmas\u00f8ya","CO":"Colombia","CK":"Cook\u00f8yene","CR":"Costa Rica","CU":"Cuba","CW":"Cura\u00e7ao","DK":"Danmark","VI":"De amerikanske jomfru\u00f8yene","VG":"De britiske jomfru\u00f8yene","AE":"De forente arabiske emirater","TF":"De franske s\u00f8rterritorier","DO":"Den dominikanske republikk","CF":"Den sentralafrikanske republikk","IO":"Det britiske territoriet i Indiahavet","PS":"Det palestinske omr\u00e5det","DJ":"Djibouti","DM":"Dominica","EC":"Ecuador","EG":"Egypt","GQ":"Ekvatorial-Guinea","SV":"El Salvador","CI":"Elfenbenskysten","ER":"Eritrea","EE":"Estland","SZ":"Eswatini","ET":"Etiopia","FK":"Falklands\u00f8yene","FJ":"Fiji","PH":"Filippinene","FI":"Finland","FR":"Frankrike","GF":"Fransk Guyana","PF":"Fransk Polynesia","FO":"F\u00e6r\u00f8yene","GA":"Gabon","GM":"Gambia","GE":"Georgia","GH":"Ghana","GI":"Gibraltar","GD":"Grenada","GL":"Gr\u00f8nland","GP":"Guadeloupe","GU":"Guam","GT":"Guatemala","GG":"Guernsey","GN":"Guinea","GW":"Guinea-Bissau","GY":"Guyana","HT":"Haiti","HM":"Heard- og McDonald\u00f8yene","GR":"Hellas","HN":"Honduras","HK":"Hongkong S.A.R. Kina","BY":"Hviterussland","IN":"India","ID":"Indonesia","IQ":"Irak","IR":"Iran","IE":"Irland","IS":"Island","IL":"Israel","IT":"Italia","JM":"Jamaica","JP":"Japan","YE":"Jemen","JE":"Jersey","JO":"Jordan","KH":"Kambodsja","CM":"Kamerun","CV":"Kapp Verde","BQ":"Karibisk Nederland","KZ":"Kasakhstan","KE":"Kenya","CN":"Kina","KG":"Kirgisistan","KI":"Kiribati","CC":"Kokos\u00f8yene","KM":"Komorene","CG":"Kongo-Brazzaville","CD":"Kongo-Kinshasa","HR":"Kroatia","KW":"Kuwait","CY":"Kypros","LA":"Laos","LV":"Latvia","LS":"Lesotho","LB":"Libanon","LR":"Liberia","LY":"Libya","LI":"Liechtenstein","LT":"Litauen","LU":"Luxemburg","MO":"Macao S.A.R. Kina","MG":"Madagaskar","MW":"Malawi","MY":"Malaysia","MV":"Maldivene","ML":"Mali","MT":"Malta","IM":"Man","MA":"Marokko","MH":"Marshall\u00f8yene","MQ":"Martinique","MR":"Mauritania","MU":"Mauritius","YT":"Mayotte","MX":"Mexico","FM":"Mikronesiaf\u00f8derasjonen","MD":"Moldova","MC":"Monaco","MN":"Mongolia","ME":"Montenegro","MS":"Montserrat","MZ":"Mosambik","MM":"Myanmar (Burma)","NA":"Namibia","NR":"Nauru","NL":"Nederland","NP":"Nepal","NZ":"New Zealand","NI":"Nicaragua","NE":"Niger","NG":"Nigeria","NU":"Niue","KP":"Nord-Korea","MK":"Nord-Makedonia","MP":"Nord-Marianene","NF":"Norfolk\u00f8ya","NO":"Norge","NC":"Ny-Caledonia","OM":"Oman","PK":"Pakistan","PW":"Palau","PA":"Panama","PG":"Papua Ny-Guinea","PY":"Paraguay","PE":"Peru","PN":"Pitcairn\u00f8yene","PL":"Polen","PT":"Portugal","PR":"Puerto Rico","QA":"Qatar","RE":"R\u00e9union","RO":"Romania","RU":"Russland","RW":"Rwanda","KN":"Saint Kitts og Nevis","BL":"Saint-Barth\u00e9lemy","MF":"Saint-Martin","PM":"Saint-Pierre-et-Miquelon","SB":"Salomon\u00f8yene","WS":"Samoa","SM":"San Marino","ST":"S\u00e3o Tom\u00e9 og Pr\u00edncipe","SA":"Saudi-Arabia","SN":"Senegal","RS":"Serbia","SC":"Seychellene","SL":"Sierra Leone","SG":"Singapore","SX":"Sint Maarten","SK":"Slovakia","SI":"Slovenia","SO":"Somalia","ES":"Spania","LK":"Sri Lanka","SH":"St. Helena","LC":"St. Lucia","VC":"St. Vincent og Grenadinene","GB":"Storbritannia","SD":"Sudan","SR":"Surinam","SJ":"Svalbard og Jan Mayen","CH":"Sveits","SE":"Sverige","SY":"Syria","ZA":"S\u00f8r-Afrika","GS":"S\u00f8r-Georgia og S\u00f8r-Sandwich\u00f8yene","KR":"S\u00f8r-Korea","SS":"S\u00f8r-Sudan","TJ":"Tadsjikistan","TW":"Taiwan","TZ":"Tanzania","TH":"Thailand","TG":"Togo","TK":"Tokelau","TO":"Tonga","TT":"Trinidad og Tobago","TD":"Tsjad","CZ":"Tsjekkia","TN":"Tunisia","TM":"Turkmenistan","TC":"Turks- og Caicos\u00f8yene","TV":"Tuvalu","TR":"Tyrkia","DE":"Tyskland","UG":"Uganda","UA":"Ukraina","HU":"Ungarn","UY":"Uruguay","US":"USA","UM":"USAs ytre \u00f8yer","UZ":"Usbekistan","VU":"Vanuatu","VA":"Vatikanstaten","VE":"Venezuela","EH":"Vest-Sahara","VN":"Vietnam","WF":"Wallis og Futuna","ZM":"Zambia","ZW":"Zimbabwe","TL":"\u00d8st-Timor","AT":"\u00d8sterrike","AX":"\u00c5land"}
\ No newline at end of file
diff --git a/redux/actions/app.js b/redux/actions/app.js
index 490bd7f102..94b77daaf1 100644
--- a/redux/actions/app.js
+++ b/redux/actions/app.js
@@ -1,6 +1,7 @@
import { createSlice } from '@reduxjs/toolkit';
import { getItem } from 'lib/web';
-import { LOCALE_CONFIG, THEME_CONFIG } from 'lib/constants';
+import { LOCALE_CONFIG, THEME_CONFIG, VERSION_CHECK } from 'lib/constants';
+import semver from 'semver';
const app = createSlice({
name: 'app',
@@ -10,6 +11,7 @@ const app = createSlice({
versions: {
current: process.env.VERSION,
latest: null,
+ hasUpdate: false,
},
},
reducers: {
@@ -60,11 +62,14 @@ export function checkVersion() {
const { tag_name } = data;
const latest = tag_name.startsWith('v') ? tag_name.slice(1) : tag_name;
+ const lastCheck = getItem(VERSION_CHECK);
+ const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
return dispatch(
setVersions({
current,
latest,
+ hasUpdate,
}),
);
};
diff --git a/scripts/loadtest.js b/scripts/loadtest.js
new file mode 100644
index 0000000000..e2146dd02b
--- /dev/null
+++ b/scripts/loadtest.js
@@ -0,0 +1,140 @@
+const loadtest = require('loadtest');
+const chalk = require('chalk');
+const trunc = num => +num.toFixed(1);
+
+/**
+ * Example invocations:
+ *
+ * npm run loadtest -- --weight=heavy
+ * npm run loadtest -- --weight=heavy --verbose
+ * npm run loadtest -- --weight=single --verbose
+ * npm run loadtest -- --weight=medium
+ */
+
+/**
+ * Command line arguments like --weight=heavy and --verbose use this object
+ * If you are providing _alternative_ configs, use --weight
+ * e.g. add --weight=ultra then add commandlineOptions.ultra={}
+ * --verbose can be combied with any weight.
+ */
+const commandlineOptions = {
+ single: {
+ concurrency: 1,
+ requestsPerSecond: 1,
+ maxSeconds: 5,
+ maxRequests: 1,
+ },
+ // Heavy can saturate CPU which leads to requests stalling depending on machine
+ // Keep an eye if --verbose logs pause, or if node CPU in top is > 100.
+ // https://github.com/alexfernandez/loadtest#usage-donts
+ heavy: {
+ concurrency: 10,
+ requestsPerSecond: 200,
+ maxSeconds: 60,
+ },
+ // Throttled requests should not max out CPU,
+ medium: {
+ concurrency: 3,
+ requestsPerSecond: 5,
+ maxSeconds: 60,
+ },
+ verbose: { statusCallback },
+};
+
+const options = {
+ url: 'http://localhost:3000',
+ method: 'POST',
+ concurrency: 5,
+ requestsPerSecond: 5,
+ maxSeconds: 5,
+ requestGenerator: (params, options, client, callback) => {
+ const message = JSON.stringify(mockPageView());
+ options.headers['Content-Length'] = message.length;
+ options.headers['Content-Type'] = 'application/json';
+ options.headers['user-agent'] = 'User-Agent: Mozilla/5.0 LoadTest';
+ options.body = message;
+ options.path = '/api/collect';
+ const request = client(options, callback);
+ request.write(message);
+ return request;
+ },
+};
+
+function getArgument() {
+ const weight = process.argv[2] && process.argv[2].replace('--weight=', '');
+ const verbose = process.argv.includes('--verbose') && 'verbose';
+ return [weight, verbose];
+}
+
+// Patch in all command line arguments over options object
+// Must do this prior to calling `loadTest()`
+getArgument().map(arg => Object.assign(options, commandlineOptions[arg]));
+
+loadtest.loadTest(options, (error, results) => {
+ if (error) {
+ return console.error(chalk.redBright('Got an error: %s', error));
+ }
+ console.log(chalk.bold(chalk.yellow('\n--------\n')));
+ console.log(chalk.yellowBright('Loadtests complete:'), chalk.greenBright('success'), '\n');
+ prettyLogItem('Total Requests:', results.totalRequests);
+ prettyLogItem('Total Errors:', results.totalErrors);
+
+ prettyLogItem(
+ 'Latency(mean/min/max)',
+ trunc(results.meanLatencyMs),
+ '/',
+ trunc(results.maxLatencyMs),
+ '/',
+ trunc(results.minLatencyMs),
+ );
+
+ if (results.totalErrors) {
+ console.log(chalk.redBright('*'), chalk.red('Total Errors:'), results.totalErrors);
+ }
+
+ if (results.errorCodes && Object.keys(results.errorCodes).length) {
+ console.log(chalk.redBright('*'), chalk.red('Error Codes:'), results.errorCodes);
+ }
+ // console.log(results);
+});
+
+/**
+ * Create a new object for each request. Note, we could randomize values here if desired.
+ *
+ * TODO: Need a better way of passing in websiteId, hostname, URL.
+ *
+ * @param {object} payload pageview payload same as sent via tracker
+ */
+function mockPageView(
+ payload = {
+ website: 'fcd4c7e3-ed76-439c-9121-3a0f102df126',
+ hostname: 'localhost',
+ screen: '1680x1050',
+ url: '/LOADTESTING',
+ },
+) {
+ return {
+ type: 'pageview',
+ payload,
+ };
+}
+
+// If you pass in --verbose, this function is called
+function statusCallback(error, result, latency) {
+ console.log(
+ chalk.yellowBright(`\n## req #${result.requestIndex + 1} of ${latency.totalRequests}`),
+ );
+ prettyLogItem('Request elapsed milliseconds:', trunc(result.requestElapsed));
+ prettyLogItem(
+ 'Latency(mean/max/min):',
+ trunc(latency.meanLatencyMs),
+ '/',
+ trunc(latency.maxLatencyMs),
+ '/',
+ trunc(latency.minLatencyMs),
+ );
+}
+
+function prettyLogItem(label, ...args) {
+ console.log(chalk.redBright('*'), chalk.green(label), ...args);
+}
diff --git a/scripts/start-env.js b/scripts/start-env.js
index 63b6636949..05823b7a22 100644
--- a/scripts/start-env.js
+++ b/scripts/start-env.js
@@ -1,3 +1,3 @@
const cli = require('next/dist/cli/next-start');
-cli.nextStart(['-p', process.env.PORT || 3000, '-H', process.env.HOSTNAME || '0.0.0.0']);
+cli.nextStart(['-p', process.env.PORT || 3000, '-H', process.env.HOSTNAME || 'localhost']);
diff --git a/yarn.lock b/yarn.lock
index 00d976ebd1..c38489ea55 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1064,12 +1064,12 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@formatjs/cli@^2.12.0":
- version "2.12.0"
- resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.12.0.tgz#f0bb253db073903634e57e587e0395cd0d0cd681"
- integrity sha512-F0epNBWCXjKGgej8GL1q4RLGqR38bRCPmGLb3VautkbZ74achB0cVGj2w/AdlQiJJ1mU5rEU13pRroukUBZ+GA==
+"@formatjs/cli@^2.13.0":
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/@formatjs/cli/-/cli-2.13.0.tgz#64018c82f9fbc291918792daf1eed16e4b56bb7f"
+ integrity sha512-1E/rdrKiHi7gbcN0WuY792X+jCHWI+9jC3565hhZXAJYmgNe9SntRW02nEJOK3WOkhm6yMWiHPLkFpyLq5hW3w==
dependencies:
- "@formatjs/ts-transformer" "^2.11.0"
+ "@formatjs/ts-transformer" "^2.11.1"
"@types/json-stable-stringify" "^1.0.32"
"@types/lodash" "^4.14.150"
"@types/loud-rejection" "^2.0.0"
@@ -1078,10 +1078,11 @@
commander "^6.1.0"
fast-glob "^3.2.4"
fs-extra "^9.0.0"
- intl-messageformat-parser "^6.0.7"
+ intl-messageformat-parser "^6.0.8"
json-stable-stringify "^1.0.1"
lodash "^4.17.15"
loud-rejection "^2.2.0"
+ tslib "^2.0.1"
typescript "^4.0"
"@formatjs/ecma402-abstract@^1.2.2":
@@ -1089,19 +1090,28 @@
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.2.tgz#4810bdbd696d3805c535fd0620b7c8f45ab3164f"
integrity sha512-mLCoAPGlXCVskb/ojBO6iurGqwo6sZvAl8pRC4N25bz4LPWExAM9LsOo057zN3Br1JxUM3RZHG4YGnVt+nSRYQ==
-"@formatjs/intl-displaynames@^3.3.9":
- version "3.3.9"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.9.tgz#18eeb39aa05d4a8b064e520725f9178d0c3f8c50"
- integrity sha512-6Ez9Ab9p9bsxCM4OlqsT+R0rmrj5lr6xjIXiCTs/pSDFeiNPQabWDHcBpiGlMRE3zifOwUOFSoi5AGGYMFgetw==
+"@formatjs/ecma402-abstract@^1.2.3":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.3.tgz#ca94911dd8e9c89eeaabba0f00e2f692979fc27b"
+ integrity sha512-sEkxTZj7qa+Pi/c4ppE5mxZYJkqQO3GNZzJZjAxgsXip2ixO/TZn58qrxdQ0V8mXmf+5xf+AfveyPvv4yHaRtw==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.2"
+ tslib "^2.0.1"
-"@formatjs/intl-listformat@^4.2.7":
- version "4.2.7"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-4.2.7.tgz#bcccfee92c69e661d4da51567540aa39fef9ceae"
- integrity sha512-7sYy7pBGzClvSZI98FhVeNt6N/ELdvrj8pvLOfcR0+FQyhv0ixanog7bRo9kT8ECin9+RwEpTmX7jGCh8Bcgjw==
+"@formatjs/intl-displaynames@^3.3.10":
+ version "3.3.10"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-3.3.10.tgz#905ad86431fdadfab2ec188bf9f4fe9e359d1fe6"
+ integrity sha512-SdIMuaKUO0N5zQb6CXtIrwjJbX+DC8ju7ifrcqpLagUMh2nIEJCz7sf0Q6lOMWEE+un1VTmjaXpRPP55cP40IA==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.2"
+ "@formatjs/ecma402-abstract" "^1.2.3"
+ tslib "^2.0.1"
+
+"@formatjs/intl-listformat@^4.2.8":
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-4.2.8.tgz#aa8935234dd5f8fcec6d08dfdf2be43e11ba671c"
+ integrity sha512-9qAThh/1HV9T/g6E11VbN5b209zg28fMUMrZqrpHiZZxc2PPHvP/CGqK7mo8hpyCoMUVo3kFxB5CFnw5difJrA==
+ dependencies:
+ "@formatjs/ecma402-abstract" "^1.2.3"
+ tslib "^2.0.1"
"@formatjs/intl-numberformat@^5.5.2":
version "5.6.2"
@@ -1110,32 +1120,35 @@
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
-"@formatjs/intl-relativetimeformat@^7.2.7":
- version "7.2.7"
- resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-7.2.7.tgz#dce72ebafb1ca0bf14673fab3b1aad145e1abac6"
- integrity sha512-R6rxX4PfPQ/EuDRALLSIEDCDW/FAmmu6xpRXIPdZ33bEP7SXEksJB039Bw//I0VIm2fBeIlxe9oqvRGfuqpwVg==
+"@formatjs/intl-relativetimeformat@^7.2.8":
+ version "7.2.8"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-7.2.8.tgz#a423ef9acd379980f58730b4757713156076de14"
+ integrity sha512-h6H5lcPn1LbVlAk62m7DYtY68aE6AiZVK1bLEo3HeWrMBFCskWAe9I/5kI+RjStdGZzo+CqBl+rSTcrSXjVj+g==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.2"
+ "@formatjs/ecma402-abstract" "^1.2.3"
+ tslib "^2.0.1"
-"@formatjs/intl@^1.3.3":
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.3.tgz#d59997b7ef832e7c47e8ca50861ff7ff7461d56c"
- integrity sha512-gFuCIZEH6o1O2ZF8YlhHJEApRrBarQ7iyqxFp4ujllr/tcjgSxfzF+LSBCPyJ1OQIU98ynOc0XKdrAR2wUd3ow==
+"@formatjs/intl@^1.3.4":
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-1.3.4.tgz#66441b85986726256f83fdffdb533c6334bc299b"
+ integrity sha512-aq6bhi2aZPYUEL15iiBrsNzDtw4Qe1r9dsqM26fbTbfWa6r5sdqcFwGySoeTzguxd+ZXoc9RypSMERjH92xFKA==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.2"
- "@formatjs/intl-displaynames" "^3.3.9"
- "@formatjs/intl-listformat" "^4.2.7"
- "@formatjs/intl-relativetimeformat" "^7.2.7"
+ "@formatjs/ecma402-abstract" "^1.2.3"
+ "@formatjs/intl-displaynames" "^3.3.10"
+ "@formatjs/intl-listformat" "^4.2.8"
+ "@formatjs/intl-relativetimeformat" "^7.2.8"
fast-memoize "^2.5.2"
- intl-messageformat "^9.3.8"
- intl-messageformat-parser "^6.0.7"
+ intl-messageformat "^9.3.9"
+ intl-messageformat-parser "^6.0.8"
+ tslib "^2.0.1"
-"@formatjs/ts-transformer@^2.11.0":
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.11.0.tgz#90c4b5afae55fd8b8c7ab6aa08ca94a123eb94b9"
- integrity sha512-d0++zpEeeCtE+RwbEB+TYw0WnC+jlNniIZu9NcILdgN6LEr9+TRxO+Gz4d7nj3g0D5X1LyNx6P4JI+byGxHqzw==
+"@formatjs/ts-transformer@^2.11.1":
+ version "2.11.1"
+ resolved "https://registry.yarnpkg.com/@formatjs/ts-transformer/-/ts-transformer-2.11.1.tgz#9b30c066cd1ca1831bfc76e22b01e2858b931923"
+ integrity sha512-VAjFBnWSQfO71PrR0NeGgwGoHOAlNMuQv4kdV6GpxQ/3d4YM+202Cpu6r1BmCvxkuXhijTMUu7ubKeenUr8WcA==
dependencies:
- intl-messageformat-parser "^6.0.7"
+ intl-messageformat-parser "^6.0.8"
+ tslib "^2.0.1"
typescript "^4.0"
"@formatjs/ts-transformer@^2.6.0":
@@ -1773,6 +1786,18 @@ agent-base@6:
dependencies:
debug "4"
+agent-base@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
+ integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
+ dependencies:
+ es6-promisify "^5.0.0"
+
+agentkeepalive@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef"
+ integrity sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=
+
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
@@ -2309,6 +2334,13 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
+bufferutil@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7"
+ integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==
+ dependencies:
+ node-gyp-build "~3.7.0"
+
builtin-modules@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
@@ -2746,6 +2778,14 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
+confinode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/confinode/-/confinode-2.1.1.tgz#6831961ca48fb3c9f7d5ff063022e2bc40bea86e"
+ integrity sha512-u5u0ZHpYMnVWtelxjalNtLvL+SdP7B/7s0JTFUIkyvqqIf67DAvy6SKaE6WZiwbufLPk+6zJKsh5SdpbtbFi9g==
+ dependencies:
+ quick-lru "^5.0.0"
+ yaml "^1.7.2"
+
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -3196,7 +3236,7 @@ debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
-debug@^3.2.6:
+debug@^3.1.0, debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@@ -3610,6 +3650,18 @@ es6-iterator@2.0.3, es6-iterator@~2.0.3:
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
+es6-promise@^4.0.3:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+ dependencies:
+ es6-promise "^4.0.3"
+
es6-symbol@^3.1.1, es6-symbol@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
@@ -4145,10 +4197,10 @@ for-own@^0.1.3:
dependencies:
for-in "^1.0.1"
-formik@^2.1.6:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.6.tgz#f723bfccb2c7abec886aa6a4930b360d20f1a0b3"
- integrity sha512-m9DcxlZw/58p4xuhH3dzUzQWaC4dig0RKX7yNQOJt4VRhXn7p+YRrs3o17r3YwzvOLua3zC53VMbfupLsDwO5w==
+formik@^2.1.7:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.1.7.tgz#40bd04e59b242176d0a17c701830f1536cd7506b"
+ integrity sha512-n1wviIh0JsvHqj9PufNvOV+fS7mFwh9FfMxxTMnTrKR/uVYMS06DKaivXBlJdDF0qEwTcPHxSmIQ3deFHL3Hsg==
dependencies:
deepmerge "^2.1.1"
hoist-non-react-statics "^3.3.0"
@@ -4524,6 +4576,14 @@ https-proxy-agent@5.0.0:
agent-base "6"
debug "4"
+https-proxy-agent@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
+ integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
+ dependencies:
+ agent-base "^4.3.0"
+ debug "^3.1.0"
+
human-signals@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
@@ -4694,13 +4754,22 @@ intl-messageformat-parser@^6.0.7:
dependencies:
"@formatjs/ecma402-abstract" "^1.2.2"
-intl-messageformat@^9.3.8:
- version "9.3.8"
- resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.3.8.tgz#561f31800cc3ced5dada6c991a0dd0233931850f"
- integrity sha512-XuFoC6kvsgL1qtzro9ubOaJ2zVgeJWb5X0mTYvG7p1OinbOZYPscP8eYyVJf9g++tDy/fwx9TfeaFlunmhC+Vw==
+intl-messageformat-parser@^6.0.8:
+ version "6.0.8"
+ resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-6.0.8.tgz#4180b280d21653df7c8c078e75e0bb7f0e3322c3"
+ integrity sha512-g1nV8YVI/Nscbu3qjGGgMcq61Es7L2bI+08gcbAx3taiFMJ3oJgQhC/wYksWLsq2cvLxq5pQ5Te06CE793/iVA==
+ dependencies:
+ "@formatjs/ecma402-abstract" "^1.2.3"
+ tslib "^2.0.1"
+
+intl-messageformat@^9.3.9:
+ version "9.3.9"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.3.9.tgz#41f9f139adbbb509da657133047c8c5bf4ca22a9"
+ integrity sha512-SB6b68bY+RZPBhg3XTmwfX0lL3ywvOuAcS+iH6cptiHPfzOPSzP05F3ZOirARwj8pVbC9Xd4w0pMtF/sGnHurw==
dependencies:
fast-memoize "^2.5.2"
- intl-messageformat-parser "^6.0.7"
+ intl-messageformat-parser "^6.0.8"
+ tslib "^2.0.1"
invariant@^2.2.2, invariant@^2.2.4:
version "2.2.4"
@@ -5296,6 +5365,19 @@ loader-utils@^1.2.3:
emojis-list "^3.0.0"
json5 "^1.0.1"
+loadtest@5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/loadtest/-/loadtest-5.1.0.tgz#20dd700329d98612b23c7e6fa0d1d4661ea9bccf"
+ integrity sha512-LFMyFMA77o41JyNPn+FOXNN/SNURXys8KQNK83mR6bDHjH/XpA5Uz8dd4lofh2VITrDsK+ITKi8QNkmxTOFt1Q==
+ dependencies:
+ agentkeepalive "^2.0.3"
+ confinode "^2.1.1"
+ https-proxy-agent "^2.2.1"
+ log "1.4.*"
+ stdio "^0.2.3"
+ testing "^1.1.1"
+ websocket "^1.0.28"
+
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -5378,6 +5460,11 @@ log-update@^4.0.0:
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
+log@1.4.*, log@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/log/-/log-1.4.0.tgz#4ba1d890fde249b031dca03bc37eaaf325656f1c"
+ integrity sha1-S6HYkP3iSbAx3KA7w36q8yVlbxw=
+
loglevel-colored-level-prefix@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
@@ -5960,6 +6047,11 @@ node-fetch@2.6.0:
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
+node-gyp-build@~3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d"
+ integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==
+
node-html-parser@^1.2.19:
version "1.2.20"
resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.2.20.tgz#37e9ebc627dbe3ff446eea4ac93e3d254b7c6ee4"
@@ -7125,6 +7217,11 @@ quick-lru@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+quick-lru@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -7165,22 +7262,23 @@ react-fast-compare@^2.0.1:
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
-react-intl@^5.8.3:
- version "5.8.3"
- resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.3.tgz#2018aca11a49d2d1b0f602e0dda653a47bf59dfb"
- integrity sha512-ueM7JhbBIi+6FpH6jCrJuKcYpjmFn9UAHA28ojY8LMAL1PowZ/53XGGMvfj32J0/2EIuHQ6vUbi/07kJqe1ksQ==
+react-intl@^5.8.4:
+ version "5.8.4"
+ resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-5.8.4.tgz#aba5432fcba17f47d9d46ac9bea1881c92f4f354"
+ integrity sha512-ToDeHYBpO9WBAOpnwQKihUdxB4qE1nqcGKV9Jq2upj1zspxeX3OddWaZwz8wNV5yjoYnoDY3HLWeBP4IXwbwqg==
dependencies:
- "@formatjs/ecma402-abstract" "^1.2.2"
- "@formatjs/intl" "^1.3.3"
- "@formatjs/intl-displaynames" "^3.3.9"
- "@formatjs/intl-listformat" "^4.2.7"
- "@formatjs/intl-relativetimeformat" "^7.2.7"
+ "@formatjs/ecma402-abstract" "^1.2.3"
+ "@formatjs/intl" "^1.3.4"
+ "@formatjs/intl-displaynames" "^3.3.10"
+ "@formatjs/intl-listformat" "^4.2.8"
+ "@formatjs/intl-relativetimeformat" "^7.2.8"
"@types/hoist-non-react-statics" "^3.3.1"
fast-memoize "^2.5.2"
hoist-non-react-statics "^3.3.2"
- intl-messageformat "^9.3.8"
- intl-messageformat-parser "^6.0.7"
+ intl-messageformat "^9.3.9"
+ intl-messageformat-parser "^6.0.8"
shallow-equal "^1.2.1"
+ tslib "^2.0.1"
react-is@16.13.1, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0:
version "16.13.1"
@@ -8090,6 +8188,11 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
+stdio@^0.2.3:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/stdio/-/stdio-0.2.7.tgz#a1c57da10fe1cfaa0c3bf683c9d0743d1b660839"
+ integrity sha1-ocV9oQ/hz6oMO/aDydB0PRtmCDk=
+
stream-browserify@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
@@ -8561,6 +8664,13 @@ terser@^5.0.0:
source-map "~0.6.1"
source-map-support "~0.5.12"
+testing@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/testing/-/testing-1.1.2.tgz#575b123070f63c5068e943cf255dbae71c5d8ba6"
+ integrity sha512-+wHrDL29KsI3NQtgGmgdZ/MaUZhnVePbt5ZfiMn6ntDpv/kMWfdiBrg/lJqntor9H8+zQYxvfPLVowPPs1nVEg==
+ dependencies:
+ log "1.4.0"
+
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -8711,6 +8821,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+tslib@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
+ integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==
+
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -8964,6 +9079,13 @@ use@^3.1.0:
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+utf-8-validate@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3"
+ integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==
+ dependencies:
+ node-gyp-build "~3.7.0"
+
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
@@ -9140,6 +9262,18 @@ webpack@4.44.1:
watchpack "^1.7.4"
webpack-sources "^1.4.1"
+websocket@^1.0.28:
+ version "1.0.32"
+ resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1"
+ integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==
+ dependencies:
+ bufferutil "^4.0.1"
+ debug "^2.2.0"
+ es5-ext "^0.10.50"
+ typedarray-to-buffer "^3.1.5"
+ utf-8-validate "^5.0.2"
+ yaeti "^0.0.6"
+
whatwg-url@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
@@ -9240,6 +9374,11 @@ y18n@^4.0.0:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+yaeti@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
+ integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=
+
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"