diff --git a/.gitignore b/.gitignore index 5db4c8fb..715ff703 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 27ec562a..7565d153 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 7bd1ebd3..30782de0 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 0df24877..73d20c98 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 }) { /> } > - + )} diff --git a/hooks/useVersion.js b/hooks/useVersion.js index d8e3d699..79b97a34 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 00000000..dcd97d47 --- /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 02dd5141..a6d311b5 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 d10777fd..7c0bb6e7 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 92c8b34f..656e535c 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 00000000..89449329 --- /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 490bd7f1..94b77daa 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 00000000..e2146dd0 --- /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 63b66369..05823b7a 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 00d976eb..c38489ea 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"