diff --git a/.env.example b/.env.example index a5459d32f8..43fb705a6a 100644 --- a/.env.example +++ b/.env.example @@ -105,4 +105,25 @@ NEXT_PUBLIC_PROPOSAL_ACCEPTED= NEXT_PUBLIC_PROPOSAL_REJECTED= # Google Analytics Measurement ID -NEXT_PUBLIC_GA_MEASUREMENT_ID= \ No newline at end of file +NEXT_PUBLIC_GA_MEASUREMENT_ID= + +# API log level: 0 none, 1 error, 2 warn, 3 info, 4 trace, 5 log, 6 debug +LOG_LEVEL=6 + +# Elastic APM integration secret token +ELASTIC_APM_SECRET_TOKEN= + +# Elastic APM integration server url +ELASTIC_APM_SERVER_URL= + +# Elastic APM integration service name +ELASTIC_APM_SERVICE_NAME= + +# true|false - Enable Elastic APM integration +ELASTIC_APM_ACTIVE= + +# Elastic APM _local_ log level +ELASTIC_APM_LOG_LEVEL= + +# true|false - should we index Logger.trace() into elastic +ELASTIC_INDEX_STACK_TRACE= \ No newline at end of file diff --git a/components/bounties/list-active-networks.tsx b/components/bounties/list-active-networks.tsx index d3f903c636..88ea2d21d3 100644 --- a/components/bounties/list-active-networks.tsx +++ b/components/bounties/list-active-networks.tsx @@ -45,7 +45,6 @@ export default function ListActiveNetworks() {

{t("most-active-networks")}

diff --git a/components/connect-wallet-button.tsx b/components/connect-wallet-button.tsx index 5c12b3746e..d86e37d67d 100644 --- a/components/connect-wallet-button.tsx +++ b/components/connect-wallet-button.tsx @@ -19,11 +19,9 @@ import {changeShowWeb3} from "../contexts/reducers/update-show-prop"; export default function ConnectWalletButton({children = null, asModal = false, forceLogin = false,}) { const { t } = useTranslation(["common", "connect-wallet-button"]); - const {dispatch, state: { loading, connectedChain },} = useAppState(); + const {dispatch, state} = useAppState(); const [showModal, setShowModal] = useState(false); - const {state} = useAppState(); - const { connectWallet } = useAuthentication(); async function handleLogin() { @@ -35,11 +33,12 @@ export default function ConnectWalletButton({children = null, asModal = false, f if (!state.Service?.active) return; - if (+state.connectedChain?.id === +state.Settings?.requiredChain?.id) { + if ( + (+state.connectedChain?.id || +window?.ethereum?.chainId) === + +state.Settings?.requiredChain?.id + ) { connectWallet(); } else { - console.log('no connected chain?', connectedChain, state.Settings?.requiredChain); - dispatch(changeChain.update({...state.connectedChain, id: state.Settings?.requiredChain?.id})); setShowModal(false); } @@ -64,7 +63,7 @@ export default function ConnectWalletButton({children = null, asModal = false, f if (asModal) { - if (loading?.isLoading) return <>; + if (state?.loading?.isLoading) return <>; return ( { @@ -74,7 +75,21 @@ export default function MainNav() { if(!window.ethereum) return dispatch(changeShowWeb3(true)) return dispatch(changeShowCreateBounty(true)) - } + } + + function LinkExplore() { + return ( + } + nav + uppercase + icon={!noNeedNetworkInstance ? :null} + /> + ); + } function LinkNetworks() { return( @@ -101,7 +116,9 @@ export default function MainNav() { function LinkBounties() { return ( } nav uppercase @@ -110,41 +127,17 @@ export default function MainNav() { } const brandLogo = !noNeedNetworkInstance ? ( - - ) : ( - - ) - } - className="brand" - nav - active - brand - /> - ): ( - - } - className="brand" - nav - active - brand + fullLogoUrl ? ( + + ) : ( + + ) + ) : ( + ); return ( @@ -163,7 +156,6 @@ export default function MainNav() {
  • -
  • +
  • + +
  • )) || (
      -
    • - -
    • +
    • + +
    )} diff --git a/components/transaction-modal.tsx b/components/transaction-modal.tsx index 74af997de9..9b5f4662be 100644 --- a/components/transaction-modal.tsx +++ b/components/transaction-modal.tsx @@ -19,6 +19,7 @@ import {toastInfo} from "contexts/reducers/change-toaster"; import {CopyValue} from "helpers/copy-value"; import {formatStringToCurrency} from "helpers/formatNumber"; import {truncateAddress} from "helpers/truncate-address"; +import { isValidUrl } from "helpers/validateUrl"; import {BlockTransaction, Transaction} from "interfaces/transaction"; @@ -99,7 +100,9 @@ export default function TransactionModal({ } function getEtherScanHref(tx: string) { - return `${state.Settings?.urls?.blockScan}/${tx}`; + const url = state.Settings?.urls?.blockScan + const validUrl = isValidUrl(url) ? url : `https://${url}` + return `${validUrl}/${tx}`; } return ( diff --git a/components/web3-dialog.tsx b/components/web3-dialog.tsx index 3bd541e23a..6c6856839d 100644 --- a/components/web3-dialog.tsx +++ b/components/web3-dialog.tsx @@ -31,12 +31,12 @@ export default function WebThreeDialog() { useEffect(() => { if (![ + "/explore", + "/leaderboard", + "/networks", getURLWithNetwork("/").pathname, getURLWithNetwork("/bounties").pathname, getURLWithNetwork("/curators").pathname, - getURLWithNetwork("/oracle").pathname, - getURLWithNetwork("/oracle/new-bounties").pathname, - getURLWithNetwork("/oracle/ready-to-merge").pathname, "/[network]/bounty", "/[network]", ].includes(router.pathname)) diff --git a/elastic-apm-node.js b/elastic-apm-node.js new file mode 100644 index 0000000000..961e2df712 --- /dev/null +++ b/elastic-apm-node.js @@ -0,0 +1,9 @@ +require(`dotenv`).config(); + +module.exports = { + serverUrl: process.env.ELASTIC_APM_SERVER_URL, // E.g. https://my-deployment-name.apm.us-west2.gcp.elastic-cloud.com + secretToken: process.env.ELASTIC_APM_SECRET_TOKEN, + serviceName: process.env.ELASTIC_APM_SERVICE_NAME, + active: process.env.ELASTIC_APM_ACTIVE === "true", + logLevel: process.env.ELASTIC_APM_LOG_LEVEL +} \ No newline at end of file diff --git a/helpers/error-messages.ts b/helpers/error-messages.ts new file mode 100644 index 0000000000..cc8d969785 --- /dev/null +++ b/helpers/error-messages.ts @@ -0,0 +1,2 @@ +export const UNAUTHORIZED = `Unauthorized`; +export const INVALID_JWT_TOKEN = `Invalid JWT Token`; \ No newline at end of file diff --git a/helpers/validateUrl.ts b/helpers/validateUrl.ts new file mode 100644 index 0000000000..7fd6e8593c --- /dev/null +++ b/helpers/validateUrl.ts @@ -0,0 +1,8 @@ +export function isValidUrl(string) { + try { + new URL(string); + return true; + } catch (err) { + return false; + } +} diff --git a/middleware/index.ts b/middleware/index.ts index 3b976dd80f..9bcc85eafc 100644 --- a/middleware/index.ts +++ b/middleware/index.ts @@ -1,5 +1,8 @@ +import {LogAccess} from "./log-access"; import withCors from "./withCors"; import WithJwt from "./withJwt"; const withProtected = (handler) => withCors(WithJwt(handler)) -export {withCors, WithJwt, withProtected} \ No newline at end of file +const RouteMiddleware = (handler) => LogAccess(withCors(WithJwt(handler))); + +export {withCors, WithJwt, withProtected, RouteMiddleware}; \ No newline at end of file diff --git a/middleware/log-access.ts b/middleware/log-access.ts new file mode 100644 index 0000000000..006f82b4cb --- /dev/null +++ b/middleware/log-access.ts @@ -0,0 +1,32 @@ +import {NextApiHandler, NextApiRequest, NextApiResponse} from "next"; + +import {debug, log, Logger} from "../services/logging"; + +export const LogAccess = (handler: NextApiHandler) => { + return async (req: NextApiRequest, res: NextApiResponse) => { + const {url, method} = req as any; + const _query = Object.fromEntries(new URLSearchParams(url.split('?')[1])); + const query = Object.keys(_query).length ? _query : null; + const body = req?.body || null; + + const pathname = url.split('/api')[1].replace(/\?.+/g, ''); + + const rest = (query || body) ? ({ ... query ? {query} : {}, ... body ? {body} : {}}) : ''; + + log(`${method} access`, pathname); + if (rest) + debug(`${method} access-payload`, pathname, rest); + + try { + await handler(req, res); + + if (res.statusCode >= 400) + Logger.warn(`Answered with ${res.statusCode}`, res.statusMessage) + + debug(`${method} access-end`, pathname) + } catch (e) { + Logger.error(e, `${method}`, pathname, e?.toString(), rest); + } + Logger.changeActionName(``); // clean action just in case; + } +} \ No newline at end of file diff --git a/middleware/withCors.ts b/middleware/withCors.ts index 93226bae68..7d783c68eb 100644 --- a/middleware/withCors.ts +++ b/middleware/withCors.ts @@ -1,8 +1,6 @@ import Cors from 'cors' import getConfig from "next/config"; -import { info, error } from 'services/logging'; - const { publicRuntimeConfig } = getConfig(); const cors = Cors({ @@ -10,43 +8,20 @@ const cors = Cors({ origin: [publicRuntimeConfig?.urls?.home || 'http://localhost:3000'], }) -const ignorePaths = ['health', 'ip']; -function runMiddleware(req, res, fn) { - return new Promise((resolve, reject) => { - fn(req, res, (result) => { - if (result instanceof Error) { - return reject(result) +const WithCors = (handler) => + (req, res) => + new Promise((resolve, reject) => { + + const next = (e) => { + if (e instanceof Error) + reject(e); + resolve(null) } - return resolve(result) - }) - }) -} - -function runLogger(req, e = null) { - const {url, method} = req as any; - const search = Object(new URLSearchParams(url.split('?')[1])); - const pathname = url.split('/api')[1].replace(/\?.+/g, ''); - - if (!ignorePaths.some(k => pathname.includes(k))) - info('Access', {method, pathname, search,}); - - if (e) - error(e?.message); -} - -const withCors = (handler) => { - return async (req, res) => { - runLogger(req); - runMiddleware(req, res, cors) - .then(()=>{ - return handler(req, res); - }).catch((e)=>{ - runLogger(req, e?.message || e.toString()); - return res.status(401).write('Unautorized'); - }) - }; -}; - -export default withCors; + cors(req, res, next); + + }).then(() => handler(req, res)) + + +export default WithCors; diff --git a/middleware/withJwt.ts b/middleware/withJwt.ts index 204696ff1f..0825c4841a 100644 --- a/middleware/withJwt.ts +++ b/middleware/withJwt.ts @@ -1,14 +1,19 @@ -import { getToken } from "next-auth/jwt"; +import {NextApiRequest} from "next"; +import {getToken} from "next-auth/jwt"; -const WithJwt = (handler) => { - return async (req, res) => { - const method = req.method - if(method !== 'GET'){ - const token = await getToken({req}); - if(!token) return res.status(401).write('Unautorized'); - } +import {INVALID_JWT_TOKEN} from "../helpers/error-messages"; +import {Logger} from "../services/logging"; - return handler(req, res); +Logger.changeActionName(`WithJWT()`); + +const WithJwt = (handler, allowMethods = ['GET']) => { + return async (req: NextApiRequest, res) => { + + if (allowMethods.map(v => v.toLowerCase()).includes(req.method.toLowerCase())) + return handler(req, res); + + if (!await getToken({req})) + return res.status(401).json({message: INVALID_JWT_TOKEN}); }; }; diff --git a/next.config.js b/next.config.js index 2abc50f9a4..8430a96065 100644 --- a/next.config.js +++ b/next.config.js @@ -55,7 +55,8 @@ const serverRuntimeConfig = { }, e2eEnabled: process.env.NEXT_E2E_TESTNET || false, scheduleInterval: process.env.NEXT_E2E_TESTNET || 60, - logLevel: process.env.LOG_LEVEL + logLevel: process.env.LOG_LEVEL, + logStackTrace: process.env.ELASTIC_INDEX_STACK_TRACE === "true" } module.exports = () => { diff --git a/package-lock.json b/package-lock.json index b626cd7207..0236d5bd58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "cron": "^1.8.2", "date-fns": "^2.28.0", "dotenv": "^16.0.0", + "elastic-apm-node": "^3.42.0", "file-type": "^17.1.1", "form-data": "^4.0.0", "formidable": "^2.0.1", @@ -526,6 +527,28 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" }, + "node_modules/@elastic/ecs-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@elastic/ecs-helpers/-/ecs-helpers-1.1.0.tgz", + "integrity": "sha512-MDLb2aFeGjg46O5mLpdCzT5yOUDnXToJSrco2ShqGIXxNJaM8uJjX+4nd+hRYV4Vex8YJyDtOFEVBldQct6ndg==", + "dependencies": { + "fast-json-stringify": "^2.4.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@elastic/ecs-pino-format": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@elastic/ecs-pino-format/-/ecs-pino-format-1.3.0.tgz", + "integrity": "sha512-U8D57gPECYoRCcwREsrXKBtqeyFFF/KAwHi4rG1u/oQhAg91Kzw8ZtUQJXD/DMDieLOqtbItFr2FRBWI3t3wog==", + "dependencies": { + "@elastic/ecs-helpers": "^1.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@elastic/elasticsearch": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.2.1.tgz", @@ -1929,6 +1952,14 @@ "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.5.1.tgz", "integrity": "sha512-FaBbqZS2e4fCdQvUqeBKpJJOVsRxGcrf0NA91WBXz9GP5/4xgQgdjpbzAcDOSfESBYDYD78HeI5VeihfCW28Ew==" }, + "node_modules/@opentelemetry/api": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.0.tgz", + "integrity": "sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@panva/hkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.1.tgz", @@ -2832,6 +2863,53 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/after-all-results": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/after-all-results/-/after-all-results-2.0.0.tgz", + "integrity": "sha512-2zHEyuhSJOuCrmas9YV0YL/MFCWLxe1dS6k/ENhgYrb/JqyMnadLN4iIAc9kkZrbElMDyyAGH/0J18OPErOWLg==" + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agentkeepalive/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agentkeepalive/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3008,11 +3086,47 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "node_modules/async-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", + "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", + "deprecated": "No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option.", + "dependencies": { + "lru-cache": "^4.0.0" + } + }, + "node_modules/async-cache/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/async-cache/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "node_modules/async-value": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/async-value/-/async-value-1.2.2.tgz", + "integrity": "sha512-8rwtYe32OAS1W9CTwvknoyts+mc3ta8N7Pi0h7AjkMaKvsFbr39K+gEfZ7Z81aPXQ1sK5M23lgLy1QfZpcpadQ==" + }, + "node_modules/async-value-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/async-value-promise/-/async-value-promise-1.1.1.tgz", + "integrity": "sha512-c2RFDKjJle1rHa0YxN9Ysu97/QBu3Wa+NOejJxsX+1qVDJrkD3JL/GN1B3gaILAEXJXbu/4Z1lcoCHFESe/APA==", + "dependencies": { + "async-value": "^1.2.2" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3026,6 +3140,14 @@ "node": ">= 4.0.0" } }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", @@ -3116,6 +3238,17 @@ } ] }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -3145,6 +3278,11 @@ "node": ">=8" } }, + "node_modules/binary-search": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", + "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" + }, "node_modules/bl": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", @@ -3272,6 +3410,14 @@ "node": ">=8" } }, + "node_modules/breadth-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/breadth-filter/-/breadth-filter-2.0.0.tgz", + "integrity": "sha512-thQShDXnFWSk2oVBixRCyrWsFoV5tfOpWKHmxwafHQDNxCfDBk539utpvytNjmlFrTMqz41poLwJvA1MW3z0MQ==", + "dependencies": { + "object.entries": "^1.0.4" + } + }, "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -3831,6 +3977,11 @@ "proto-list": "~1.2.1" } }, + "node_modules/console-log-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/console-log-level/-/console-log-level-1.4.1.tgz", + "integrity": "sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4026,8 +4177,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cors": { "version": "2.8.5", @@ -4562,6 +4712,148 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/elastic-apm-http-client": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/elastic-apm-http-client/-/elastic-apm-http-client-11.2.0.tgz", + "integrity": "sha512-XHXK+gQmd34eRN/ffrml7AN4h1VwujB79WEO2C/J59ufvEk+mT1OGBhl6pntHPUWn4Um52C5m84O6jIXzaQwfw==", + "dependencies": { + "agentkeepalive": "^4.2.1", + "breadth-filter": "^2.0.0", + "end-of-stream": "^1.4.4", + "fast-safe-stringify": "^2.0.7", + "fast-stream-to-buffer": "^1.0.0", + "object-filter-sequence": "^1.0.0", + "readable-stream": "^3.4.0", + "semver": "^6.3.0", + "stream-chopper": "^3.0.1" + }, + "engines": { + "node": "^8.6.0 || 10 || >=12" + } + }, + "node_modules/elastic-apm-http-client/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/elastic-apm-node": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/elastic-apm-node/-/elastic-apm-node-3.42.0.tgz", + "integrity": "sha512-Q9sugfpaw6jQ8xDeP09LlyF0MwE5k0hphQmUiap+qQKE2jrLvY00zk4WierDQ2GF/AguE6BtRZmXpUELDbHFyA==", + "dependencies": { + "@elastic/ecs-pino-format": "^1.2.0", + "@opentelemetry/api": "^1.1.0", + "after-all-results": "^2.0.0", + "async-cache": "^1.1.0", + "async-value-promise": "^1.1.1", + "basic-auth": "^2.0.1", + "cookie": "^0.5.0", + "core-util-is": "^1.0.2", + "debug": "^4.1.1", + "elastic-apm-http-client": "11.2.0", + "end-of-stream": "^1.4.4", + "error-callsites": "^2.0.4", + "error-stack-parser": "^2.0.6", + "escape-string-regexp": "^4.0.0", + "fast-safe-stringify": "^2.0.7", + "http-headers": "^3.0.2", + "is-native": "^1.0.1", + "lru-cache": "^6.0.0", + "measured-reporting": "^1.51.1", + "module-details-from-path": "^1.0.3", + "monitor-event-loop-delay": "^1.0.0", + "object-filter-sequence": "^1.0.0", + "object-identity-map": "^1.0.2", + "original-url": "^1.2.3", + "pino": "^6.11.2", + "relative-microtime": "^2.0.0", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "set-cookie-serde": "^1.0.0", + "shallow-clone-shim": "^2.0.0", + "source-map": "^0.8.0-beta.0", + "sql-summary": "^1.0.1", + "traverse": "^0.6.6", + "unicode-byte-truncate": "^1.0.0" + }, + "engines": { + "node": "^8.6.0 || 10 || 12 || 14 || 16 || 17 || 18 || 19" + } + }, + "node_modules/elastic-apm-node/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/elastic-apm-node/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/elastic-apm-node/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/elastic-apm-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/elastic-apm-node/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/elastic-apm-node/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/elastic-apm-node/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/elastic-apm-node/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/electron-fetch": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", @@ -4635,6 +4927,14 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" }, + "node_modules/error-callsites": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-callsites/-/error-callsites-2.0.4.tgz", + "integrity": "sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==", + "engines": { + "node": ">=6.x" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4643,6 +4943,14 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/es-abstract": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", @@ -5563,17 +5871,46 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "dependencies": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "engines": { + "node": ">=6" + } + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-stream-to-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stream-to-buffer/-/fast-stream-to-buffer-1.0.0.tgz", + "integrity": "sha512-bI/544WUQlD2iXBibQbOMSmG07Hay7YrpXlKaeGTPT7H7pC0eitt3usak5vUwEvCGK/O7rUAM3iyQValGU22TQ==", + "dependencies": { + "end-of-stream": "^1.4.1" + } }, "node_modules/fastq": { "version": "1.13.0", @@ -5701,6 +6038,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -5813,6 +6155,11 @@ "node": ">= 0.6" } }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -6357,6 +6704,14 @@ "node": ">= 0.8" } }, + "node_modules/http-headers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-headers/-/http-headers-3.0.2.tgz", + "integrity": "sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw==", + "dependencies": { + "next-line": "^1.1.0" + } + }, "node_modules/http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", @@ -6388,6 +6743,14 @@ "node": ">=10.19.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/i18next": { "version": "21.6.14", "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.14.tgz", @@ -6912,9 +7275,9 @@ "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==" }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -6972,6 +7335,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -7028,6 +7402,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==", + "dependencies": { + "is-finite": "^1.0.0" + } + }, "node_modules/is-ip": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", @@ -7039,6 +7421,15 @@ "node": ">=8" } }, + "node_modules/is-native": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-native/-/is-native-1.0.1.tgz", + "integrity": "sha512-I4z9hx+4u3/zyvpvGtAR+n7SodJugE+i2jiS8yfq1A9QAZY0KldLQz0SBptLC9ti7kBlpghWUwTKE2BA62eCcw==", + "dependencies": { + "is-nil": "^1.0.0", + "to-source-code": "^1.0.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -7050,6 +7441,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-nil": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-nil/-/is-nil-1.0.1.tgz", + "integrity": "sha512-m2Rm8PhUFDNNhgvwZJjJG74a9h5CHU0fkA8WT+WGlCjyEbZ2jPwgb+ZxHu4np284EqNVyOsgppReK4qy/TwEwg==" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7842,6 +8238,11 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -7906,6 +8307,11 @@ "es5-ext": "~0.10.2" } }, + "node_modules/mapcap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mapcap/-/mapcap-1.0.0.tgz", + "integrity": "sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g==" + }, "node_modules/markdown-to-text": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/markdown-to-text/-/markdown-to-text-0.1.1.tgz", @@ -7936,6 +8342,32 @@ "safe-buffer": "^5.1.2" } }, + "node_modules/measured-core": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/measured-core/-/measured-core-1.51.1.tgz", + "integrity": "sha512-DZQP9SEwdqqYRvT2slMK81D/7xwdxXosZZBtLVfPSo6y5P672FBTbzHVdN4IQyUkUpcVOR9pIvtUy5Ryl7NKyg==", + "dependencies": { + "binary-search": "^1.3.3", + "optional-js": "^2.0.0" + }, + "engines": { + "node": ">= 5.12" + } + }, + "node_modules/measured-reporting": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/measured-reporting/-/measured-reporting-1.51.1.tgz", + "integrity": "sha512-JCt+2u6XT1I5lG3SuYqywE0e62DJuAzBcfMzWGUhIYtPQV2Vm4HiYt/durqmzsAbZV181CEs+o/jMKWJKkYIWw==", + "dependencies": { + "console-log-level": "^1.4.1", + "mapcap": "^1.0.0", + "measured-core": "^1.51.1", + "optional-js": "^2.0.0" + }, + "engines": { + "node": ">= 5.12" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -8156,6 +8588,11 @@ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -8175,6 +8612,11 @@ "node": "*" } }, + "node_modules/monitor-event-loop-delay": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/monitor-event-loop-delay/-/monitor-event-loop-delay-1.0.0.tgz", + "integrity": "sha512-YRIr1exCIfBDLZle8WHOfSo7Xg3M+phcZfq9Fx1L6Abo+atGp7cge5pM7PjyBn4s1oZI/BRD4EMrzQBbPpVb5Q==" + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -8454,6 +8896,11 @@ "react": ">= 16.8.0" } }, + "node_modules/next-line": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-line/-/next-line-1.1.0.tgz", + "integrity": "sha512-+I10J3wKNoKddNxn0CNpoZ3eTZuqxjNM3b1GImVx22+ePI+Y15P8g/j3WsbP0fhzzrFzrtjOAoq5NCCucswXOQ==" + }, "node_modules/next-seo": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-5.3.0.tgz", @@ -8480,11 +8927,6 @@ "next": "^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0" } }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "node_modules/nextjs-google-analytics": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/nextjs-google-analytics/-/nextjs-google-analytics-2.2.2.tgz", @@ -8497,6 +8939,11 @@ "react": ">=17.0.0" } }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -8636,6 +9083,11 @@ "node": ">=0.10.0" } }, + "node_modules/object-filter-sequence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-filter-sequence/-/object-filter-sequence-1.0.0.tgz", + "integrity": "sha512-CsubGNxhIEChNY4cXYuA6KXafztzHqzLLZ/y3Kasf3A+sa3lL9thq3z+7o0pZqzEinjXT6lXDPAfVWI59dUyzQ==" + }, "node_modules/object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", @@ -8644,6 +9096,14 @@ "node": ">= 6" } }, + "node_modules/object-identity-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-identity-map/-/object-identity-map-1.0.2.tgz", + "integrity": "sha512-a2XZDGyYTngvGS67kWnqVdpoaJWsY7C1GhPJvejWAFCsUioTAaiTu8oBad7c6cI4McZxr4CmvnZeycK05iav5A==", + "dependencies": { + "object.entries": "^1.1.0" + } + }, "node_modules/object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -8681,7 +9141,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -8820,6 +9279,11 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/optional-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/optional-js/-/optional-js-2.3.0.tgz", + "integrity": "sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==" + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -8837,6 +9301,14 @@ "node": ">= 0.8.0" } }, + "node_modules/original-url": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/original-url/-/original-url-1.2.3.tgz", + "integrity": "sha512-BYm+pKYLtS4mVe/mgT3YKGtWV5HzN/XKiaIu1aK4rsxyjuHeTW9N+xVBEpJcY1onB3nccfH0RbzUEoimMqFUHQ==", + "dependencies": { + "forwarded-parse": "^2.1.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -9362,6 +9834,28 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "dependencies": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, "node_modules/postcss": { "version": "8.4.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", @@ -9470,6 +9964,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -9652,6 +10151,11 @@ } ] }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -10125,6 +10629,11 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/relative-microtime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/relative-microtime/-/relative-microtime-2.0.0.tgz", + "integrity": "sha512-l18ha6HEZc+No/uK4GyAnNxgKW7nvEe35IaeN54sShMojtqik2a6GbTyuiezkjpPaqP874Z3lW5ysBo5irz4NA==" + }, "node_modules/remarkable": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", @@ -10236,11 +10745,11 @@ "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -10311,6 +10820,11 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10772,6 +11286,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==" }, + "node_modules/set-cookie-serde": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-cookie-serde/-/set-cookie-serde-1.0.0.tgz", + "integrity": "sha512-Vq8e5GsupfJ7okHIvEPcfs5neCo7MZ1ZuWrO3sllYi3DOWt6bSSCpADzqXjz3k0fXehnoFIrmmhty9IN6U6BXQ==" + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -10794,6 +11313,11 @@ "sha.js": "bin.js" } }, + "node_modules/shallow-clone-shim": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone-shim/-/shallow-clone-shim-2.0.0.tgz", + "integrity": "sha512-YRNymdiL3KGOoS67d73TEmk4tdPTO9GSMCoiphQsTcC9EtC+AOmMPjkyBkRoCJfW9ASsaZw1craaiw1dPN2D3Q==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10882,6 +11406,15 @@ "node": ">=8" } }, + "node_modules/sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -10920,6 +11453,11 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/sql-summary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sql-summary/-/sql-summary-1.0.1.tgz", + "integrity": "sha512-IpCr2tpnNkP3Jera4ncexsZUp0enJBLr+pHCyTweMUBrbJsTgQeLWx1FXLhoBj/MvcnUQpkgOn2EY8FKOkUzww==" + }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -10950,6 +11488,11 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -10958,6 +11501,14 @@ "node": ">= 0.8" } }, + "node_modules/stream-chopper": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-chopper/-/stream-chopper-3.0.1.tgz", + "integrity": "sha512-f7h+ly8baAE26iIjcp3VbnBkbIRGtrvV0X0xxFM/d7fwLTYnLzDPTXRKNxa2HZzohOrc96NTrR+FaV3mzOelNA==", + "dependencies": { + "readable-stream": "^3.0.6" + } + }, "node_modules/stream-to-it": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", @@ -10982,6 +11533,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11451,6 +12007,14 @@ "node": ">=8.0" } }, + "node_modules/to-source-code": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/to-source-code/-/to-source-code-1.0.2.tgz", + "integrity": "sha512-YzWtjmNIf3E75eZYa7m1SCyl0vgOGoTzdpH3svfa8SUm5rqTgl9hnDolrAGOghCF9P2gsITXQoMrlujOoz+RPw==", + "dependencies": { + "is-nil": "^1.0.0" + } + }, "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", @@ -11730,6 +12294,20 @@ "node": ">=12.18" } }, + "node_modules/unicode-byte-truncate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-byte-truncate/-/unicode-byte-truncate-1.0.0.tgz", + "integrity": "sha512-GQgHk6DodEoKddKQdjnv7xKS9G09XCfHWX0R4RKht+EbUMSiVEmtWHGFO8HUm+6NvWik3E2/DG4MxTitOLL64A==", + "dependencies": { + "is-integer": "^1.0.6", + "unicode-substring": "^0.1.0" + } + }, + "node_modules/unicode-substring": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicode-substring/-/unicode-substring-0.1.0.tgz", + "integrity": "sha512-36Xaw9wXi7MB/3/EQZZHkZyyiRNa9i3k9YtPAz2KfqMVH2xutdXyMHn4Igarmnvr+wOrfWa/6njhY+jPpXN2EQ==" + }, "node_modules/universal-github-app-jwt": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.1.0.tgz", @@ -13112,6 +13690,22 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz", "integrity": "sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==" }, + "@elastic/ecs-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@elastic/ecs-helpers/-/ecs-helpers-1.1.0.tgz", + "integrity": "sha512-MDLb2aFeGjg46O5mLpdCzT5yOUDnXToJSrco2ShqGIXxNJaM8uJjX+4nd+hRYV4Vex8YJyDtOFEVBldQct6ndg==", + "requires": { + "fast-json-stringify": "^2.4.1" + } + }, + "@elastic/ecs-pino-format": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@elastic/ecs-pino-format/-/ecs-pino-format-1.3.0.tgz", + "integrity": "sha512-U8D57gPECYoRCcwREsrXKBtqeyFFF/KAwHi4rG1u/oQhAg91Kzw8ZtUQJXD/DMDieLOqtbItFr2FRBWI3t3wog==", + "requires": { + "@elastic/ecs-helpers": "^1.1.0" + } + }, "@elastic/elasticsearch": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.2.1.tgz", @@ -14144,6 +14738,11 @@ "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-5.5.1.tgz", "integrity": "sha512-FaBbqZS2e4fCdQvUqeBKpJJOVsRxGcrf0NA91WBXz9GP5/4xgQgdjpbzAcDOSfESBYDYD78HeI5VeihfCW28Ew==" }, + "@opentelemetry/api": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.0.tgz", + "integrity": "sha512-IgMK9i3sFGNUqPMbjABm0G26g0QCKCUBfglhQ7rQq6WcxbKfEHRcmwsoER4hZcuYqJgkYn2OeuoJIv7Jsftp7g==" + }, "@panva/hkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.1.tgz", @@ -14851,6 +15450,41 @@ "dev": true, "requires": {} }, + "after-all-results": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/after-all-results/-/after-all-results-2.0.0.tgz", + "integrity": "sha512-2zHEyuhSJOuCrmas9YV0YL/MFCWLxe1dS6k/ENhgYrb/JqyMnadLN4iIAc9kkZrbElMDyyAGH/0J18OPErOWLg==" + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -14987,11 +15621,48 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "async-cache": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", + "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", + "requires": { + "lru-cache": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + } + } + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "async-value": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/async-value/-/async-value-1.2.2.tgz", + "integrity": "sha512-8rwtYe32OAS1W9CTwvknoyts+mc3ta8N7Pi0h7AjkMaKvsFbr39K+gEfZ7Z81aPXQ1sK5M23lgLy1QfZpcpadQ==" + }, + "async-value-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/async-value-promise/-/async-value-promise-1.1.1.tgz", + "integrity": "sha512-c2RFDKjJle1rHa0YxN9Ysu97/QBu3Wa+NOejJxsX+1qVDJrkD3JL/GN1B3gaILAEXJXbu/4Z1lcoCHFESe/APA==", + "requires": { + "async-value": "^1.2.2" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -15002,6 +15673,11 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, "attr-accept": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", @@ -15066,6 +15742,14 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -15089,6 +15773,11 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "binary-search": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", + "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" + }, "bl": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", @@ -15193,6 +15882,14 @@ "fill-range": "^7.0.1" } }, + "breadth-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/breadth-filter/-/breadth-filter-2.0.0.tgz", + "integrity": "sha512-thQShDXnFWSk2oVBixRCyrWsFoV5tfOpWKHmxwafHQDNxCfDBk539utpvytNjmlFrTMqz41poLwJvA1MW3z0MQ==", + "requires": { + "object.entries": "^1.0.4" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -15621,6 +16318,11 @@ "proto-list": "~1.2.1" } }, + "console-log-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/console-log-level/-/console-log-level-1.4.1.tgz", + "integrity": "sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -15767,8 +16469,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cors": { "version": "2.8.5", @@ -16191,6 +16892,126 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "elastic-apm-http-client": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/elastic-apm-http-client/-/elastic-apm-http-client-11.2.0.tgz", + "integrity": "sha512-XHXK+gQmd34eRN/ffrml7AN4h1VwujB79WEO2C/J59ufvEk+mT1OGBhl6pntHPUWn4Um52C5m84O6jIXzaQwfw==", + "requires": { + "agentkeepalive": "^4.2.1", + "breadth-filter": "^2.0.0", + "end-of-stream": "^1.4.4", + "fast-safe-stringify": "^2.0.7", + "fast-stream-to-buffer": "^1.0.0", + "object-filter-sequence": "^1.0.0", + "readable-stream": "^3.4.0", + "semver": "^6.3.0", + "stream-chopper": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "elastic-apm-node": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/elastic-apm-node/-/elastic-apm-node-3.42.0.tgz", + "integrity": "sha512-Q9sugfpaw6jQ8xDeP09LlyF0MwE5k0hphQmUiap+qQKE2jrLvY00zk4WierDQ2GF/AguE6BtRZmXpUELDbHFyA==", + "requires": { + "@elastic/ecs-pino-format": "^1.2.0", + "@opentelemetry/api": "^1.1.0", + "after-all-results": "^2.0.0", + "async-cache": "^1.1.0", + "async-value-promise": "^1.1.1", + "basic-auth": "^2.0.1", + "cookie": "^0.5.0", + "core-util-is": "^1.0.2", + "debug": "^4.1.1", + "elastic-apm-http-client": "11.2.0", + "end-of-stream": "^1.4.4", + "error-callsites": "^2.0.4", + "error-stack-parser": "^2.0.6", + "escape-string-regexp": "^4.0.0", + "fast-safe-stringify": "^2.0.7", + "http-headers": "^3.0.2", + "is-native": "^1.0.1", + "lru-cache": "^6.0.0", + "measured-reporting": "^1.51.1", + "module-details-from-path": "^1.0.3", + "monitor-event-loop-delay": "^1.0.0", + "object-filter-sequence": "^1.0.0", + "object-identity-map": "^1.0.2", + "original-url": "^1.2.3", + "pino": "^6.11.2", + "relative-microtime": "^2.0.0", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "set-cookie-serde": "^1.0.0", + "shallow-clone-shim": "^2.0.0", + "source-map": "^0.8.0-beta.0", + "sql-summary": "^1.0.1", + "traverse": "^0.6.6", + "unicode-byte-truncate": "^1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "requires": { + "punycode": "^2.1.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, "electron-fetch": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", @@ -16255,6 +17076,11 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" }, + "error-callsites": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-callsites/-/error-callsites-2.0.4.tgz", + "integrity": "sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -16263,6 +17089,14 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, "es-abstract": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", @@ -17017,17 +17851,40 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + }, "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fast-stream-to-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stream-to-buffer/-/fast-stream-to-buffer-1.0.0.tgz", + "integrity": "sha512-bI/544WUQlD2iXBibQbOMSmG07Hay7YrpXlKaeGTPT7H7pC0eitt3usak5vUwEvCGK/O7rUAM3iyQValGU22TQ==", + "requires": { + "end-of-stream": "^1.4.1" + } }, "fastq": { "version": "1.13.0", @@ -17127,6 +17984,11 @@ "rimraf": "^3.0.2" } }, + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, "flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -17203,6 +18065,11 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==" + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -17584,6 +18451,14 @@ "toidentifier": "1.0.1" } }, + "http-headers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-headers/-/http-headers-3.0.2.tgz", + "integrity": "sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw==", + "requires": { + "next-line": "^1.1.0" + } + }, "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", @@ -17608,6 +18483,14 @@ "resolve-alpn": "^1.2.0" } }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "requires": { + "ms": "^2.0.0" + } + }, "i18next": { "version": "21.6.14", "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.14.tgz", @@ -18005,9 +18888,9 @@ "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==" }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } @@ -18040,6 +18923,11 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -18076,6 +18964,14 @@ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" }, + "is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==", + "requires": { + "is-finite": "^1.0.0" + } + }, "is-ip": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", @@ -18084,11 +18980,25 @@ "ip-regex": "^4.0.0" } }, + "is-native": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-native/-/is-native-1.0.1.tgz", + "integrity": "sha512-I4z9hx+4u3/zyvpvGtAR+n7SodJugE+i2jiS8yfq1A9QAZY0KldLQz0SBptLC9ti7kBlpghWUwTKE2BA62eCcw==", + "requires": { + "is-nil": "^1.0.0", + "to-source-code": "^1.0.0" + } + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, + "is-nil": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-nil/-/is-nil-1.0.1.tgz", + "integrity": "sha512-m2Rm8PhUFDNNhgvwZJjJG74a9h5CHU0fkA8WT+WGlCjyEbZ2jPwgb+ZxHu4np284EqNVyOsgppReK4qy/TwEwg==" + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -18732,6 +19642,11 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -18782,6 +19697,11 @@ "es5-ext": "~0.10.2" } }, + "mapcap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mapcap/-/mapcap-1.0.0.tgz", + "integrity": "sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g==" + }, "markdown-to-text": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/markdown-to-text/-/markdown-to-text-0.1.1.tgz", @@ -18806,6 +19726,26 @@ "safe-buffer": "^5.1.2" } }, + "measured-core": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/measured-core/-/measured-core-1.51.1.tgz", + "integrity": "sha512-DZQP9SEwdqqYRvT2slMK81D/7xwdxXosZZBtLVfPSo6y5P672FBTbzHVdN4IQyUkUpcVOR9pIvtUy5Ryl7NKyg==", + "requires": { + "binary-search": "^1.3.3", + "optional-js": "^2.0.0" + } + }, + "measured-reporting": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/measured-reporting/-/measured-reporting-1.51.1.tgz", + "integrity": "sha512-JCt+2u6XT1I5lG3SuYqywE0e62DJuAzBcfMzWGUhIYtPQV2Vm4HiYt/durqmzsAbZV181CEs+o/jMKWJKkYIWw==", + "requires": { + "console-log-level": "^1.4.1", + "mapcap": "^1.0.0", + "measured-core": "^1.51.1", + "optional-js": "^2.0.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -18979,6 +19919,11 @@ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -18992,6 +19937,11 @@ "moment": ">= 2.9.0" } }, + "monitor-event-loop-delay": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/monitor-event-loop-delay/-/monitor-event-loop-delay-1.0.0.tgz", + "integrity": "sha512-YRIr1exCIfBDLZle8WHOfSo7Xg3M+phcZfq9Fx1L6Abo+atGp7cge5pM7PjyBn4s1oZI/BRD4EMrzQBbPpVb5Q==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -19195,6 +20145,11 @@ "react-i18next": "^11.15.5" } }, + "next-line": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-line/-/next-line-1.1.0.tgz", + "integrity": "sha512-+I10J3wKNoKddNxn0CNpoZ3eTZuqxjNM3b1GImVx22+ePI+Y15P8g/j3WsbP0fhzzrFzrtjOAoq5NCCucswXOQ==" + }, "next-seo": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-5.3.0.tgz", @@ -19214,11 +20169,6 @@ "cors": "^2.8.5" } }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "nextjs-google-analytics": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/nextjs-google-analytics/-/nextjs-google-analytics-2.2.2.tgz", @@ -19227,6 +20177,11 @@ "fsevents": "^2.3.2" } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", @@ -19314,11 +20269,24 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-filter-sequence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-filter-sequence/-/object-filter-sequence-1.0.0.tgz", + "integrity": "sha512-CsubGNxhIEChNY4cXYuA6KXafztzHqzLLZ/y3Kasf3A+sa3lL9thq3z+7o0pZqzEinjXT6lXDPAfVWI59dUyzQ==" + }, "object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" }, + "object-identity-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-identity-map/-/object-identity-map-1.0.2.tgz", + "integrity": "sha512-a2XZDGyYTngvGS67kWnqVdpoaJWsY7C1GhPJvejWAFCsUioTAaiTu8oBad7c6cI4McZxr4CmvnZeycK05iav5A==", + "requires": { + "object.entries": "^1.1.0" + } + }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", @@ -19344,7 +20312,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -19447,6 +20414,11 @@ "oidc-token-hash": "^5.0.1" } }, + "optional-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/optional-js/-/optional-js-2.3.0.tgz", + "integrity": "sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==" + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -19461,6 +20433,14 @@ "word-wrap": "^1.2.3" } }, + "original-url": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/original-url/-/original-url-1.2.3.tgz", + "integrity": "sha512-BYm+pKYLtS4mVe/mgT3YKGtWV5HzN/XKiaIu1aK4rsxyjuHeTW9N+xVBEpJcY1onB3nccfH0RbzUEoimMqFUHQ==", + "requires": { + "forwarded-parse": "^2.1.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -19847,6 +20827,25 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + } + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, "postcss": { "version": "8.4.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", @@ -19920,6 +20919,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -20059,6 +21063,11 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -20414,6 +21423,11 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "relative-microtime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/relative-microtime/-/relative-microtime-2.0.0.tgz", + "integrity": "sha512-l18ha6HEZc+No/uK4GyAnNxgKW7nvEe35IaeN54sShMojtqik2a6GbTyuiezkjpPaqP874Z3lW5ysBo5irz4NA==" + }, "remarkable": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", @@ -20503,11 +21517,11 @@ "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -20558,6 +21572,11 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -20885,6 +21904,11 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", "integrity": "sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==" }, + "set-cookie-serde": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-cookie-serde/-/set-cookie-serde-1.0.0.tgz", + "integrity": "sha512-Vq8e5GsupfJ7okHIvEPcfs5neCo7MZ1ZuWrO3sllYi3DOWt6bSSCpADzqXjz3k0fXehnoFIrmmhty9IN6U6BXQ==" + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -20904,6 +21928,11 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone-shim": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone-shim/-/shallow-clone-shim-2.0.0.tgz", + "integrity": "sha512-YRNymdiL3KGOoS67d73TEmk4tdPTO9GSMCoiphQsTcC9EtC+AOmMPjkyBkRoCJfW9ASsaZw1craaiw1dPN2D3Q==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -20965,6 +21994,15 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -20990,6 +22028,11 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "sql-summary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sql-summary/-/sql-summary-1.0.1.tgz", + "integrity": "sha512-IpCr2tpnNkP3Jera4ncexsZUp0enJBLr+pHCyTweMUBrbJsTgQeLWx1FXLhoBj/MvcnUQpkgOn2EY8FKOkUzww==" + }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -21011,11 +22054,24 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "stream-chopper": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-chopper/-/stream-chopper-3.0.1.tgz", + "integrity": "sha512-f7h+ly8baAE26iIjcp3VbnBkbIRGtrvV0X0xxFM/d7fwLTYnLzDPTXRKNxa2HZzohOrc96NTrR+FaV3mzOelNA==", + "requires": { + "readable-stream": "^3.0.6" + } + }, "stream-to-it": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", @@ -21037,6 +22093,11 @@ "safe-buffer": "~5.1.0" } }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -21380,6 +22441,14 @@ "is-number": "^7.0.0" } }, + "to-source-code": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/to-source-code/-/to-source-code-1.0.2.tgz", + "integrity": "sha512-YzWtjmNIf3E75eZYa7m1SCyl0vgOGoTzdpH3svfa8SUm5rqTgl9hnDolrAGOghCF9P2gsITXQoMrlujOoz+RPw==", + "requires": { + "is-nil": "^1.0.0" + } + }, "toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", @@ -21588,6 +22657,20 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-5.9.1.tgz", "integrity": "sha512-6fB3a+SNnWEm4CJbgo0/CWR8RGcOCQP68SF4X0mxtYTq2VNN8T88NYrWVBAeSX+zb7bny2dx2iYhP3XHi00omg==" }, + "unicode-byte-truncate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-byte-truncate/-/unicode-byte-truncate-1.0.0.tgz", + "integrity": "sha512-GQgHk6DodEoKddKQdjnv7xKS9G09XCfHWX0R4RKht+EbUMSiVEmtWHGFO8HUm+6NvWik3E2/DG4MxTitOLL64A==", + "requires": { + "is-integer": "^1.0.6", + "unicode-substring": "^0.1.0" + } + }, + "unicode-substring": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicode-substring/-/unicode-substring-0.1.0.tgz", + "integrity": "sha512-36Xaw9wXi7MB/3/EQZZHkZyyiRNa9i3k9YtPAz2KfqMVH2xutdXyMHn4Igarmnvr+wOrfWa/6njhY+jPpXN2EQ==" + }, "universal-github-app-jwt": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.1.0.tgz", diff --git a/package.json b/package.json index 1ab05851c0..7ad1fec090 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "migrate": "sequelize db:migrate", "migrate:undo": "sequelize db:migrate:undo", "clean": "npm cache clean --force && rm -rf .next", - "dev": "cross-env NODE_OPTIONS='--inspect' next dev", + "dev": "cross-env NODE_OPTIONS=\"--inspect --require=elastic-apm-node/start-next.js\" next dev", "prebuild": "next telemetry disable", "build": "next build", "start": "next start", @@ -50,6 +50,7 @@ "cron": "^1.8.2", "date-fns": "^2.28.0", "dotenv": "^16.0.0", + "elastic-apm-node": "^3.42.0", "file-type": "^17.1.1", "form-data": "^4.0.0", "formidable": "^2.0.1", diff --git a/pages/[network]/bounties.tsx b/pages/[network]/bounties.tsx index 0298f449e1..0341bc260d 100644 --- a/pages/[network]/bounties.tsx +++ b/pages/[network]/bounties.tsx @@ -17,7 +17,7 @@ import {BountyEffectsProvider} from "../../contexts/bounty-effects"; import {useBounty} from "../../x-hooks/use-bounty"; -export default function PageDevelopers() { +export default function BountiesPage() { useBounty(); const { t } = useTranslation(["common"]); diff --git a/pages/[network]/index.tsx b/pages/[network]/index.tsx index 1689f88a75..10b93482df 100644 --- a/pages/[network]/index.tsx +++ b/pages/[network]/index.tsx @@ -1,12 +1,22 @@ -import React from "react"; +import { useEffect } from "react"; import {serverSideTranslations} from "next-i18next/serverSideTranslations"; +import { useRouter } from "next/router"; import {GetServerSideProps} from "next/types"; -import PageDevelopers from "pages/[network]/bounties"; +import useNetworkTheme from "x-hooks/use-network-theme"; export default function Home() { - return ; + const { getURLWithNetwork } = useNetworkTheme(); + const { replace, query } = useRouter(); + + useEffect(() => { + replace(getURLWithNetwork(`/bounties`, { + network: query?.network + })); + }, []); + + return null; } export const getServerSideProps: GetServerSideProps = async ({locale}) => { diff --git a/pages/_app.tsx b/pages/_app.tsx index 294b6f4818..95fcab7f25 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -22,17 +22,19 @@ import RootProviders from "contexts"; import "../styles/styles.scss"; import "../node_modules/@primer/css/dist/markdown.css"; import {useRouter} from "next/router"; +import getConfig from "next/config"; function App({ Component, pageProps: { session, ...pageProps } }: AppProps) { const {asPath} = useRouter(); + const {publicRuntimeConfig} = getConfig(); if (asPath.includes('api-doc')) return return ( <> - + diff --git a/pages/api-doc.tsx b/pages/api-doc.tsx index 313c98fe00..21e2071af1 100644 --- a/pages/api-doc.tsx +++ b/pages/api-doc.tsx @@ -1,8 +1,9 @@ import React from 'react'; -import dynamic from "next/dynamic"; + import "swagger-ui-react/swagger-ui.css" import axios from "axios"; import getConfig from "next/config"; +import dynamic from "next/dynamic"; const SwaggerUI = dynamic<{ spec: Record; }>(import('swagger-ui-react'), { ssr: false }); diff --git a/pages/api/_middleware.ts b/pages/api/_middleware.ts deleted file mode 100644 index 80c49ecd21..0000000000 --- a/pages/api/_middleware.ts +++ /dev/null @@ -1,59 +0,0 @@ -import {IncomingHttpHeaders} from "http2"; -import type {NextApiRequest} from "next"; -import {getToken} from "next-auth/jwt"; -import {NextResponse} from "next/server"; - -interface CustomHeader { - get: (key: string) => string -} - -type CombinedHeader = IncomingHttpHeaders & CustomHeader; - -const testnet = process.env.NEXT_E2E_TESTNET === "true"; - -const whiteList = { - POST: [ "auth/_log", - "auth/signin/github", - "auth/signout", - "graphql", - "issue", - "network", - "search/users/address", - "search/users/all", - "search/users/login", - "search/users/total", - "files", - "nft", - "seo", - "setup/registry" ], - PUT: [ "network" ] -}; - -const UnauthorizedResponse = - (reason: string) => new Response(JSON.stringify({ reason }), { status: 401, statusText: "Unauthorized" }); - -export async function middleware(req: NextApiRequest) { - const method = req.method; - - const shouldCheckForToken = - method !== "GET" && !whiteList[method]?.some(path => (new RegExp(`${path}$`)).test(req.url) ); - - if (!testnet && shouldCheckForToken) { - const token = await getToken({req}); - - if(!token) - return UnauthorizedResponse("Missing Token"); - - const requestWallet = (req.headers as CombinedHeader).get("wallet")?.toLowerCase(); - const tokenWallet = (token.wallet as string)?.toLowerCase(); - - if (tokenWallet && requestWallet !== "" && tokenWallet !== requestWallet) - return UnauthorizedResponse("Invalid Accounts"); - } - - try { - return NextResponse.next(); - } catch (e) { - return NextResponse.error(); - } -} \ No newline at end of file diff --git a/pages/api/files/index.ts b/pages/api/files/index.ts index c0dbdec3e5..92c1dbcca7 100644 --- a/pages/api/files/index.ts +++ b/pages/api/files/index.ts @@ -1,10 +1,12 @@ import formidable from "formidable"; import fs from "fs"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import IpfsStorage from "services/ipfs-service"; +import {Logger} from "../../../services/logging"; + export const config = { api: { bodyParser: false @@ -49,4 +51,5 @@ async function FilesMethods (req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(FilesMethods) \ No newline at end of file +Logger.changeActionName(`Files`); +export default RouteMiddleware(FilesMethods) \ No newline at end of file diff --git a/pages/api/graphql/index.ts b/pages/api/graphql/index.ts index d2690cfbe1..c082afda5e 100644 --- a/pages/api/graphql/index.ts +++ b/pages/api/graphql/index.ts @@ -1,11 +1,11 @@ // import { error as LogError } from "services/logging"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {getToken} from "next-auth/jwt"; import getConfig from "next/config"; import {Octokit} from "octokit"; -import {error} from "services/logging"; +import {Logger} from "services/logging"; const {serverRuntimeConfig: {authSecret, github: {token: botToken}}} = getConfig(); @@ -23,7 +23,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json(result); } catch(_error) { - error("GraphQL Proxy", { req, error:_error?.message, token }); + Logger.error(_error, "Failed", { query, params, useBotToken }); return res.status(200).json(_error.data); } @@ -39,4 +39,5 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { } } -export default withCors(handler); \ No newline at end of file +Logger.changeActionName(`GraphQL`); +export default RouteMiddleware(handler); \ No newline at end of file diff --git a/pages/api/header/networks/index.ts b/pages/api/header/networks/index.ts index 3442ccf49c..e3dcd2b352 100644 --- a/pages/api/header/networks/index.ts +++ b/pages/api/header/networks/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import models from "db/models"; @@ -22,8 +22,9 @@ async function SearchNetworks(req: NextApiRequest, default: res.status(405); + break; } res.end(); } -export default withCors(SearchNetworks) \ No newline at end of file +export default RouteMiddleware(SearchNetworks) \ No newline at end of file diff --git a/pages/api/health/index.ts b/pages/api/health/index.ts index 791073bd2c..de9a213d51 100644 --- a/pages/api/health/index.ts +++ b/pages/api/health/index.ts @@ -1,7 +1,11 @@ import {NextApiRequest, NextApiResponse} from "next"; -export default async function Health(req: NextApiRequest, - res: NextApiResponse) { - res.status(204); +import {Logger} from "services/logging"; + +Logger.changeActionName(`Health`); + +export default function Health(req: NextApiRequest, + res: NextApiResponse) { + res.status(200); res.end(); } diff --git a/pages/api/issue/[...ids].ts b/pages/api/issue/[...ids].ts index 62bc734915..37fad9f4b0 100644 --- a/pages/api/issue/[...ids].ts +++ b/pages/api/issue/[...ids].ts @@ -3,6 +3,8 @@ import {Op} from "sequelize"; import models from "db/models"; +import {RouteMiddleware} from "../../../middleware"; + async function get(req: NextApiRequest, res: NextApiResponse) { const { ids: [repoId, ghId, networkName] @@ -42,7 +44,7 @@ async function get(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json(issue); } -export default async function GetIssues(req: NextApiRequest, +export default RouteMiddleware(async function GetIssues(req: NextApiRequest, res: NextApiResponse) { switch (req.method.toLowerCase()) { case "get": @@ -54,4 +56,4 @@ export default async function GetIssues(req: NextApiRequest, } res.end(); -} +}) diff --git a/pages/api/issue/index.ts b/pages/api/issue/index.ts index 58fbff33a1..cb7b11286d 100644 --- a/pages/api/issue/index.ts +++ b/pages/api/issue/index.ts @@ -10,6 +10,8 @@ import * as RepositoryQueries from "graphql/repository"; import {GraphQlResponse} from "types/octokit"; +import {RouteMiddleware} from "../../../middleware"; + const {serverRuntimeConfig} = getConfig(); async function post(req: NextApiRequest, res: NextApiResponse) { @@ -93,7 +95,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json(`${repository.id}/${githubId}`); } -export default async function Issue(req: NextApiRequest, res: NextApiResponse) { +export default RouteMiddleware(async function Issue(req: NextApiRequest, res: NextApiResponse) { switch (req.method.toLowerCase()) { case "post": await post(req, res); @@ -104,4 +106,4 @@ export default async function Issue(req: NextApiRequest, res: NextApiResponse) { } res.end(); -} +}) diff --git a/pages/api/issue/working/index.ts b/pages/api/issue/working/index.ts index 89b1796a41..c406ab70c2 100644 --- a/pages/api/issue/working/index.ts +++ b/pages/api/issue/working/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import getConfig from "next/config"; import {Octokit} from "octokit"; @@ -13,6 +13,8 @@ import {getPropertyRecursively} from "helpers/object"; import {GraphQlQueryResponseData, GraphQlResponse} from "types/octokit"; +import {Logger} from "../../../../services/logging"; + const { serverRuntimeConfig } = getConfig(); async function put(req: NextApiRequest, res: NextApiResponse) { @@ -27,13 +29,13 @@ async function put(req: NextApiRequest, res: NextApiResponse) { } }); - if (!network) return res.status(404).json("Invalid network"); + if (!network) return res.status(404).json({message: "Invalid network"}); const issue = await models.issue.findOne({ where: { issueId, network_id: network.id } }); - if (!issue) return res.status(404).json("Issue not found"); + if (!issue) return res.status(404).json({message: "Issue not found"}); if (!issue.working.find((el) => el === String(githubLogin))) { const repository = await models.repositories.findOne({ @@ -71,7 +73,7 @@ async function put(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json(comment); } - return res.status(409).json("Already working"); + return res.status(409).json({message: "Already working"}); } catch (error) { return res .status(error.response?.status || 500) @@ -93,4 +95,5 @@ async function Working(req: NextApiRequest, res.end(); } -export default withCors(Working) \ No newline at end of file +Logger.changeActionName(`Issue/Working`); +export default RouteMiddleware(Working) \ No newline at end of file diff --git a/pages/api/merge-proposal/[id].ts b/pages/api/merge-proposal/[id].ts index a9f83416b7..16aea903a2 100644 --- a/pages/api/merge-proposal/[id].ts +++ b/pages/api/merge-proposal/[id].ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import models from "db/models"; @@ -24,4 +24,4 @@ async function MergeProposal(req: NextApiRequest, } } -export default withCors(MergeProposal) \ No newline at end of file +export default RouteMiddleware(MergeProposal) \ No newline at end of file diff --git a/pages/api/merge-proposal/poll/[...info].ts b/pages/api/merge-proposal/poll/[...info].ts index 8f9f88f7e0..b0595ccca7 100644 --- a/pages/api/merge-proposal/poll/[...info].ts +++ b/pages/api/merge-proposal/poll/[...info].ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Bus} from "helpers/bus"; @@ -27,4 +27,4 @@ async function PollMergeProposal(req: NextApiRequest, } } -export default withCors(PollMergeProposal) \ No newline at end of file +export default RouteMiddleware(PollMergeProposal) \ No newline at end of file diff --git a/pages/api/network/index.ts b/pages/api/network/index.ts index 8667505a77..4691588be2 100644 --- a/pages/api/network/index.ts +++ b/pages/api/network/index.ts @@ -6,12 +6,15 @@ import Sequelize, {Op} from "sequelize"; import Database from "db/models"; -import { handlefindOrCreateTokens, handleRemoveTokens } from "helpers/handleNetworkTokens"; +import {handlefindOrCreateTokens, handleRemoveTokens} from "helpers/handleNetworkTokens"; import {Settings} from "helpers/settings"; import DAO from "services/dao-service"; import IpfsStorage from "services/ipfs-service"; -import {error as LogError} from 'services/logging'; +import {Logger} from 'services/logging'; + +import {UNAUTHORIZED} from "../../../helpers/error-messages"; +import {LogAccess} from "../../../middleware/log-access"; const {serverRuntimeConfig} = getConfig(); @@ -67,7 +70,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { isDefault } = req.body; - const name = _name.replaceAll(" ", "-").toLowerCase() + const name = _name?.replaceAll(" ", "-")?.toLowerCase() if (!botPermission) return res.status(403).json("Bepro-bot authorization needed"); @@ -78,7 +81,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { } }); - if(hasNetwork){ + if(hasNetwork) { return res.status(409).json("Already exists a network created for this wallet"); } @@ -92,7 +95,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { if (!publicSettings?.contracts?.networkRegistry) return res.status(500).json("Missing network registry contract"); if (!publicSettings?.urls?.web3Provider) return res.status(500).json("Missing web3 provider url"); if (isDefault && creator !== publicSettings?.defaultNetworkConfig?.adminWallet) - return res.status(401).json("Unauthorized"); + return res.status(401).json({message: UNAUTHORIZED}); const defaultNetwork = await Database.network.findOne({ where: { @@ -131,7 +134,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { if (logo?.hash) logoIconHash = logo.hash; } catch (error) { - console.error('Failed to store ipfs', error); + Logger.error(error, 'Failed to store ipfs'); } const network = await Database.network.create({ @@ -174,7 +177,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { }) .then(({data}) => invitations.push(data?.id)) .catch((e) => { - LogError('[GH Add Colaborator Fail]', {e}) + Logger.error(e, 'Add Collaborator Fail') return e; }); } @@ -189,7 +192,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { invitation_id }) .catch((e)=>{ - LogError('[GH Accpet Invitation Fail]', {e}) + Logger.error(e, 'Accept Invitation Fail') return e; }); } @@ -209,7 +212,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { return res.status(200).json("Network created"); } catch (error) { - LogError("Failed to create network", { error, req }); + Logger.error(error, "Failed to create network", req.body); return res.status(500).json(error); } } @@ -235,7 +238,7 @@ async function put(req: NextApiRequest, res: NextApiResponse) { const isAdminOverriding = !!override; - if (!accessToken && !isAdminOverriding) return res.status(401).json("Unauthorized user"); + if (!accessToken && !isAdminOverriding) return res.status(401).json({message: "Unauthorized user"}); const network = await Database.network.findOne({ where: { @@ -288,7 +291,7 @@ async function put(req: NextApiRequest, res: NextApiResponse) { } else { const isRegistryGovernor = await DAOService.isRegistryGovernor(creator); - if (!isRegistryGovernor) return res.status(403).json("Unauthorized"); + if (!isRegistryGovernor) return res.status(403).json({message: UNAUTHORIZED}); } const addingRepos = repositoriesToAdd ? JSON.parse(repositoriesToAdd) : []; @@ -350,7 +353,7 @@ async function put(req: NextApiRequest, res: NextApiResponse) { if (logo?.hash) network.fullLogo = full?.hash; } catch (error) { - console.error('Failed to store ipfs', error); + Logger.error(error, 'Failed to store ipfs'); } } @@ -375,7 +378,7 @@ async function put(req: NextApiRequest, res: NextApiResponse) { ...(githubLogin !== owner && { permission: "maintain"} || {}) }) .catch((e) => { - LogError('[GH Add Colaborator Fail]', {e}) + Logger.error(e, 'Add collaborator fail') return e; }); @@ -398,7 +401,7 @@ async function put(req: NextApiRequest, res: NextApiResponse) { invitation_id }) .catch((e)=>{ - LogError('[GH Accpet Invitation Fail]', {e}) + Logger.error(e, 'Accept invitation fail', {e}) return e; }); } @@ -470,4 +473,5 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(handler) \ No newline at end of file +Logger.changeActionName(`Network`); +export default LogAccess(withCors(handler)); \ No newline at end of file diff --git a/pages/api/nft/index.ts b/pages/api/nft/index.ts index 521e77c8ed..41ab8ebb8b 100644 --- a/pages/api/nft/index.ts +++ b/pages/api/nft/index.ts @@ -1,13 +1,13 @@ import {Bounty, ProposalDetail,} from "@taikai/dappkit"; import BigNumber from "bignumber.js"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op} from "sequelize"; import models from "db/models"; -import {formatNumberToNScale} from "helpers/formatNumber"; import calculateDistributedAmounts from "helpers/calculateDistributedAmounts"; +import {formatNumberToNScale} from "helpers/formatNumber"; import {Settings} from "helpers/settings"; import DAO from "services/dao-service"; @@ -178,4 +178,4 @@ async function NftMethods(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(NftMethods); \ No newline at end of file +export default RouteMiddleware(NftMethods); \ No newline at end of file diff --git a/pages/api/payments/index.ts b/pages/api/payments/index.ts index b751ed1b17..27da1702fd 100644 --- a/pages/api/payments/index.ts +++ b/pages/api/payments/index.ts @@ -1,5 +1,5 @@ import {endOfDay, isAfter, parseISO, startOfDay} from "date-fns"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op} from "sequelize"; @@ -74,4 +74,4 @@ async function Payments(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(Payments) \ No newline at end of file +export default RouteMiddleware(Payments) \ No newline at end of file diff --git a/pages/api/poll/index.ts b/pages/api/poll/index.ts index 23c2962683..cce755f93b 100644 --- a/pages/api/poll/index.ts +++ b/pages/api/poll/index.ts @@ -2,6 +2,8 @@ import {NextApiRequest, NextApiResponse} from "next"; import {Bus} from "helpers/bus"; +import {RouteMiddleware} from "../../../middleware"; + async function post(req: NextApiRequest, res: NextApiResponse) { const { eventName, ...rest } = req.body; @@ -34,7 +36,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { }); } -export default async function PollBody(req: NextApiRequest, +export default RouteMiddleware(async function PollBody(req: NextApiRequest, res: NextApiResponse) { switch (req.method.toLowerCase()) { case "post": @@ -44,4 +46,4 @@ export default async function PollBody(req: NextApiRequest, default: res.status(405); } -} +}) diff --git a/pages/api/pull-request/index.ts b/pages/api/pull-request/index.ts index 21c5ab726f..1c28b49994 100644 --- a/pages/api/pull-request/index.ts +++ b/pages/api/pull-request/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import getConfig from "next/config"; import {Octokit} from "octokit"; @@ -289,4 +289,4 @@ async function PullRequest(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(PullRequest); +export default RouteMiddleware(PullRequest); diff --git a/pages/api/pull-request/merge/index.ts b/pages/api/pull-request/merge/index.ts index 3ea177a64c..0a96e60a32 100644 --- a/pages/api/pull-request/merge/index.ts +++ b/pages/api/pull-request/merge/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import getConfig from "next/config"; import {Octokit} from "octokit"; @@ -130,4 +130,4 @@ async function PullRequest(req: NextApiRequest, res.end(); } -export default withCors(PullRequest) \ No newline at end of file +export default RouteMiddleware(PullRequest) \ No newline at end of file diff --git a/pages/api/pull-request/review/index.ts b/pages/api/pull-request/review/index.ts index 53756935e3..316dcefada 100644 --- a/pages/api/pull-request/review/index.ts +++ b/pages/api/pull-request/review/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import getConfig from "next/config"; import {Octokit} from "octokit"; @@ -100,4 +100,4 @@ async function PullRequestReview(req: NextApiRequest, res.end(); } -export default withCors(PullRequestReview) \ No newline at end of file +export default RouteMiddleware(PullRequestReview) \ No newline at end of file diff --git a/pages/api/repos/index.ts b/pages/api/repos/index.ts index bc1b9e1667..c4148a63a7 100644 --- a/pages/api/repos/index.ts +++ b/pages/api/repos/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op} from "sequelize"; @@ -103,4 +103,4 @@ async function RepoRoute(req: NextApiRequest, res.end(); } -export default withCors(RepoRoute) \ No newline at end of file +export default RouteMiddleware(RepoRoute) \ No newline at end of file diff --git a/pages/api/rss/index.ts b/pages/api/rss/index.ts index f505206eaa..27a0eba46e 100644 --- a/pages/api/rss/index.ts +++ b/pages/api/rss/index.ts @@ -1,15 +1,17 @@ -import { promises as fs} from "fs"; +import {promises as fs} from "fs"; import Handlebars from "handlebars"; import cache from "memory-cache"; -import { NextApiRequest, NextApiResponse } from "next"; +import {NextApiRequest, NextApiResponse} from "next"; import getConfig from "next/config"; import path from "path"; -import { Op } from "sequelize"; +import {Op} from "sequelize"; import models from "db/models"; -import { error as LogError } from 'services/logging'; +import {error as LogError} from 'services/logging'; + +import {LogAccess} from "../../../middleware/log-access"; const { publicRuntimeConfig } = getConfig(); @@ -103,7 +105,7 @@ async function get(req: NextApiRequest, res: NextApiResponse) { } } -export default async function handler(req: NextApiRequest, res: NextApiResponse) { +export default LogAccess(async function handler(req: NextApiRequest, res: NextApiResponse) { switch (req.method.toLowerCase()) { case "get": await get(req, res); @@ -114,4 +116,4 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } res.end(); -} +}) diff --git a/pages/api/search/curators/index.ts b/pages/api/search/curators/index.ts index 91da3fd8c5..3467fafb99 100644 --- a/pages/api/search/curators/index.ts +++ b/pages/api/search/curators/index.ts @@ -1,10 +1,10 @@ -import { withCors } from "middleware"; -import { NextApiRequest, NextApiResponse } from "next"; -import { Op, WhereOptions } from "sequelize"; +import {RouteMiddleware} from "middleware"; +import {NextApiRequest, NextApiResponse} from "next"; +import {Op, WhereOptions} from "sequelize"; import models from "db/models"; -import paginate, { calculateTotalPages } from "helpers/paginate"; +import paginate, {calculateTotalPages} from "helpers/paginate"; async function get(req: NextApiRequest, res: NextApiResponse) { try { @@ -76,4 +76,4 @@ async function SearchCurators(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(SearchCurators); +export default RouteMiddleware(SearchCurators); diff --git a/pages/api/search/issues/index.ts b/pages/api/search/issues/index.ts index 2fad4380ae..245d7afc62 100644 --- a/pages/api/search/issues/index.ts +++ b/pages/api/search/issues/index.ts @@ -1,5 +1,5 @@ import {subHours, subMonths, subWeeks, subYears} from "date-fns"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op, Sequelize, WhereOptions} from "sequelize"; @@ -227,4 +227,4 @@ async function SearchIssues(req: NextApiRequest, res.end(); } -export default withCors(SearchIssues) \ No newline at end of file +export default RouteMiddleware(SearchIssues) \ No newline at end of file diff --git a/pages/api/search/issues/recent.ts b/pages/api/search/issues/recent.ts index cffb98c3ff..09e6aa5cc0 100644 --- a/pages/api/search/issues/recent.ts +++ b/pages/api/search/issues/recent.ts @@ -1,4 +1,4 @@ -import {withCors} from 'middleware'; +import {RouteMiddleware} from 'middleware'; import {NextApiRequest, NextApiResponse} from "next"; import {Op, WhereOptions} from "sequelize"; @@ -84,4 +84,4 @@ async function getAll(req: NextApiRequest, res.end(); } -export default withCors(getAll) \ No newline at end of file +export default RouteMiddleware(getAll) \ No newline at end of file diff --git a/pages/api/search/issues/total.ts b/pages/api/search/issues/total.ts index ffc67f8f8a..158a2aa154 100644 --- a/pages/api/search/issues/total.ts +++ b/pages/api/search/issues/total.ts @@ -1,4 +1,4 @@ -import {withCors} from 'middleware'; +import {RouteMiddleware} from 'middleware'; import withJwt from "middleware/withJwt"; import {NextApiRequest, NextApiResponse} from "next"; import {Op, WhereOptions} from "sequelize"; @@ -72,4 +72,4 @@ async function getAll(req: NextApiRequest, res.end(); } -export default withCors(withJwt(getAll)) \ No newline at end of file +export default RouteMiddleware(withJwt(getAll)) \ No newline at end of file diff --git a/pages/api/search/leaderboard/index.ts b/pages/api/search/leaderboard/index.ts index 53887b41de..b9fb6231d3 100644 --- a/pages/api/search/leaderboard/index.ts +++ b/pages/api/search/leaderboard/index.ts @@ -1,12 +1,12 @@ -import { subMonths, subWeeks, subYears, subHours } from "date-fns"; -import { withCors } from "middleware"; -import { NextApiRequest, NextApiResponse } from "next"; -import { Op, WhereOptions } from "sequelize"; +import {subHours, subMonths, subWeeks, subYears} from "date-fns"; +import {RouteMiddleware} from "middleware"; +import {NextApiRequest, NextApiResponse} from "next"; +import {Op, WhereOptions} from "sequelize"; import models from "db/models"; -import paginate, { calculateTotalPages, paginateArray } from "helpers/paginate"; -import { searchPatternInText } from "helpers/string"; +import paginate, {calculateTotalPages, paginateArray} from "helpers/paginate"; +import {searchPatternInText} from "helpers/string"; async function get(req: NextApiRequest, res: NextApiResponse) { try { @@ -110,4 +110,4 @@ async function SearchLeaderBoard(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(SearchLeaderBoard); +export default RouteMiddleware(SearchLeaderBoard); diff --git a/pages/api/search/leaderboard/points/index.ts b/pages/api/search/leaderboard/points/index.ts index 19c9cb1100..46653ddc54 100644 --- a/pages/api/search/leaderboard/points/index.ts +++ b/pages/api/search/leaderboard/points/index.ts @@ -1,11 +1,11 @@ -import { withCors } from "middleware"; -import { NextApiRequest, NextApiResponse } from "next"; -import { WhereOptions, Op } from "sequelize"; +import {RouteMiddleware} from "middleware"; +import {NextApiRequest, NextApiResponse} from "next"; +import {Op, WhereOptions} from "sequelize"; import models from "db/models"; -import { calculateLeaderboardScore } from "helpers/leaderboard-score"; -import paginate, { calculateTotalPages } from "helpers/paginate"; +import {calculateLeaderboardScore} from "helpers/leaderboard-score"; +import paginate, {calculateTotalPages} from "helpers/paginate"; async function get(req: NextApiRequest, res: NextApiResponse) { try { @@ -64,4 +64,4 @@ async function SearchLeaderBoardPoints(req: NextApiRequest, res: NextApiResponse res.end(); } -export default withCors(SearchLeaderBoardPoints); +export default RouteMiddleware(SearchLeaderBoardPoints); diff --git a/pages/api/search/networks/active.ts b/pages/api/search/networks/active.ts index a808dfc348..273ee1ce69 100644 --- a/pages/api/search/networks/active.ts +++ b/pages/api/search/networks/active.ts @@ -1,11 +1,11 @@ import BigNumber from "bignumber.js"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op, WhereOptions} from "sequelize"; import models from "db/models"; -import { paginateArray} from "helpers/paginate"; +import {paginateArray} from "helpers/paginate"; async function get(req: NextApiRequest, res: NextApiResponse) { const whereCondition: WhereOptions = {}; @@ -83,4 +83,4 @@ async function SearchNetworks(req: NextApiRequest, res.end(); } -export default withCors(SearchNetworks) \ No newline at end of file +export default RouteMiddleware(SearchNetworks) \ No newline at end of file diff --git a/pages/api/search/networks/index.ts b/pages/api/search/networks/index.ts index fbbd5362e9..b63b87c634 100644 --- a/pages/api/search/networks/index.ts +++ b/pages/api/search/networks/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op, WhereOptions} from "sequelize"; @@ -63,4 +63,4 @@ async function SearchNetworks(req: NextApiRequest, res.end(); } -export default withCors(SearchNetworks) \ No newline at end of file +export default RouteMiddleware(SearchNetworks) \ No newline at end of file diff --git a/pages/api/search/networks/total.ts b/pages/api/search/networks/total.ts index af836a540d..4e9f076ebd 100644 --- a/pages/api/search/networks/total.ts +++ b/pages/api/search/networks/total.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op, WhereOptions} from "sequelize"; @@ -39,4 +39,4 @@ async function GetAll(req: NextApiRequest, res.end(); } -export default withCors(GetAll) \ No newline at end of file +export default RouteMiddleware(GetAll) \ No newline at end of file diff --git a/pages/api/search/repositories/index.ts b/pages/api/search/repositories/index.ts index 39c54b8fff..f0f74653bf 100644 --- a/pages/api/search/repositories/index.ts +++ b/pages/api/search/repositories/index.ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op, WhereOptions} from "sequelize"; @@ -56,4 +56,4 @@ async function SearchRepositories(req: NextApiRequest, res.end(); } -export default withCors(SearchRepositories) \ No newline at end of file +export default RouteMiddleware(SearchRepositories) \ No newline at end of file diff --git a/pages/api/search/users/[...action].ts b/pages/api/search/users/[...action].ts index 8a1c110e87..accda188e8 100644 --- a/pages/api/search/users/[...action].ts +++ b/pages/api/search/users/[...action].ts @@ -1,4 +1,4 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op} from "sequelize"; @@ -51,4 +51,4 @@ async function SearchUsers(req: NextApiRequest, res.end(); } -export default withCors(SearchUsers) \ No newline at end of file +export default RouteMiddleware(SearchUsers) \ No newline at end of file diff --git a/pages/api/search/users/total.ts b/pages/api/search/users/total.ts index 3a43fe91ca..359a7e533b 100644 --- a/pages/api/search/users/total.ts +++ b/pages/api/search/users/total.ts @@ -1,4 +1,4 @@ -import {withCors} from 'middleware'; +import {RouteMiddleware} from 'middleware'; import {NextApiRequest, NextApiResponse} from "next"; import models from "db/models"; @@ -23,4 +23,4 @@ async function getAll(req: NextApiRequest, res.end(); } -export default withCors(getAll) \ No newline at end of file +export default RouteMiddleware(getAll) \ No newline at end of file diff --git a/pages/api/seo/[...ids].ts b/pages/api/seo/[...ids].ts index bd7d7b34db..dd8fc7afc6 100644 --- a/pages/api/seo/[...ids].ts +++ b/pages/api/seo/[...ids].ts @@ -1,5 +1,5 @@ import axios from "axios"; -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; import {Op} from "sequelize"; @@ -59,4 +59,4 @@ async function Seo(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(Seo) \ No newline at end of file +export default RouteMiddleware(Seo) \ No newline at end of file diff --git a/pages/api/settings/index.ts b/pages/api/settings/index.ts index cd433b250e..e13725e1c8 100644 --- a/pages/api/settings/index.ts +++ b/pages/api/settings/index.ts @@ -4,6 +4,9 @@ import models from "db/models"; import {Settings} from "helpers/settings"; +import {RouteMiddleware} from "../../../middleware"; +import {Logger} from "../../../services/logging"; + async function get(_req: NextApiRequest, res: NextApiResponse) { const settings = await models.settings.findAll({ where: { visibility: "public" }, @@ -15,7 +18,9 @@ async function get(_req: NextApiRequest, res: NextApiResponse) { return res.status(200).json(settingsList.raw()); } -export default async function handler(req: NextApiRequest, res: NextApiResponse) { +Logger.changeActionName(`Settings`); + +export default RouteMiddleware(async function handler(req: NextApiRequest, res: NextApiResponse) { switch (req.method) { case "GET": await get(req, res); @@ -26,4 +31,4 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } res.end(); -} \ No newline at end of file +}) \ No newline at end of file diff --git a/pages/api/setup/registry.ts b/pages/api/setup/registry.ts index 7472d3dd32..0482ff6963 100644 --- a/pages/api/setup/registry.ts +++ b/pages/api/setup/registry.ts @@ -1,14 +1,15 @@ -import { withCors } from "middleware"; -import { NextApiRequest, NextApiResponse } from "next"; +import {NextApiRequest, NextApiResponse} from "next"; import Database from "db/models"; -import { Settings } from "helpers/settings"; +import {Settings} from "helpers/settings"; import DAO from "services/dao-service"; -import {error as LogError, log as Log} from 'services/logging'; +import {error as LogError, log as Log, Logger} from 'services/logging'; -import { SettingsType } from "types/settings"; +import {SettingsType} from "types/settings"; + +import {LogAccess} from "../../../middleware/log-access"; async function post(req: NextApiRequest, res: NextApiResponse) { const { @@ -86,4 +87,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(handler) \ No newline at end of file +Logger.changeActionName(`Setup`); + +export default LogAccess(handler) \ No newline at end of file diff --git a/pages/api/tokens/index.ts b/pages/api/tokens/index.ts index 367da5afcf..d4d0a477f7 100644 --- a/pages/api/tokens/index.ts +++ b/pages/api/tokens/index.ts @@ -1,10 +1,10 @@ -import {withCors} from "middleware"; +import {RouteMiddleware} from "middleware"; import {NextApiRequest, NextApiResponse} from "next"; -import { Op, Sequelize } from "sequelize"; +import {Op, Sequelize} from "sequelize"; import Database from "db/models"; -import { error as logError } from 'services/logging'; +import {error as logError, Logger} from 'services/logging'; const colToLower = (colName: string) => Sequelize.fn("LOWER", Sequelize.col(colName)); @@ -55,4 +55,5 @@ async function tokensEndPoint(req: NextApiRequest, res: NextApiResponse) { res.end(); } -export default withCors(tokensEndPoint); +Logger.changeActionName(`Tokens`); +export default RouteMiddleware(tokensEndPoint); diff --git a/pages/api/user/connect/index.ts b/pages/api/user/connect/index.ts index 44c4535fc6..aa0795e56c 100644 --- a/pages/api/user/connect/index.ts +++ b/pages/api/user/connect/index.ts @@ -6,6 +6,8 @@ import models from "db/models"; import {error as LogError} from "services/logging"; +import {RouteMiddleware} from "../../../../middleware"; + enum Actions { REGISTER = "register", RESET = "reset" @@ -56,7 +58,7 @@ async function patch(req: NextApiRequest, res: NextApiResponse) { } } -export default async function ConnectUser(req: NextApiRequest, res: NextApiResponse) { +export default RouteMiddleware(async function ConnectUser(req: NextApiRequest, res: NextApiResponse) { switch (req.method.toLowerCase()) { case "patch": await patch(req, res); @@ -67,4 +69,4 @@ export default async function ConnectUser(req: NextApiRequest, res: NextApiRespo } res.end(); -} +}) diff --git a/pages/api/user/reset/index.ts b/pages/api/user/reset/index.ts index 16954578c8..35a512ed5b 100644 --- a/pages/api/user/reset/index.ts +++ b/pages/api/user/reset/index.ts @@ -6,6 +6,9 @@ import models from "db/models"; import {error as LogError} from "services/logging"; +import {UNAUTHORIZED} from "../../../../helpers/error-messages"; +import {RouteMiddleware} from "../../../../middleware"; + async function post(req: NextApiRequest, res: NextApiResponse) { const {address, githubLogin} = req.body; @@ -23,7 +26,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const token = await getToken({req}); if ( headerWallet !== user.address || !token || token?.login !== githubLogin ) - return res.status(401).json("Unauthorized"); + return res.status(401).json({message: UNAUTHORIZED}); const issuesWithPullRequestsByAccount = await models.issue.findAndCountAll({ where: { @@ -58,7 +61,7 @@ async function post(req: NextApiRequest, res: NextApiResponse) { } } -export default async function ResetUser(req: NextApiRequest, res: NextApiResponse) { +export default RouteMiddleware(async function ResetUser(req: NextApiRequest, res: NextApiResponse) { switch (req.method.toLowerCase()) { case "post": await post(req, res); @@ -69,4 +72,4 @@ export default async function ResetUser(req: NextApiRequest, res: NextApiRespons } res.end(); -} +}) diff --git a/pages/bounty-hall.tsx b/pages/explore.tsx similarity index 98% rename from pages/bounty-hall.tsx rename to pages/explore.tsx index 84dc6122f7..ca17237167 100644 --- a/pages/bounty-hall.tsx +++ b/pages/explore.tsx @@ -14,7 +14,7 @@ import { BountyEffectsProvider } from "contexts/bounty-effects"; import useApi from "x-hooks/use-api"; -export default function BountyHallPage() { +export default function ExplorePage() { const { t } = useTranslation(["common", "custom-network", "bounty"]); const [numberOfNetworks, setNumberOfNetworks] = useState(0); const [numberOfBounties, setNumberOfBounties] = useState(0); diff --git a/pages/index.tsx b/pages/index.tsx index a6f6008406..9586ecaaf2 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -10,7 +10,7 @@ export default function Index() { const { replace } = useRouter(); useEffect(() => { - replace(`/bounty-hall`); + replace(`/explore`); }, []); return( diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 129c0b1d0a..4743bec70d 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -62,6 +62,7 @@ "leaderboard": "Leaderboard", "Oracle": "bv{{token}}", "new-bounty": "New bounty", + "explorer": "Explore", "get-started": "Get Started", "connect": "Connect Wallet", "new-network": "New Network", diff --git a/services/coingecko.ts b/services/coingecko.ts index 8f568b4fdd..553c99f51b 100644 --- a/services/coingecko.ts +++ b/services/coingecko.ts @@ -100,12 +100,12 @@ async function getCoinPrice(search: string, fiat = settings?.currency.defaultFia if (!coinEntry) return 0; - const price = await COINGECKO_API.get(`/simple/price?ids=digitalprice&vs_currencies=${fiat || 'eur'}`); + const price = await COINGECKO_API.get(`/simple/price?ids=${coinEntry.id}&vs_currencies=${fiat || 'eur'}`); - if (!price?.data?.digitalprice) + if (!price?.data?.[coinEntry.id]) return 0; - return price?.data?.digitalprice[fiat || 'eur']; + return price?.data?.[coinEntry.id]?.[fiat || 'eur']; } export { diff --git a/services/logging.ts b/services/logging.ts index f8389ea7a5..fcbebb5448 100644 --- a/services/logging.ts +++ b/services/logging.ts @@ -1,41 +1,77 @@ import {Client} from "@elastic/elasticsearch"; +import {format} from "date-fns"; import getConfig from "next/config"; + const { serverRuntimeConfig } = getConfig(); -const Levels = {none: '', log: 'log', info: 'info', error: 'error', DEBUG: 'debug'}; -let DebugLevel; +enum LogLevel { + none, error, warn, info, trace, log, debug +} -(function (DebugLevel) { - DebugLevel[DebugLevel["none"] = 0] = "none"; - DebugLevel[DebugLevel["error"] = 1] = "error"; - DebugLevel[DebugLevel["warn"] = 2] = "warn"; - DebugLevel[DebugLevel["info"] = 3] = "info"; - DebugLevel[DebugLevel["log"] = 4] = "log"; -})(DebugLevel || (DebugLevel = {})) +const consoleMethods = { + none: '', + log: 'log', + info: 'info', + error: 'error', + DEBUG: 'debug', + warn: 'warn', + debug: 'debug', + trace: 'info' +}; -export const LOG_LEVEL = serverRuntimeConfig.logLevel ? parseInt(serverRuntimeConfig.logLevel, 10) : DebugLevel.log; +const LOG_LEVEL = serverRuntimeConfig.logLevel ? parseInt(serverRuntimeConfig.logLevel, 10) : LogLevel.debug; +const INDEX_STACK_TRACE = serverRuntimeConfig.logStackTrace; const {url: node, username, password} = serverRuntimeConfig.elasticSearch; -export const output = (level, message, ...rest) => { // eslint-disable-line - let _rest; +export const output = (_level: LogLevel, message, ...rest) => { // eslint-disable-line + const level = LogLevel[_level]; + const method = consoleMethods[level]; - if (rest.some(v => v !== undefined)) - _rest = rest; + if (!(LOG_LEVEL && LOG_LEVEL >= _level)) + return; - const string = `(${level.toUpperCase()}) (${new Date().toISOString()}) ${message}\n`; + const string = `(${level.toUpperCase()}) (${format(new Date(), `dd/MM HH:mm:ss`)}) ${message}`; - if (LOG_LEVEL && LOG_LEVEL >= +DebugLevel[level]) - console[level](string, _rest ? _rest : ""); // eslint-disable-line + console[method](string, ...rest); // eslint-disable-line if (node && username && password) { + if (!INDEX_STACK_TRACE && _level === LogLevel.trace) + return; // optionally disable indexing stack traces + const client = new Client({node, auth: {username, password} }) - client?.index({ index: "web-network-app", document: {level, timestamp: new Date(), message, rest: _rest}}) + client?.index({ index: "web-network-app", document: {level, timestamp: new Date(), message, rest}}) .catch(e => console.log(e)) } } /* eslint-disable */ -export const info = (message, rest?) => output(Levels.info, message, rest); -export const error = (message, rest?) => output(Levels.error, message, rest); -export const log = (message, rest?) => output(Levels.log, message, rest); \ No newline at end of file +export const info = (message, ...rest) => output(LogLevel.info, message, ...rest); +export const error = (message, ...rest) => output(LogLevel.error, message, ...rest); +export const log = (message, ...rest) => output(LogLevel.log, message, ...rest); +export const warn = (message, ...rest) => output(LogLevel.warn, message, ...rest); +export const debug = (message, ...rest) => output(LogLevel.debug, message, ...rest); +export const trace = (message, ...rest) => output(LogLevel.trace, message, ...rest); + + +export class Logger { + static action: string = ``; + static changeActionName(action: string) { this.action = action; } + + static _args(...v): [string?, ...any[]] { + return [ + ... Logger.action ? [Logger.action] : [], + ...v + ] + } + + static info(..._args) { info(...this._args(..._args)) } + static log(..._args) { log(...this._args(..._args)) } + static warn(..._args) { warn(...this._args(..._args)) } + static debug(..._args) { debug(...this._args(..._args)) } + static trace(..._args) { trace(...this._args(..._args)) } + static error(e: Error, ..._args) { + error(...this._args(...[e?.toString(), ..._args])) + trace(...this._args(...[`Code: ${(e as any).code || `NO_OPCODE`}\n`, e.stack || `NO_STACK_TRACE`, ..._args])); + } +} \ No newline at end of file diff --git a/x-hooks/use-analytic-events.ts b/x-hooks/use-analytic-events.ts index 743898a512..1213e5f742 100644 --- a/x-hooks/use-analytic-events.ts +++ b/x-hooks/use-analytic-events.ts @@ -1,8 +1,10 @@ -import {Analytic, EventName} from "../interfaces/analytics"; +import getConfig from "next/config"; import {event} from "nextjs-google-analytics"; -import {analyticEvents} from "../helpers/analytic-events"; + import {useAppState} from "../contexts/app-state"; -import getConfig from "next/config"; +import {analyticEvents} from "../helpers/analytic-events"; +import {Analytic, EventName} from "../interfaces/analytics"; + export default function useAnalyticEvents() { @@ -26,12 +28,12 @@ export default function useAnalyticEvents() { switch (type) { - case "ga4": - if (!publicRuntimeConfig.gaMeasureID) - return rejectMissingParams(`publicRuntimeConfig.gaMeasureID`); - return event; - default: - return reject(`Missing implementation for ${type}`); + case "ga4": + if (!publicRuntimeConfig.gaMeasureID) + return rejectMissingParams(`publicRuntimeConfig.gaMeasureID`); + return event; + default: + return reject(`Missing implementation for ${type}`); } } @@ -51,14 +53,12 @@ export default function useAnalyticEvents() { } if (eventName in analyticEvents) - return Promise.all( - analyticEvents[eventName] + return Promise.all(analyticEvents[eventName] .map(getCallback) .map(call => { // console.debug(`Pushing ${eventName}`) return call(eventName, details); - }) - ) + })) .then(() => { // console.debug(`Event published ${eventName}`, details); return true; diff --git a/x-hooks/use-authentication.tsx b/x-hooks/use-authentication.tsx index 0a2d693611..3d47358878 100644 --- a/x-hooks/use-authentication.tsx +++ b/x-hooks/use-authentication.tsx @@ -26,8 +26,9 @@ import useApi from "x-hooks/use-api"; import {useDao} from "x-hooks/use-dao"; import {useNetwork} from "x-hooks/use-network"; import {useTransactions} from "x-hooks/use-transactions"; -import useAnalyticEvents from "./use-analytic-events"; + import {EventName} from "../interfaces/analytics"; +import useAnalyticEvents from "./use-analytic-events"; export const SESSION_EXPIRATION_KEY = "next-auth.expiration";