From 525cab2573faaff48825e90c7142b841e7d65607 Mon Sep 17 00:00:00 2001 From: keyan Date: Sun, 6 Nov 2022 11:28:58 -0600 Subject: [PATCH 01/42] upgrade deps --- api/ssrApollo.js | 8 +- components/lightning-auth.js | 4 +- components/lnqr.js | 17 +- next.config.js | 2 +- package-lock.json | 6186 ++++++++++++++---------------- package.json | 80 +- pages/_app.js | 2 +- pages/api/capture/[[...path]].js | 14 +- pages/api/graphql.js | 9 +- pages/wallet.js | 33 +- spawn/capture.js | 6 +- spawn/package.json | 3 + 12 files changed, 3009 insertions(+), 3355 deletions(-) create mode 100644 spawn/package.json diff --git a/api/ssrApollo.js b/api/ssrApollo.js index 3c3097c6..c13792d5 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -1,6 +1,6 @@ import { ApolloClient, InMemoryCache } from '@apollo/client' import { SchemaLink } from '@apollo/client/link/schema' -import { mergeSchemas } from 'graphql-tools' +import { makeExecutableSchema } from 'graphql-tools' import { getSession } from 'next-auth/client' import resolvers from './resolvers' import typeDefs from './typeDefs' @@ -16,9 +16,9 @@ export default async function getSSRApolloClient (req, me = null) { return new ApolloClient({ ssrMode: true, link: new SchemaLink({ - schema: mergeSchemas({ - schemas: typeDefs, - resolvers: resolvers + schema: makeExecutableSchema({ + typeDefs, + resolvers }), context: { models, diff --git a/components/lightning-auth.js b/components/lightning-auth.js index 734e6ce6..4ffbaaa6 100644 --- a/components/lightning-auth.js +++ b/components/lightning-auth.js @@ -38,7 +38,9 @@ export function LightningAuth ({ callbackUrl }) { } }`) - useEffect(createAuth, []) + useEffect(() => { + createAuth() + }, []) if (error) return
error
diff --git a/components/lnqr.js b/components/lnqr.js index 6be957d3..e8286390 100644 --- a/components/lnqr.js +++ b/components/lnqr.js @@ -7,15 +7,18 @@ import { useEffect } from 'react' export default function LnQR ({ value, webLn, statusVariant, status }) { const qrValue = 'lightning:' + value.toUpperCase() - useEffect(async () => { - if (webLn) { - try { - const provider = await requestProvider() - await provider.sendPayment(value) - } catch (e) { - console.log(e.message) + useEffect(() => { + async function effect () { + if (webLn) { + try { + const provider = await requestProvider() + await provider.sendPayment(value) + } catch (e) { + console.log(e.message) + } } } + effect() }, []) return ( diff --git a/next.config.js b/next.config.js index 5940ec84..ebfa15ff 100644 --- a/next.config.js +++ b/next.config.js @@ -26,7 +26,7 @@ module.exports = withPlausibleProxy()({ return Object.keys(RuntimeSources['stacker.news'])[0] }, // Use the CDN in production and localhost for development. - assetPrefix: isProd ? 'https://a.stacker.news' : '', + assetPrefix: isProd ? 'https://a.stacker.news' : undefined, async headers () { return [ { diff --git a/package-lock.json b/package-lock.json index 483167d5..690f3f21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,29 +4,40 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@apollo/client": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.4.15.tgz", - "integrity": "sha512-CnlT9i7TgHagkKQNvti81A9KcbIMqgpUPGJJL6bg5spTsB2R/5J6E7qiPcMvXuuXwR2xe4FmE4Ey4HizStb8Hg==", + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, "requires": { - "@graphql-typed-document-node/core": "^3.0.0", - "@wry/context": "^0.6.0", + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@apollo/client": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.1.tgz", + "integrity": "sha512-xu5M/l7p9gT9Fx7nF3AQivp0XukjB7TM7tOd5wifIpI8RskYveL4I+rpTijzWrnqCPZabkbzJKH7WEAKdctt9w==", + "requires": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/context": "^0.7.0", "@wry/equality": "^0.5.0", "@wry/trie": "^0.3.0", - "graphql-tag": "^2.12.3", + "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.16.1", "prop-types": "^15.7.2", + "response-iterator": "^0.2.6", "symbol-observable": "^4.0.0", - "ts-invariant": "^0.9.0", + "ts-invariant": "^0.10.3", "tslib": "^2.3.0", - "zen-observable-ts": "~1.1.0" + "zen-observable-ts": "^1.2.5" } }, "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.6.tgz", + "integrity": "sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -50,31 +61,79 @@ } } }, - "@apollographql/apollo-tools": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz", - "integrity": "sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA==" + "@apollo/utils.dropunuseddefinitions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz", + "integrity": "sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg==" }, - "@apollographql/graphql-playground-html": { - "version": "1.6.27", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz", - "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==", + "@apollo/utils.keyvaluecache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz", + "integrity": "sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA==", "requires": { - "xss": "^1.0.8" + "@apollo/utils.logger": "^1.0.0", + "lru-cache": "^7.10.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==" + } } }, - "@apollographql/graphql-upload-8-fork": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz", - "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==", + "@apollo/utils.logger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-1.0.1.tgz", + "integrity": "sha512-XdlzoY7fYNK4OIcvMD2G94RoFZbzTQaNP0jozmqqMudmaGo2I/2Jx71xlDJ801mWA/mbYRihyaw6KJii7k5RVA==" + }, + "@apollo/utils.printwithreducedwhitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz", + "integrity": "sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q==" + }, + "@apollo/utils.removealiases": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz", + "integrity": "sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A==" + }, + "@apollo/utils.sortast": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz", + "integrity": "sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA==", "requires": { - "@types/express": "*", - "@types/fs-capacitor": "*", - "@types/koa": "*", - "busboy": "^0.3.1", - "fs-capacitor": "^2.0.4", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" + "lodash.sortby": "^4.7.0" + } + }, + "@apollo/utils.stripsensitiveliterals": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz", + "integrity": "sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w==" + }, + "@apollo/utils.usagereporting": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.0.tgz", + "integrity": "sha512-5PL7hJMkTPmdo3oxPtigRrIyPxDk/ddrUryHPDaezL1lSFExpNzsDd2f1j0XJoHOg350GRd3LyD64caLA2PU1w==", + "requires": { + "@apollo/utils.dropunuseddefinitions": "^1.1.0", + "@apollo/utils.printwithreducedwhitespace": "^1.1.0", + "@apollo/utils.removealiases": "1.0.0", + "@apollo/utils.sortast": "^1.1.0", + "@apollo/utils.stripsensitiveliterals": "^1.2.0", + "apollo-reporting-protobuf": "^3.3.1" + } + }, + "@apollographql/apollo-tools": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz", + "integrity": "sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw==" + }, + "@apollographql/graphql-playground-html": { + "version": "1.6.29", + "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz", + "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==", + "requires": { + "xss": "^1.0.8" } }, "@babel/code-frame": { @@ -90,6 +149,202 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" }, + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/generator": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.2.tgz", + "integrity": "sha512-SD75PMIK6i9H8G/tfGvB4KKl4Nw6Ssos9nGgYwxbgyTP0iX/Z55DveoH86rmUB/YHTQQ+ZC0F7xxaY8l2OF44Q==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz", + "integrity": "sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==", + "dev": true + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + } + } + }, + "@babel/eslint-parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz", + "integrity": "sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==", + "dev": true, + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, "@babel/generator": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", @@ -109,35 +364,6 @@ "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.20.2", "semver": "^6.3.0" - }, - "dependencies": { - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001341", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", - "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==" - }, - "electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" - }, - "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" - } } }, "@babel/helper-define-polyfill-provider": { @@ -155,6 +381,12 @@ "semver": "^6.1.2" } }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, "@babel/helper-function-name": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", @@ -205,11 +437,188 @@ } } }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/generator": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.2.tgz", + "integrity": "sha512-SD75PMIK6i9H8G/tfGvB4KKl4Nw6Ssos9nGgYwxbgyTP0iX/Z55DveoH86rmUB/YHTQQ+ZC0F7xxaY8l2OF44Q==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz", + "integrity": "sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==", + "dev": true + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, "@babel/helper-plugin-utils": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-split-export-declaration": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", @@ -218,6 +627,12 @@ "@babel/types": "^7.15.4" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", @@ -228,6 +643,141 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/generator": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.2.tgz", + "integrity": "sha512-SD75PMIK6i9H8G/tfGvB4KKl4Nw6Ssos9nGgYwxbgyTP0iX/Z55DveoH86rmUB/YHTQQ+ZC0F7xxaY8l2OF44Q==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz", + "integrity": "sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==", + "dev": true + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.1", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, "@babel/highlight": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", @@ -243,14 +793,6 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==" }, - "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, "@babel/plugin-transform-runtime": { "version": "7.17.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.10.tgz", @@ -314,6 +856,55 @@ "to-fast-properties": "^2.0.0" } }, + "@cliqz/adblocker": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.25.1.tgz", + "integrity": "sha512-1C1/ELI94/XewdUj/o1+Q4ziOigMvTZQA05UERfDoKqpJ+0cbrEF/UImrzpX7n+kYsR7xTJvmf+iNM3zS0tfsg==", + "requires": { + "@cliqz/adblocker-content": "^1.25.1", + "@cliqz/adblocker-extended-selectors": "^1.25.1", + "@remusao/guess-url-type": "^1.1.2", + "@remusao/small": "^1.1.2", + "@remusao/smaz": "^1.7.1", + "@types/chrome": "^0.0.197", + "@types/firefox-webext-browser": "^94.0.0", + "tldts-experimental": "^5.6.21" + }, + "dependencies": { + "@types/chrome": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.197.tgz", + "integrity": "sha512-m1NfS5bOjaypyqQfaX6CxmJodZVcvj5+Mt/K94EBHkflYjPNmXHAzbxfifdLMa0YM3PDyOxohoTS5ug/e6p5jA==", + "requires": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + } + } + }, + "@cliqz/adblocker-content": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.25.1.tgz", + "integrity": "sha512-7gl2VdNPBfj7aPoq34B5miwGcnda/7LCr+BqnpcSOjdLV6jjT2FrNSAKGFvcH23q0HM1IFhYDV6ydTgsdWFCnA==", + "requires": { + "@cliqz/adblocker-extended-selectors": "^1.25.1" + } + }, + "@cliqz/adblocker-extended-selectors": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.25.1.tgz", + "integrity": "sha512-4MdMe/YfIok5d8WYVcLR3Ak7vGrmeUV47frgmXEe945luY93vwlzk1NiLYW1JM5Gdm+VePweoS9cJ1/QUTmv+Q==" + }, + "@cliqz/adblocker-puppeteer": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@cliqz/adblocker-puppeteer/-/adblocker-puppeteer-1.25.1.tgz", + "integrity": "sha512-YvikyoMLgifMiCckazxvGvzd7T90px3eVLG40oyahmPEfwRTLj8NSnCYG/Nld1sZPLPNiy/dmA44QK2e9kuJqw==", + "requires": { + "@cliqz/adblocker": "^1.25.1", + "@cliqz/adblocker-content": "^1.25.1", + "tldts-experimental": "^5.6.21" + } + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -331,15 +922,40 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -348,15 +964,86 @@ } } }, + "@graphql-tools/merge": { + "version": "8.3.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.10.tgz", + "integrity": "sha512-/hSg69JwqEA+t01wQmMGKPuaJ9VJBSz6uAXhbNNrTBJu8bmXljw305NVXM49pCwDKFVUGtbTqYrBeLcfT3RoYw==", + "requires": { + "@graphql-tools/utils": "9.0.1", + "tslib": "^2.4.0" + } + }, + "@graphql-tools/mock": { + "version": "8.7.10", + "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.7.10.tgz", + "integrity": "sha512-PuRGfk6TQger7EfE08yO3+QCAcZ6nYo3kyoEmTPc27w4yiqKCwZIyD8vegzl/EQphEourjaOhO149te6qNEUeQ==", + "requires": { + "@graphql-tools/schema": "9.0.8", + "@graphql-tools/utils": "9.0.1", + "fast-json-stable-stringify": "^2.1.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "@graphql-tools/schema": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.8.tgz", + "integrity": "sha512-PnES7sNkhQ/FdPQhP7cup0OIzwzQh+nfjklilU7YJzE209ACIyEQtxoNCfvPW5eV6hc9bWsBQeI3Jm4mMtwxNA==", + "requires": { + "@graphql-tools/merge": "8.3.10", + "@graphql-tools/utils": "9.0.1", + "tslib": "^2.4.0", + "value-or-promise": "1.0.11" + } + } + } + }, + "@graphql-tools/schema": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.5.1.tgz", + "integrity": "sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg==", + "requires": { + "@graphql-tools/merge": "8.3.1", + "@graphql-tools/utils": "8.9.0", + "tslib": "^2.4.0", + "value-or-promise": "1.0.11" + }, + "dependencies": { + "@graphql-tools/merge": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.3.1.tgz", + "integrity": "sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg==", + "requires": { + "@graphql-tools/utils": "8.9.0", + "tslib": "^2.4.0" + } + }, + "@graphql-tools/utils": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.9.0.tgz", + "integrity": "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg==", + "requires": { + "tslib": "^2.4.0" + } + } + } + }, + "@graphql-tools/utils": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.0.1.tgz", + "integrity": "sha512-z6FimVa5E44bHKmqK0/uMp9hHvHo2Tkt9A5rlLb40ReD/8IFKehSXLzM4b2N1vcP7mSsbXIdDK9Aoc8jT/he1Q==", + "requires": { + "tslib": "^2.4.0" + } + }, "@graphql-typed-document-node/core": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.0.tgz", - "integrity": "sha512-wYn6r8zVZyQJ6rQaALBEln5B1pzxb9shV5Ef97kTvn6yVGrqyXVnDqnU24MXnFubR+rZjBY9NWuxX3FB2sTsjg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==" }, "@grpc/grpc-js": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.1.tgz", - "integrity": "sha512-GVtMU4oh/TeKkWGzXUEsyZtyvSUIT1z49RtGH1UnEGeL+sLuxKl8QH3KZTlSB329R1sWJmesm5hQ5CxXdYH9dg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", + "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", "requires": { "@grpc/proto-loader": "^0.7.0", "@types/node": ">=12.12.47" @@ -392,9 +1079,9 @@ } }, "@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "@humanwhocodes/config-array": { "version": "0.5.0", @@ -408,9 +1095,9 @@ } }, "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@josephg/resolvable": { @@ -418,16 +1105,49 @@ "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" }, - "@mdn/browser-compat-data": { - "version": "3.3.14", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz", - "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, - "@napi-rs/triples": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", - "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==" + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mdn/browser-compat-data": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", + "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==", + "dev": true }, "@next-auth/prisma-legacy-adapter": { "version": "0.1.2", @@ -448,171 +1168,119 @@ } }, "@next/env": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.2.tgz", - "integrity": "sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA==" + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.2.tgz", + "integrity": "sha512-upwtMaHxlv/udAWGq0kE+rg8huwmcxQPsKZFhS1R5iVO323mvxEBe1YrSXe1awLbg9sTIuEHbgxjLLt7JbeuAQ==" }, - "@next/polyfill-module": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.2.tgz", - "integrity": "sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA==" + "@next/swc-android-arm-eabi": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.2.tgz", + "integrity": "sha512-r2rrz+DZ8YYGqzVrbRrpP6GKzwozpOrnFbErc4k36vUTSFMag9yQahZfaBe06JYdqu/e5yhm/saIDEaSVPRP4g==", + "optional": true }, - "@next/react-dev-overlay": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz", - "integrity": "sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A==", - "requires": { - "@babel/code-frame": "7.12.11", - "anser": "1.4.9", - "chalk": "4.0.0", - "classnames": "2.2.6", - "css.escape": "1.5.1", - "data-uri-to-buffer": "3.0.1", - "platform": "1.3.6", - "shell-quote": "1.7.2", - "source-map": "0.8.0-beta.0", - "stacktrace-parser": "0.1.10", - "strip-ansi": "6.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "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" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "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" - } - } - } - }, - "@next/react-refresh-utils": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz", - "integrity": "sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q==" + "@next/swc-android-arm64": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.3.2.tgz", + "integrity": "sha512-B+TINJhCf+CrY1+b3/JWQlkecv53rAGa/gA7gi5B1cnBa/2Uvoe+Ue0JeCefTjfiyl1ScsyNx+NcESY8Ye2Ngg==", + "optional": true }, "@next/swc-darwin-arm64": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.2.tgz", - "integrity": "sha512-hZuwOlGOwBZADA8EyDYyjx3+4JGIGjSHDHWrmpI7g5rFmQNltjlbaefAbiU5Kk7j3BUSDwt30quJRFv3nyJQ0w==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.2.tgz", + "integrity": "sha512-PTUfe1ZrwjsiuTmr3bOM9lsoy5DCmfYsLOUF9ZVhtbi5MNJVmUTy4VZ06GfrvnCO5hGCr48z3vpFE9QZ0qLcPw==", "optional": true }, "@next/swc-darwin-x64": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-11.1.2.tgz", - "integrity": "sha512-PGOp0E1GisU+EJJlsmJVGE+aPYD0Uh7zqgsrpD3F/Y3766Ptfbe1lEPPWnRDl+OzSSrSrX1lkyM/Jlmh5OwNvA==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.2.tgz", + "integrity": "sha512-1HkjmS9awwlaeEY8Y01nRSNkSv3y+qnC/mjMPe/W66hEh3QKa/LQHqHeS7NOdEs19B2mhZ7w+EgMRXdLQ0Su8w==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.2.tgz", + "integrity": "sha512-h5Mx0BKDCJ5Vu/U8e07esF6PjPv1EJgmRbYWTUZMAflu13MQpCJkKEJir7+BeRfTXRfgFf+llc7uocrpd7mcrg==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.2.tgz", + "integrity": "sha512-EuRZAamoxfe/WoWRaC0zsCAoE4gs/mEhilcloNM4J5Mnb3PLY8PZV394W7t5tjBjItMCF7l2Ebwjwtm46tq2RA==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.2.tgz", + "integrity": "sha512-T9GCFyOIb4S3acA9LqflUYD+QZ94iZketHCqKdoO0Nx0OCHIgGJV5rotDe8TDXwh/goYpIfyHU4j1qqw4w4VnA==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.2.tgz", + "integrity": "sha512-hxNVZS6L3c2z3l9EH2GP0MGQ9exu6O8cohYNZyqC9WUl6C03sEn8xzDH1y+NgD3fVurvYkGU5F0PDddJJLfDIw==", "optional": true }, "@next/swc-linux-x64-gnu": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-11.1.2.tgz", - "integrity": "sha512-YcDHTJjn/8RqvyJVB6pvEKXihDcdrOwga3GfMv/QtVeLphTouY4BIcEUfrG5+26Nf37MP1ywN3RRl1TxpurAsQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.2.tgz", + "integrity": "sha512-fCPkLuwDwY8/QeXxciJJjDHG09liZym/Bhb4A+RLFQ877wUkwFsNWDUTSdUx0YXlYK/1gf67BKauqKkOKp6CYw==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.2.tgz", + "integrity": "sha512-o+GifBIQ2K+/MEFxHsxUZoU3bsuVFLXZYWd3idimFHiVdDCVYiKsY6mYMmKDlucX+9xRyOCkKL9Tjf+3tuXJpw==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.2.tgz", + "integrity": "sha512-crii66irzGGMSUR0L8r9+A06eTv7FTXqw4rgzJ33M79EwQJOdpY7RVKXLQMurUhniEeQEEOfamiEdPIi/qxisw==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.2.tgz", + "integrity": "sha512-5hRUSvn3MdQ4nVRu1rmKxq5YJzpTtZfaC/NyGw6wa4NSF1noUn/pdQGUr+I5Qz3CZkd1gZzzC0eaXQHlrk0E2g==", "optional": true }, "@next/swc-win32-x64-msvc": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-11.1.2.tgz", - "integrity": "sha512-e/pIKVdB+tGQYa1cW3sAeHm8gzEri/HYLZHT4WZojrUxgWXqx8pk7S7Xs47uBcFTqBDRvK3EcQpPLf3XdVsDdg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.2.tgz", + "integrity": "sha512-tpQJYUH+TzPMIsdVl9fH8uDg47iwiNjKY+8e9da3dXqlkztKzjSw0OwSADoqh3KrifplXeKSta+BBGLdBqg3sg==", "optional": true }, - "@node-rs/helper": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz", - "integrity": "sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg==", + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, "requires": { - "@napi-rs/triples": "^1.0.3" + "eslint-scope": "5.1.1" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } } }, "@opensearch-project/opensearch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-1.0.2.tgz", - "integrity": "sha512-gQ2CjbS7/pJ4A3IBWd+AD0KbCaAnE1Ur9baRxqM1NMH/7A8GQxwtVxx8raUOf4HZExkZZOUYBMzJgWM1OyELyw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-1.1.0.tgz", + "integrity": "sha512-1TDw92JL8rD1b2QGluqBsIBLIiD5SGciIpz4qkrGAe9tcdfQ1ptub5e677rhWl35UULSjr6hP8M6HmISZ/M5HQ==", "requires": { "debug": "^4.3.1", "hpagent": "^0.1.1", @@ -633,32 +1301,32 @@ "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" }, "@popperjs/core": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz", - "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==" + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@prisma/client": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.25.0.tgz", - "integrity": "sha512-JDrAJ+oemiYAwgpYNJvCVT59S9bMbqkx78q2OT54xmmBoyYWWnn6t6oS6q8gKMiKHS6rzm/jdh3sy+2E0R+NAQ==", + "version": "2.30.3", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.30.3.tgz", + "integrity": "sha512-Ey2miZ+Hne12We3rA8XrlPoAF0iuKEhw5IK2nropaelSt0Ju3b2qSz9Qt50a/1Mx3+7yRSu/iSXt8y9TUMl/Yw==", "requires": { - "@prisma/engines-version": "2.25.0-36.c838e79f39885bc8e1611849b1eb28b5bb5bc922" + "@prisma/engines-version": "2.30.1-2.b8c35d44de987a9691890b3ddf3e2e7effb9bf20" } }, "@prisma/engines": { - "version": "2.25.0-36.c838e79f39885bc8e1611849b1eb28b5bb5bc922", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.25.0-36.c838e79f39885bc8e1611849b1eb28b5bb5bc922.tgz", - "integrity": "sha512-vjLCk8AFRZu3D8h/SMcWDzTo0xkMuUDyXQzXekn8gzAGjb47B6LQXGR6rDoZ3/uPM13JNTLPvF62mtVaY6fVeQ==" + "version": "2.30.1-2.b8c35d44de987a9691890b3ddf3e2e7effb9bf20", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.30.1-2.b8c35d44de987a9691890b3ddf3e2e7effb9bf20.tgz", + "integrity": "sha512-WPnA/IUrxDihrRhdP6+8KAVSwsc0zsh8ioPYsLJjOhzVhwpRbuFH2tJDRIAbc+qFh+BbTIZbeyBYt8fpNXaYQQ==" }, "@prisma/engines-version": { - "version": "2.25.0-36.c838e79f39885bc8e1611849b1eb28b5bb5bc922", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.25.0-36.c838e79f39885bc8e1611849b1eb28b5bb5bc922.tgz", - "integrity": "sha512-uZaonv3ZzLYAi99AooOe2BOBmb3k+ibVsJyZ5J3F6U1uFHTtTI9AVzC51mE09iNcgq3ZBt2CZNi5CDQZedMWyA==" + "version": "2.30.1-2.b8c35d44de987a9691890b3ddf3e2e7effb9bf20", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.30.1-2.b8c35d44de987a9691890b3ddf3e2e7effb9bf20.tgz", + "integrity": "sha512-/iDRgaoSQC77WN2oDsOM8dn61fykm6tnZUAClY+6p+XJbOEgZ9gy4CKuKTBgrjSGDVjtQ/S2KGcYd3Ring8xaw==" }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "@protobufjs/base64": { "version": "1.1.2", @@ -673,12 +1341,12 @@ "@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "requires": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -687,27 +1355,64 @@ "@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@remusao/guess-url-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz", + "integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA==" + }, + "@remusao/small": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz", + "integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw==" + }, + "@remusao/smaz": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz", + "integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==", + "requires": { + "@remusao/smaz-compress": "^1.9.1", + "@remusao/smaz-decompress": "^1.9.1" + } + }, + "@remusao/smaz-compress": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz", + "integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==", + "requires": { + "@remusao/trie": "^1.4.1" + } + }, + "@remusao/smaz-decompress": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz", + "integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A==" + }, + "@remusao/trie": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz", + "integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==" }, "@restart/context": { "version": "2.1.4", @@ -715,31 +1420,31 @@ "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" }, "@restart/hooks": { - "version": "0.3.27", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", - "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.7.tgz", + "integrity": "sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==", "requires": { "dequal": "^2.0.2" } }, "@sqltools/formatter": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", - "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "@swc/helpers": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", + "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", + "requires": { + "tslib": "^2.4.0" + } }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "requires": { - "@types/node": "*" - } - }, "@types/bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", @@ -749,9 +1454,9 @@ } }, "@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "requires": { "@types/connect": "*", "@types/node": "*" @@ -778,22 +1483,45 @@ "@types/node": "*" } }, - "@types/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==" + "@types/d3-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.3.tgz", + "integrity": "sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==" }, - "@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", + "@types/d3-interpolate": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz", + "integrity": "sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw==", "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" + "@types/d3-color": "^2" } }, + "@types/d3-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.2.tgz", + "integrity": "sha512-3YHpvDw9LzONaJzejXLOwZ3LqwwkoXb9LI2YN7Hbd6pkGo5nIlJ09ul4bQhBN4hQZJKmUpX8HkVqbzgUKY48cg==" + }, + "@types/d3-scale": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", + "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", + "requires": { + "@types/d3-time": "^2" + } + }, + "@types/d3-shape": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.3.tgz", + "integrity": "sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==", + "requires": { + "@types/d3-path": "^2" + } + }, + "@types/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" + }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", @@ -803,9 +1531,9 @@ } }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -814,9 +1542,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -836,13 +1564,15 @@ "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==" }, - "@types/fs-capacitor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", - "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", - "requires": { - "@types/node": "*" - } + "@types/firefox-webext-browser": { + "version": "94.0.1", + "resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-94.0.1.tgz", + "integrity": "sha512-I6iHRQJSTZ+gYt2IxdH2RRAMvcUyK8v5Ig7fHQR0IwUNYP7hz9+cziBVIKxLCO6XI7fiyRsNOWObfl3/4Js2Lg==" + }, + "@types/har-format": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.9.tgz", + "integrity": "sha512-rffW6MhQ9yoa75bdNi+rjZBAvu2HhehWJXlhuWXnWdENeuKe82wUgAwxYOb7KRKKmxYN+D/iRKd2NDQMLqlUmg==" }, "@types/hast": { "version": "2.3.4", @@ -852,16 +1582,6 @@ "@types/unist": "*" } }, - "@types/http-assert": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", - "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" - }, - "@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" - }, "@types/invariant": { "version": "2.2.35", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.35.tgz", @@ -870,46 +1590,18 @@ "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" - }, - "@types/koa": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", - "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", - "requires": { - "@types/koa": "*" - } - }, "@types/lodash": { - "version": "4.14.175", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", - "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==" + "version": "4.14.188", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz", + "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w==" }, "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "@types/mdast": { "version": "3.0.10", @@ -919,15 +1611,10 @@ "@types/unist": "*" } }, - "@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" - }, "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/ms": { "version": "0.7.31", @@ -939,18 +1626,20 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.1.tgz", "integrity": "sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w==" }, - "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "@types/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==" }, - "@types/puppeteer": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.4.tgz", - "integrity": "sha512-3Nau+qi69CN55VwZb0ATtdUAlYlqOOQ3OfQfq0Hqgc4JMFXiQT/XInlwQ9g6LbicDslE6loIFsXFklGh5XmI6Q==", - "requires": { - "@types/node": "*" - } + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/qs": { "version": "6.9.7", @@ -963,9 +1652,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.24.tgz", - "integrity": "sha512-eIpyco99gTH+FTI3J7Oi/OH8MZoFMJuztNRimDOJwH4iGIsKV2qkGnk4M9VzlaVWeEEWLWSQRy0FEA0Kz218cg==", + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -973,9 +1662,9 @@ } }, "@types/react-transition-group": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.3.tgz", - "integrity": "sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", "requires": { "@types/react": "*" } @@ -991,22 +1680,17 @@ "form-data": "^2.5.0" } }, - "@types/resize-observer-browser": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", - "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==" - }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "requires": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -1023,68 +1707,46 @@ "@types/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, - "@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "requires": { - "@types/node": "*" - } + "integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==" }, "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "optional": true, "requires": { "@types/node": "*" } }, - "@types/zen-observable": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", - "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==" - }, "@use-it/event-listener": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@use-it/event-listener/-/event-listener-0.1.6.tgz", - "integrity": "sha512-e6V7vbU8xpuqy4GZkTLExHffOFgxmGHo3kNWnlhzM/zcX2v+idbD/HaJ9sKdQMgTh+L7MIhdRDXGX3SdAViZzA==" + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@use-it/event-listener/-/event-listener-0.1.7.tgz", + "integrity": "sha512-hgfExDzUU9uTRTPDCpw2s9jWTxcxmpJya3fK5ADpf5VDpSy8WYwY/kh28XE0tUcbsljeP8wfan48QvAQTSSa3Q==" }, "@wry/context": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz", - "integrity": "sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.0.tgz", + "integrity": "sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ==", "requires": { "tslib": "^2.3.0" } }, "@wry/equality": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.2.tgz", - "integrity": "sha512-oVMxbUXL48EV/C0/M7gLVsoK6qRHPS85x8zECofEZOVvxGmIPLA9o5Z27cc2PoAyZz1S2VoM2A7FLAnpfGlneA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.3.tgz", + "integrity": "sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g==", "requires": { "tslib": "^2.3.0" } }, "@wry/trie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.1.tgz", - "integrity": "sha512-WwB53ikYudh9pIorgxrkHKrQZcCqNM/Q/bDzZBffEaGUKGuHrRb3zZUT9Sh2qw9yogC7SsdRmQ1ER0pqvd3bfw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz", + "integrity": "sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ==", "requires": { "tslib": "^2.3.0" } }, - "accept": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/accept/-/accept-3.1.3.tgz", - "integrity": "sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg==", - "requires": { - "boom": "7.x.x", - "hoek": "6.x.x" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1107,9 +1769,12 @@ "dev": true }, "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } }, "aggregate-error": { "version": "3.1.0", @@ -1118,6 +1783,13 @@ "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + } } }, "ajv": { @@ -1132,15 +1804,10 @@ "uri-js": "^4.2.2" } }, - "anser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", - "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" - }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-regex": { @@ -1170,208 +1837,107 @@ "picomatch": "^2.0.4" } }, - "apollo-cache-control": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz", - "integrity": "sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==", - "requires": { - "apollo-server-env": "^3.1.0", - "apollo-server-plugin-base": "^0.13.0" - } - }, "apollo-datasource": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz", - "integrity": "sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.2.tgz", + "integrity": "sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg==", "requires": { - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - }, - "apollo-graphql": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.9.3.tgz", - "integrity": "sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A==", - "requires": { - "core-js-pure": "^3.10.2", - "lodash.sortby": "^4.7.0", - "sha.js": "^2.4.11" - } - }, - "apollo-link": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", - "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", - "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.21" - }, - "dependencies": { - "ts-invariant": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "zen-observable-ts": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", - "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", - "requires": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" - } - } + "@apollo/utils.keyvaluecache": "^1.0.1", + "apollo-server-env": "^4.2.1" } }, "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.3.tgz", + "integrity": "sha512-L3+DdClhLMaRZWVmMbBcwl4Ic77CnEBPXLW53F7hkYhkaZD88ivbCVB1w/x5gunO6ZHrdzhjq0FHmTsBvPo7aQ==", "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-caching": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz", - "integrity": "sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==", - "requires": { - "lru-cache": "^6.0.0" + "@apollo/protobufjs": "1.2.6" } }, "apollo-server-core": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.25.2.tgz", - "integrity": "sha512-lrohEjde2TmmDTO7FlOs8x5QQbAS0Sd3/t0TaK2TWaodfzi92QAvIsq321Mol6p6oEqmjm8POIDHW1EuJd7XMA==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.11.1.tgz", + "integrity": "sha512-t/eCKrRFK1lYZlc5pHD99iG7Np7CEm3SmbDiONA7fckR3EaB/pdsEdIkIwQ5QBBpT5JLp/nwvrZRVwhaWmaRvw==", "requires": { - "@apollographql/apollo-tools": "^0.5.0", - "@apollographql/graphql-playground-html": "1.6.27", - "@apollographql/graphql-upload-8-fork": "^8.1.3", + "@apollo/utils.keyvaluecache": "^1.0.1", + "@apollo/utils.logger": "^1.0.0", + "@apollo/utils.usagereporting": "^1.0.0", + "@apollographql/apollo-tools": "^0.5.3", + "@apollographql/graphql-playground-html": "1.6.29", + "@graphql-tools/mock": "^8.1.2", + "@graphql-tools/schema": "^8.0.0", "@josephg/resolvable": "^1.0.0", - "@types/ws": "^7.0.0", - "apollo-cache-control": "^0.14.0", - "apollo-datasource": "^0.9.0", - "apollo-graphql": "^0.9.0", - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0", - "apollo-server-errors": "^2.5.0", - "apollo-server-plugin-base": "^0.13.0", - "apollo-server-types": "^0.9.0", - "apollo-tracing": "^0.15.0", + "apollo-datasource": "^3.3.2", + "apollo-reporting-protobuf": "^3.3.3", + "apollo-server-env": "^4.2.1", + "apollo-server-errors": "^3.3.1", + "apollo-server-plugin-base": "^3.7.1", + "apollo-server-types": "^3.7.1", "async-retry": "^1.2.1", - "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.15.0", + "fast-json-stable-stringify": "^2.1.0", "graphql-tag": "^2.11.0", - "graphql-tools": "^4.0.8", - "loglevel": "^1.6.7", + "loglevel": "^1.6.8", "lru-cache": "^6.0.0", + "node-abort-controller": "^3.0.1", "sha.js": "^2.4.11", - "subscriptions-transport-ws": "^0.9.19", - "uuid": "^8.0.0" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==", - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-errors": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz", - "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==" - }, - "apollo-server-micro": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/apollo-server-micro/-/apollo-server-micro-2.25.2.tgz", - "integrity": "sha512-TaYHe82Nki4dOxpIEbWi1cNkTvm2JBQX7biluXOTjSyKXrT8/URec4rJrbwOyF56KQ7Td96gkUDJZHBYZ49Vzg==", - "requires": { - "@apollographql/graphql-playground-html": "1.6.27", - "accept": "^3.0.2", - "apollo-server-core": "^2.25.2", - "apollo-server-types": "^0.9.0", - "micro": "^9.3.2" - } - }, - "apollo-server-plugin-base": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz", - "integrity": "sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==", - "requires": { - "apollo-server-types": "^0.9.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==", - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - }, - "apollo-tracing": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.15.0.tgz", - "integrity": "sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==", - "requires": { - "apollo-server-env": "^3.1.0", - "apollo-server-plugin-base": "^0.13.0" - } - }, - "apollo-utilities": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", - "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", - "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" + "uuid": "^9.0.0", + "whatwg-mimetype": "^3.0.0" }, "dependencies": { - "@wry/equality": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", - "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "ts-invariant": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" } } }, + "apollo-server-env": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.1.tgz", + "integrity": "sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g==", + "requires": { + "node-fetch": "^2.6.7" + } + }, + "apollo-server-errors": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz", + "integrity": "sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA==" + }, + "apollo-server-micro": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/apollo-server-micro/-/apollo-server-micro-3.11.1.tgz", + "integrity": "sha512-4bETccnRotMQIg3ah4/NAWPppB05i5ePrTOuLBGBBQaV8bz1E4Md3snxSB8JkANND7sXmH9OCiKKeLFK8q8JaA==", + "requires": { + "@hapi/accept": "^5.0.2", + "apollo-server-core": "^3.11.1", + "apollo-server-types": "^3.7.1", + "type-is": "^1.6.18" + } + }, + "apollo-server-plugin-base": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.1.tgz", + "integrity": "sha512-g3vJStmQtQvjGI289UkLMfThmOEOddpVgHLHT2bNj0sCD/bbisj4xKbBHETqaURokteqSWyyd4RDTUe0wAUDNQ==", + "requires": { + "apollo-server-types": "^3.7.1" + } + }, + "apollo-server-types": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.7.1.tgz", + "integrity": "sha512-aE9RDVplmkaOj/OduNmGa+0a1B5RIWI0o3zC1zLvBTVWMKTpo0ifVf11TyMkLCY+T7cnZqVqwyShziOyC3FyUw==", + "requires": { + "@apollo/utils.keyvaluecache": "^1.0.1", + "@apollo/utils.logger": "^1.0.0", + "apollo-reporting-protobuf": "^3.3.3", + "apollo-server-env": "^4.2.1" + } + }, "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "arg": { "version": "4.1.0", @@ -1379,23 +1945,19 @@ "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==" }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==" }, "array-flatten": { "version": "1.1.1", @@ -1403,73 +1965,45 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" } }, "array-uniq": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.1.0.tgz", - "integrity": "sha512-bdHxtev7FN6+MXI1YFW0Q8mQ8dTJc2S8AMfju+ZR77pbg2yAdVyDlwkaUI7Har0LyOMRFPHrJ9lYdyjZZswdlQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-3.0.0.tgz", + "integrity": "sha512-T/3qyw9JTDHjj+aIo4uQyHCAoG1DkFqFViq0e6uPzkXwT74MEPsmQ30rxx8x9+yjBQ3KJ2bXOb2bBKC1FwEjdw==" }, "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, - "assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "requires": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" } }, "ast-metadata-inferer": { @@ -1479,13 +2013,16 @@ "dev": true, "requires": { "@mdn/browser-compat-data": "^3.3.14" + }, + "dependencies": { + "@mdn/browser-compat-data": { + "version": "3.3.14", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-3.3.14.tgz", + "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", + "dev": true + } } }, - "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -1524,18 +2061,19 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-sdk": { - "version": "2.1056.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1056.0.tgz", - "integrity": "sha512-ocpc4Sy9Lclt+v5bIRuvFq0WwJoLIU26ikdCQn+ke9lIDPC9+hGZbkFK7TiqTu3noEekgIubGHFGEkd/5V0HhQ==", + "version": "2.1248.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1248.0.tgz", + "integrity": "sha512-PxSweXAmKZyhHoPOPphz2XN9/3SDdNs/HBrLn7YF6c+AnZz8VPxCPYRFbFGUTLfQmdz5Cog82tDzwgFd4KGzFQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", - "jmespath": "0.15.0", + "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.3.2", + "util": "^0.12.4", + "uuid": "8.0.0", "xml2js": "0.4.19" }, "dependencies": { @@ -1552,77 +2090,39 @@ "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" }, "url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" } } }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, "babel-plugin-inline-react-svg": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/babel-plugin-inline-react-svg/-/babel-plugin-inline-react-svg-2.0.1.tgz", @@ -1662,11 +2162,6 @@ "@babel/helper-define-polyfill-provider": "^0.3.1" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, "bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -1678,9 +2173,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base-x": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.8.tgz", - "integrity": "sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "requires": { "safe-buffer": "^5.0.1" } @@ -1703,20 +2198,15 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bip174": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.0.1.tgz", - "integrity": "sha512-i3X26uKJOkDTAalYAp0Er+qGMDhrbbh2o93/xiPyAN2s25KrClSpe3VXo/7mNJoqA5qfko8rLS2l3RWZgYmjKQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.0.tgz", + "integrity": "sha512-lkc0XyiX9E9KiVAS1ZiOqK1xfiwvf4FXDDdkDq5crcDzOq+xGytY+14qCsqz7kCiy8rpN1CRNfacRhf9G3JNSA==" }, "bip66": { "version": "1.1.5", @@ -1757,9 +2247,9 @@ } }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "body-parser": { "version": "1.20.1", @@ -1815,6 +2305,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1833,13 +2334,6 @@ "integrity": "sha512-jq1b/ZdMambhh+yi+pm+1PJBAnlYvQYljaBgSajvVAINHrHg32ovCBra8d0ADE3BAoj6G/tK7OSV4t/yT9A+/g==", "requires": { "bn.js": "5.2.1" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - } } }, "bolt09": { @@ -1848,9 +2342,9 @@ "integrity": "sha512-xEt5GE6pXB8wMIWHAoyF28k0Yt2rFqIou1LCyIeNadAOQhu/F7GTjZwreFwLl07YYkhOH23avewRt5PD8JnKKg==" }, "bolt11": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bolt11/-/bolt11-1.3.4.tgz", - "integrity": "sha512-x4lHDv0oid13lGlZU7cl/5gx9nRwjB2vgK/uB3c50802Wh+9WjWQMwzD2PCETHylUijx2iBAqUQYbx3ZgwF06Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bolt11/-/bolt11-1.4.0.tgz", + "integrity": "sha512-TeGIOpFNrvNA1XGvwBr+lYmzKfoJeyMRt7nsGmIci+5gbmSz7s46jwKLNYXH3IoxV7fjmYUEUu2NM19n9w0msg==", "requires": { "@types/bn.js": "^4.11.3", "bech32": "^1.1.2", @@ -1867,27 +2361,6 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, - "bitcoinjs-lib": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-6.0.1.tgz", - "integrity": "sha512-x/7D4jDj/MMkmO6t3p2CSDXTqpwZ/jRsRiJDmaiXabrR9XRo7jwby8HRn7EyK1h24rKFFI7vI0ay4czl6bDOZQ==", - "requires": { - "bech32": "^2.0.0", - "bip174": "^2.0.1", - "bs58check": "^2.1.2", - "create-hash": "^1.1.0", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.1" - }, - "dependencies": { - "bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - } - } - }, "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", @@ -1900,18 +2373,10 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, - "boom": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz", - "integrity": "sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==", - "requires": { - "hoek": "6.x.x" - } - }, "bootstrap": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", - "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==" }, "brace-expansion": { "version": "1.1.11", @@ -1935,97 +2400,21 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", - "dev": true, + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "requires": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", - "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" } }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "requires": { "base-x": "^3.0.2" } @@ -2041,18 +2430,18 @@ } }, "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, "buffer-equal-constant-time": { "version": "1.0.1", @@ -2064,24 +2453,6 @@ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "requires": { - "dicer": "0.3.0" - } - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -2099,42 +2470,54 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" }, "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" } }, "caniuse-lite": { - "version": "1.0.30001261", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", - "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==" + "version": "1.0.30001430", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001430.tgz", + "integrity": "sha512-IB1BXTZKPDVPM7cnV4iaKaHxckvdr/3xtctB3f7Hmenx3qYBhGtTZ//7EllK66aKXW98Lx0+7Yr0kxBtIt3tzg==" }, "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==" }, "capture-website": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/capture-website/-/capture-website-1.4.0.tgz", - "integrity": "sha512-VhU0e0u5NVug53O208ISQPTbr0NW9zPNw3YjGNTHiwY3e/iVRjI6AWdfbRGtHtRkSt4Y8q+6sbB92OsB7uzGmw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/capture-website/-/capture-website-3.2.0.tgz", + "integrity": "sha512-AupgsR6iNi2RA8Prgr1JuuTKYSgfKNU/7cl90Xndh1VhfEwYr4jjduyPJvNyc7nhCOyl9ocCzW6nbB7xLuSmug==", "requires": { - "@types/puppeteer": "^5.4.3", - "file-url": "^3.0.0", - "puppeteer": "^5.3.1", - "tough-cookie": "^4.0.0" + "@cliqz/adblocker-puppeteer": "^1.25.1", + "file-url": "^4.0.0", + "node-fetch": "^3.2.10", + "puppeteer": "^19.2.0", + "tough-cookie": "^4.1.2" + }, + "dependencies": { + "node-fetch": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", + "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + } } }, "cbor": { @@ -2183,7 +2566,7 @@ "cheerio": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", - "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "integrity": "sha512-Fwcm3zkR37STnPC8FepSHeSYJM5Rd596TZOcfDUdojR4Q735aK1Xn+M+ISagNneuCwMjK28w4kX+ETILGNT/UQ==", "requires": { "css-select": "~1.0.0", "dom-serializer": "~0.1.0", @@ -2195,7 +2578,7 @@ "css-select": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", - "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "integrity": "sha512-/xPlD7betkfd7ChGkLGGWx5HWyiHDOSn7aACLzdH0nwucPvB0EAm8hMBm7Xn7vGfAeRRN7KZ8wumGm8NoNcMRw==", "requires": { "boolbase": "~1.0.0", "css-what": "1.0", @@ -2206,7 +2589,7 @@ "css-what": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" + "integrity": "sha512-60SUMPBreXrLXgvpM8kYpO0AOyMRhdRlXFX5BMQbZq1SIJCyNE56nqFQhmvREQdUJpedbGRYZ5wOyq3/F6q5Zw==" }, "dom-serializer": { "version": "0.1.1", @@ -2225,7 +2608,7 @@ "domutils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", - "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "integrity": "sha512-ZkVgS/PpxjyJMb+S2iVHHEZjVnOUtjGp0/zstqKGTE9lrZtNHlNQmLwP/lhLMEApYbzc08BKMx9IFpKhaSbW1w==", "requires": { "domelementtype": "1" } @@ -2238,7 +2621,7 @@ "lodash": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==" }, "nth-check": { "version": "1.0.2", @@ -2280,9 +2663,9 @@ } }, "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "clean-stack": { "version": "2.2.0", @@ -2375,11 +2758,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2389,34 +2767,19 @@ } }, "comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" }, "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "content-disposition": { "version": "0.5.4", @@ -2438,6 +2801,12 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -2449,9 +2818,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "core-js": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.1.tgz", - "integrity": "sha512-vJlUi/7YdlCZeL6fXvWNaLUPh/id12WXj3MbkMw5uOyF0PfWPBNOCNbs53YqgrvtujLNlt9JQpruyIKkUZ+PKA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", "dev": true }, "core-js-compat": { @@ -2463,33 +2832,6 @@ "semver": "7.0.0" }, "dependencies": { - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001341", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", - "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==" - }, - "electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==" - }, - "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==" - }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -2497,11 +2839,6 @@ } } }, - "core-js-pure": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.1.tgz", - "integrity": "sha512-kmW/k8MaSuqpvA1xm2l3TVlBuvW+XBkcaOroFUpO3D4lsTGQWBTb/tBDCf/PNkkPLrwgrkQRIYNPB0CeqGJWGQ==" - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2516,26 +2853,22 @@ "vary": "^1" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", "requires": { "capture-stack-trace": "^1.0.0" } @@ -2552,25 +2885,12 @@ "sha.js": "^2.4.0" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cron-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.2.1.tgz", - "integrity": "sha512-5sJBwDYyCp+0vU5b7POl8zLWfgV5fOHxlc45FWoWdHecGC7MQHCjx0CHivCMRnGFovghKhhyYM+Zm9DcY5qcHg==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.6.0.tgz", + "integrity": "sha512-guZNLMGUgg6z4+eGhmHGw7ft+v6OQeuHzd1gcLxCo9Yg/qoxmG3nindp2/uwGCLizEisf2H0ptqeVXeoCpP6FA==", "requires": { - "luxon": "^1.28.0" + "luxon": "^3.0.1" } }, "cross-fetch": { @@ -2592,24 +2912,6 @@ "which": "^2.0.1" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", @@ -2648,31 +2950,10 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, "cssfilter": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" - }, - "cssnano-preset-simple": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz", - "integrity": "sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w==", - "requires": { - "caniuse-lite": "^1.0.30001202" - } - }, - "cssnano-simple": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-3.0.0.tgz", - "integrity": "sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg==", - "requires": { - "cssnano-preset-simple": "^3.0.0" - } + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" }, "csso": { "version": "4.2.0", @@ -2683,14 +2964,14 @@ } }, "csstype": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", - "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "requires": { "array-find-index": "^1.0.1" } @@ -2763,14 +3044,14 @@ } }, "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" }, "date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, "debug": { "version": "4.3.2", @@ -2783,7 +3064,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" }, "decimal.js-light": { "version": "2.5.1", @@ -2817,11 +3098,13 @@ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delay": { @@ -2837,67 +3120,28 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, "dequal": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "devtools-protocol": { - "version": "0.0.818844", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", - "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "requires": { - "streamsearch": "0.1.2" - } + "version": "0.0.1056733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz", + "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA==" }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2926,11 +3170,6 @@ "entities": "^2.0.0" } }, - "domain-browser": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", - "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" - }, "domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", @@ -2965,9 +3204,9 @@ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" }, "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "ecdsa-sig-formatter": { "version": "1.0.11", @@ -2993,9 +3232,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.3.853", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz", - "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "elliptic": { "version": "6.5.4", @@ -3023,34 +3262,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -3082,47 +3298,88 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.2", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + } + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3204,6 +3461,15 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3235,16 +3501,10 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -3256,10 +3516,26 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -3282,6 +3558,18 @@ } } }, + "eslint-config-standard": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", + "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", + "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", + "dev": true + }, "eslint-import-resolver-node": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", @@ -3304,14 +3592,12 @@ } }, "eslint-module-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", - "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", "dev": true, "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -3322,77 +3608,19 @@ "requires": { "ms": "^2.1.1" } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } } } }, "eslint-plugin-compat": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-3.13.0.tgz", - "integrity": "sha512-cv8IYMuTXm7PIjMVDN2y4k/KVnKZmoNGHNq27/9dLstOLydKblieIv+oe2BN2WthuXnFNhaNvv3N1Bvl4dbIGA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.0.2.tgz", + "integrity": "sha512-xqvoO54CLTVaEYGMzhu35Wzwk/As7rCvz/2dqwnFiWi0OJccEtGIn+5qq3zqIu9nboXlpdBN579fZcItC73Ycg==", "dev": true, "requires": { - "@mdn/browser-compat-data": "^3.3.14", + "@mdn/browser-compat-data": "^4.1.5", "ast-metadata-inferer": "^0.7.0", "browserslist": "^4.16.8", - "caniuse-lite": "^1.0.30001251", + "caniuse-lite": "^1.0.30001304", "core-js": "^3.16.2", "find-up": "^5.0.0", "lodash.memoize": "4.1.2", @@ -3410,6 +3638,244 @@ } } }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + } + }, + "eslint-plugin-promise": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.1.tgz", + "integrity": "sha512-XgdcdyNzHfmlQyweOPTxmc7pIsS6dE4MvwhXWMQ2Dxs1XAL2GJDilUsjWen6TWik0aSI+zD/PqocZBblcm9rdA==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", + "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", + "doctrine": "^2.1.0", + "estraverse": "^5.2.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", + "object.values": "^1.1.4", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -3418,6 +3884,14 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } } }, "eslint-utils": { @@ -3427,12 +3901,20 @@ "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { @@ -3444,6 +3926,14 @@ "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -3459,14 +3949,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "esrecurse": { @@ -3476,20 +3958,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -3504,23 +3978,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "express": { "version": "4.18.2", @@ -3641,7 +4101,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fault": { @@ -3655,11 +4115,20 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "requires": { "pend": "~1.2.0" } }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3670,32 +4139,32 @@ } }, "file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-4.0.0.tgz", + "integrity": "sha512-vRCdScQ6j3Ku6Kd7W1kZk9c++5SqD6Xz5Jotrjr/nkY714M14RFHy/AAVA2WQvpsqVAVgTbDrYyBpU205F0cLw==" }, "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", + "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==" }, "filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", + "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" + "filename-reserved-regex": "^3.0.0", + "strip-outer": "^2.0.0", + "trim-repeated": "^2.0.0" } }, "filenamify-url": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-2.1.2.tgz", - "integrity": "sha512-3rMbAr7vDNMOGsj1aMniQFl749QjgM+lMJ/77ZRSPTIgxvolZwoQbn8dXLs7xfd+hAdli+oTnSWZNkJJLWQFEQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-3.0.0.tgz", + "integrity": "sha512-8wbXil432tPxajYfC9HT8va8zbst17aEgGIrzCvYFZe89TfIPUE/rSFmcROXCoinnn5fxv6UfICmPmHL1gRZ2Q==", "requires": { - "filenamify": "^4.3.0", - "humanize-url": "^2.1.1" + "filenamify": "^5.0.1", + "humanize-url": "^3.0.0" } }, "fill-range": { @@ -3740,16 +4209,6 @@ } } }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3771,9 +4230,9 @@ } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "for-each": { @@ -3784,11 +4243,6 @@ "is-callable": "^1.1.3" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -3802,7 +4256,15 @@ "format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } }, "formik": { "version": "2.2.9", @@ -3835,11 +4297,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, - "fs-capacitor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", - "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -3861,10 +4318,28 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "futoin-hkdf": { @@ -3872,6 +4347,12 @@ "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==" }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3887,18 +4368,10 @@ "has-symbols": "^1.0.1" } }, - "get-orientation": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz", - "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==", - "requires": { - "stream-parser": "^0.3.1" - } - }, "get-res": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-res/-/get-res-3.0.0.tgz", - "integrity": "sha1-vQ1s4aShixvbKFSNNcTZ4XAwXGE=", + "integrity": "sha512-sABGPPWcn5KTmo5TbZYyHIw39TwRd4A3MZXad00UAeVH+hZMeqPL/D5PJSvRtQS3vY+utJry38Ka7iAIP4qKIQ==", "requires": { "meow": "^3.3.0", "w3counter": "^3.0.1" @@ -3922,15 +4395,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, "github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "glob": { "version": "7.2.0", @@ -3953,20 +4427,40 @@ "is-glob": "^4.0.1" } }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + } + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -3984,7 +4478,7 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" } } }, @@ -3994,44 +4488,38 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "graphql": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.6.0.tgz", - "integrity": "sha512-WJR872Zlc9hckiEPhXgyUftXH48jp2EjO5tgBBOyNMRJZ9fviL2mJBD6CAysk6N5S0r9BTs09Qk39nnJBkvOXQ==" - }, - "graphql-extensions": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.15.0.tgz", - "integrity": "sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==", - "requires": { - "@apollographql/apollo-tools": "^0.5.0", - "apollo-server-env": "^3.1.0", - "apollo-server-types": "^0.9.0" - } + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==" }, "graphql-tag": { - "version": "2.12.5", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.5.tgz", - "integrity": "sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ==", + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "requires": { "tslib": "^2.1.0" } }, "graphql-tools": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", - "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", + "version": "8.3.10", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-8.3.10.tgz", + "integrity": "sha512-JygPYlpcZM3DqoNtHjMCwyzITwyAVyOhVjZS/oPgclMGITKmFZJ8b8dTZmg7yccMY2bTngsdT/7zNZPq9dPzVQ==", "requires": { - "apollo-link": "^1.2.14", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" + "@apollo/client": "~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0 || ~3.6.0 || ~3.7.0", + "@graphql-tools/schema": "9.0.8", + "tslib": "^2.4.0" }, "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "@graphql-tools/schema": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.8.tgz", + "integrity": "sha512-PnES7sNkhQ/FdPQhP7cup0OIzwzQh+nfjklilU7YJzE209ACIyEQtxoNCfvPW5eV6hc9bWsBQeI3Jm4mMtwxNA==", + "requires": { + "@graphql-tools/merge": "8.3.10", + "@graphql-tools/utils": "9.0.1", + "tslib": "^2.4.0", + "value-or-promise": "1.0.11" + } } } }, @@ -4049,15 +4537,25 @@ } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", @@ -4117,13 +4615,28 @@ "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + } } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, "highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -4139,11 +4652,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" - }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -4165,7 +4673,7 @@ "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "requires": { "domelementtype": "1", "domhandler": "2.3", @@ -4184,9 +4692,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "entities": { "version": "2.2.0", @@ -4203,7 +4711,7 @@ "domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "requires": { "domelementtype": "1" } @@ -4211,7 +4719,7 @@ "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -4220,12 +4728,17 @@ "entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -4236,42 +4749,44 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" } } }, "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", - "setprototypeof": "1.2.0", + "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "dependencies": { + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + } } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { - "agent-base": "5", + "agent-base": "6", "debug": "4" } }, "humanize-url": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-2.1.1.tgz", - "integrity": "sha512-V4nxsPGNE7mPjr1qDp471YfW8nhBiTRWrG/4usZlpvFU8I7gsV7Jvrrzv/snbLm5dWO3dr1ennu2YqnhTWFmYA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-3.0.0.tgz", + "integrity": "sha512-oWcYrKNVa+bCX9ACFZ85H8l1+QcwBJ64xH5+PHYoLe/Y5aToOfw3s3OZqRA/OyJPcWOXuDLo3qil5CYvTMtp0A==", "requires": { - "normalize-url": "^4.5.1" + "normalize-url": "^7.0.0" } }, "iconv-lite": { @@ -4288,24 +4803,20 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "image-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", - "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", - "requires": { - "queue": "6.0.2" - } + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4314,13 +4825,16 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "requires": { + "repeating": "^2.0.0" + } }, "inflight": { "version": "1.0.6", @@ -4345,6 +4859,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -4375,13 +4890,6 @@ "bolt07": "1.8.2", "bolt09": "0.2.3", "tiny-secp256k1": "2.2.1" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - } } }, "ipaddr.js": { @@ -4426,6 +4934,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -4442,6 +4951,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4469,6 +4979,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -4514,19 +5025,11 @@ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true }, "is-number": { "version": "7.0.0", @@ -4534,9 +5037,10 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -4549,12 +5053,13 @@ "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==" }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -4566,19 +5071,24 @@ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -4587,107 +5097,82 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" } }, "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==" }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" - }, - "jest-worker": { - "version": "27.0.0-next.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz", - "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" }, "jose": { - "version": "1.28.1", - "resolved": "https://registry.npmjs.org/jose/-/jose-1.28.1.tgz", - "integrity": "sha512-6JK28rFu5ENp/yxMwM+iN7YeaInnY9B9Bggjkz5fuwLiJhbVrl2O4SJr65bdNBPl9y27fdC3Mymh+FVCvozLIg==", + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-1.28.2.tgz", + "integrity": "sha512-wWy51U2MXxYi3g8zk2lsQ8M6O1lartpkxuq1TYexzPKYLgHLZkCjklaATP36I5BUoWjF2sInB9U1Qf18fBZxNA==", "requires": { "@panva/asn1.js": "^1.0.0" } }, + "jquery": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", + "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsesc": { @@ -4701,6 +5186,11 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4710,13 +5200,14 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, "requires": { "minimist": "^1.2.0" } @@ -4746,13 +5237,13 @@ } }, "jsx-ast-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", - "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "requires": { - "array-includes": "^3.1.3", - "object.assign": "^4.1.2" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" } }, "jwa": { @@ -4790,14 +5281,14 @@ } }, "lightning": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/lightning/-/lightning-6.2.2.tgz", - "integrity": "sha512-6afDZviRGJbZXM+JJ7iJMLOPcNK/XrPkf/vVoHQtudAiPsrL/z4NRRUSH4PYfq/01hH28DG2rx5ZFXfRaJNeTQ==", + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/lightning/-/lightning-6.2.7.tgz", + "integrity": "sha512-2O68CU67XWqbahWRG4Ut5OsdqzxWh3Pg2bboiGcSSBA1boRECQLvw3cpnsFZK7Sef5s4NhgslDu7bZxyrDa8pw==", "requires": { - "@grpc/grpc-js": "1.7.1", + "@grpc/grpc-js": "1.7.3", "@grpc/proto-loader": "0.7.3", "@types/express": "4.17.14", - "@types/node": "18.8.3", + "@types/node": "18.11.9", "@types/request": "2.48.8", "@types/ws": "8.5.3", "async": "3.2.4", @@ -4806,7 +5297,7 @@ "bn.js": "5.2.1", "body-parser": "1.20.1", "bolt07": "1.8.2", - "bolt09": "0.2.3", + "bolt09": "0.2.4", "cbor": "8.1.0", "ecpair": "2.1.0", "express": "4.18.2", @@ -4816,21 +5307,10 @@ "type-fest": "3.1.0" }, "dependencies": { - "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, "@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==" + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" }, "@types/ws": { "version": "8.5.3", @@ -4840,10 +5320,10 @@ "@types/node": "*" } }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "bolt09": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/bolt09/-/bolt09-0.2.4.tgz", + "integrity": "sha512-ulNUekEfVhJredkXxP970MrVcrbPbDYyybfagqKFa8J3/4MtkhrX1pR5DjHWeyIujEkFNLbZpo6QF/Og2gXxug==" }, "type-fest": { "version": "3.1.0", @@ -4852,31 +5332,46 @@ } } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "ln-service": { - "version": "54.2.1", - "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-54.2.1.tgz", - "integrity": "sha512-AufpoiQbRcKqr223c7YksB8CbHaaWtEbRVh8YIOTm1HEz2fn3iadPOipgPNoDDcR4dkDEUYJJMg1fods1RS8rw==", + "version": "54.2.6", + "resolved": "https://registry.npmjs.org/ln-service/-/ln-service-54.2.6.tgz", + "integrity": "sha512-HEFcTdVj1nYfhkLzPKtCtBZhw+I9FB8qoJhMb4ro8cwMebRSG/lDDcIvkANfi7ccFLbRNB+M7Tk1vHRaFdQAzw==", "requires": { "bolt07": "1.8.2", "cors": "2.8.5", "express": "4.18.2", "invoices": "2.2.0", - "lightning": "6.2.2", + "lightning": "6.2.7", "macaroon": "3.0.4", "morgan": "1.10.0", - "ws": "8.9.0" + "ws": "8.10.0" } }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "requires": { + "error-ex": "^1.2.0" + } + } } }, "load-script": { @@ -4884,16 +5379,6 @@ "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=" }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4916,19 +5401,13 @@ "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -4967,7 +5446,7 @@ "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "lodash.merge": { @@ -4984,7 +5463,7 @@ "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, "lodash.template": { "version": "4.5.0", @@ -5006,67 +5485,29 @@ "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==" } } }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" }, "long": { "version": "4.0.0", @@ -5089,7 +5530,7 @@ "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -5118,9 +5559,9 @@ } }, "luxon": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", - "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", + "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==" }, "macaroon": { "version": "3.0.4", @@ -5140,18 +5581,10 @@ "semver": "^6.0.0" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==" }, "markdown-table": { "version": "3.0.2", @@ -5169,39 +5602,13 @@ } }, "mdast-util-definitions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz", - "integrity": "sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz", + "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", - "unist-util-visit": "^3.0.0" - }, - "dependencies": { - "unist-util-is": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", - "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" - }, - "unist-util-visit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", - "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^4.0.0" - } - }, - "unist-util-visit-parents": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", - "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - } - } + "unist-util-visit": "^4.0.0" } }, "mdast-util-directive": { @@ -5415,20 +5822,31 @@ } }, "mdast-util-to-hast": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz", - "integrity": "sha512-qE09zD6ylVP14jV4mjLIhDBOrpFdShHZcEsYvvKGABlr9mGbV7mTlRWdoFxL/EYSTNDiC9GZXy7y8Shgb9Dtzw==", + "version": "12.2.4", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz", + "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", "requires": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", - "@types/mdurl": "^1.0.0", "mdast-util-definitions": "^5.0.0", - "mdurl": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", "unist-builder": "^3.0.0", "unist-util-generated": "^2.0.0", "unist-util-position": "^4.0.0", "unist-util-visit": "^4.0.0" + }, + "dependencies": { + "micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + } } }, "mdast-util-to-markdown": { @@ -5455,11 +5873,6 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -5468,7 +5881,7 @@ "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -5487,74 +5900,19 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micro": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/micro/-/micro-9.3.4.tgz", - "integrity": "sha512-smz9naZwTG7qaFnEZ2vn248YZq9XR+XoOH3auieZbkhDL4xLOxiE+KqG8qqnBeKfXA9c1uEFGCxPN1D+nT6N7w==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/micro/-/micro-9.4.1.tgz", + "integrity": "sha512-Lpjcbp6Y9GJIfewxDfTmu9eW0rt0MGo+Gs1d3yJLFa7mhErtKkCngGhDbA/O1gqUjEwsHh+jWPg8BJ0Bx4AgFA==", "requires": { "arg": "4.1.0", "content-type": "1.0.4", - "is-stream": "1.1.0", - "raw-body": "2.3.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } + "raw-body": "2.4.1" } }, "micromark": { @@ -5925,22 +6283,6 @@ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==" }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5960,9 +6302,9 @@ } }, "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" }, "minimalistic-assert": { "version": "1.0.1", @@ -5975,17 +6317,17 @@ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "mkdirp": { "version": "1.0.4", @@ -5997,11 +6339,6 @@ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, - "modify-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", - "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" - }, "morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -6073,22 +6410,14 @@ "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==" }, "nanoid": { - "version": "3.1.28", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.28.tgz", - "integrity": "sha512-gSu9VZ2HtmoKYe/lmyPFES5nknFrHa+/DT9muUFWFMi6Jh9E1I7bkvlQ8xxf1Kos9pi9o8lBnIOkatMhKX/YUw==" - }, - "native-url": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz", - "integrity": "sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==", - "requires": { - "querystring": "^0.2.0" - } + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { @@ -6097,122 +6426,35 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "next": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/next/-/next-11.1.2.tgz", - "integrity": "sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/next/-/next-12.3.2.tgz", + "integrity": "sha512-orzvvebCwOqaz1eA5ZA0R5dbKxqtJyw7yeig7kDspu6p8OrplfyelzpvMHcDTKscv/l0nn/0l0v3mSsE8w4k7A==", "requires": { - "@babel/runtime": "7.15.3", - "@hapi/accept": "5.0.2", - "@next/env": "11.1.2", - "@next/polyfill-module": "11.1.2", - "@next/react-dev-overlay": "11.1.2", - "@next/react-refresh-utils": "11.1.2", - "@next/swc-darwin-arm64": "11.1.2", - "@next/swc-darwin-x64": "11.1.2", - "@next/swc-linux-x64-gnu": "11.1.2", - "@next/swc-win32-x64-msvc": "11.1.2", - "@node-rs/helper": "1.2.1", - "assert": "2.0.0", - "ast-types": "0.13.2", - "browserify-zlib": "0.2.0", - "browserslist": "4.16.6", - "buffer": "5.6.0", - "caniuse-lite": "^1.0.30001228", - "chalk": "2.4.2", - "chokidar": "3.5.1", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "cssnano-simple": "3.0.0", - "domain-browser": "4.19.0", - "encoding": "0.1.13", - "etag": "1.8.1", - "find-cache-dir": "3.3.1", - "get-orientation": "1.1.2", - "https-browserify": "1.0.0", - "image-size": "1.0.0", - "jest-worker": "27.0.0-next.5", - "native-url": "0.3.4", - "node-fetch": "2.6.1", - "node-html-parser": "1.4.9", - "node-libs-browser": "^2.2.1", - "os-browserify": "0.3.0", - "p-limit": "3.1.0", - "path-browserify": "1.0.1", - "pnp-webpack-plugin": "1.6.4", - "postcss": "8.2.15", - "process": "0.11.10", - "querystring-es3": "0.2.1", - "raw-body": "2.4.1", - "react-is": "17.0.2", - "react-refresh": "0.8.3", - "stream-browserify": "3.0.0", - "stream-http": "3.1.1", - "string_decoder": "1.3.0", - "styled-jsx": "4.0.1", - "timers-browserify": "2.0.12", - "tty-browserify": "0.0.1", - "use-subscription": "1.5.1", - "util": "0.12.4", - "vm-browserify": "1.1.2", - "watchpack": "2.1.1" - }, - "dependencies": { - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } + "@next/env": "12.3.2", + "@next/swc-android-arm-eabi": "12.3.2", + "@next/swc-android-arm64": "12.3.2", + "@next/swc-darwin-arm64": "12.3.2", + "@next/swc-darwin-x64": "12.3.2", + "@next/swc-freebsd-x64": "12.3.2", + "@next/swc-linux-arm-gnueabihf": "12.3.2", + "@next/swc-linux-arm64-gnu": "12.3.2", + "@next/swc-linux-arm64-musl": "12.3.2", + "@next/swc-linux-x64-gnu": "12.3.2", + "@next/swc-linux-x64-musl": "12.3.2", + "@next/swc-win32-arm64-msvc": "12.3.2", + "@next/swc-win32-ia32-msvc": "12.3.2", + "@next/swc-win32-x64-msvc": "12.3.2", + "@swc/helpers": "0.4.11", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.0.7", + "use-sync-external-store": "1.2.0" } }, "next-auth": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-3.29.3.tgz", - "integrity": "sha512-OoG5y8oFV7MWF2VVs20AfdF41ndoXtPBFIlLfCHbrvFWHfPGsjnyAnhDxyJZX91Taknd4MD3zrCGOlBJKrLU7A==", + "version": "3.29.10", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-3.29.10.tgz", + "integrity": "sha512-e4nNYhISQRHNnem/WX1ybnQGDGb2rMP29maNmIXEOxSL6Uhu/pGFYu/aqApgIObDVWFt5l+33Ddh3rc71hjvEA==", "requires": { "@babel/runtime": "^7.14.0", "@next-auth/prisma-legacy-adapter": "0.1.2", @@ -6229,29 +6471,52 @@ } }, "next-plausible": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-2.1.3.tgz", - "integrity": "sha512-EyKvwYs+5zSPbjdsX8sWZs23LfwhsaDUMjdUitj07GADAuKwCM3w29LBmjhf0cp6QqZi79y3o76+fXVYutsyuw==" + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.6.4.tgz", + "integrity": "sha512-aHL4IL+gkkjs5ScB18LZ3LMEWXKR5VTvnMDs/fHNFHadOh23i37fD+VP5oAQLALR8Mde63l9JJljrw9DkvjWjQ==" }, "next-seo": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-4.28.1.tgz", - "integrity": "sha512-WZgwdM+UhpNF3A37zFllzmPhnOVJ9vYeYlc0n3Z/kYfz/QQgy8NEdncNNggS9dU4JD8xriaCcyknhy5OsrFsJw==" + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-4.29.0.tgz", + "integrity": "sha512-xmwzcz4uHaYJ8glbuhs6FSBQ7z3irmdPYdJJ5saWm72Uy3o+mPKGaPCXQetTCE6/xxVnpoDV4yFtFlEjUcljSg==" }, "nextjs-progressbar": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/nextjs-progressbar/-/nextjs-progressbar-0.0.13.tgz", - "integrity": "sha512-vuE9/j1yaFyHhMVwdlPZbGbcwnvoZZMH8fXUG+HCa+w5uojRNOMO43EL+o9YZ53QwQHsjWdfUapz+J8D/u3jFw==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/nextjs-progressbar/-/nextjs-progressbar-0.0.16.tgz", + "integrity": "sha512-GV0fD38EMD3vSDCmkq+tObmoup6QA91a6a9MxGuhJZuRk/9TNsrHGnIQQQ/sggkMkXuT4fBgF6jRjFwScDT3zA==", "requires": { + "@types/nprogress": "^0.2.0", "nprogress": "^0.2.0", - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" + }, + "dependencies": { + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + } } }, + "node-abort-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", + "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" + }, "node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -6261,164 +6526,14 @@ } }, "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==" - }, - "node-html-parser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz", - "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==", - "requires": { - "he": "1.2.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "requires": { - "inherits": "2.0.3" - } - } - } + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" }, "node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "node-s3-url-encode": { "version": "0.0.4", @@ -6426,9 +6541,9 @@ "integrity": "sha1-VWD8abweqQ46THhB8jPSAHU3hQM=" }, "nodemailer": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.5.tgz", - "integrity": "sha512-6VtMpwhsrixq1HDYSBBHvW0GwiWawE75dS3oal48VqRhUvKJNnKnJo2RI/bCVQubj1vgrgscMNW4DHaD6xtMCg==" + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.8.0.tgz", + "integrity": "sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==" }, "nofilter": { "version": "3.1.0", @@ -6459,14 +6574,14 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz", + "integrity": "sha512-uhXOdZry0L6M2UIo9BTt7FdpBDiAGN/7oItedQwPKh8jh31ZlvC8U9Xl/EJ3aijDHaywXTW3QbZ6LuCocur1YA==" }, "nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "nth-check": { "version": "2.0.1", @@ -6491,88 +6606,73 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } } }, "object.entries": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", - "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "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", - "es-abstract": "^1.18.2" - } - }, - "object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", - "dev": true, - "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.19.1" } }, - "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, "on-finished": { @@ -6603,6 +6703,16 @@ "requires": { "@wry/context": "^0.6.0", "@wry/trie": "^0.3.0" + }, + "dependencies": { + "@wry/context": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz", + "integrity": "sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw==", + "requires": { + "tslib": "^2.3.0" + } + } } }, "optionator": { @@ -6619,20 +6729,11 @@ "word-wrap": "^1.2.3" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -6655,43 +6756,19 @@ } }, "p-memoize": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz", - "integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-7.1.1.tgz", + "integrity": "sha512-DZ/bONJILHkQ721hSr/E9wMz5Am/OTJ9P6LhLFo2Tu+jL8044tgc9LwHO8g4PiaYePnlVVRAJcKmgy8J9MVFrA==", "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.0.0", - "p-settle": "^4.1.1" - } - }, - "p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==" - }, - "p-settle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", - "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", - "requires": { - "p-limit": "^2.2.2", - "p-reflect": "^2.1.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - } + "mimic-fn": "^4.0.0", + "type-fest": "^3.0.0" } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true }, "packet-reader": { "version": "1.0.0", @@ -6704,53 +6781,73 @@ "integrity": "sha512-TbPNw7GddbHs4c2DyYinFvh51BVsaMfdrweeylzGlg8qeuzALGxq2NF+6jbmeKc7DnU2BZRDOuWNnEjDwUSqRQ==" }, "pageres": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/pageres/-/pageres-6.3.0.tgz", - "integrity": "sha512-U17DXvyuCMVlPjECIMvDfXS6uVERXxqjk5zpfj/kW50bDIV2/YYrOoIAs0bJkxnG/XOfnFBX+hltACIWIgBLtw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pageres/-/pageres-7.1.0.tgz", + "integrity": "sha512-IDkx7xUfCFNtas4ZMxYpr4FKmTjwT0iwjjI2wbjL79lSYcY9Nyl9F5xr10QX/WKZhB1GvTFfLSyq/8hceaYPag==", "requires": { - "array-differ": "^3.0.0", - "array-uniq": "^2.1.0", - "capture-website": "^1.2.6", - "date-fns": "^2.16.1", - "filenamify": "^4.2.0", - "filenamify-url": "^2.1.1", + "array-differ": "^4.0.0", + "array-uniq": "^3.0.0", + "capture-website": "^3.2.0", + "date-fns": "^2.29.2", + "filenamify": "^5.1.1", + "filenamify-url": "^3.0.0", "get-res": "^3.0.0", "lodash.template": "^4.5.0", - "log-symbols": "^4.0.0", + "log-symbols": "^5.1.0", "make-dir": "^3.1.0", - "p-map": "^4.0.0", - "p-memoize": "^4.0.1", - "plur": "^4.0.0", - "unused-filename": "^2.1.0", + "p-map": "^5.5.0", + "p-memoize": "^7.1.0", + "plur": "^5.1.0", + "type-fest": "^3.1.0", + "unused-filename": "^4.0.1", "viewport-list": "^5.1.1" + }, + "dependencies": { + "aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "requires": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + } + }, + "clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "requires": { + "escape-string-regexp": "5.0.0" + } + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==" + }, + "p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "requires": { + "aggregate-error": "^4.0.0" + } + } } }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", @@ -6765,11 +6862,14 @@ } }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "requires": { - "error-ex": "^1.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse5": { @@ -6797,15 +6897,11 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -6829,55 +6925,33 @@ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "pg": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz", - "integrity": "sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "^2.5.0", - "pg-pool": "^3.4.1", + "pg-pool": "^3.5.2", "pg-protocol": "^1.5.0", "pg-types": "^2.1.0", "pgpass": "1.x" } }, "pg-boss": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pg-boss/-/pg-boss-7.0.2.tgz", - "integrity": "sha512-5s4HsrkGd8qbNYPf+SBxLZ3gCZYdNbttUCRpyuH6aCz6niR4Macoieuwv3JBwvHdNqDWoLtx6o5wMgFCjt/oZQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/pg-boss/-/pg-boss-7.4.0.tgz", + "integrity": "sha512-thjVCqLvFINqDJq/fS3dsH2lglZ9owqJi6waTNO/Bmdr0zDbRbrgEsAkzi50riYPaDx5EUvmpsFHipmR1XjxWA==", "requires": { "cron-parser": "^4.0.0", "delay": "^5.0.0", @@ -6898,9 +6972,9 @@ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, "pg-pool": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", - "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==" + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==" }, "pg-protocol": { "version": "1.5.0", @@ -6940,17 +7014,17 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "requires": { "pinkie": "^2.0.0" } @@ -7020,10 +7094,16 @@ "p-limit": "^2.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -7033,7 +7113,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true }, "pify": { @@ -7045,7 +7125,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, "type-fest": { @@ -7056,53 +7136,10 @@ } } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, "pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", "dev": true, "requires": { "find-up": "^2.1.0" @@ -7111,7 +7148,7 @@ "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "requires": { "locate-path": "^2.0.0" @@ -7120,7 +7157,7 @@ "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "requires": { "p-locate": "^2.0.0", @@ -7139,62 +7176,41 @@ "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "requires": { "p-limit": "^1.1.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true } } }, - "platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "requires": { - "irregular-plurals": "^3.2.0" + "irregular-plurals": "^3.3.0" } }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", - "requires": { - "ts-pnp": "^1.1.6" - } + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" }, "postcss": { - "version": "8.2.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", - "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "postcss-value-parser": { @@ -7210,7 +7226,7 @@ "postgres-bytea": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" }, "postgres-date": { "version": "1.0.7", @@ -7226,14 +7242,14 @@ } }, "preact": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.3.tgz", - "integrity": "sha512-giqJXP8VbtA1tyGa3f1n9wiN7PrHtONrDyE3T+ifjr/tTkg+2N4d/6sjC9WyJKv8wM7rOYDveqy5ZoFmYlwo4w==" + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.2.tgz", + "integrity": "sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==" }, "preact-render-to-string": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.0.tgz", - "integrity": "sha512-+RGwSW78Cl+NsZRUbFW1MGB++didsfqRk+IyRVTaqy+3OjtpKK/6HgBtfszUX0YXMfo41k2iaQSseAHGKEwrbg==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", "requires": { "pretty-format": "^3.8.0" } @@ -7247,7 +7263,7 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==" }, "pretty-format": { "version": "3.8.0", @@ -7255,27 +7271,17 @@ "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" }, "prisma": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-2.25.0.tgz", - "integrity": "sha512-AdAlP+PShvugljIx62Omu+eLKu6Cozz06dehmClIHSb0/yFiVnyBtrRVV4LZus+QX6Ayg7CTDvtzroACAWl+Zw==", + "version": "2.30.3", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-2.30.3.tgz", + "integrity": "sha512-48qYba2BIyUmXuosBZs0g3kYGrxKvo4VkSHYOuLlDdDirmKyvoY2hCYMUYHSx3f++8ovfgs+MX5KmNlP+iAZrQ==", "requires": { - "@prisma/engines": "2.25.0-36.c838e79f39885bc8e1611849b1eb28b5bb5bc922" + "@prisma/engines": "2.30.1-2.b8c35d44de987a9691890b3ddf3e2e7effb9bf20" } }, "prismjs": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", - "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "progress": { "version": "2.0.3", @@ -7302,17 +7308,14 @@ } }, "property-expr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", - "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" }, "property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { - "xtend": "^4.0.0" - } + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" }, "protobufjs": { "version": "7.1.2", @@ -7334,9 +7337,9 @@ }, "dependencies": { "long": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", - "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" } } }, @@ -7365,39 +7368,12 @@ "bn.js": "5.2.1", "pushdata-bitcoin": "1.0.1", "varuint-bitcoin": "1.1.2" - }, - "dependencies": { - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - } } }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - } - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "pump": { "version": "3.0.0", @@ -7409,33 +7385,47 @@ } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", - "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.2.2.tgz", + "integrity": "sha512-m1T5Mog5qu5+dMBptWYTn6pXRdnFbydbVUCthqwbfd8/kOiMlzZBR9ywjX79LpvI1Sj+/z8+FKeIsjnMul8ZYA==", "requires": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" + "cosmiconfig": "7.0.1", + "devtools-protocol": "0.0.1056733", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "puppeteer-core": "19.2.2" + } + }, + "puppeteer-core": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.2.2.tgz", + "integrity": "sha512-faojf+1pZ/tHXSr4x1q+9MVd9FrL3rpdbC0w7qN7MNClMoLuCvMbpR4vzcjoiJYgclt1n+SOPUOmHQViTw6frw==", + "requires": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1056733", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.10.0" }, "dependencies": { - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "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" + } } } }, @@ -7447,20 +7437,10 @@ "bitcoin-ops": "^1.3.0" } }, - "qr.js": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz", - "integrity": "sha1-ys6GOG9ZoNuAUPqQ2baw6IoeNk8=" - }, "qrcode.react": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-1.0.1.tgz", - "integrity": "sha512-8d3Tackk8IRLXTo67Y+c1rpaiXjoz/Dd2HpcMdW//62/x8J1Nbho14Kh8x974t9prsLHN6XqVgcnRiBGFptQmg==", - "requires": { - "loose-envify": "^1.4.0", - "prop-types": "^15.6.0", - "qr.js": "0.0.0" - } + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==" }, "qs": { "version": "6.11.0", @@ -7475,26 +7455,10 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==" }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "requires": { - "inherits": "~2.0.3" - } - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" - } + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "randombytes": { "version": "2.1.0", @@ -7504,63 +7468,20 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", + "bytes": "3.1.0", + "http-errors": "1.7.3", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - } } }, "react": { @@ -7583,13 +7504,13 @@ } }, "react-bootstrap": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.4.tgz", - "integrity": "sha512-z3BhBD4bEZuLP8VrYqAD7OT7axdcSkkyvWBWnS2U/4MhyabUihrUyucPWkan7aMI1XIHbmH4LCpEtzWGfx/yfA==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.6.tgz", + "integrity": "sha512-pSzYyJT5u4rc8+5myM8Vid2JG52L8AmYSkpznReH/GM4+FhLqEnxUa0+6HRTaGwjdEixQNGchwY+b3xCdYWrDA==", "requires": { "@babel/runtime": "^7.14.0", "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.26", + "@restart/hooks": "^0.4.7", "@types/invariant": "^2.2.33", "@types/prop-types": "^15.7.3", "@types/react": ">=16.14.8", @@ -7600,23 +7521,16 @@ "invariant": "^2.2.4", "prop-types": "^15.7.2", "prop-types-extra": "^1.1.0", - "react-overlays": "^5.1.1", + "react-overlays": "^5.1.2", "react-transition-group": "^4.4.1", "uncontrollable": "^7.2.1", "warning": "^4.0.3" - }, - "dependencies": { - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - } } }, "react-countdown": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/react-countdown/-/react-countdown-2.3.2.tgz", - "integrity": "sha512-Q4SADotHtgOxNWhDdvgupmKVL0pMB9DvoFcxv5AzjsxVhzOVxnttMbAywgqeOdruwEAmnPhOhNv/awAgkwru2w==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/react-countdown/-/react-countdown-2.3.3.tgz", + "integrity": "sha512-z/AS1ccdb45Fd8/1AGt9m2UIJvPUZHViL+EfWyJsI7H+99aUFnDIhN9NTGtM4n5OhhYH+Ne1UvX/u1Ejw6RGzg==", "requires": { "prop-types": "^15.7.2" } @@ -7652,17 +7566,18 @@ "integrity": "sha512-Q8S7CzZVNmP123tHrMp0U0+/fgDEZCi5CpOGkabz3a2zQ0aek5IAizetxtxBAt1hQHHaAYynPHhtcSkLIkqEzQ==" }, "react-markdown": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.0.tgz", - "integrity": "sha512-qbrWpLny6Ef2xHqnYqtot948LXP+4FtC+MWIuaN1kvSnowM+r1qEeEHpSaU0TDBOisQuj+Qe6eFY15cNL3gLAw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.3.tgz", + "integrity": "sha512-We36SfqaKoVNpN1QqsZwWSv/OZt5J15LNgTLWynwAN5b265hrQrsjMtlRNwUvS+YyR3yDM8HpTNc4pK9H/Gc0A==", "requires": { "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", "@types/unist": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^2.0.0", "prop-types": "^15.0.0", "property-information": "^6.0.0", - "react-is": "^17.0.0", + "react-is": "^18.0.0", "remark-parse": "^10.0.0", "remark-rehype": "^10.0.0", "space-separated-tokens": "^2.0.0", @@ -7672,36 +7587,21 @@ "vfile": "^5.0.0" }, "dependencies": { - "comma-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", - "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" - }, - "property-information": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", - "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" - }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "space-separated-tokens": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", - "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" } } }, "react-overlays": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", - "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", + "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", "requires": { "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.8.6", - "@restart/hooks": "^0.3.26", + "@popperjs/core": "^2.11.6", + "@restart/hooks": "^0.4.7", "@types/warning": "^3.0.0", "dom-helpers": "^5.2.0", "prop-types": "^15.7.2", @@ -7709,28 +7609,20 @@ "warning": "^4.0.3" } }, - "react-refresh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", - "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" - }, "react-resize-detector": { - "version": "6.7.8", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.7.8.tgz", - "integrity": "sha512-0FaEcUBAbn+pq3PT5a9hHRebUfuS1SRLGLpIw8LydU7zX429I6XJgKerKAMPsJH0qWAl6o5bVKNqFJqr6tGPYw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-7.1.2.tgz", + "integrity": "sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw==", "requires": { - "@types/resize-observer-browser": "^0.1.6", - "lodash": "^4.17.21", - "resize-observer-polyfill": "^1.5.1" + "lodash": "^4.17.21" } }, "react-smooth": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.0.tgz", - "integrity": "sha512-wK4dBBR6P21otowgMT9toZk+GngMplGS1O5gk+2WSiHEXIrQgDvhR5IIlT74Vtu//qpTcipkgo21dD7a7AUNxw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.1.tgz", + "integrity": "sha512-Own9TA0GPPf3as4vSwFhDouVfXP15ie/wIHklhyKBH5AN6NFtdk0UpHBnonV11BtqDkAWlt40MOUc+5srmW7NA==", "requires": { "fast-equals": "^2.0.0", - "raf": "^3.4.0", "react-transition-group": "2.9.0" }, "dependencies": { @@ -7764,31 +7656,31 @@ } }, "react-syntax-highlighter": { - "version": "15.4.4", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz", - "integrity": "sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", "requires": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "lowlight": "^1.17.0", - "prismjs": "^1.22.0", - "refractor": "^3.2.0" + "prismjs": "^1.27.0", + "refractor": "^3.6.0" } }, "react-textarea-autosize": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", "requires": { "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.0.0", - "use-latest": "^1.0.0" + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" } }, "react-transition-group": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", - "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -7817,17 +7709,29 @@ "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -7836,7 +7740,7 @@ "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -7845,7 +7749,7 @@ "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "requires": { "pinkie-promise": "^2.0.0" } @@ -7871,10 +7775,13 @@ } }, "recharts": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.1.10.tgz", - "integrity": "sha512-me6c8m2Gs88X/nuM2gDSTDIhpSLNMbiTrlE4Cu53hjZNegT3g3xLlTrbYSAQuBCFWuWJAZXCmEuMr6AwizLyaA==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.1.16.tgz", + "integrity": "sha512-aYn1plTjYzRCo3UGxtWsduslwYd+Cuww3h/YAAEoRdGe0LRnBgYgaXSlVrNFkWOOSXrBavpmnli9h7pvRuk5wg==", "requires": { + "@types/d3-interpolate": "^2.0.0", + "@types/d3-scale": "^3.0.0", + "@types/d3-shape": "^2.0.0", "classnames": "^2.2.5", "d3-interpolate": "^2.0.0", "d3-scale": "^3.0.0", @@ -7882,17 +7789,10 @@ "eventemitter3": "^4.0.1", "lodash": "^4.17.19", "react-is": "^16.10.2", - "react-resize-detector": "^6.6.3", - "react-smooth": "^2.0.0", + "react-resize-detector": "^7.1.2", + "react-smooth": "^2.0.1", "recharts-scale": "^0.4.4", "reduce-css-calc": "^2.1.8" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - } } }, "recharts-scale": { @@ -7906,20 +7806,10 @@ "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" - }, - "dependencies": { - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - } } }, "reduce-css-calc": { @@ -7937,13 +7827,20 @@ "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, "refractor": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", - "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", "requires": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", - "prismjs": "~1.25.0" + "prismjs": "~1.27.0" + }, + "dependencies": { + "prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + } } }, "regenerator-runtime": { @@ -7952,13 +7849,14 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -8018,7 +7916,7 @@ "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "requires": { "is-finite": "^1.0.0" } @@ -8026,7 +7924,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", @@ -8055,10 +7953,10 @@ } } }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { "version": "1.20.0", @@ -8072,8 +7970,12 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "response-iterator": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", + "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==" }, "retry": { "version": "0.13.1", @@ -8110,23 +8012,55 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.42.1.tgz", - "integrity": "sha512-/zvGoN8B7dspKc5mC6HlaygyCBRvnyzzgD5khiaCfglWztY99cYoiTUksVx11NlnemrcfH5CEaCpsUKoW0cQqg==", + "version": "1.56.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.0.tgz", + "integrity": "sha512-WFJ9XrpkcnqZcYuLRJh5qiV6ibQOR4AezleeEjTjMsCocYW59dEG19U3fwTTXxzi2Ed3yjPBp727hbbj53pHFw==", "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, "scheduler": { "version": "0.20.2", @@ -8143,19 +8077,19 @@ "integrity": "sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg==" }, "secp256k1": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.2.tgz", - "integrity": "sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "requires": { - "elliptic": "^6.5.2", + "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0" } }, "secure-json-parse": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", - "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.5.0.tgz", + "integrity": "sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==" }, "semver": { "version": "6.3.0", @@ -8242,11 +8176,6 @@ "send": "0.18.0" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8276,11 +8205,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -8348,10 +8272,15 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, "space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" }, "spdx-correct": { "version": "3.1.1", @@ -8389,7 +8318,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "stable": { @@ -8397,14 +8326,6 @@ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "requires": { - "type-fest": "^0.7.1" - } - }, "standard": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", @@ -8439,6 +8360,12 @@ "strip-json-comments": "^3.1.1" } }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8448,6 +8375,15 @@ "color-convert": "^2.0.1" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8516,175 +8452,43 @@ "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } } }, - "eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true - }, - "eslint-config-standard-jsx": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", - "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", - "dev": true - }, - "eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.6.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "dependencies": { - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, - "eslint-plugin-promise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.1.tgz", - "integrity": "sha512-XgdcdyNzHfmlQyweOPTxmc7pIsS6dE4MvwhXWMQ2Dxs1XAL2GJDilUsjWen6TWik0aSI+zD/PqocZBblcm9rdA==", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", - "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", - "dev": true, - "requires": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", - "doctrine": "^2.1.0", - "estraverse": "^5.2.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.4", - "object.fromentries": "^2.0.4", - "object.hasown": "^1.0.0", - "object.values": "^1.1.4", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.5" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "globals": { "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", @@ -8700,116 +8504,31 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "p-try": "^1.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "lru-cache": "^6.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8842,60 +8561,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", - "requires": { - "debug": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" }, "string-width": { "version": "4.2.3", @@ -8908,37 +8574,49 @@ } }, "string.prototype.matchall": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", - "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", + "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } } }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" } }, "string_decoder": { @@ -8983,7 +8661,7 @@ "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "requires": { "is-utf8": "^0.2.0" } @@ -8991,7 +8669,7 @@ "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "requires": { "get-stdin": "^4.0.1" }, @@ -8999,7 +8677,7 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==" } } }, @@ -9010,12 +8688,9 @@ "dev": true }, "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "requires": { - "escape-string-regexp": "^1.0.2" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", + "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==" }, "style-to-object": { "version": "0.3.0", @@ -9026,77 +8701,9 @@ } }, "styled-jsx": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-4.0.1.tgz", - "integrity": "sha512-Gcb49/dRB1k8B4hdK8vhW27Rlb2zujCk1fISrizCcToIs+55B4vmUM0N9Gi4nnVfFZWe55jRdWpAqH1ldAKWvQ==", - "requires": { - "@babel/plugin-syntax-jsx": "7.14.5", - "@babel/types": "7.15.0", - "convert-source-map": "1.7.0", - "loader-utils": "1.2.3", - "source-map": "0.7.3", - "string-hash": "1.1.3", - "stylis": "3.5.4", - "stylis-rule-sheet": "0.0.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.9", - "to-fast-properties": "^2.0.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" - }, - "stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" - }, - "subscriptions-transport-ws": { - "version": "0.9.19", - "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz", - "integrity": "sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==", - "requires": { - "backo2": "^1.0.2", - "eventemitter3": "^3.1.0", - "iterall": "^1.2.1", - "symbol-observable": "^1.0.4", - "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" - } - } + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.7.tgz", + "integrity": "sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==" }, "supports-color": { "version": "5.5.0", @@ -9106,6 +8713,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "svgo": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.7.0.tgz", @@ -9121,12 +8734,9 @@ } }, "swr": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/swr/-/swr-0.5.7.tgz", - "integrity": "sha512-Jh1Efgu8nWZV9rU4VLUMzBzcwaZgi4znqbVXvAtUy/0JzSiN6bNjLaJK8vhY/Rtp7a83dosz5YuehfBNwC/ZoQ==", - "requires": { - "dequal": "2.0.2" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-1.3.0.tgz", + "integrity": "sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==" }, "symbol-observable": { "version": "4.0.0", @@ -9134,23 +8744,22 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==" }, "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "requires": { "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -9193,7 +8802,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "thenify": { @@ -9207,7 +8816,7 @@ "thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "requires": { "thenify": ">= 3.1.0 < 4" } @@ -9215,20 +8824,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "requires": { - "setimmediate": "^1.0.4" - } + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==" }, "tiny-secp256k1": { "version": "2.2.1", @@ -9243,10 +8844,18 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "tldts-core": { + "version": "5.7.98", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.98.tgz", + "integrity": "sha512-kbWEtI/DnGqnzgaYyl8+vuta1Z16GCQXSOxNFLCT754ISl6MZEJrPhyridmW+QCDPAiDKwrzBTsN8SwM/2PmWw==" + }, + "tldts-experimental": { + "version": "5.7.98", + "resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-5.7.98.tgz", + "integrity": "sha512-me1u/KyF2Y9zg797oZW1E3k+N4yPVLE+pwM5mHPAlfdxkLgSactT298dnvFXynaPFh1rdl5FKxHinVt7x2vqQg==", + "requires": { + "tldts-core": "^5.7.98" + } }, "to-fast-properties": { "version": "2.0.0", @@ -9269,23 +8878,17 @@ "toposort": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tr46": { @@ -9293,17 +8896,29 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==" }, "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", + "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", "requires": { - "escape-string-regexp": "^1.0.2" + "escape-string-regexp": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } } }, "trough": { @@ -9311,53 +8926,38 @@ "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==" }, - "ts-essentials": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", - "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" - }, "ts-invariant": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.9.3.tgz", - "integrity": "sha512-HinBlTbFslQI0OHP07JLsSXPibSegec6r9ai5xxq/qHYCsIQbzpymLpDhAUsnXcSrDEcd0L62L8vsOEdzM0qlA==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", + "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", "requires": { "tslib": "^2.1.0" } }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" - }, "tsconfig-paths": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "tweetnacl": { "version": "1.0.3", @@ -9379,9 +8979,9 @@ } }, "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz", + "integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==" }, "type-is": { "version": "1.6.18", @@ -9429,11 +9029,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -9452,6 +9047,16 @@ "supports-color": "^7.1.0" } }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9470,14 +9075,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9486,24 +9083,38 @@ "has-flag": "^4.0.0" } }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "requires": { - "cliui": "^7.0.2", + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "requires": { + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" } } }, @@ -9513,14 +9124,23 @@ "integrity": "sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==" }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } } }, "unbzip2-stream": { @@ -9576,9 +9196,12 @@ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" }, "unist-util-position": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.1.tgz", - "integrity": "sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz", + "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", + "requires": { + "@types/unist": "^2.0.0" + } }, "unist-util-stringify-position": { "version": "3.0.0", @@ -9589,13 +9212,13 @@ } }, "unist-util-visit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz", - "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" + "unist-util-visit-parents": "^5.1.1" }, "dependencies": { "unist-util-is": { @@ -9604,9 +9227,9 @@ "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" }, "unist-util-visit-parents": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz", - "integrity": "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" @@ -9624,9 +9247,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" }, "unpipe": { "version": "1.0.0", @@ -9634,18 +9257,39 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unused-filename": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-2.1.0.tgz", - "integrity": "sha512-BMiNwJbuWmqCpAM1FqxCTD7lXF97AvfQC8Kr/DIeA6VtvhJaMDupZ82+inbjl5yVP44PcxOuCSxye1QMS0wZyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-4.0.1.tgz", + "integrity": "sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A==", "requires": { - "modify-filename": "^1.1.0", - "path-exists": "^4.0.0" + "escape-string-regexp": "^5.0.0", + "path-exists": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" + } } }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, "uri-js": { "version": "4.4.1", @@ -9654,52 +9298,29 @@ "dev": true, "requires": { "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } } }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - } + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", "requires": { "prepend-http": "^1.0.1" } }, "use-composed-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", - "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", - "requires": { - "ts-essentials": "^2.0.3" - } + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==" }, "use-dark-mode": { "version": "2.3.1", @@ -9711,16 +9332,16 @@ } }, "use-isomorphic-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" }, "use-latest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", "requires": { - "use-isomorphic-layout-effect": "^1.0.0" + "use-isomorphic-layout-effect": "^1.1.1" } }, "use-persisted-state": { @@ -9731,13 +9352,10 @@ "@use-it/event-listener": "^0.1.2" } }, - "use-subscription": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", - "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", - "requires": { - "object-assign": "^4.1.1" - } + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" }, "util": { "version": "0.12.4", @@ -9757,18 +9375,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -9805,6 +9411,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-or-promise": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz", + "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==" + }, "varuint-bitcoin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", @@ -9841,17 +9452,12 @@ "viewport-list": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/viewport-list/-/viewport-list-5.1.1.tgz", - "integrity": "sha1-U0Dsso5oRHFRVeoQN6BTEi7qnZU=" - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-cRbBuQgCpm1OvltWDb9ucZXBGqHP5YGg495G+vaQEgZLt94tFuiHRwZQpOT+nLCsJ0pUGxE4ZwIEQcA0UDIa4Q==" }, "w3counter": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/w3counter/-/w3counter-3.0.1.tgz", - "integrity": "sha1-rAtzZlEUyuvlRF/Oc5AX6tveigU=", + "integrity": "sha512-pQN3bmi/1YVHcaVMlsZ/eSB6uFn5A/SREcpgm3ZTX7HQWyi/7p3LerFYnAqbNSR9RBNS17hqXc1mvhpr9KqDhg==", "requires": { "cheerio": "^0.19.0", "got": "^6.3.0", @@ -9866,14 +9472,10 @@ "loose-envify": "^1.0.0" } }, - "watchpack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", - "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" }, "webidl-conversions": { "version": "3.0.1", @@ -9888,6 +9490,11 @@ "@types/chrome": "0.0.74" } }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -9910,6 +9517,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -9919,22 +9527,22 @@ } }, "which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" + "is-typed-array": "^1.1.10" } }, "wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", - "integrity": "sha1-CNP1IFbGZnkplyb63g1DKudLRwQ=", + "integrity": "sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==", "requires": { "bs58check": "<3.0.0" } @@ -9984,9 +9592,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==" + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==" }, "xdg-basedir": { "version": "4.0.0", @@ -9995,23 +9603,23 @@ "dev": true }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" }, "xss": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.9.tgz", - "integrity": "sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", "requires": { "commander": "^2.20.3", "cssfilter": "0.0.10" @@ -10039,6 +9647,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -10061,7 +9674,7 @@ "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -10070,7 +9683,8 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true }, "youtube-player": { "version": "5.5.2", @@ -10098,17 +9712,32 @@ } }, "yup": { - "version": "0.32.9", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz", - "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==", + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", "requires": { - "@babel/runtime": "^7.10.5", - "@types/lodash": "^4.14.165", - "lodash": "^4.17.20", - "lodash-es": "^4.17.15", + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "nanoclone": "^0.2.1", "property-expr": "^2.0.4", "toposort": "^2.0.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "requires": { + "regenerator-runtime": "^0.13.10" + } + }, + "regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + } } }, "zen-observable": { @@ -10117,11 +9746,10 @@ "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" }, "zen-observable-ts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz", - "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", + "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", "requires": { - "@types/zen-observable": "0.8.3", "zen-observable": "0.8.15" } }, diff --git a/package.json b/package.json index 1f0b988d..093a342a 100644 --- a/package.json +++ b/package.json @@ -3,74 +3,79 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "NODE_OPTIONS='--trace-warnings --inspect' next dev", + "dev": "NODE_OPTIONS='--trace-warnings' next dev", "build": "next build", "migrate": "prisma migrate deploy", "start": "NODE_OPTIONS='--trace-warnings' next start -p $PORT" }, "dependencies": { - "@apollo/client": "^3.4.15", - "@opensearch-project/opensearch": "^1.0.2", - "@prisma/client": "^2.25.0", - "apollo-server-micro": "^2.21.2", + "@apollo/client": "^3.7.1", + "@opensearch-project/opensearch": "^1.1.0", + "@prisma/client": "^2.30.3", + "apollo-server-micro": "^3.11.1", "async-retry": "^1.3.1", - "aws-sdk": "^2.1056.0", + "aws-sdk": "^2.1248.0", "babel-plugin-inline-react-svg": "^2.0.1", "bech32": "^2.0.0", - "bolt11": "^1.3.4", - "bootstrap": "^4.6.0", + "bolt11": "^1.4.0", + "bootstrap": "^4.6.2", + "browserslist": "^4.21.4", "clipboard-copy": "^4.0.1", "cross-fetch": "^3.1.5", "domino": "^2.1.6", "formik": "^2.2.6", - "github-slugger": "^1.4.0", - "graphql": "^15.5.0", + "github-slugger": "^1.5.0", + "graphql": "^15.8.0", + "graphql-tools": "^8.3.10", "graphql-type-json": "^0.3.2", - "ln-service": "^54.2.1", + "jquery": "^3.6.1", + "ln-service": "^54.2.6", "mdast-util-find-and-replace": "^1.1.1", "mdast-util-from-markdown": "^1.2.0", "mdast-util-to-string": "^3.1.0", - "next": "^11.1.2", - "next-auth": "^3.29.3", - "next-plausible": "^2.1.3", - "next-seo": "^4.24.0", - "nextjs-progressbar": "^0.0.13", + "micro": "^9.4.1", + "next": "^12.3.2", + "next-auth": "^3.29.10", + "next-plausible": "^3.6.4", + "next-seo": "^4.29.0", + "nextjs-progressbar": "0.0.16", "node-s3-url-encode": "^0.0.4", "page-metadata-parser": "^1.1.4", - "pageres": "^6.3.0", - "pg-boss": "^7.0.2", - "prisma": "^2.25.0", - "qrcode.react": "^1.0.1", - "react": "^17.0.1", + "pageres": "^7.1.0", + "pg-boss": "^7.4.0", + "popper.js": "^1.16.1", + "prisma": "^2.30.3", + "qrcode.react": "^3.1.0", + "react": "^17.0.2", "react-avatar-editor": "^13.0.0", - "react-bootstrap": "^1.5.2", - "react-countdown": "^2.3.2", + "react-bootstrap": "^1.6.6", + "react-countdown": "^2.3.3", "react-dom": "^17.0.2", "react-longpressable": "^1.1.1", - "react-markdown": "^8.0.0", + "react-markdown": "^8.0.3", "react-string-replace": "^0.4.4", - "react-syntax-highlighter": "^15.4.3", - "react-textarea-autosize": "^8.3.3", + "react-syntax-highlighter": "^15.5.0", + "react-textarea-autosize": "^8.3.4", "react-twitter-embed": "^4.0.4", "react-youtube": "^7.14.0", - "recharts": "^2.1.10", + "recharts": "^2.1.16", "remark-directive": "^2.0.1", "remark-gfm": "^3.0.1", "remove-markdown": "^0.3.0", - "sass": "^1.32.8", - "secp256k1": "^4.0.2", - "swr": "^0.5.4", - "unist-util-visit": "^4.1.0", + "sass": "^1.56.0", + "secp256k1": "^4.0.3", + "swr": "^1.3.0", + "unist-util-visit": "^4.1.1", "use-dark-mode": "^2.3.1", "uuid": "^8.3.2", "webln": "^0.2.2", - "yup": "^0.32.9" + "yup": "^0.32.11" }, "engines": { "node": "14.17.0" }, "standard": { - "parser": "babel-eslint", + "parser": "@babel/eslint-parser", "plugins": [ "eslint-plugin-compat" ], @@ -82,9 +87,10 @@ } }, "devDependencies": { - "babel-eslint": "^10.1.0", - "eslint": "^7.29.0", - "eslint-plugin-compat": "^3.9.0", - "standard": "^16.0.3" + "@babel/core": "^7.20.2", + "@babel/eslint-parser": "^7.19.1", + "eslint": "^7.32.0", + "eslint-plugin-compat": "^4.0.2", + "standard": "^16.0.4" } } diff --git a/pages/_app.js b/pages/_app.js index e47989ee..fdb578e3 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -42,7 +42,7 @@ function MyApp ({ Component, pageProps: { session, ...props } }) { const client = getApolloClient() const router = useRouter() - useEffect(async () => { + useEffect(() => { // HACK: 'cause there's no way to tell Next to skip SSR // So every page load, we modify the route in browser history // to point to the same page but without SSR, ie ?nodata=true diff --git a/pages/api/capture/[[...path]].js b/pages/api/capture/[[...path]].js index 75f8fea4..5f71d93d 100644 --- a/pages/api/capture/[[...path]].js +++ b/pages/api/capture/[[...path]].js @@ -1,6 +1,6 @@ import path from 'path' import AWS from 'aws-sdk' -import {PassThrough} from 'stream' +import { PassThrough } from 'stream' const { spawn } = require('child_process') const encodeS3URI = require('node-s3-url-encode') @@ -9,7 +9,7 @@ const bucketRegion = 'us-east-1' const contentType = 'image/png' const bucketUrl = 'https://sn-capture.s3.amazonaws.com/' const s3PathPrefix = process.env.NODE_ENV === 'development' ? 'dev/' : '' -var capturing = false +let capturing = false AWS.config.update({ region: bucketRegion @@ -22,13 +22,13 @@ export default async function handler (req, res) { const s3PathPUT = s3PathPrefix + (joinedPath === '.' ? '_' : joinedPath) + searchQ const s3PathGET = s3PathPrefix + (joinedPath === '.' ? '_' : joinedPath) + encodeS3URI(searchQ) const url = process.env.PUBLIC_URL + '/' + joinedPath + searchQ - const aws = new AWS.S3({apiVersion: '2006-03-01'}) + const aws = new AWS.S3({ apiVersion: '2006-03-01' }) // check to see if we have a recent version of the object aws.headObject({ Bucket: bucketName, Key: s3PathPUT, - IfModifiedSince : new Date(new Date().getTime() - 15*60000) + IfModifiedSince: new Date(new Date().getTime() - 15 * 60000) }).promise().then(() => { // this path is cached so return it res.writeHead(302, { Location: bucketUrl + s3PathGET }).end() @@ -37,7 +37,7 @@ export default async function handler (req, res) { // we don't have it cached, so capture it and cache it if (capturing) { return res.writeHead(503, { - 'Retry-After' : 1 + 'Retry-After': 1 }).end() } @@ -53,7 +53,7 @@ export default async function handler (req, res) { res.setHeader('Content-Type', contentType) const capture = spawn( - 'node', ['./spawn/capture.js', url], {maxBuffer: 1024*1024*5}) + 'node', ['./spawn/capture.js', url], { maxBuffer: 1024 * 1024 * 5 }) capture.on('close', code => { if (code !== 0) { @@ -74,4 +74,4 @@ export default async function handler (req, res) { }) }) }) -} \ No newline at end of file +} diff --git a/pages/api/graphql.js b/pages/api/graphql.js index 5b575697..1134826c 100644 --- a/pages/api/graphql.js +++ b/pages/api/graphql.js @@ -51,4 +51,11 @@ export const config = { } } -export default apolloServer.createHandler({ path: '/api/graphql' }) +const startServer = apolloServer.start() + +export default async function handler (req, res) { + await startServer + await apolloServer.createHandler({ + path: '/api/graphql' + })(req, res) +} diff --git a/pages/wallet.js b/pages/wallet.js index c1cede09..ad3e5cbb 100644 --- a/pages/wallet.js +++ b/pages/wallet.js @@ -149,18 +149,21 @@ export function WithdrawlForm () { const [createWithdrawl, { called, error }] = useMutation(CREATE_WITHDRAWL) - useEffect(async () => { - try { - const provider = await requestProvider() - const { paymentRequest: invoice } = await provider.makeInvoice({ - defaultMemo: `Withdrawal for @${me.name} on SN`, - maximumAmount: Math.max(me.sats - MAX_FEE_DEFAULT, 0) - }) - const { data } = await createWithdrawl({ variables: { invoice, maxFee: MAX_FEE_DEFAULT } }) - router.push(`/withdrawals/${data.createWithdrawl.id}`) - } catch (e) { - console.log(e.message) + useEffect(() => { + async function effect () { + try { + const provider = await requestProvider() + const { paymentRequest: invoice } = await provider.makeInvoice({ + defaultMemo: `Withdrawal for @${me.name} on SN`, + maximumAmount: Math.max(me.sats - MAX_FEE_DEFAULT, 0) + }) + const { data } = await createWithdrawl({ variables: { invoice, maxFee: MAX_FEE_DEFAULT } }) + router.push(`/withdrawals/${data.createWithdrawl.id}`) + } catch (e) { + console.log(e.message) + } } + effect() }, []) if (called && !error) { @@ -228,15 +231,17 @@ function LnQRWith ({ k1, encodedUrl }) { export function LnWithdrawal () { // query for challenge - const [createAuth, { data, error }] = useMutation(gql` - mutation createAuth { + const [createWith, { data, error }] = useMutation(gql` + mutation createWith { createWith { k1 encodedUrl } }`) - useEffect(createAuth, []) + useEffect(() => { + createWith() + }, []) if (error) return
error
diff --git a/spawn/capture.js b/spawn/capture.js index fe59dd01..dd96ca04 100755 --- a/spawn/capture.js +++ b/spawn/capture.js @@ -1,11 +1,11 @@ #!/usr/bin/node -const Pageres = require('pageres') +import Pageres from 'pageres' async function captureUrl () { try { - const streams = await new Pageres({ crop: true, delay: 1, scale: 2, timeout: 10, launchOptions: { args: ['--single-process'] } }) - .src(process.argv[2], ['600x315']) + const streams = await new Pageres({ crop: true, scale: 2, timeout: 10, launchOptions: { args: ['--single-process'] } }) + .source(process.argv[2], ['600x315']) .run() process.stdout.write(streams[0], () => process.exit(0)) } catch (e) { diff --git a/spawn/package.json b/spawn/package.json new file mode 100644 index 00000000..aead43de --- /dev/null +++ b/spawn/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} \ No newline at end of file From 21083ef8cd266bac1d761007e81dad3c8ea0759e Mon Sep 17 00:00:00 2001 From: keyan Date: Sun, 6 Nov 2022 12:31:07 -0600 Subject: [PATCH 02/42] increase item path index siglen --- prisma/migrations/20220412190704_item_path_index/migration.sql | 2 +- prisma/migrations/20221106181637_item_path_index/migration.sql | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 prisma/migrations/20221106181637_item_path_index/migration.sql diff --git a/prisma/migrations/20220412190704_item_path_index/migration.sql b/prisma/migrations/20220412190704_item_path_index/migration.sql index f701cd03..2ec14089 100644 --- a/prisma/migrations/20220412190704_item_path_index/migration.sql +++ b/prisma/migrations/20220412190704_item_path_index/migration.sql @@ -1 +1 @@ -CREATE INDEX IF NOT EXISTS "item_gist_path_index" ON "Item" USING GIST ("path"); \ No newline at end of file +CREATE INDEX "item_gist_path_index" ON "Item" USING GIST ("path" gist_ltree_ops(siglen=2024)); \ No newline at end of file diff --git a/prisma/migrations/20221106181637_item_path_index/migration.sql b/prisma/migrations/20221106181637_item_path_index/migration.sql new file mode 100644 index 00000000..5dff7dd6 --- /dev/null +++ b/prisma/migrations/20221106181637_item_path_index/migration.sql @@ -0,0 +1,3 @@ +-- This is an empty migration. +DROP INDEX "Item.path_index"; +CREATE INDEX "Item.path_index" ON "Item" USING GIST ("path" gist_ltree_ops(siglen=2024)); From 13163232ecdbfae3178280db97e75c83adf86ecb Mon Sep 17 00:00:00 2001 From: keyan Date: Sun, 6 Nov 2022 12:31:07 -0600 Subject: [PATCH 03/42] update ltree extension --- .../migrations/20220412190704_item_path_index/migration.sql | 2 +- .../migrations/20221106181637_item_path_index/migration.sql | 3 +++ .../migrations/20221106184713_item_path_index/migration.sql | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 prisma/migrations/20221106181637_item_path_index/migration.sql create mode 100644 prisma/migrations/20221106184713_item_path_index/migration.sql diff --git a/prisma/migrations/20220412190704_item_path_index/migration.sql b/prisma/migrations/20220412190704_item_path_index/migration.sql index f701cd03..2ec14089 100644 --- a/prisma/migrations/20220412190704_item_path_index/migration.sql +++ b/prisma/migrations/20220412190704_item_path_index/migration.sql @@ -1 +1 @@ -CREATE INDEX IF NOT EXISTS "item_gist_path_index" ON "Item" USING GIST ("path"); \ No newline at end of file +CREATE INDEX "item_gist_path_index" ON "Item" USING GIST ("path" gist_ltree_ops(siglen=2024)); \ No newline at end of file diff --git a/prisma/migrations/20221106181637_item_path_index/migration.sql b/prisma/migrations/20221106181637_item_path_index/migration.sql new file mode 100644 index 00000000..5dff7dd6 --- /dev/null +++ b/prisma/migrations/20221106181637_item_path_index/migration.sql @@ -0,0 +1,3 @@ +-- This is an empty migration. +DROP INDEX "Item.path_index"; +CREATE INDEX "Item.path_index" ON "Item" USING GIST ("path" gist_ltree_ops(siglen=2024)); diff --git a/prisma/migrations/20221106184713_item_path_index/migration.sql b/prisma/migrations/20221106184713_item_path_index/migration.sql new file mode 100644 index 00000000..56ebbe27 --- /dev/null +++ b/prisma/migrations/20221106184713_item_path_index/migration.sql @@ -0,0 +1,4 @@ +-- This is an empty migration. +ALTER EXTENSION ltree UPDATE TO '1.2'; +DROP INDEX "Item.path_index"; +CREATE INDEX "Item.path_index" ON "Item" USING GIST ("path" gist_ltree_ops(siglen=2024)); \ No newline at end of file From 32651bea92804d2ea5c2b822fd8ba8036e9fc3d2 Mon Sep 17 00:00:00 2001 From: keyan Date: Sun, 6 Nov 2022 14:39:23 -0600 Subject: [PATCH 04/42] more indices --- .../20221106203216_item_indices/migration.sql | 14 ++++++++++++++ prisma/schema.prisma | 4 ++++ 2 files changed, 18 insertions(+) create mode 100644 prisma/migrations/20221106203216_item_indices/migration.sql diff --git a/prisma/migrations/20221106203216_item_indices/migration.sql b/prisma/migrations/20221106203216_item_indices/migration.sql new file mode 100644 index 00000000..7cd5b493 --- /dev/null +++ b/prisma/migrations/20221106203216_item_indices/migration.sql @@ -0,0 +1,14 @@ +-- CreateIndex +CREATE INDEX "Item.weightedVotes_index" ON "Item"("weightedVotes"); + +-- CreateIndex +CREATE INDEX "Item.weightedDownVotes_index" ON "Item"("weightedDownVotes"); + +-- CreateIndex +CREATE INDEX "Item.bio_index" ON "Item"("bio"); + +-- CreateIndex +CREATE INDEX "Item.freebie_index" ON "Item"("freebie"); + +-- CreateIndex +CREATE INDEX "Item.sumVotes_index" ON "Item"(("weightedVotes" - "weightedDownVotes")); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8b4eeba8..1ad3d5f8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -224,6 +224,10 @@ model Item { PollOption PollOption[] PollVote PollVote[] + @@index([weightedVotes]) + @@index([weightedDownVotes]) + @@index([bio]) + @@index([freebie]) @@index([createdAt]) @@index([userId]) @@index([parentId]) From f1a4e9c682286c8a43572c6672c57da0f57f6a35 Mon Sep 17 00:00:00 2001 From: keyan Date: Mon, 7 Nov 2022 17:31:29 -0600 Subject: [PATCH 05/42] poll for notifications less, don't retry gql --- api/resolvers/user.js | 220 +++++++++++++++++++++--------------------- api/ssrApollo.js | 4 +- api/typeDefs/user.js | 2 +- components/header.js | 10 +- fragments/users.js | 30 ------ lib/apollo.js | 14 +-- 6 files changed, 129 insertions(+), 151 deletions(-) diff --git a/api/resolvers/user.js b/api/resolvers/user.js index b4163775..f0e5dcec 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -149,6 +149,118 @@ export default { users } }, + hasNewNotes: async (parent, args, { me, models }) => { + if (!me) { + return false + } + const user = await models.user.findUnique({ where: { id: me.id } }) + const lastChecked = user.checkedNotesAt || new Date(0) + + // check if any votes have been cast for them since checkedNotesAt + if (user.noteItemSats) { + const votes = await models.$queryRaw(` + SELECT "ItemAct".id, "ItemAct".created_at + FROM "Item" + JOIN "ItemAct" on "ItemAct"."itemId" = "Item".id + WHERE "ItemAct"."userId" <> $1 + AND "ItemAct".created_at > $2 + AND "Item"."userId" = $1 + AND "ItemAct".act IN ('VOTE', 'TIP') + LIMIT 1`, me.id, lastChecked) + if (votes.length > 0) { + return true + } + } + + // check if they have any replies since checkedNotesAt + const newReplies = await models.$queryRaw(` + SELECT "Item".id, "Item".created_at + FROM "Item" + JOIN "Item" p ON ${user.noteAllDescendants ? '"Item".path <@ p.path' : '"Item"."parentId" = p.id'} + WHERE p."userId" = $1 + AND "Item".created_at > $2 AND "Item"."userId" <> $1 + ${await filterClause(me, models)} + LIMIT 1`, me.id, lastChecked) + if (newReplies.length > 0) { + return true + } + + // check if they have any mentions since checkedNotesAt + if (user.noteMentions) { + const newMentions = await models.$queryRaw(` + SELECT "Item".id, "Item".created_at + FROM "Mention" + JOIN "Item" ON "Mention"."itemId" = "Item".id + WHERE "Mention"."userId" = $1 + AND "Mention".created_at > $2 + AND "Item"."userId" <> $1 + LIMIT 1`, me.id, lastChecked) + if (newMentions.length > 0) { + return true + } + } + + const job = await models.item.findFirst({ + where: { + maxBid: { + not: null + }, + userId: me.id, + statusUpdatedAt: { + gt: lastChecked + } + } + }) + if (job) { + return true + } + + if (user.noteEarning) { + const earn = await models.earn.findFirst({ + where: { + userId: me.id, + createdAt: { + gt: lastChecked + }, + msats: { + gte: 1000 + } + } + }) + if (earn) { + return true + } + } + + if (user.noteDeposits) { + const invoice = await models.invoice.findFirst({ + where: { + userId: me.id, + confirmedAt: { + gt: lastChecked + } + } + }) + if (invoice) { + return true + } + } + + // check if new invites have been redeemed + if (user.noteInvites) { + const newInvitees = await models.$queryRaw(` + SELECT "Invite".id + FROM users JOIN "Invite" on users."inviteId" = "Invite".id + WHERE "Invite"."userId" = $1 + AND users.created_at > $2 + LIMIT 1`, me.id, lastChecked) + if (newInvitees.length > 0) { + return true + } + } + + return false + }, searchUsers: async (parent, { q, limit, similarity }, { models }) => { return await models.$queryRaw` SELECT * FROM users where id > 615 AND SIMILARITY(name, ${q}) > ${Number(similarity) || 0.1} ORDER BY SIMILARITY(name, ${q}) DESC LIMIT ${Number(limit) || 5}` @@ -362,114 +474,6 @@ export default { }).invites({ take: 1 }) return invites.length > 0 - }, - hasNewNotes: async (user, args, { me, models }) => { - const lastChecked = user.checkedNotesAt || new Date(0) - - // check if any votes have been cast for them since checkedNotesAt - if (user.noteItemSats) { - const votes = await models.$queryRaw(` - SELECT "ItemAct".id, "ItemAct".created_at - FROM "Item" - JOIN "ItemAct" on "ItemAct"."itemId" = "Item".id - WHERE "ItemAct"."userId" <> $1 - AND "ItemAct".created_at > $2 - AND "Item"."userId" = $1 - AND "ItemAct".act IN ('VOTE', 'TIP') - LIMIT 1`, me.id, lastChecked) - if (votes.length > 0) { - return true - } - } - - // check if they have any replies since checkedNotesAt - const newReplies = await models.$queryRaw(` - SELECT "Item".id, "Item".created_at - FROM "Item" - JOIN "Item" p ON ${user.noteAllDescendants ? '"Item".path <@ p.path' : '"Item"."parentId" = p.id'} - WHERE p."userId" = $1 - AND "Item".created_at > $2 AND "Item"."userId" <> $1 - ${await filterClause(me, models)} - LIMIT 1`, me.id, lastChecked) - if (newReplies.length > 0) { - return true - } - - // check if they have any mentions since checkedNotesAt - if (user.noteMentions) { - const newMentions = await models.$queryRaw(` - SELECT "Item".id, "Item".created_at - FROM "Mention" - JOIN "Item" ON "Mention"."itemId" = "Item".id - WHERE "Mention"."userId" = $1 - AND "Mention".created_at > $2 - AND "Item"."userId" <> $1 - LIMIT 1`, me.id, lastChecked) - if (newMentions.length > 0) { - return true - } - } - - const job = await models.item.findFirst({ - where: { - maxBid: { - not: null - }, - userId: me.id, - statusUpdatedAt: { - gt: lastChecked - } - } - }) - if (job) { - return true - } - - if (user.noteEarning) { - const earn = await models.earn.findFirst({ - where: { - userId: me.id, - createdAt: { - gt: lastChecked - }, - msats: { - gte: 1000 - } - } - }) - if (earn) { - return true - } - } - - if (user.noteDeposits) { - const invoice = await models.invoice.findFirst({ - where: { - userId: me.id, - confirmedAt: { - gt: lastChecked - } - } - }) - if (invoice) { - return true - } - } - - // check if new invites have been redeemed - if (user.noteInvites) { - const newInvitees = await models.$queryRaw(` - SELECT "Invite".id - FROM users JOIN "Invite" on users."inviteId" = "Invite".id - WHERE "Invite"."userId" = $1 - AND users.created_at > $2 - LIMIT 1`, me.id, lastChecked) - if (newInvitees.length > 0) { - return true - } - } - - return false } } } diff --git a/api/ssrApollo.js b/api/ssrApollo.js index c13792d5..3931c76d 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -8,7 +8,7 @@ import models from './models' import { print } from 'graphql' import lnd from './lnd' import search from './search' -import { ME_SSR } from '../fragments/users' +import { ME } from '../fragments/users' import { getPrice } from '../components/price' export default async function getSSRApolloClient (req, me = null) { @@ -40,7 +40,7 @@ export function getGetServerSideProps (query, variables = null, notFoundFunc, re const client = await getSSRApolloClient(req) const { data: { me } } = await client.query({ - query: ME_SSR + query: ME }) const price = await getPrice(me?.fiatCurrency) diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index f2c260c7..c6fffb6a 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -9,6 +9,7 @@ export default gql` nameAvailable(name: String!): Boolean! topUsers(cursor: String, when: String, sort: String): Users searchUsers(q: String!, limit: Int, similarity: Float): [User!]! + hasNewNotes: Boolean! } type Users { @@ -46,7 +47,6 @@ export default gql` spent(when: String): Int! freePosts: Int! freeComments: Int! - hasNewNotes: Boolean! hasInvites: Boolean! tipDefault: Int! fiatCurrency: String! diff --git a/components/header.js b/components/header.js index 1580dcfb..6e34a2b2 100644 --- a/components/header.js +++ b/components/header.js @@ -35,7 +35,11 @@ export default function Header ({ sub }) { subLatestPost(name: $name) } `, { variables: { name: 'jobs' }, pollInterval: 600000, fetchPolicy: 'network-only' }) - + const { data: hasNewNotes } = useQuery(gql` + { + hasNewNotes + } + `, { pollInterval: 30000, fetchPolicy: 'cache-and-network' }) const [lastCheckedJobs, setLastCheckedJobs] = useState(new Date().getTime()) useEffect(() => { if (me) { @@ -53,12 +57,12 @@ export default function Header ({ sub }) { return (
- + - {me?.hasNewNotes && + {hasNewNotes?.hasNewNotes && {' '} } diff --git a/fragments/users.js b/fragments/users.js index db4e1e16..5b98bc98 100644 --- a/fragments/users.js +++ b/fragments/users.js @@ -3,36 +3,6 @@ import { COMMENT_FIELDS } from './comments' import { ITEM_FIELDS, ITEM_WITH_COMMENTS } from './items' export const ME = gql` - { - me { - id - name - sats - stacked - freePosts - freeComments - hasNewNotes - tipDefault - fiatCurrency - bioId - hasInvites - upvotePopover - tipPopover - noteItemSats - noteEarning - noteAllDescendants - noteMentions - noteDeposits - noteInvites - noteJobIndicator - hideInvoiceDesc - wildWestMode - greeterMode - lastCheckedJobs - } - }` - -export const ME_SSR = gql` { me { id diff --git a/lib/apollo.js b/lib/apollo.js index 5829c368..291e3d2f 100644 --- a/lib/apollo.js +++ b/lib/apollo.js @@ -1,11 +1,11 @@ -import { ApolloClient, InMemoryCache, from, HttpLink } from '@apollo/client' +import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client' import { decodeCursor, LIMIT } from './cursor' -import { RetryLink } from '@apollo/client/link/retry' +// import { RetryLink } from '@apollo/client/link/retry' -const additiveLink = from([ - new RetryLink(), - new HttpLink({ uri: '/api/graphql' }) -]) +// const additiveLink = from([ +// new RetryLink(), +// new HttpLink({ uri: '/api/graphql' }) +// ]) function isFirstPage (cursor, existingThings) { if (cursor) { @@ -20,7 +20,7 @@ function isFirstPage (cursor, existingThings) { export default function getApolloClient () { global.apolloClient ||= new ApolloClient({ - link: additiveLink, + link: new HttpLink({ uri: '/api/graphql' }), cache: new InMemoryCache({ typePolicies: { Query: { From e79f39274b9e4187b4fe1407c9c3f7ab31c87b93 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 8 Nov 2022 13:24:15 -0600 Subject: [PATCH 06/42] puppeteer config --- .puppeteerrc.cjs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .puppeteerrc.cjs diff --git a/.puppeteerrc.cjs b/.puppeteerrc.cjs new file mode 100644 index 00000000..a7021076 --- /dev/null +++ b/.puppeteerrc.cjs @@ -0,0 +1,9 @@ +const {join} = require('path'); + +/** + * @type {import("puppeteer").Configuration} + */ +module.exports = { + // Changes the cache location for Puppeteer. + cacheDirectory: join(__dirname, '.cache', 'puppeteer'), +}; \ No newline at end of file From bcdd5410a3f24534e6b29856c3cfd94b33b2f6a9 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 15 Nov 2022 14:51:55 -0600 Subject: [PATCH 07/42] sats to msats --- api/resolvers/growth.js | 36 +- api/resolvers/item.js | 30 +- api/resolvers/notifications.js | 2 +- api/resolvers/user.js | 25 +- api/resolvers/wallet.js | 23 +- api/typeDefs/wallet.js | 10 +- components/invoice.js | 2 +- components/text.js | 42 +- fragments/wallet.js | 6 +- lib/format.js | 7 + pages/_app.js | 10 +- pages/invoices/[id].js | 5 +- pages/satistics.js | 2 +- .../20221110190205_msats_bigint/migration.sql | 43 ++ .../20221110224543_msats_funcs/migration.sql | 376 ++++++++++++++++++ prisma/schema.prisma | 30 +- worker/earn.js | 9 +- 17 files changed, 546 insertions(+), 112 deletions(-) create mode 100644 prisma/migrations/20221110190205_msats_bigint/migration.sql create mode 100644 prisma/migrations/20221110224543_msats_funcs/migration.sql diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 3b03b385..7793a759 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -33,10 +33,10 @@ export default { return await models.$queryRaw( `SELECT date_trunc('month', "ItemAct".created_at) AS time, - sum(CASE WHEN act = 'STREAM' THEN "ItemAct".sats ELSE 0 END) as jobs, - sum(CASE WHEN act IN ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".sats ELSE 0 END) as fees, - sum(CASE WHEN act = 'BOOST' THEN "ItemAct".sats ELSE 0 END) as boost, - sum(CASE WHEN act = 'TIP' THEN "ItemAct".sats ELSE 0 END) as tips + floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000) as jobs, + floor(sum(CASE WHEN act IN ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".msats ELSE 0 END)/1000) as fees, + floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000) as boost, + floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000) as tips FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) @@ -60,17 +60,17 @@ export default { }, stackedGrowth: async (parent, args, { models }) => { return await models.$queryRaw( - `SELECT time, sum(airdrop) as rewards, sum(post) as posts, sum(comment) as comments + `SELECT time, floor(sum(airdrop)/1000) as rewards, floor(sum(post)/1000) as posts, floor(sum(comment)/1000) as comments FROM ((SELECT date_trunc('month', "ItemAct".created_at) AS time, 0 as airdrop, - CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".sats END as comment, - CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".sats ELSE 0 END as post + CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".msats END as comment, + CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) AND "ItemAct".act IN ('VOTE', 'TIP')) UNION ALL - (SELECT date_trunc('month', created_at) AS time, msats / 1000 as airdrop, 0 as post, 0 as comment + (SELECT date_trunc('month', created_at) AS time, msats as airdrop, 0 as post, 0 as comment FROM "Earn" WHERE date_trunc('month', now_utc()) <> date_trunc('month', created_at))) u GROUP BY time @@ -121,10 +121,10 @@ export default { spentWeekly: async (parent, args, { models }) => { const [stats] = await models.$queryRaw( `SELECT json_build_array( - json_build_object('name', 'jobs', 'value', sum(CASE WHEN act = 'STREAM' THEN "ItemAct".sats ELSE 0 END)), - json_build_object('name', 'fees', 'value', sum(CASE WHEN act in ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".sats ELSE 0 END)), - json_build_object('name', 'boost', 'value', sum(CASE WHEN act = 'BOOST' THEN "ItemAct".sats ELSE 0 END)), - json_build_object('name', 'tips', 'value', sum(CASE WHEN act = 'TIP' THEN "ItemAct".sats ELSE 0 END))) as array + json_build_object('name', 'jobs', 'value', floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'fees', 'value', floor(sum(CASE WHEN act in ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'boost', 'value',floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'tips', 'value', floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000))) as array FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE "ItemAct".created_at >= now_utc() - interval '1 week'`) @@ -134,20 +134,20 @@ export default { stackedWeekly: async (parent, args, { models }) => { const [stats] = await models.$queryRaw( `SELECT json_build_array( - json_build_object('name', 'rewards', 'value', sum(airdrop)), - json_build_object('name', 'posts', 'value', sum(post)), - json_build_object('name', 'comments', 'value', sum(comment)) + json_build_object('name', 'rewards', 'value', floor(sum(airdrop)/1000)), + json_build_object('name', 'posts', 'value', floor(sum(post)/1000)), + json_build_object('name', 'comments', 'value', floor(sum(comment)/1000)) ) as array FROM ((SELECT 0 as airdrop, - CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".sats END as comment, - CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".sats ELSE 0 END as post + CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".msats END as comment, + CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" WHERE "ItemAct".created_at >= now_utc() - interval '1 week' AND "ItemAct".act IN ('VOTE', 'TIP')) UNION ALL - (SELECT msats / 1000 as airdrop, 0 as post, 0 as comment + (SELECT msats as airdrop, 0 as post, 0 as comment FROM "Earn" WHERE created_at >= now_utc() - interval '1 week')) u`) diff --git a/api/resolvers/item.js b/api/resolvers/item.js index 302f1441..550d3eda 100644 --- a/api/resolvers/item.js +++ b/api/resolvers/item.js @@ -8,6 +8,7 @@ import { BOOST_MIN, ITEM_SPAM_INTERVAL, MAX_POLL_NUM_CHOICES, MAX_TITLE_LENGTH, ITEM_FILTER_THRESHOLD, DONT_LIKE_THIS_COST } from '../../lib/constants' +import { msatsToSats } from '../../lib/format' async function comments (me, models, id, sort) { let orderBy @@ -74,7 +75,7 @@ async function topOrderClause (sort, me, models) { case 'comments': return 'ORDER BY ncomments DESC' case 'sats': - return 'ORDER BY sats DESC' + return 'ORDER BY msats DESC' default: return await topOrderByWeightedSats(me, models) } @@ -690,6 +691,12 @@ export default { } }, Item: { + sats: async (item, args, { models }) => { + return msatsToSats(item.msats) + }, + commentSats: async (item, args, { models }) => { + return msatsToSats(item.commentMsats) + }, isJob: async (item, args, { models }) => { return item.subName === 'jobs' }, @@ -771,10 +778,7 @@ export default { return comments(me, models, item.id, 'hot') }, upvotes: async (item, args, { models }) => { - const { sum: { sats } } = await models.itemAct.aggregate({ - sum: { - sats: true - }, + const count = await models.itemAct.count({ where: { itemId: Number(item.id), userId: { @@ -784,12 +788,12 @@ export default { } }) - return sats || 0 + return count }, boost: async (item, args, { models }) => { - const { sum: { sats } } = await models.itemAct.aggregate({ + const { sum: { msats } } = await models.itemAct.aggregate({ sum: { - sats: true + msats: true }, where: { itemId: Number(item.id), @@ -797,7 +801,7 @@ export default { } }) - return sats || 0 + return (msats && msatsToSats(msats)) || 0 }, wvotes: async (item) => { return item.weightedVotes - item.weightedDownVotes @@ -805,9 +809,9 @@ export default { meSats: async (item, args, { me, models }) => { if (!me) return 0 - const { sum: { sats } } = await models.itemAct.aggregate({ + const { sum: { msats } } = await models.itemAct.aggregate({ sum: { - sats: true + msats: true }, where: { itemId: Number(item.id), @@ -823,7 +827,7 @@ export default { } }) - return sats || 0 + return (msats && msatsToSats(msats)) || 0 }, meDontLike: async (item, args, { me, models }) => { if (!me) return false @@ -1010,7 +1014,7 @@ export const SELECT = "Item".text, "Item".url, "Item"."userId", "Item"."fwdUserId", "Item"."parentId", "Item"."pinId", "Item"."maxBid", "Item".company, "Item".location, "Item".remote, "Item"."subName", "Item".status, "Item"."uploadId", "Item"."pollCost", - "Item".sats, "Item".ncomments, "Item"."commentSats", "Item"."lastCommentAt", "Item"."weightedVotes", + "Item".msats, "Item".ncomments, "Item"."commentMsats", "Item"."lastCommentAt", "Item"."weightedVotes", "Item"."weightedDownVotes", "Item".freebie, ltree2text("Item"."path") AS "path"` async function newTimedOrderByWeightedSats (me, models, num) { diff --git a/api/resolvers/notifications.js b/api/resolvers/notifications.js index 7e630494..79272e86 100644 --- a/api/resolvers/notifications.js +++ b/api/resolvers/notifications.js @@ -106,7 +106,7 @@ export default { if (meFull.noteItemSats) { queries.push( `(SELECT "Item".id::TEXT, MAX("ItemAct".created_at) AS "sortTime", - sum("ItemAct".sats) as "earnedSats", 'Votification' AS type + floor(sum("ItemAct".msats)/1000) as "earnedSats", 'Votification' AS type FROM "Item" JOIN "ItemAct" ON "ItemAct"."itemId" = "Item".id WHERE "ItemAct"."userId" <> $1 diff --git a/api/resolvers/user.js b/api/resolvers/user.js index f0e5dcec..b9691616 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -1,5 +1,6 @@ import { AuthenticationError, UserInputError } from 'apollo-server-errors' import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor' +import { msatsToSats } from '../../lib/format' import { createMentions, getItem, SELECT, updateItem, filterClause } from './item' import serialize from './serial' @@ -92,7 +93,7 @@ export default { let users if (sort === 'spent') { users = await models.$queryRaw(` - SELECT users.*, sum("ItemAct".sats) as spent + SELECT users.*, floor(sum("ItemAct".msats)/1000) as spent FROM "ItemAct" JOIN users on "ItemAct"."userId" = users.id WHERE "ItemAct".created_at <= $1 @@ -125,16 +126,16 @@ export default { LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) } else { users = await models.$queryRaw(` - SELECT u.id, u.name, u."photoId", sum(amount) as stacked + SELECT u.id, u.name, u."photoId", floor(sum(amount)/1000) as stacked FROM - ((SELECT users.*, "ItemAct".sats as amount + ((SELECT users.*, "ItemAct".msats as amount FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id JOIN users on "Item"."userId" = users.id WHERE act <> 'BOOST' AND "ItemAct"."userId" <> users.id AND "ItemAct".created_at <= $1 ${within('ItemAct', when)}) UNION ALL - (SELECT users.*, "Earn".msats/1000 as amount + (SELECT users.*, "Earn".msats as amount FROM "Earn" JOIN users on users.id = "Earn"."userId" WHERE "Earn".msats > 0 ${within('Earn', when)})) u @@ -422,22 +423,22 @@ export default { if (!when) { // forever - return Math.floor((user.stackedMsats || 0) / 1000) + return (user.stackedMsats && msatsToSats(user.stackedMsats)) || 0 } else { const [{ stacked }] = await models.$queryRaw(` SELECT sum(amount) as stacked FROM - ((SELECT sum("ItemAct".sats) as amount + ((SELECT sum("ItemAct".msats) as amount FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE act <> 'BOOST' AND "ItemAct"."userId" <> $2 AND "Item"."userId" = $2 AND "ItemAct".created_at >= $1) UNION ALL - (SELECT sum("Earn".msats/1000) as amount + (SELECT sum("Earn".msats) as amount FROM "Earn" WHERE "Earn".msats > 0 AND "Earn"."userId" = $2 AND "Earn".created_at >= $1)) u`, withinDate(when), Number(user.id)) - return stacked || 0 + return (stacked && msatsToSats(stacked)) || 0 } }, spent: async (user, { when }, { models }) => { @@ -445,9 +446,9 @@ export default { return user.spent } - const { sum: { sats } } = await models.itemAct.aggregate({ + const { sum: { msats } } = await models.itemAct.aggregate({ sum: { - sats: true + msats: true }, where: { userId: user.id, @@ -457,13 +458,13 @@ export default { } }) - return sats || 0 + return (msats && msatsToSats(msats)) || 0 }, sats: async (user, args, { models, me }) => { if (me?.id !== user.id) { return 0 } - return Math.floor(user.msats / 1000.0) + return msatsToSats(user.msats) }, bio: async (user, args, { models }) => { return getItem(user, { id: user.bioId }, { models }) diff --git a/api/resolvers/wallet.js b/api/resolvers/wallet.js index c9724cee..4e8a98f6 100644 --- a/api/resolvers/wallet.js +++ b/api/resolvers/wallet.js @@ -5,6 +5,7 @@ import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor' import lnpr from 'bolt11' import { SELECT } from './item' import { lnurlPayDescriptionHash } from '../../lib/lnurl' +import { msatsToSats } from '../../lib/format' export async function getInvoice (parent, { id }, { me, models }) { if (!me) { @@ -93,7 +94,7 @@ export default { if (include.has('stacked')) { queries.push( `(SELECT ('stacked' || "Item".id) as id, "Item".id as "factId", NULL as bolt11, - MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".sats) * 1000 as msats, + MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".msats) as msats, 0 as "msatsFee", NULL as status, 'stacked' as type FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id @@ -114,7 +115,7 @@ export default { if (include.has('spent')) { queries.push( `(SELECT ('spent' || "Item".id) as id, "Item".id as "factId", NULL as bolt11, - MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".sats) * 1000 as msats, + MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".msats) as msats, 0 as "msatsFee", NULL as status, 'spent' as type FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id @@ -254,10 +255,14 @@ export default { }, Withdrawl: { - satsPaying: w => Math.floor(w.msatsPaying / 1000), - satsPaid: w => Math.floor(w.msatsPaid / 1000), - satsFeePaying: w => Math.floor(w.msatsFeePaying / 1000), - satsFeePaid: w => Math.floor(w.msatsFeePaid / 1000) + satsPaying: w => msatsToSats(w.msatsPaying), + satsPaid: w => msatsToSats(w.msatsPaid), + satsFeePaying: w => msatsToSats(w.msatsFeePaying), + satsFeePaid: w => msatsToSats(w.msatsFeePaid) + }, + + Invoice: { + satsReceived: i => msatsToSats(i.msatsReceived) }, Fact: { @@ -271,7 +276,9 @@ export default { WHERE id = $1`, Number(fact.factId)) return item - } + }, + sats: fact => msatsToSats(fact.msats), + satsFee: fact => msatsToSats(fact.msatsFee) } } @@ -285,7 +292,7 @@ async function createWithdrawal (parent, { invoice, maxFee }, { me, models, lnd throw new UserInputError('could not decode invoice') } - if (!decoded.mtokens || Number(decoded.mtokens) <= 0) { + if (!decoded.mtokens || BigInt(decoded.mtokens) <= 0) { throw new UserInputError('your invoice must specify an amount') } diff --git a/api/typeDefs/wallet.js b/api/typeDefs/wallet.js index 8d955a4d..5b4d3303 100644 --- a/api/typeDefs/wallet.js +++ b/api/typeDefs/wallet.js @@ -21,7 +21,7 @@ export default gql` expiresAt: String! cancelled: Boolean! confirmedAt: String - msatsReceived: Int + satsReceived: Int } type Withdrawl { @@ -29,13 +29,9 @@ export default gql` createdAt: String! hash: String! bolt11: String! - msatsPaying: Int! satsPaying: Int! - msatsPaid: Int satsPaid: Int - msatsFeePaying: Int! satsFeePaying: Int! - msatsFeePaid: Int satsFeePaid: Int status: String } @@ -45,8 +41,8 @@ export default gql` factId: ID! bolt11: String createdAt: String! - msats: Int! - msatsFee: Int + sats: Int! + satsFee: Int status: String type: String! description: String diff --git a/components/invoice.js b/components/invoice.js index 707a4a21..677f83da 100644 --- a/components/invoice.js +++ b/components/invoice.js @@ -5,7 +5,7 @@ export function Invoice ({ invoice }) { let status = 'waiting for you' if (invoice.confirmedAt) { variant = 'confirmed' - status = `${invoice.msatsReceived / 1000} sats deposited` + status = `${invoice.satsReceived} sats deposited` } else if (invoice.cancelled) { variant = 'failed' status = 'cancelled' diff --git a/components/text.js b/components/text.js index 282fc6bc..77fb035c 100644 --- a/components/text.js +++ b/components/text.js @@ -12,7 +12,7 @@ import React, { useEffect, useState } from 'react' import GithubSlugger from 'github-slugger' import LinkIcon from '../svgs/link.svg' import Thumb from '../svgs/thumb-up-fill.svg' -import {toString} from 'mdast-util-to-string' +import { toString } from 'mdast-util-to-string' import copy from 'clipboard-copy' function myRemarkPlugin () { @@ -32,8 +32,6 @@ function myRemarkPlugin () { } } - - function Heading ({ h, slugger, noFragments, topLevel, children, node, ...props }) { const [copied, setCopied] = useState(false) const [id] = useState(noFragments ? undefined : slugger.slug(toString(node).replace(/[^\w\-\s]+/gi, ''))) @@ -44,20 +42,20 @@ function Heading ({ h, slugger, noFragments, topLevel, children, node, ...props ) } @@ -66,7 +64,7 @@ export default function Text ({ topLevel, noFragments, nofollow, children }) { // all the reactStringReplace calls are to facilitate search highlighting const slugger = new GithubSlugger() - const HeadingWrapper = (props) => Heading({ topLevel, slugger, noFragments, ...props}) + const HeadingWrapper = (props) => Heading({ topLevel, slugger, noFragments, ...props }) return (
@@ -108,10 +106,10 @@ export default function Text ({ topLevel, noFragments, nofollow, children }) { // map: fix any highlighted links children = children?.map(e => typeof e === 'string' - ? reactStringReplace(e, /:high\[([^\]]+)\]/g, (match, i) => { - return {match} - }) - : e) + ? reactStringReplace(e, /:high\[([^\]]+)\]/g, (match, i) => { + return {match} + }) + : e) return ( /* eslint-disable-next-line */ diff --git a/fragments/wallet.js b/fragments/wallet.js index bdf02e70..93a5b57e 100644 --- a/fragments/wallet.js +++ b/fragments/wallet.js @@ -7,7 +7,7 @@ export const INVOICE = gql` invoice(id: $id) { id bolt11 - msatsReceived + satsReceived cancelled confirmedAt expiresAt @@ -40,8 +40,8 @@ export const WALLET_HISTORY = gql` factId type createdAt - msats - msatsFee + sats + satsFee status type description diff --git a/lib/format.js b/lib/format.js index 7cb2f1d4..d312eb9e 100644 --- a/lib/format.js +++ b/lib/format.js @@ -9,3 +9,10 @@ export const abbrNum = n => { export const fixedDecimal = (n, f) => { return Number.parseFloat(n).toFixed(f) } + +export const msatsToSats = msats => { + if (msats === null || msats === undefined) { + return null + } + return Number(BigInt(msats) / 1000n) +} diff --git a/pages/_app.js b/pages/_app.js index fdb578e3..e9a3c6d7 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -49,10 +49,12 @@ function MyApp ({ Component, pageProps: { session, ...props } }) { // this nodata var will get passed to the server on back/foward and // 1. prevent data from reloading and 2. perserve scroll // (2) is not possible while intercepting nav with beforePopState - router.replace({ - pathname: router.pathname, - query: { ...router.query, nodata: true } - }, router.asPath, { ...router.options, scroll: false }) + if (router.isReady) { + router.replace({ + pathname: router.pathname, + query: { ...router.query, nodata: true } + }, router.asPath, { ...router.options, scroll: false }) + } }, [router.asPath]) /* diff --git a/pages/invoices/[id].js b/pages/invoices/[id].js index 909e8d4f..5a6812e8 100644 --- a/pages/invoices/[id].js +++ b/pages/invoices/[id].js @@ -19,7 +19,10 @@ function LoadInvoice () { pollInterval: 1000, variables: { id: router.query.id } }) - if (error) return
error
+ if (error) { + console.log(error) + return
error
+ } if (!data || loading) { return } diff --git a/pages/satistics.js b/pages/satistics.js index 5b550773..bea223cd 100644 --- a/pages/satistics.js +++ b/pages/satistics.js @@ -213,7 +213,7 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor - {Math.floor(f.msats / 1000)} + {Math.floor(f.sats)} ) diff --git a/prisma/migrations/20221110190205_msats_bigint/migration.sql b/prisma/migrations/20221110190205_msats_bigint/migration.sql new file mode 100644 index 00000000..8eb94638 --- /dev/null +++ b/prisma/migrations/20221110190205_msats_bigint/migration.sql @@ -0,0 +1,43 @@ +-- AlterTable +ALTER TABLE "Earn" ALTER COLUMN "msats" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "Invoice" ALTER COLUMN "msatsRequested" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsReceived" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "Item" +ALTER COLUMN "commentSats" SET DATA TYPE BIGINT, +ALTER COLUMN "sats" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "Item" RENAME COLUMN "commentSats" TO "commentMsats"; +ALTER TABLE "Item" RENAME COLUMN "sats" TO "msats"; + +-- update to msats +UPDATE "Item" SET +"commentMsats" = "commentMsats" * 1000, +"msats" = "msats" * 1000; + +-- AlterTable +ALTER TABLE "ItemAct" +ALTER COLUMN "sats" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "ItemAct" RENAME COLUMN "sats" TO "msats"; + +-- update to msats +UPDATE "ItemAct" SET +"msats" = "msats" * 1000; + +-- AlterTable +ALTER TABLE "Withdrawl" ALTER COLUMN "msatsPaying" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsPaid" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsFeePaying" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsFeePaid" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "users" ALTER COLUMN "msats" SET DEFAULT 0, +ALTER COLUMN "msats" SET DATA TYPE BIGINT, +ALTER COLUMN "stackedMsats" SET DEFAULT 0, +ALTER COLUMN "stackedMsats" SET DATA TYPE BIGINT; \ No newline at end of file diff --git a/prisma/migrations/20221110224543_msats_funcs/migration.sql b/prisma/migrations/20221110224543_msats_funcs/migration.sql new file mode 100644 index 00000000..1be0d18f --- /dev/null +++ b/prisma/migrations/20221110224543_msats_funcs/migration.sql @@ -0,0 +1,376 @@ +-- item_act should take sats but treat them as msats +CREATE OR REPLACE FUNCTION item_act(item_id INTEGER, user_id INTEGER, act "ItemActType", act_sats INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + act_msats BIGINT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + act_msats := act_sats * 1000; + SELECT msats INTO user_msats FROM users WHERE id = user_id; + IF act_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + + -- deduct msats from actor + UPDATE users SET msats = msats - act_msats WHERE id = user_id; + + IF act = 'VOTE' OR act = 'TIP' THEN + -- add sats to actee's balance and stacked count + UPDATE users + SET msats = msats + act_msats, "stackedMsats" = "stackedMsats" + act_msats + WHERE id = (SELECT COALESCE("fwdUserId", "userId") FROM "Item" WHERE id = item_id); + + -- if they have already voted, this is a tip + IF EXISTS (SELECT 1 FROM "ItemAct" WHERE "itemId" = item_id AND "userId" = user_id AND "ItemAct".act = 'VOTE') THEN + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, 'TIP', now_utc(), now_utc()); + ELSE + -- else this is a vote with a possible extra tip + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (1000, item_id, user_id, 'VOTE', now_utc(), now_utc()); + act_msats := act_msats - 1000; + + -- if we have sats left after vote, leave them as a tip + IF act_msats > 0 THEN + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, 'TIP', now_utc(), now_utc()); + END IF; + + RETURN 1; + END IF; + ELSE -- BOOST, POLL, DONT_LIKE_THIS + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, act, now_utc(), now_utc()); + END IF; + + RETURN 0; +END; +$$; + +-- when creating free item, set freebie flag so can be optionally viewed +CREATE OR REPLACE FUNCTION create_item( + title TEXT, url TEXT, text TEXT, boost INTEGER, + parent_id INTEGER, user_id INTEGER, fwd_user_id INTEGER, + spam_within INTERVAL) +RETURNS "Item" +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + cost_msats BIGINT; + free_posts INTEGER; + free_comments INTEGER; + freebie BOOLEAN; + item "Item"; + med_votes FLOAT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats, "freePosts", "freeComments" + INTO user_msats, free_posts, free_comments + FROM users WHERE id = user_id; + + cost_msats := 1000 * POWER(10, item_spam(parent_id, user_id, spam_within)); + -- it's only a freebie if it's a 1 sat cost, they have < 1 sat, boost = 0, and they have freebies left + freebie := (cost_msats <= 1000) AND (user_msats < 1000) AND (boost = 0) AND ((parent_id IS NULL AND free_posts > 0) OR (parent_id IS NOT NULL AND free_comments > 0)); + + IF NOT freebie AND cost_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + -- get this user's median item score + SELECT COALESCE(percentile_cont(0.5) WITHIN GROUP(ORDER BY "weightedVotes" - "weightedDownVotes"), 0) INTO med_votes FROM "Item" WHERE "userId" = user_id; + + -- if their median votes are positive, start at 0 + -- if the median votes are negative, start their post with that many down votes + -- basically: if their median post is bad, presume this post is too + IF med_votes >= 0 THEN + med_votes := 0; + ELSE + med_votes := ABS(med_votes); + END IF; + + INSERT INTO "Item" (title, url, text, "userId", "parentId", "fwdUserId", freebie, "weightedDownVotes", created_at, updated_at) + VALUES (title, url, text, user_id, parent_id, fwd_user_id, freebie, med_votes, now_utc(), now_utc()) RETURNING * INTO item; + + IF freebie THEN + IF parent_id IS NULL THEN + UPDATE users SET "freePosts" = "freePosts" - 1 WHERE id = user_id; + ELSE + UPDATE users SET "freeComments" = "freeComments" - 1 WHERE id = user_id; + END IF; + ELSE + UPDATE users SET msats = msats - cost_msats WHERE id = user_id; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (cost_msats, item.id, user_id, 'VOTE', now_utc(), now_utc()); + END IF; + + IF boost > 0 THEN + PERFORM item_act(item.id, user_id, 'BOOST', boost); + END IF; + + RETURN item; +END; +$$; + +CREATE OR REPLACE FUNCTION run_auction(item_id INTEGER) RETURNS void AS $$ + DECLARE + bid_msats BIGINT; + user_msats BIGINT; + user_id INTEGER; + item_status "Status"; + status_updated_at timestamp(3); + BEGIN + PERFORM ASSERT_SERIALIZED(); + + -- extract data we need + SELECT "maxBid" * 1000, "userId", status, "statusUpdatedAt" INTO bid_msats, user_id, item_status, status_updated_at FROM "Item" WHERE id = item_id; + SELECT msats INTO user_msats FROM users WHERE id = user_id; + + -- 0 bid items expire after 30 days unless updated + IF bid_msats = 0 THEN + IF item_status <> 'STOPPED' THEN + IF status_updated_at < now_utc() - INTERVAL '30 days' THEN + UPDATE "Item" SET status = 'STOPPED', "statusUpdatedAt" = now_utc() WHERE id = item_id; + ELSEIF item_status = 'NOSATS' THEN + UPDATE "Item" SET status = 'ACTIVE' WHERE id = item_id; + END IF; + END IF; + RETURN; + END IF; + + -- check if user wallet has enough sats + IF bid_msats > user_msats THEN + -- if not, set status = NOSATS and statusUpdatedAt to now_utc if not already set + IF item_status <> 'NOSATS' THEN + UPDATE "Item" SET status = 'NOSATS', "statusUpdatedAt" = now_utc() WHERE id = item_id; + END IF; + ELSE + -- if so, deduct from user + UPDATE users SET msats = msats - bid_msats WHERE id = user_id; + + -- create an item act + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (bid_msats, item_id, user_id, 'STREAM', now_utc(), now_utc()); + + -- update item status = ACTIVE and statusUpdatedAt = now_utc if NOSATS + IF item_status = 'NOSATS' THEN + UPDATE "Item" SET status = 'ACTIVE', "statusUpdatedAt" = now_utc() WHERE id = item_id; + END IF; + END IF; + END; +$$ LANGUAGE plpgsql; + + +-- on item act denormalize sats and comment sats +CREATE OR REPLACE FUNCTION sats_after_act() RETURNS TRIGGER AS $$ +DECLARE + item "Item"; +BEGIN + SELECT * FROM "Item" WHERE id = NEW."itemId" INTO item; + IF item."userId" = NEW."userId" THEN + RETURN NEW; + END IF; + + UPDATE "Item" + SET "msats" = "msats" + NEW.msats + WHERE id = item.id; + + UPDATE "Item" + SET "commentMsats" = "commentMsats" + NEW.msats + WHERE id <> item.id and path @> item.path; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS sats_after_act_trigger ON "ItemAct"; +CREATE TRIGGER sats_after_act_trigger + AFTER INSERT ON "ItemAct" + FOR EACH ROW + WHEN (NEW.act = 'VOTE' or NEW.act = 'TIP') + EXECUTE PROCEDURE sats_after_act(); + +CREATE OR REPLACE FUNCTION boost_after_act() RETURNS TRIGGER AS $$ +BEGIN + -- update item + UPDATE "Item" SET boost = boost + FLOOR(NEW.msats / 1000) WHERE id = NEW."itemId"; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS boost_after_act ON "ItemAct"; +CREATE TRIGGER boost_after_act + AFTER INSERT ON "ItemAct" + FOR EACH ROW + WHEN (NEW.act = 'BOOST') + EXECUTE PROCEDURE boost_after_act(); + +DROP FUNCTION IF EXISTS create_invoice(TEXT, TEXT, timestamp(3) without time zone, INTEGER, INTEGER); +CREATE OR REPLACE FUNCTION create_invoice(hash TEXT, bolt11 TEXT, expires_at timestamp(3) without time zone, msats_req BIGINT, user_id INTEGER) +RETURNS "Invoice" +LANGUAGE plpgsql +AS $$ +DECLARE + invoice "Invoice"; + limit_reached BOOLEAN; + too_much BOOLEAN; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT count(*) >= 10, coalesce(sum("msatsRequested"),0)+coalesce(max(users.msats), 0)+msats_req > 1000000000 INTO limit_reached, too_much + FROM "Invoice" + JOIN users on "userId" = users.id + WHERE "userId" = user_id AND "expiresAt" > now_utc() AND "confirmedAt" is null AND cancelled = false; + + -- prevent more than 10 pending invoices + IF limit_reached THEN + RAISE EXCEPTION 'SN_INV_PENDING_LIMIT'; + END IF; + + -- prevent pending invoices + msats from exceeding 1,000,000 sats + IF too_much THEN + RAISE EXCEPTION 'SN_INV_EXCEED_BALANCE'; + END IF; + + INSERT INTO "Invoice" (hash, bolt11, "expiresAt", "msatsRequested", "userId", created_at, updated_at) + VALUES (hash, bolt11, expires_at, msats_req, user_id, now_utc(), now_utc()) RETURNING * INTO invoice; + + INSERT INTO pgboss.job (name, data, retrylimit, retrybackoff, startafter) + VALUES ('checkInvoice', jsonb_build_object('hash', hash), 21, true, now() + interval '10 seconds'); + + RETURN invoice; +END; +$$; + +DROP FUNCTION IF EXISTS confirm_invoice(TEXT, INTEGER); +CREATE OR REPLACE FUNCTION confirm_invoice(lnd_id TEXT, lnd_received BIGINT) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_id INTEGER; + confirmed_at TIMESTAMP; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT "userId", "confirmedAt" INTO user_id, confirmed_at FROM "Invoice" WHERE hash = lnd_id; + IF confirmed_at IS NULL THEN + UPDATE "Invoice" SET "msatsReceived" = lnd_received, "confirmedAt" = now_utc(), updated_at = now_utc() + WHERE hash = lnd_id; + UPDATE users SET msats = msats + lnd_received WHERE id = user_id; + END IF; + RETURN 0; +END; +$$; + +DROP FUNCTION IF EXISTS create_withdrawl(TEXT, TEXT, INTEGER, INTEGER, TEXT); +CREATE OR REPLACE FUNCTION create_withdrawl(lnd_id TEXT, invoice TEXT, msats_amount BIGINT, msats_max_fee BIGINT, username TEXT) +RETURNS "Withdrawl" +LANGUAGE plpgsql +AS $$ +DECLARE + user_id INTEGER; + user_msats BIGINT; + withdrawl "Withdrawl"; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats, id INTO user_msats, user_id FROM users WHERE name = username; + IF (msats_amount + msats_max_fee) > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE hash = lnd_id AND status IS NULL) THEN + RAISE EXCEPTION 'SN_PENDING_WITHDRAWL_EXISTS'; + END IF; + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE hash = lnd_id AND status = 'CONFIRMED') THEN + RAISE EXCEPTION 'SN_CONFIRMED_WITHDRAWL_EXISTS'; + END IF; + + INSERT INTO "Withdrawl" (hash, bolt11, "msatsPaying", "msatsFeePaying", "userId", created_at, updated_at) + VALUES (lnd_id, invoice, msats_amount, msats_max_fee, user_id, now_utc(), now_utc()) RETURNING * INTO withdrawl; + + UPDATE users SET msats = msats - msats_amount - msats_max_fee WHERE id = user_id; + + INSERT INTO pgboss.job (name, data, retrylimit, retrybackoff, startafter) + VALUES ('checkWithdrawal', jsonb_build_object('id', withdrawl.id, 'hash', lnd_id), 21, true, now() + interval '10 seconds'); + + RETURN withdrawl; +END; +$$; + +DROP FUNCTION IF EXISTS confirm_withdrawl(INTEGER, INTEGER, INTEGER); +CREATE OR REPLACE FUNCTION confirm_withdrawl(wid INTEGER, msats_paid BIGINT, msats_fee_paid BIGINT) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + msats_fee_paying BIGINT; + user_id INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE id = wid AND status IS NULL) THEN + SELECT "msatsFeePaying", "userId" INTO msats_fee_paying, user_id + FROM "Withdrawl" WHERE id = wid AND status IS NULL; + + UPDATE "Withdrawl" + SET status = 'CONFIRMED', "msatsPaid" = msats_paid, + "msatsFeePaid" = msats_fee_paid, updated_at = now_utc() + WHERE id = wid AND status IS NULL; + + UPDATE users SET msats = msats + (msats_fee_paying - msats_fee_paid) WHERE id = user_id; + END IF; + + RETURN 0; +END; +$$; + +CREATE OR REPLACE FUNCTION reverse_withdrawl(wid INTEGER, wstatus "WithdrawlStatus") +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + msats_fee_paying BIGINT; + msats_paying BIGINT; + user_id INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE id = wid AND status IS NULL) THEN + SELECT "msatsPaying", "msatsFeePaying", "userId" INTO msats_paying, msats_fee_paying, user_id + FROM "Withdrawl" WHERE id = wid AND status IS NULL; + + UPDATE "Withdrawl" SET status = wstatus, updated_at = now_utc() WHERE id = wid AND status IS NULL; + + UPDATE users SET msats = msats + msats_paying + msats_fee_paying WHERE id = user_id; + END IF; + RETURN 0; +END; +$$; + +DROP FUNCTION IF EXISTS earn(INTEGER, INTEGER, TIMESTAMP(3), "EarnType", INTEGER, INTEGER); +CREATE OR REPLACE FUNCTION earn(user_id INTEGER, earn_msats BIGINT, created_at TIMESTAMP(3), + type "EarnType", type_id INTEGER, rank INTEGER) +RETURNS void AS $$ +DECLARE +BEGIN + PERFORM ASSERT_SERIALIZED(); + -- insert into earn + INSERT INTO "Earn" (msats, "userId", created_at, type, "typeId", rank) + VALUES (earn_msats, user_id, created_at, type, type_id, rank); + + -- give the user the sats + UPDATE users + SET msats = msats + earn_msats, "stackedMsats" = "stackedMsats" + earn_msats + WHERE id = user_id; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1ad3d5f8..503a0268 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -30,8 +30,8 @@ model User { inviteId String? bio Item? @relation(fields: [bioId], references: [id]) bioId Int? - msats Int @default(0) - stackedMsats Int @default(0) + msats BigInt @default(0) + stackedMsats BigInt @default(0) freeComments Int @default(5) freePosts Int @default(2) checkedNotesAt DateTime? @@ -105,8 +105,8 @@ model Earn { createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @default(now()) @updatedAt @map(name: "updated_at") - msats Int - user User @relation(fields: [userId], references: [id]) + msats BigInt + user User @relation(fields: [userId], references: [id]) userId Int type EarnType? @@ -192,13 +192,13 @@ model Item { bio Boolean @default(false) // denormalized self stats - weightedVotes Float @default(0) - weightedDownVotes Float @default(0) - sats Int @default(0) + weightedVotes Float @default(0) + weightedDownVotes Float @default(0) + msats BigInt @default(0) // denormalized comment stats ncomments Int @default(0) - commentSats Int @default(0) + commentMsats BigInt @default(0) lastCommentAt DateTime? // if sub is null, this is the main sub @@ -317,7 +317,7 @@ model ItemAct { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @updatedAt @map(name: "updated_at") - sats Int + msats BigInt act ItemActType item Item @relation(fields: [itemId], references: [id]) itemId Int @@ -356,8 +356,8 @@ model Invoice { bolt11 String expiresAt DateTime confirmedAt DateTime? - msatsRequested Int - msatsReceived Int? + msatsRequested BigInt + msatsReceived BigInt? cancelled Boolean @default(false) @@index([createdAt]) @@ -382,10 +382,10 @@ model Withdrawl { hash String bolt11 String - msatsPaying Int - msatsPaid Int? - msatsFeePaying Int - msatsFeePaid Int? + msatsPaying BigInt + msatsPaid BigInt? + msatsFeePaying BigInt + msatsFeePaid BigInt? status WithdrawlStatus? diff --git a/worker/earn.js b/worker/earn.js index 95e9895a..8f666fdb 100644 --- a/worker/earn.js +++ b/worker/earn.js @@ -10,17 +10,14 @@ function earn ({ models }) { console.log('running', name) // compute how much sn earned today - let [{ sum }] = await models.$queryRaw` - SELECT sum("ItemAct".sats) + const [{ sum }] = await models.$queryRaw` + SELECT sum("ItemAct".msats) FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE ("ItemAct".act in ('BOOST', 'STREAM') OR ("ItemAct".act IN ('VOTE','POLL') AND "Item"."userId" = "ItemAct"."userId")) AND "ItemAct".created_at > now_utc() - INTERVAL '1 day'` - // convert to msats - sum = sum * 1000 - /* How earnings work: 1/3: top 21% posts over last 36 hours, scored on a relative basis @@ -56,7 +53,7 @@ function earn ({ models }) { ), upvoters AS ( SELECT "ItemAct"."userId", item_ratios.id, item_ratios.ratio, item_ratios."parentId", - sum("ItemAct".sats) as tipped, min("ItemAct".created_at) as acted_at + sum("ItemAct".msats) as tipped, min("ItemAct".created_at) as acted_at FROM item_ratios JOIN "ItemAct" on "ItemAct"."itemId" = item_ratios.id WHERE act IN ('VOTE','TIP') From 9431469453a9317198ae5563ef65e7161092c58d Mon Sep 17 00:00:00 2001 From: keyan Date: Sun, 6 Nov 2022 14:39:23 -0600 Subject: [PATCH 08/42] more indices --- .../20221106203216_item_indices/migration.sql | 14 ++++++++++++++ prisma/schema.prisma | 4 ++++ 2 files changed, 18 insertions(+) create mode 100644 prisma/migrations/20221106203216_item_indices/migration.sql diff --git a/prisma/migrations/20221106203216_item_indices/migration.sql b/prisma/migrations/20221106203216_item_indices/migration.sql new file mode 100644 index 00000000..7cd5b493 --- /dev/null +++ b/prisma/migrations/20221106203216_item_indices/migration.sql @@ -0,0 +1,14 @@ +-- CreateIndex +CREATE INDEX "Item.weightedVotes_index" ON "Item"("weightedVotes"); + +-- CreateIndex +CREATE INDEX "Item.weightedDownVotes_index" ON "Item"("weightedDownVotes"); + +-- CreateIndex +CREATE INDEX "Item.bio_index" ON "Item"("bio"); + +-- CreateIndex +CREATE INDEX "Item.freebie_index" ON "Item"("freebie"); + +-- CreateIndex +CREATE INDEX "Item.sumVotes_index" ON "Item"(("weightedVotes" - "weightedDownVotes")); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8b4eeba8..1ad3d5f8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -224,6 +224,10 @@ model Item { PollOption PollOption[] PollVote PollVote[] + @@index([weightedVotes]) + @@index([weightedDownVotes]) + @@index([bio]) + @@index([freebie]) @@index([createdAt]) @@index([userId]) @@index([parentId]) From 8de00c741d0915c9017a10ae8044863788dac05b Mon Sep 17 00:00:00 2001 From: keyan Date: Mon, 7 Nov 2022 17:31:29 -0600 Subject: [PATCH 09/42] poll for notifications less, don't retry gql --- api/resolvers/user.js | 220 +++++++++++++++++++++--------------------- api/ssrApollo.js | 4 +- api/typeDefs/user.js | 2 +- components/header.js | 10 +- fragments/users.js | 30 ------ lib/apollo.js | 14 +-- 6 files changed, 129 insertions(+), 151 deletions(-) diff --git a/api/resolvers/user.js b/api/resolvers/user.js index b4163775..f0e5dcec 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -149,6 +149,118 @@ export default { users } }, + hasNewNotes: async (parent, args, { me, models }) => { + if (!me) { + return false + } + const user = await models.user.findUnique({ where: { id: me.id } }) + const lastChecked = user.checkedNotesAt || new Date(0) + + // check if any votes have been cast for them since checkedNotesAt + if (user.noteItemSats) { + const votes = await models.$queryRaw(` + SELECT "ItemAct".id, "ItemAct".created_at + FROM "Item" + JOIN "ItemAct" on "ItemAct"."itemId" = "Item".id + WHERE "ItemAct"."userId" <> $1 + AND "ItemAct".created_at > $2 + AND "Item"."userId" = $1 + AND "ItemAct".act IN ('VOTE', 'TIP') + LIMIT 1`, me.id, lastChecked) + if (votes.length > 0) { + return true + } + } + + // check if they have any replies since checkedNotesAt + const newReplies = await models.$queryRaw(` + SELECT "Item".id, "Item".created_at + FROM "Item" + JOIN "Item" p ON ${user.noteAllDescendants ? '"Item".path <@ p.path' : '"Item"."parentId" = p.id'} + WHERE p."userId" = $1 + AND "Item".created_at > $2 AND "Item"."userId" <> $1 + ${await filterClause(me, models)} + LIMIT 1`, me.id, lastChecked) + if (newReplies.length > 0) { + return true + } + + // check if they have any mentions since checkedNotesAt + if (user.noteMentions) { + const newMentions = await models.$queryRaw(` + SELECT "Item".id, "Item".created_at + FROM "Mention" + JOIN "Item" ON "Mention"."itemId" = "Item".id + WHERE "Mention"."userId" = $1 + AND "Mention".created_at > $2 + AND "Item"."userId" <> $1 + LIMIT 1`, me.id, lastChecked) + if (newMentions.length > 0) { + return true + } + } + + const job = await models.item.findFirst({ + where: { + maxBid: { + not: null + }, + userId: me.id, + statusUpdatedAt: { + gt: lastChecked + } + } + }) + if (job) { + return true + } + + if (user.noteEarning) { + const earn = await models.earn.findFirst({ + where: { + userId: me.id, + createdAt: { + gt: lastChecked + }, + msats: { + gte: 1000 + } + } + }) + if (earn) { + return true + } + } + + if (user.noteDeposits) { + const invoice = await models.invoice.findFirst({ + where: { + userId: me.id, + confirmedAt: { + gt: lastChecked + } + } + }) + if (invoice) { + return true + } + } + + // check if new invites have been redeemed + if (user.noteInvites) { + const newInvitees = await models.$queryRaw(` + SELECT "Invite".id + FROM users JOIN "Invite" on users."inviteId" = "Invite".id + WHERE "Invite"."userId" = $1 + AND users.created_at > $2 + LIMIT 1`, me.id, lastChecked) + if (newInvitees.length > 0) { + return true + } + } + + return false + }, searchUsers: async (parent, { q, limit, similarity }, { models }) => { return await models.$queryRaw` SELECT * FROM users where id > 615 AND SIMILARITY(name, ${q}) > ${Number(similarity) || 0.1} ORDER BY SIMILARITY(name, ${q}) DESC LIMIT ${Number(limit) || 5}` @@ -362,114 +474,6 @@ export default { }).invites({ take: 1 }) return invites.length > 0 - }, - hasNewNotes: async (user, args, { me, models }) => { - const lastChecked = user.checkedNotesAt || new Date(0) - - // check if any votes have been cast for them since checkedNotesAt - if (user.noteItemSats) { - const votes = await models.$queryRaw(` - SELECT "ItemAct".id, "ItemAct".created_at - FROM "Item" - JOIN "ItemAct" on "ItemAct"."itemId" = "Item".id - WHERE "ItemAct"."userId" <> $1 - AND "ItemAct".created_at > $2 - AND "Item"."userId" = $1 - AND "ItemAct".act IN ('VOTE', 'TIP') - LIMIT 1`, me.id, lastChecked) - if (votes.length > 0) { - return true - } - } - - // check if they have any replies since checkedNotesAt - const newReplies = await models.$queryRaw(` - SELECT "Item".id, "Item".created_at - FROM "Item" - JOIN "Item" p ON ${user.noteAllDescendants ? '"Item".path <@ p.path' : '"Item"."parentId" = p.id'} - WHERE p."userId" = $1 - AND "Item".created_at > $2 AND "Item"."userId" <> $1 - ${await filterClause(me, models)} - LIMIT 1`, me.id, lastChecked) - if (newReplies.length > 0) { - return true - } - - // check if they have any mentions since checkedNotesAt - if (user.noteMentions) { - const newMentions = await models.$queryRaw(` - SELECT "Item".id, "Item".created_at - FROM "Mention" - JOIN "Item" ON "Mention"."itemId" = "Item".id - WHERE "Mention"."userId" = $1 - AND "Mention".created_at > $2 - AND "Item"."userId" <> $1 - LIMIT 1`, me.id, lastChecked) - if (newMentions.length > 0) { - return true - } - } - - const job = await models.item.findFirst({ - where: { - maxBid: { - not: null - }, - userId: me.id, - statusUpdatedAt: { - gt: lastChecked - } - } - }) - if (job) { - return true - } - - if (user.noteEarning) { - const earn = await models.earn.findFirst({ - where: { - userId: me.id, - createdAt: { - gt: lastChecked - }, - msats: { - gte: 1000 - } - } - }) - if (earn) { - return true - } - } - - if (user.noteDeposits) { - const invoice = await models.invoice.findFirst({ - where: { - userId: me.id, - confirmedAt: { - gt: lastChecked - } - } - }) - if (invoice) { - return true - } - } - - // check if new invites have been redeemed - if (user.noteInvites) { - const newInvitees = await models.$queryRaw(` - SELECT "Invite".id - FROM users JOIN "Invite" on users."inviteId" = "Invite".id - WHERE "Invite"."userId" = $1 - AND users.created_at > $2 - LIMIT 1`, me.id, lastChecked) - if (newInvitees.length > 0) { - return true - } - } - - return false } } } diff --git a/api/ssrApollo.js b/api/ssrApollo.js index c13792d5..3931c76d 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -8,7 +8,7 @@ import models from './models' import { print } from 'graphql' import lnd from './lnd' import search from './search' -import { ME_SSR } from '../fragments/users' +import { ME } from '../fragments/users' import { getPrice } from '../components/price' export default async function getSSRApolloClient (req, me = null) { @@ -40,7 +40,7 @@ export function getGetServerSideProps (query, variables = null, notFoundFunc, re const client = await getSSRApolloClient(req) const { data: { me } } = await client.query({ - query: ME_SSR + query: ME }) const price = await getPrice(me?.fiatCurrency) diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index f2c260c7..c6fffb6a 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -9,6 +9,7 @@ export default gql` nameAvailable(name: String!): Boolean! topUsers(cursor: String, when: String, sort: String): Users searchUsers(q: String!, limit: Int, similarity: Float): [User!]! + hasNewNotes: Boolean! } type Users { @@ -46,7 +47,6 @@ export default gql` spent(when: String): Int! freePosts: Int! freeComments: Int! - hasNewNotes: Boolean! hasInvites: Boolean! tipDefault: Int! fiatCurrency: String! diff --git a/components/header.js b/components/header.js index 1580dcfb..6e34a2b2 100644 --- a/components/header.js +++ b/components/header.js @@ -35,7 +35,11 @@ export default function Header ({ sub }) { subLatestPost(name: $name) } `, { variables: { name: 'jobs' }, pollInterval: 600000, fetchPolicy: 'network-only' }) - + const { data: hasNewNotes } = useQuery(gql` + { + hasNewNotes + } + `, { pollInterval: 30000, fetchPolicy: 'cache-and-network' }) const [lastCheckedJobs, setLastCheckedJobs] = useState(new Date().getTime()) useEffect(() => { if (me) { @@ -53,12 +57,12 @@ export default function Header ({ sub }) { return (
- + - {me?.hasNewNotes && + {hasNewNotes?.hasNewNotes && {' '} } diff --git a/fragments/users.js b/fragments/users.js index db4e1e16..5b98bc98 100644 --- a/fragments/users.js +++ b/fragments/users.js @@ -3,36 +3,6 @@ import { COMMENT_FIELDS } from './comments' import { ITEM_FIELDS, ITEM_WITH_COMMENTS } from './items' export const ME = gql` - { - me { - id - name - sats - stacked - freePosts - freeComments - hasNewNotes - tipDefault - fiatCurrency - bioId - hasInvites - upvotePopover - tipPopover - noteItemSats - noteEarning - noteAllDescendants - noteMentions - noteDeposits - noteInvites - noteJobIndicator - hideInvoiceDesc - wildWestMode - greeterMode - lastCheckedJobs - } - }` - -export const ME_SSR = gql` { me { id diff --git a/lib/apollo.js b/lib/apollo.js index 5829c368..291e3d2f 100644 --- a/lib/apollo.js +++ b/lib/apollo.js @@ -1,11 +1,11 @@ -import { ApolloClient, InMemoryCache, from, HttpLink } from '@apollo/client' +import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client' import { decodeCursor, LIMIT } from './cursor' -import { RetryLink } from '@apollo/client/link/retry' +// import { RetryLink } from '@apollo/client/link/retry' -const additiveLink = from([ - new RetryLink(), - new HttpLink({ uri: '/api/graphql' }) -]) +// const additiveLink = from([ +// new RetryLink(), +// new HttpLink({ uri: '/api/graphql' }) +// ]) function isFirstPage (cursor, existingThings) { if (cursor) { @@ -20,7 +20,7 @@ function isFirstPage (cursor, existingThings) { export default function getApolloClient () { global.apolloClient ||= new ApolloClient({ - link: additiveLink, + link: new HttpLink({ uri: '/api/graphql' }), cache: new InMemoryCache({ typePolicies: { Query: { From 249bcce04cff6bd898ad319efde4207e956e1590 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 8 Nov 2022 13:24:15 -0600 Subject: [PATCH 10/42] puppeteer config --- .puppeteerrc.cjs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .puppeteerrc.cjs diff --git a/.puppeteerrc.cjs b/.puppeteerrc.cjs new file mode 100644 index 00000000..a7021076 --- /dev/null +++ b/.puppeteerrc.cjs @@ -0,0 +1,9 @@ +const {join} = require('path'); + +/** + * @type {import("puppeteer").Configuration} + */ +module.exports = { + // Changes the cache location for Puppeteer. + cacheDirectory: join(__dirname, '.cache', 'puppeteer'), +}; \ No newline at end of file From 1bf747c7c0a7591288e2fdfd9eceaabd4b23bd52 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 15 Nov 2022 14:51:55 -0600 Subject: [PATCH 11/42] sats to msats --- api/resolvers/growth.js | 36 +- api/resolvers/item.js | 30 +- api/resolvers/notifications.js | 2 +- api/resolvers/user.js | 25 +- api/resolvers/wallet.js | 23 +- api/typeDefs/wallet.js | 10 +- components/invoice.js | 2 +- components/text.js | 42 +- fragments/wallet.js | 6 +- lib/format.js | 7 + pages/_app.js | 10 +- pages/invoices/[id].js | 5 +- pages/satistics.js | 2 +- .../20221110190205_msats_bigint/migration.sql | 43 ++ .../20221110224543_msats_funcs/migration.sql | 376 ++++++++++++++++++ prisma/schema.prisma | 30 +- worker/earn.js | 9 +- 17 files changed, 546 insertions(+), 112 deletions(-) create mode 100644 prisma/migrations/20221110190205_msats_bigint/migration.sql create mode 100644 prisma/migrations/20221110224543_msats_funcs/migration.sql diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 3b03b385..7793a759 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -33,10 +33,10 @@ export default { return await models.$queryRaw( `SELECT date_trunc('month', "ItemAct".created_at) AS time, - sum(CASE WHEN act = 'STREAM' THEN "ItemAct".sats ELSE 0 END) as jobs, - sum(CASE WHEN act IN ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".sats ELSE 0 END) as fees, - sum(CASE WHEN act = 'BOOST' THEN "ItemAct".sats ELSE 0 END) as boost, - sum(CASE WHEN act = 'TIP' THEN "ItemAct".sats ELSE 0 END) as tips + floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000) as jobs, + floor(sum(CASE WHEN act IN ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".msats ELSE 0 END)/1000) as fees, + floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000) as boost, + floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000) as tips FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) @@ -60,17 +60,17 @@ export default { }, stackedGrowth: async (parent, args, { models }) => { return await models.$queryRaw( - `SELECT time, sum(airdrop) as rewards, sum(post) as posts, sum(comment) as comments + `SELECT time, floor(sum(airdrop)/1000) as rewards, floor(sum(post)/1000) as posts, floor(sum(comment)/1000) as comments FROM ((SELECT date_trunc('month', "ItemAct".created_at) AS time, 0 as airdrop, - CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".sats END as comment, - CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".sats ELSE 0 END as post + CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".msats END as comment, + CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) AND "ItemAct".act IN ('VOTE', 'TIP')) UNION ALL - (SELECT date_trunc('month', created_at) AS time, msats / 1000 as airdrop, 0 as post, 0 as comment + (SELECT date_trunc('month', created_at) AS time, msats as airdrop, 0 as post, 0 as comment FROM "Earn" WHERE date_trunc('month', now_utc()) <> date_trunc('month', created_at))) u GROUP BY time @@ -121,10 +121,10 @@ export default { spentWeekly: async (parent, args, { models }) => { const [stats] = await models.$queryRaw( `SELECT json_build_array( - json_build_object('name', 'jobs', 'value', sum(CASE WHEN act = 'STREAM' THEN "ItemAct".sats ELSE 0 END)), - json_build_object('name', 'fees', 'value', sum(CASE WHEN act in ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".sats ELSE 0 END)), - json_build_object('name', 'boost', 'value', sum(CASE WHEN act = 'BOOST' THEN "ItemAct".sats ELSE 0 END)), - json_build_object('name', 'tips', 'value', sum(CASE WHEN act = 'TIP' THEN "ItemAct".sats ELSE 0 END))) as array + json_build_object('name', 'jobs', 'value', floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'fees', 'value', floor(sum(CASE WHEN act in ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'boost', 'value',floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'tips', 'value', floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000))) as array FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE "ItemAct".created_at >= now_utc() - interval '1 week'`) @@ -134,20 +134,20 @@ export default { stackedWeekly: async (parent, args, { models }) => { const [stats] = await models.$queryRaw( `SELECT json_build_array( - json_build_object('name', 'rewards', 'value', sum(airdrop)), - json_build_object('name', 'posts', 'value', sum(post)), - json_build_object('name', 'comments', 'value', sum(comment)) + json_build_object('name', 'rewards', 'value', floor(sum(airdrop)/1000)), + json_build_object('name', 'posts', 'value', floor(sum(post)/1000)), + json_build_object('name', 'comments', 'value', floor(sum(comment)/1000)) ) as array FROM ((SELECT 0 as airdrop, - CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".sats END as comment, - CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".sats ELSE 0 END as post + CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".msats END as comment, + CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" WHERE "ItemAct".created_at >= now_utc() - interval '1 week' AND "ItemAct".act IN ('VOTE', 'TIP')) UNION ALL - (SELECT msats / 1000 as airdrop, 0 as post, 0 as comment + (SELECT msats as airdrop, 0 as post, 0 as comment FROM "Earn" WHERE created_at >= now_utc() - interval '1 week')) u`) diff --git a/api/resolvers/item.js b/api/resolvers/item.js index 302f1441..550d3eda 100644 --- a/api/resolvers/item.js +++ b/api/resolvers/item.js @@ -8,6 +8,7 @@ import { BOOST_MIN, ITEM_SPAM_INTERVAL, MAX_POLL_NUM_CHOICES, MAX_TITLE_LENGTH, ITEM_FILTER_THRESHOLD, DONT_LIKE_THIS_COST } from '../../lib/constants' +import { msatsToSats } from '../../lib/format' async function comments (me, models, id, sort) { let orderBy @@ -74,7 +75,7 @@ async function topOrderClause (sort, me, models) { case 'comments': return 'ORDER BY ncomments DESC' case 'sats': - return 'ORDER BY sats DESC' + return 'ORDER BY msats DESC' default: return await topOrderByWeightedSats(me, models) } @@ -690,6 +691,12 @@ export default { } }, Item: { + sats: async (item, args, { models }) => { + return msatsToSats(item.msats) + }, + commentSats: async (item, args, { models }) => { + return msatsToSats(item.commentMsats) + }, isJob: async (item, args, { models }) => { return item.subName === 'jobs' }, @@ -771,10 +778,7 @@ export default { return comments(me, models, item.id, 'hot') }, upvotes: async (item, args, { models }) => { - const { sum: { sats } } = await models.itemAct.aggregate({ - sum: { - sats: true - }, + const count = await models.itemAct.count({ where: { itemId: Number(item.id), userId: { @@ -784,12 +788,12 @@ export default { } }) - return sats || 0 + return count }, boost: async (item, args, { models }) => { - const { sum: { sats } } = await models.itemAct.aggregate({ + const { sum: { msats } } = await models.itemAct.aggregate({ sum: { - sats: true + msats: true }, where: { itemId: Number(item.id), @@ -797,7 +801,7 @@ export default { } }) - return sats || 0 + return (msats && msatsToSats(msats)) || 0 }, wvotes: async (item) => { return item.weightedVotes - item.weightedDownVotes @@ -805,9 +809,9 @@ export default { meSats: async (item, args, { me, models }) => { if (!me) return 0 - const { sum: { sats } } = await models.itemAct.aggregate({ + const { sum: { msats } } = await models.itemAct.aggregate({ sum: { - sats: true + msats: true }, where: { itemId: Number(item.id), @@ -823,7 +827,7 @@ export default { } }) - return sats || 0 + return (msats && msatsToSats(msats)) || 0 }, meDontLike: async (item, args, { me, models }) => { if (!me) return false @@ -1010,7 +1014,7 @@ export const SELECT = "Item".text, "Item".url, "Item"."userId", "Item"."fwdUserId", "Item"."parentId", "Item"."pinId", "Item"."maxBid", "Item".company, "Item".location, "Item".remote, "Item"."subName", "Item".status, "Item"."uploadId", "Item"."pollCost", - "Item".sats, "Item".ncomments, "Item"."commentSats", "Item"."lastCommentAt", "Item"."weightedVotes", + "Item".msats, "Item".ncomments, "Item"."commentMsats", "Item"."lastCommentAt", "Item"."weightedVotes", "Item"."weightedDownVotes", "Item".freebie, ltree2text("Item"."path") AS "path"` async function newTimedOrderByWeightedSats (me, models, num) { diff --git a/api/resolvers/notifications.js b/api/resolvers/notifications.js index 7e630494..79272e86 100644 --- a/api/resolvers/notifications.js +++ b/api/resolvers/notifications.js @@ -106,7 +106,7 @@ export default { if (meFull.noteItemSats) { queries.push( `(SELECT "Item".id::TEXT, MAX("ItemAct".created_at) AS "sortTime", - sum("ItemAct".sats) as "earnedSats", 'Votification' AS type + floor(sum("ItemAct".msats)/1000) as "earnedSats", 'Votification' AS type FROM "Item" JOIN "ItemAct" ON "ItemAct"."itemId" = "Item".id WHERE "ItemAct"."userId" <> $1 diff --git a/api/resolvers/user.js b/api/resolvers/user.js index f0e5dcec..b9691616 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -1,5 +1,6 @@ import { AuthenticationError, UserInputError } from 'apollo-server-errors' import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor' +import { msatsToSats } from '../../lib/format' import { createMentions, getItem, SELECT, updateItem, filterClause } from './item' import serialize from './serial' @@ -92,7 +93,7 @@ export default { let users if (sort === 'spent') { users = await models.$queryRaw(` - SELECT users.*, sum("ItemAct".sats) as spent + SELECT users.*, floor(sum("ItemAct".msats)/1000) as spent FROM "ItemAct" JOIN users on "ItemAct"."userId" = users.id WHERE "ItemAct".created_at <= $1 @@ -125,16 +126,16 @@ export default { LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) } else { users = await models.$queryRaw(` - SELECT u.id, u.name, u."photoId", sum(amount) as stacked + SELECT u.id, u.name, u."photoId", floor(sum(amount)/1000) as stacked FROM - ((SELECT users.*, "ItemAct".sats as amount + ((SELECT users.*, "ItemAct".msats as amount FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id JOIN users on "Item"."userId" = users.id WHERE act <> 'BOOST' AND "ItemAct"."userId" <> users.id AND "ItemAct".created_at <= $1 ${within('ItemAct', when)}) UNION ALL - (SELECT users.*, "Earn".msats/1000 as amount + (SELECT users.*, "Earn".msats as amount FROM "Earn" JOIN users on users.id = "Earn"."userId" WHERE "Earn".msats > 0 ${within('Earn', when)})) u @@ -422,22 +423,22 @@ export default { if (!when) { // forever - return Math.floor((user.stackedMsats || 0) / 1000) + return (user.stackedMsats && msatsToSats(user.stackedMsats)) || 0 } else { const [{ stacked }] = await models.$queryRaw(` SELECT sum(amount) as stacked FROM - ((SELECT sum("ItemAct".sats) as amount + ((SELECT sum("ItemAct".msats) as amount FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE act <> 'BOOST' AND "ItemAct"."userId" <> $2 AND "Item"."userId" = $2 AND "ItemAct".created_at >= $1) UNION ALL - (SELECT sum("Earn".msats/1000) as amount + (SELECT sum("Earn".msats) as amount FROM "Earn" WHERE "Earn".msats > 0 AND "Earn"."userId" = $2 AND "Earn".created_at >= $1)) u`, withinDate(when), Number(user.id)) - return stacked || 0 + return (stacked && msatsToSats(stacked)) || 0 } }, spent: async (user, { when }, { models }) => { @@ -445,9 +446,9 @@ export default { return user.spent } - const { sum: { sats } } = await models.itemAct.aggregate({ + const { sum: { msats } } = await models.itemAct.aggregate({ sum: { - sats: true + msats: true }, where: { userId: user.id, @@ -457,13 +458,13 @@ export default { } }) - return sats || 0 + return (msats && msatsToSats(msats)) || 0 }, sats: async (user, args, { models, me }) => { if (me?.id !== user.id) { return 0 } - return Math.floor(user.msats / 1000.0) + return msatsToSats(user.msats) }, bio: async (user, args, { models }) => { return getItem(user, { id: user.bioId }, { models }) diff --git a/api/resolvers/wallet.js b/api/resolvers/wallet.js index c9724cee..4e8a98f6 100644 --- a/api/resolvers/wallet.js +++ b/api/resolvers/wallet.js @@ -5,6 +5,7 @@ import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor' import lnpr from 'bolt11' import { SELECT } from './item' import { lnurlPayDescriptionHash } from '../../lib/lnurl' +import { msatsToSats } from '../../lib/format' export async function getInvoice (parent, { id }, { me, models }) { if (!me) { @@ -93,7 +94,7 @@ export default { if (include.has('stacked')) { queries.push( `(SELECT ('stacked' || "Item".id) as id, "Item".id as "factId", NULL as bolt11, - MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".sats) * 1000 as msats, + MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".msats) as msats, 0 as "msatsFee", NULL as status, 'stacked' as type FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id @@ -114,7 +115,7 @@ export default { if (include.has('spent')) { queries.push( `(SELECT ('spent' || "Item".id) as id, "Item".id as "factId", NULL as bolt11, - MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".sats) * 1000 as msats, + MAX("ItemAct".created_at) as "createdAt", sum("ItemAct".msats) as msats, 0 as "msatsFee", NULL as status, 'spent' as type FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id @@ -254,10 +255,14 @@ export default { }, Withdrawl: { - satsPaying: w => Math.floor(w.msatsPaying / 1000), - satsPaid: w => Math.floor(w.msatsPaid / 1000), - satsFeePaying: w => Math.floor(w.msatsFeePaying / 1000), - satsFeePaid: w => Math.floor(w.msatsFeePaid / 1000) + satsPaying: w => msatsToSats(w.msatsPaying), + satsPaid: w => msatsToSats(w.msatsPaid), + satsFeePaying: w => msatsToSats(w.msatsFeePaying), + satsFeePaid: w => msatsToSats(w.msatsFeePaid) + }, + + Invoice: { + satsReceived: i => msatsToSats(i.msatsReceived) }, Fact: { @@ -271,7 +276,9 @@ export default { WHERE id = $1`, Number(fact.factId)) return item - } + }, + sats: fact => msatsToSats(fact.msats), + satsFee: fact => msatsToSats(fact.msatsFee) } } @@ -285,7 +292,7 @@ async function createWithdrawal (parent, { invoice, maxFee }, { me, models, lnd throw new UserInputError('could not decode invoice') } - if (!decoded.mtokens || Number(decoded.mtokens) <= 0) { + if (!decoded.mtokens || BigInt(decoded.mtokens) <= 0) { throw new UserInputError('your invoice must specify an amount') } diff --git a/api/typeDefs/wallet.js b/api/typeDefs/wallet.js index 8d955a4d..5b4d3303 100644 --- a/api/typeDefs/wallet.js +++ b/api/typeDefs/wallet.js @@ -21,7 +21,7 @@ export default gql` expiresAt: String! cancelled: Boolean! confirmedAt: String - msatsReceived: Int + satsReceived: Int } type Withdrawl { @@ -29,13 +29,9 @@ export default gql` createdAt: String! hash: String! bolt11: String! - msatsPaying: Int! satsPaying: Int! - msatsPaid: Int satsPaid: Int - msatsFeePaying: Int! satsFeePaying: Int! - msatsFeePaid: Int satsFeePaid: Int status: String } @@ -45,8 +41,8 @@ export default gql` factId: ID! bolt11: String createdAt: String! - msats: Int! - msatsFee: Int + sats: Int! + satsFee: Int status: String type: String! description: String diff --git a/components/invoice.js b/components/invoice.js index 707a4a21..677f83da 100644 --- a/components/invoice.js +++ b/components/invoice.js @@ -5,7 +5,7 @@ export function Invoice ({ invoice }) { let status = 'waiting for you' if (invoice.confirmedAt) { variant = 'confirmed' - status = `${invoice.msatsReceived / 1000} sats deposited` + status = `${invoice.satsReceived} sats deposited` } else if (invoice.cancelled) { variant = 'failed' status = 'cancelled' diff --git a/components/text.js b/components/text.js index 282fc6bc..77fb035c 100644 --- a/components/text.js +++ b/components/text.js @@ -12,7 +12,7 @@ import React, { useEffect, useState } from 'react' import GithubSlugger from 'github-slugger' import LinkIcon from '../svgs/link.svg' import Thumb from '../svgs/thumb-up-fill.svg' -import {toString} from 'mdast-util-to-string' +import { toString } from 'mdast-util-to-string' import copy from 'clipboard-copy' function myRemarkPlugin () { @@ -32,8 +32,6 @@ function myRemarkPlugin () { } } - - function Heading ({ h, slugger, noFragments, topLevel, children, node, ...props }) { const [copied, setCopied] = useState(false) const [id] = useState(noFragments ? undefined : slugger.slug(toString(node).replace(/[^\w\-\s]+/gi, ''))) @@ -44,20 +42,20 @@ function Heading ({ h, slugger, noFragments, topLevel, children, node, ...props ) } @@ -66,7 +64,7 @@ export default function Text ({ topLevel, noFragments, nofollow, children }) { // all the reactStringReplace calls are to facilitate search highlighting const slugger = new GithubSlugger() - const HeadingWrapper = (props) => Heading({ topLevel, slugger, noFragments, ...props}) + const HeadingWrapper = (props) => Heading({ topLevel, slugger, noFragments, ...props }) return (
@@ -108,10 +106,10 @@ export default function Text ({ topLevel, noFragments, nofollow, children }) { // map: fix any highlighted links children = children?.map(e => typeof e === 'string' - ? reactStringReplace(e, /:high\[([^\]]+)\]/g, (match, i) => { - return {match} - }) - : e) + ? reactStringReplace(e, /:high\[([^\]]+)\]/g, (match, i) => { + return {match} + }) + : e) return ( /* eslint-disable-next-line */ diff --git a/fragments/wallet.js b/fragments/wallet.js index bdf02e70..93a5b57e 100644 --- a/fragments/wallet.js +++ b/fragments/wallet.js @@ -7,7 +7,7 @@ export const INVOICE = gql` invoice(id: $id) { id bolt11 - msatsReceived + satsReceived cancelled confirmedAt expiresAt @@ -40,8 +40,8 @@ export const WALLET_HISTORY = gql` factId type createdAt - msats - msatsFee + sats + satsFee status type description diff --git a/lib/format.js b/lib/format.js index 7cb2f1d4..d312eb9e 100644 --- a/lib/format.js +++ b/lib/format.js @@ -9,3 +9,10 @@ export const abbrNum = n => { export const fixedDecimal = (n, f) => { return Number.parseFloat(n).toFixed(f) } + +export const msatsToSats = msats => { + if (msats === null || msats === undefined) { + return null + } + return Number(BigInt(msats) / 1000n) +} diff --git a/pages/_app.js b/pages/_app.js index fdb578e3..e9a3c6d7 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -49,10 +49,12 @@ function MyApp ({ Component, pageProps: { session, ...props } }) { // this nodata var will get passed to the server on back/foward and // 1. prevent data from reloading and 2. perserve scroll // (2) is not possible while intercepting nav with beforePopState - router.replace({ - pathname: router.pathname, - query: { ...router.query, nodata: true } - }, router.asPath, { ...router.options, scroll: false }) + if (router.isReady) { + router.replace({ + pathname: router.pathname, + query: { ...router.query, nodata: true } + }, router.asPath, { ...router.options, scroll: false }) + } }, [router.asPath]) /* diff --git a/pages/invoices/[id].js b/pages/invoices/[id].js index 909e8d4f..5a6812e8 100644 --- a/pages/invoices/[id].js +++ b/pages/invoices/[id].js @@ -19,7 +19,10 @@ function LoadInvoice () { pollInterval: 1000, variables: { id: router.query.id } }) - if (error) return
error
+ if (error) { + console.log(error) + return
error
+ } if (!data || loading) { return } diff --git a/pages/satistics.js b/pages/satistics.js index 5b550773..bea223cd 100644 --- a/pages/satistics.js +++ b/pages/satistics.js @@ -213,7 +213,7 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor - {Math.floor(f.msats / 1000)} + {Math.floor(f.sats)} ) diff --git a/prisma/migrations/20221110190205_msats_bigint/migration.sql b/prisma/migrations/20221110190205_msats_bigint/migration.sql new file mode 100644 index 00000000..8eb94638 --- /dev/null +++ b/prisma/migrations/20221110190205_msats_bigint/migration.sql @@ -0,0 +1,43 @@ +-- AlterTable +ALTER TABLE "Earn" ALTER COLUMN "msats" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "Invoice" ALTER COLUMN "msatsRequested" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsReceived" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "Item" +ALTER COLUMN "commentSats" SET DATA TYPE BIGINT, +ALTER COLUMN "sats" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "Item" RENAME COLUMN "commentSats" TO "commentMsats"; +ALTER TABLE "Item" RENAME COLUMN "sats" TO "msats"; + +-- update to msats +UPDATE "Item" SET +"commentMsats" = "commentMsats" * 1000, +"msats" = "msats" * 1000; + +-- AlterTable +ALTER TABLE "ItemAct" +ALTER COLUMN "sats" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "ItemAct" RENAME COLUMN "sats" TO "msats"; + +-- update to msats +UPDATE "ItemAct" SET +"msats" = "msats" * 1000; + +-- AlterTable +ALTER TABLE "Withdrawl" ALTER COLUMN "msatsPaying" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsPaid" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsFeePaying" SET DATA TYPE BIGINT, +ALTER COLUMN "msatsFeePaid" SET DATA TYPE BIGINT; + +-- AlterTable +ALTER TABLE "users" ALTER COLUMN "msats" SET DEFAULT 0, +ALTER COLUMN "msats" SET DATA TYPE BIGINT, +ALTER COLUMN "stackedMsats" SET DEFAULT 0, +ALTER COLUMN "stackedMsats" SET DATA TYPE BIGINT; \ No newline at end of file diff --git a/prisma/migrations/20221110224543_msats_funcs/migration.sql b/prisma/migrations/20221110224543_msats_funcs/migration.sql new file mode 100644 index 00000000..1be0d18f --- /dev/null +++ b/prisma/migrations/20221110224543_msats_funcs/migration.sql @@ -0,0 +1,376 @@ +-- item_act should take sats but treat them as msats +CREATE OR REPLACE FUNCTION item_act(item_id INTEGER, user_id INTEGER, act "ItemActType", act_sats INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + act_msats BIGINT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + act_msats := act_sats * 1000; + SELECT msats INTO user_msats FROM users WHERE id = user_id; + IF act_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + + -- deduct msats from actor + UPDATE users SET msats = msats - act_msats WHERE id = user_id; + + IF act = 'VOTE' OR act = 'TIP' THEN + -- add sats to actee's balance and stacked count + UPDATE users + SET msats = msats + act_msats, "stackedMsats" = "stackedMsats" + act_msats + WHERE id = (SELECT COALESCE("fwdUserId", "userId") FROM "Item" WHERE id = item_id); + + -- if they have already voted, this is a tip + IF EXISTS (SELECT 1 FROM "ItemAct" WHERE "itemId" = item_id AND "userId" = user_id AND "ItemAct".act = 'VOTE') THEN + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, 'TIP', now_utc(), now_utc()); + ELSE + -- else this is a vote with a possible extra tip + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (1000, item_id, user_id, 'VOTE', now_utc(), now_utc()); + act_msats := act_msats - 1000; + + -- if we have sats left after vote, leave them as a tip + IF act_msats > 0 THEN + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, 'TIP', now_utc(), now_utc()); + END IF; + + RETURN 1; + END IF; + ELSE -- BOOST, POLL, DONT_LIKE_THIS + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, act, now_utc(), now_utc()); + END IF; + + RETURN 0; +END; +$$; + +-- when creating free item, set freebie flag so can be optionally viewed +CREATE OR REPLACE FUNCTION create_item( + title TEXT, url TEXT, text TEXT, boost INTEGER, + parent_id INTEGER, user_id INTEGER, fwd_user_id INTEGER, + spam_within INTERVAL) +RETURNS "Item" +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + cost_msats BIGINT; + free_posts INTEGER; + free_comments INTEGER; + freebie BOOLEAN; + item "Item"; + med_votes FLOAT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats, "freePosts", "freeComments" + INTO user_msats, free_posts, free_comments + FROM users WHERE id = user_id; + + cost_msats := 1000 * POWER(10, item_spam(parent_id, user_id, spam_within)); + -- it's only a freebie if it's a 1 sat cost, they have < 1 sat, boost = 0, and they have freebies left + freebie := (cost_msats <= 1000) AND (user_msats < 1000) AND (boost = 0) AND ((parent_id IS NULL AND free_posts > 0) OR (parent_id IS NOT NULL AND free_comments > 0)); + + IF NOT freebie AND cost_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + -- get this user's median item score + SELECT COALESCE(percentile_cont(0.5) WITHIN GROUP(ORDER BY "weightedVotes" - "weightedDownVotes"), 0) INTO med_votes FROM "Item" WHERE "userId" = user_id; + + -- if their median votes are positive, start at 0 + -- if the median votes are negative, start their post with that many down votes + -- basically: if their median post is bad, presume this post is too + IF med_votes >= 0 THEN + med_votes := 0; + ELSE + med_votes := ABS(med_votes); + END IF; + + INSERT INTO "Item" (title, url, text, "userId", "parentId", "fwdUserId", freebie, "weightedDownVotes", created_at, updated_at) + VALUES (title, url, text, user_id, parent_id, fwd_user_id, freebie, med_votes, now_utc(), now_utc()) RETURNING * INTO item; + + IF freebie THEN + IF parent_id IS NULL THEN + UPDATE users SET "freePosts" = "freePosts" - 1 WHERE id = user_id; + ELSE + UPDATE users SET "freeComments" = "freeComments" - 1 WHERE id = user_id; + END IF; + ELSE + UPDATE users SET msats = msats - cost_msats WHERE id = user_id; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (cost_msats, item.id, user_id, 'VOTE', now_utc(), now_utc()); + END IF; + + IF boost > 0 THEN + PERFORM item_act(item.id, user_id, 'BOOST', boost); + END IF; + + RETURN item; +END; +$$; + +CREATE OR REPLACE FUNCTION run_auction(item_id INTEGER) RETURNS void AS $$ + DECLARE + bid_msats BIGINT; + user_msats BIGINT; + user_id INTEGER; + item_status "Status"; + status_updated_at timestamp(3); + BEGIN + PERFORM ASSERT_SERIALIZED(); + + -- extract data we need + SELECT "maxBid" * 1000, "userId", status, "statusUpdatedAt" INTO bid_msats, user_id, item_status, status_updated_at FROM "Item" WHERE id = item_id; + SELECT msats INTO user_msats FROM users WHERE id = user_id; + + -- 0 bid items expire after 30 days unless updated + IF bid_msats = 0 THEN + IF item_status <> 'STOPPED' THEN + IF status_updated_at < now_utc() - INTERVAL '30 days' THEN + UPDATE "Item" SET status = 'STOPPED', "statusUpdatedAt" = now_utc() WHERE id = item_id; + ELSEIF item_status = 'NOSATS' THEN + UPDATE "Item" SET status = 'ACTIVE' WHERE id = item_id; + END IF; + END IF; + RETURN; + END IF; + + -- check if user wallet has enough sats + IF bid_msats > user_msats THEN + -- if not, set status = NOSATS and statusUpdatedAt to now_utc if not already set + IF item_status <> 'NOSATS' THEN + UPDATE "Item" SET status = 'NOSATS', "statusUpdatedAt" = now_utc() WHERE id = item_id; + END IF; + ELSE + -- if so, deduct from user + UPDATE users SET msats = msats - bid_msats WHERE id = user_id; + + -- create an item act + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (bid_msats, item_id, user_id, 'STREAM', now_utc(), now_utc()); + + -- update item status = ACTIVE and statusUpdatedAt = now_utc if NOSATS + IF item_status = 'NOSATS' THEN + UPDATE "Item" SET status = 'ACTIVE', "statusUpdatedAt" = now_utc() WHERE id = item_id; + END IF; + END IF; + END; +$$ LANGUAGE plpgsql; + + +-- on item act denormalize sats and comment sats +CREATE OR REPLACE FUNCTION sats_after_act() RETURNS TRIGGER AS $$ +DECLARE + item "Item"; +BEGIN + SELECT * FROM "Item" WHERE id = NEW."itemId" INTO item; + IF item."userId" = NEW."userId" THEN + RETURN NEW; + END IF; + + UPDATE "Item" + SET "msats" = "msats" + NEW.msats + WHERE id = item.id; + + UPDATE "Item" + SET "commentMsats" = "commentMsats" + NEW.msats + WHERE id <> item.id and path @> item.path; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS sats_after_act_trigger ON "ItemAct"; +CREATE TRIGGER sats_after_act_trigger + AFTER INSERT ON "ItemAct" + FOR EACH ROW + WHEN (NEW.act = 'VOTE' or NEW.act = 'TIP') + EXECUTE PROCEDURE sats_after_act(); + +CREATE OR REPLACE FUNCTION boost_after_act() RETURNS TRIGGER AS $$ +BEGIN + -- update item + UPDATE "Item" SET boost = boost + FLOOR(NEW.msats / 1000) WHERE id = NEW."itemId"; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS boost_after_act ON "ItemAct"; +CREATE TRIGGER boost_after_act + AFTER INSERT ON "ItemAct" + FOR EACH ROW + WHEN (NEW.act = 'BOOST') + EXECUTE PROCEDURE boost_after_act(); + +DROP FUNCTION IF EXISTS create_invoice(TEXT, TEXT, timestamp(3) without time zone, INTEGER, INTEGER); +CREATE OR REPLACE FUNCTION create_invoice(hash TEXT, bolt11 TEXT, expires_at timestamp(3) without time zone, msats_req BIGINT, user_id INTEGER) +RETURNS "Invoice" +LANGUAGE plpgsql +AS $$ +DECLARE + invoice "Invoice"; + limit_reached BOOLEAN; + too_much BOOLEAN; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT count(*) >= 10, coalesce(sum("msatsRequested"),0)+coalesce(max(users.msats), 0)+msats_req > 1000000000 INTO limit_reached, too_much + FROM "Invoice" + JOIN users on "userId" = users.id + WHERE "userId" = user_id AND "expiresAt" > now_utc() AND "confirmedAt" is null AND cancelled = false; + + -- prevent more than 10 pending invoices + IF limit_reached THEN + RAISE EXCEPTION 'SN_INV_PENDING_LIMIT'; + END IF; + + -- prevent pending invoices + msats from exceeding 1,000,000 sats + IF too_much THEN + RAISE EXCEPTION 'SN_INV_EXCEED_BALANCE'; + END IF; + + INSERT INTO "Invoice" (hash, bolt11, "expiresAt", "msatsRequested", "userId", created_at, updated_at) + VALUES (hash, bolt11, expires_at, msats_req, user_id, now_utc(), now_utc()) RETURNING * INTO invoice; + + INSERT INTO pgboss.job (name, data, retrylimit, retrybackoff, startafter) + VALUES ('checkInvoice', jsonb_build_object('hash', hash), 21, true, now() + interval '10 seconds'); + + RETURN invoice; +END; +$$; + +DROP FUNCTION IF EXISTS confirm_invoice(TEXT, INTEGER); +CREATE OR REPLACE FUNCTION confirm_invoice(lnd_id TEXT, lnd_received BIGINT) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_id INTEGER; + confirmed_at TIMESTAMP; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT "userId", "confirmedAt" INTO user_id, confirmed_at FROM "Invoice" WHERE hash = lnd_id; + IF confirmed_at IS NULL THEN + UPDATE "Invoice" SET "msatsReceived" = lnd_received, "confirmedAt" = now_utc(), updated_at = now_utc() + WHERE hash = lnd_id; + UPDATE users SET msats = msats + lnd_received WHERE id = user_id; + END IF; + RETURN 0; +END; +$$; + +DROP FUNCTION IF EXISTS create_withdrawl(TEXT, TEXT, INTEGER, INTEGER, TEXT); +CREATE OR REPLACE FUNCTION create_withdrawl(lnd_id TEXT, invoice TEXT, msats_amount BIGINT, msats_max_fee BIGINT, username TEXT) +RETURNS "Withdrawl" +LANGUAGE plpgsql +AS $$ +DECLARE + user_id INTEGER; + user_msats BIGINT; + withdrawl "Withdrawl"; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats, id INTO user_msats, user_id FROM users WHERE name = username; + IF (msats_amount + msats_max_fee) > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE hash = lnd_id AND status IS NULL) THEN + RAISE EXCEPTION 'SN_PENDING_WITHDRAWL_EXISTS'; + END IF; + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE hash = lnd_id AND status = 'CONFIRMED') THEN + RAISE EXCEPTION 'SN_CONFIRMED_WITHDRAWL_EXISTS'; + END IF; + + INSERT INTO "Withdrawl" (hash, bolt11, "msatsPaying", "msatsFeePaying", "userId", created_at, updated_at) + VALUES (lnd_id, invoice, msats_amount, msats_max_fee, user_id, now_utc(), now_utc()) RETURNING * INTO withdrawl; + + UPDATE users SET msats = msats - msats_amount - msats_max_fee WHERE id = user_id; + + INSERT INTO pgboss.job (name, data, retrylimit, retrybackoff, startafter) + VALUES ('checkWithdrawal', jsonb_build_object('id', withdrawl.id, 'hash', lnd_id), 21, true, now() + interval '10 seconds'); + + RETURN withdrawl; +END; +$$; + +DROP FUNCTION IF EXISTS confirm_withdrawl(INTEGER, INTEGER, INTEGER); +CREATE OR REPLACE FUNCTION confirm_withdrawl(wid INTEGER, msats_paid BIGINT, msats_fee_paid BIGINT) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + msats_fee_paying BIGINT; + user_id INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE id = wid AND status IS NULL) THEN + SELECT "msatsFeePaying", "userId" INTO msats_fee_paying, user_id + FROM "Withdrawl" WHERE id = wid AND status IS NULL; + + UPDATE "Withdrawl" + SET status = 'CONFIRMED', "msatsPaid" = msats_paid, + "msatsFeePaid" = msats_fee_paid, updated_at = now_utc() + WHERE id = wid AND status IS NULL; + + UPDATE users SET msats = msats + (msats_fee_paying - msats_fee_paid) WHERE id = user_id; + END IF; + + RETURN 0; +END; +$$; + +CREATE OR REPLACE FUNCTION reverse_withdrawl(wid INTEGER, wstatus "WithdrawlStatus") +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + msats_fee_paying BIGINT; + msats_paying BIGINT; + user_id INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + IF EXISTS (SELECT 1 FROM "Withdrawl" WHERE id = wid AND status IS NULL) THEN + SELECT "msatsPaying", "msatsFeePaying", "userId" INTO msats_paying, msats_fee_paying, user_id + FROM "Withdrawl" WHERE id = wid AND status IS NULL; + + UPDATE "Withdrawl" SET status = wstatus, updated_at = now_utc() WHERE id = wid AND status IS NULL; + + UPDATE users SET msats = msats + msats_paying + msats_fee_paying WHERE id = user_id; + END IF; + RETURN 0; +END; +$$; + +DROP FUNCTION IF EXISTS earn(INTEGER, INTEGER, TIMESTAMP(3), "EarnType", INTEGER, INTEGER); +CREATE OR REPLACE FUNCTION earn(user_id INTEGER, earn_msats BIGINT, created_at TIMESTAMP(3), + type "EarnType", type_id INTEGER, rank INTEGER) +RETURNS void AS $$ +DECLARE +BEGIN + PERFORM ASSERT_SERIALIZED(); + -- insert into earn + INSERT INTO "Earn" (msats, "userId", created_at, type, "typeId", rank) + VALUES (earn_msats, user_id, created_at, type, type_id, rank); + + -- give the user the sats + UPDATE users + SET msats = msats + earn_msats, "stackedMsats" = "stackedMsats" + earn_msats + WHERE id = user_id; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1ad3d5f8..503a0268 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -30,8 +30,8 @@ model User { inviteId String? bio Item? @relation(fields: [bioId], references: [id]) bioId Int? - msats Int @default(0) - stackedMsats Int @default(0) + msats BigInt @default(0) + stackedMsats BigInt @default(0) freeComments Int @default(5) freePosts Int @default(2) checkedNotesAt DateTime? @@ -105,8 +105,8 @@ model Earn { createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @default(now()) @updatedAt @map(name: "updated_at") - msats Int - user User @relation(fields: [userId], references: [id]) + msats BigInt + user User @relation(fields: [userId], references: [id]) userId Int type EarnType? @@ -192,13 +192,13 @@ model Item { bio Boolean @default(false) // denormalized self stats - weightedVotes Float @default(0) - weightedDownVotes Float @default(0) - sats Int @default(0) + weightedVotes Float @default(0) + weightedDownVotes Float @default(0) + msats BigInt @default(0) // denormalized comment stats ncomments Int @default(0) - commentSats Int @default(0) + commentMsats BigInt @default(0) lastCommentAt DateTime? // if sub is null, this is the main sub @@ -317,7 +317,7 @@ model ItemAct { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @updatedAt @map(name: "updated_at") - sats Int + msats BigInt act ItemActType item Item @relation(fields: [itemId], references: [id]) itemId Int @@ -356,8 +356,8 @@ model Invoice { bolt11 String expiresAt DateTime confirmedAt DateTime? - msatsRequested Int - msatsReceived Int? + msatsRequested BigInt + msatsReceived BigInt? cancelled Boolean @default(false) @@index([createdAt]) @@ -382,10 +382,10 @@ model Withdrawl { hash String bolt11 String - msatsPaying Int - msatsPaid Int? - msatsFeePaying Int - msatsFeePaid Int? + msatsPaying BigInt + msatsPaid BigInt? + msatsFeePaying BigInt + msatsFeePaid BigInt? status WithdrawlStatus? diff --git a/worker/earn.js b/worker/earn.js index 95e9895a..8f666fdb 100644 --- a/worker/earn.js +++ b/worker/earn.js @@ -10,17 +10,14 @@ function earn ({ models }) { console.log('running', name) // compute how much sn earned today - let [{ sum }] = await models.$queryRaw` - SELECT sum("ItemAct".sats) + const [{ sum }] = await models.$queryRaw` + SELECT sum("ItemAct".msats) FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE ("ItemAct".act in ('BOOST', 'STREAM') OR ("ItemAct".act IN ('VOTE','POLL') AND "Item"."userId" = "ItemAct"."userId")) AND "ItemAct".created_at > now_utc() - INTERVAL '1 day'` - // convert to msats - sum = sum * 1000 - /* How earnings work: 1/3: top 21% posts over last 36 hours, scored on a relative basis @@ -56,7 +53,7 @@ function earn ({ models }) { ), upvoters AS ( SELECT "ItemAct"."userId", item_ratios.id, item_ratios.ratio, item_ratios."parentId", - sum("ItemAct".sats) as tipped, min("ItemAct".created_at) as acted_at + sum("ItemAct".msats) as tipped, min("ItemAct".created_at) as acted_at FROM item_ratios JOIN "ItemAct" on "ItemAct"."itemId" = item_ratios.id WHERE act IN ('VOTE','TIP') From 5746160893e70294cfb85521aa181b158e92f128 Mon Sep 17 00:00:00 2001 From: keyan Date: Wed, 23 Nov 2022 12:12:09 -0600 Subject: [PATCH 12/42] let tips affect ranking --- api/resolvers/growth.js | 8 +- api/resolvers/item.js | 15 +- api/resolvers/notifications.js | 2 +- api/resolvers/serial.js | 6 + api/resolvers/user.js | 2 +- api/resolvers/wallet.js | 2 +- pages/satistics.js | 9 +- .../20221116223041_tipcut/migration.sql | 3 + .../20221118202137_tipcut_funcs/migration.sql | 225 ++++++++++++++++++ prisma/schema.prisma | 1 + styles/satistics.module.css | 5 + worker/earn.js | 10 +- worker/trust.js | 17 +- 13 files changed, 275 insertions(+), 30 deletions(-) create mode 100644 prisma/migrations/20221116223041_tipcut/migration.sql create mode 100644 prisma/migrations/20221118202137_tipcut_funcs/migration.sql diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 7793a759..5a1df669 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -34,7 +34,7 @@ export default { return await models.$queryRaw( `SELECT date_trunc('month', "ItemAct".created_at) AS time, floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000) as jobs, - floor(sum(CASE WHEN act IN ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".msats ELSE 0 END)/1000) as fees, + floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM') THEN "ItemAct".msats ELSE 0 END)/1000) as fees, floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000) as boost, floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000) as tips FROM "ItemAct" @@ -68,7 +68,7 @@ export default { FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) AND - "ItemAct".act IN ('VOTE', 'TIP')) + "ItemAct".act = 'TIP') UNION ALL (SELECT date_trunc('month', created_at) AS time, msats as airdrop, 0 as post, 0 as comment FROM "Earn" @@ -122,7 +122,7 @@ export default { const [stats] = await models.$queryRaw( `SELECT json_build_array( json_build_object('name', 'jobs', 'value', floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000)), - json_build_object('name', 'fees', 'value', floor(sum(CASE WHEN act in ('VOTE', 'POLL') AND "Item"."userId" = "ItemAct"."userId" THEN "ItemAct".msats ELSE 0 END)/1000)), + json_build_object('name', 'fees', 'value', floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM') THEN "ItemAct".msats ELSE 0 END)/1000)), json_build_object('name', 'boost', 'value',floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000)), json_build_object('name', 'tips', 'value', floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000))) as array FROM "ItemAct" @@ -145,7 +145,7 @@ export default { FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" WHERE "ItemAct".created_at >= now_utc() - interval '1 week' AND - "ItemAct".act IN ('VOTE', 'TIP')) + "ItemAct".act = 'TIP') UNION ALL (SELECT msats as airdrop, 0 as post, 0 as comment FROM "Earn" diff --git a/api/resolvers/item.js b/api/resolvers/item.js index 550d3eda..6cc30a61 100644 --- a/api/resolvers/item.js +++ b/api/resolvers/item.js @@ -778,15 +778,10 @@ export default { return comments(me, models, item.id, 'hot') }, upvotes: async (item, args, { models }) => { - const count = await models.itemAct.count({ - where: { - itemId: Number(item.id), - userId: { - not: Number(item.userId) - }, - act: 'VOTE' - } - }) + const [{ count }] = await models.$queryRaw(` + SELECT COUNT(DISTINCT "userId") as count + FROM "ItemAct" + WHERE act = 'TIP' AND "itemId" = $1`, Number(item.id)) return count }, @@ -821,7 +816,7 @@ export default { act: 'TIP' }, { - act: 'VOTE' + act: 'FEE' } ] } diff --git a/api/resolvers/notifications.js b/api/resolvers/notifications.js index 79272e86..06b93be6 100644 --- a/api/resolvers/notifications.js +++ b/api/resolvers/notifications.js @@ -111,7 +111,7 @@ export default { JOIN "ItemAct" ON "ItemAct"."itemId" = "Item".id WHERE "ItemAct"."userId" <> $1 AND "ItemAct".created_at <= $2 - AND "ItemAct".act in ('VOTE', 'TIP') + AND "ItemAct".act IN ('TIP', 'FEE') AND "Item"."userId" = $1 GROUP BY "Item".id ORDER BY "sortTime" DESC diff --git a/api/resolvers/serial.js b/api/resolvers/serial.js index 773b8bf0..7efdeb7d 100644 --- a/api/resolvers/serial.js +++ b/api/resolvers/serial.js @@ -26,6 +26,12 @@ async function serialize (models, call) { if (error.message.includes('SN_INELIGIBLE')) { bail(new Error('user ineligible for gift')) } + if (error.message.includes('SN_UNSUPPORTED')) { + bail(new Error('unsupported action')) + } + if (error.message.includes('SN_DUPLICATE')) { + bail(new Error('duplicate not allowed')) + } if (error.message.includes('SN_REVOKED_OR_EXHAUSTED')) { bail(new Error('faucet has been revoked or is exhausted')) } diff --git a/api/resolvers/user.js b/api/resolvers/user.js index b9691616..4ea16225 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -166,7 +166,7 @@ export default { WHERE "ItemAct"."userId" <> $1 AND "ItemAct".created_at > $2 AND "Item"."userId" = $1 - AND "ItemAct".act IN ('VOTE', 'TIP') + AND "ItemAct".act = 'TIP' LIMIT 1`, me.id, lastChecked) if (votes.length > 0) { return true diff --git a/api/resolvers/wallet.js b/api/resolvers/wallet.js index 4e8a98f6..b8dafcec 100644 --- a/api/resolvers/wallet.js +++ b/api/resolvers/wallet.js @@ -98,7 +98,7 @@ export default { 0 as "msatsFee", NULL as status, 'stacked' as type FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id - WHERE "ItemAct"."userId" <> $1 AND "ItemAct".act <> 'BOOST' + WHERE act = 'TIP' AND (("Item"."userId" = $1 AND "Item"."fwdUserId" IS NULL) OR ("Item"."fwdUserId" = $1 AND "ItemAct"."userId" <> "Item"."userId")) AND "ItemAct".created_at <= $2 diff --git a/pages/satistics.js b/pages/satistics.js index bea223cd..97cbacea 100644 --- a/pages/satistics.js +++ b/pages/satistics.js @@ -15,6 +15,7 @@ import { useRouter } from 'next/router' import Item from '../components/item' import Comment from '../components/comment' import React from 'react' +import Info from '../components/info' export const getServerSideProps = getGetServerSideProps(WALLET_HISTORY) @@ -199,7 +200,13 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor type detail - sats + +
sats + +
Sats are rounded down from millisats to the nearest sat, so the actual amount might be slightly larger.
+
+
+ diff --git a/prisma/migrations/20221116223041_tipcut/migration.sql b/prisma/migrations/20221116223041_tipcut/migration.sql new file mode 100644 index 00000000..ea2d2221 --- /dev/null +++ b/prisma/migrations/20221116223041_tipcut/migration.sql @@ -0,0 +1,3 @@ +-- AlterEnum +ALTER TYPE "ItemActType" ADD VALUE 'FEE'; + diff --git a/prisma/migrations/20221118202137_tipcut_funcs/migration.sql b/prisma/migrations/20221118202137_tipcut_funcs/migration.sql new file mode 100644 index 00000000..1349571e --- /dev/null +++ b/prisma/migrations/20221118202137_tipcut_funcs/migration.sql @@ -0,0 +1,225 @@ +-- convert all self-votes to FEEs +UPDATE "ItemAct" +SET act = 'FEE' +FROM "Item" +WHERE act = 'VOTE' +AND "Item".id = "ItemAct"."itemId" +AND "Item"."userId" = "ItemAct"."userId"; + +-- convert all votes to TIPs +UPDATE "ItemAct" +SET act = 'TIP' +WHERE act = 'VOTE'; + +-- change vote on creation to act type FEE +CREATE OR REPLACE FUNCTION create_item( + title TEXT, url TEXT, text TEXT, boost INTEGER, + parent_id INTEGER, user_id INTEGER, fwd_user_id INTEGER, + spam_within INTERVAL) +RETURNS "Item" +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + cost_msats BIGINT; + free_posts INTEGER; + free_comments INTEGER; + freebie BOOLEAN; + item "Item"; + med_votes FLOAT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats, "freePosts", "freeComments" + INTO user_msats, free_posts, free_comments + FROM users WHERE id = user_id; + + cost_msats := 1000 * POWER(10, item_spam(parent_id, user_id, spam_within)); + -- it's only a freebie if it's a 1 sat cost, they have < 1 sat, boost = 0, and they have freebies left + freebie := (cost_msats <= 1000) AND (user_msats < 1000) AND (boost = 0) AND ((parent_id IS NULL AND free_posts > 0) OR (parent_id IS NOT NULL AND free_comments > 0)); + + IF NOT freebie AND cost_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + -- get this user's median item score + SELECT COALESCE(percentile_cont(0.5) WITHIN GROUP(ORDER BY "weightedVotes" - "weightedDownVotes"), 0) INTO med_votes FROM "Item" WHERE "userId" = user_id; + + -- if their median votes are positive, start at 0 + -- if the median votes are negative, start their post with that many down votes + -- basically: if their median post is bad, presume this post is too + IF med_votes >= 0 THEN + med_votes := 0; + ELSE + med_votes := ABS(med_votes); + END IF; + + INSERT INTO "Item" (title, url, text, "userId", "parentId", "fwdUserId", freebie, "weightedDownVotes", created_at, updated_at) + VALUES (title, url, text, user_id, parent_id, fwd_user_id, freebie, med_votes, now_utc(), now_utc()) RETURNING * INTO item; + + IF freebie THEN + IF parent_id IS NULL THEN + UPDATE users SET "freePosts" = "freePosts" - 1 WHERE id = user_id; + ELSE + UPDATE users SET "freeComments" = "freeComments" - 1 WHERE id = user_id; + END IF; + ELSE + UPDATE users SET msats = msats - cost_msats WHERE id = user_id; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (cost_msats, item.id, user_id, 'FEE', now_utc(), now_utc()); + END IF; + + IF boost > 0 THEN + PERFORM item_act(item.id, user_id, 'BOOST', boost); + END IF; + + RETURN item; +END; +$$; + +-- change item_act to take FEE and remove VOTE +CREATE OR REPLACE FUNCTION item_act(item_id INTEGER, user_id INTEGER, act "ItemActType", act_sats INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + act_msats BIGINT; + fee_msats BIGINT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + act_msats := act_sats * 1000; + SELECT msats INTO user_msats FROM users WHERE id = user_id; + IF act_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + -- deduct msats from actor + UPDATE users SET msats = msats - act_msats WHERE id = user_id; + + IF act = 'VOTE' THEN + RAISE EXCEPTION 'SN_UNSUPPORTED'; + END IF; + + IF act = 'TIP' THEN + -- call to influence weightedVotes ... we need to do this before we record the acts because + -- the priors acts are taken into account + PERFORM weighted_votes_after_tip(item_id, user_id, act_sats); + + -- take 10% and insert as FEE + fee_msats := CEIL(act_msats * 0.1); + act_msats := act_msats - fee_msats; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (fee_msats, item_id, user_id, 'FEE', now_utc(), now_utc()); + + -- add sats to actee's balance and stacked count + UPDATE users + SET msats = msats + act_msats, "stackedMsats" = "stackedMsats" + act_msats + WHERE id = (SELECT COALESCE("fwdUserId", "userId") FROM "Item" WHERE id = item_id); + + -- leave the rest as a tip + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, 'TIP', now_utc(), now_utc()); + + -- call to denormalize sats and commentSats + PERFORM sats_after_tip(item_id, user_id, act_msats + fee_msats); + ELSE -- BOOST, POLL, DONT_LIKE_THIS + -- call to influence if DONT_LIKE_THIS weightedDownVotes + IF act = 'DONT_LIKE_THIS' THEN + -- make sure they haven't done this before + IF EXISTS (SELECT 1 FROM "ItemAct" WHERE "itemId" = item_id AND "userId" = user_id AND "ItemAct".act = 'DONT_LIKE_THIS') THEN + RAISE EXCEPTION 'SN_DUPLICATE'; + END IF; + + PERFORM weighted_downvotes_after_act(item_id, user_id, act_sats); + END IF; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, act, now_utc(), now_utc()); + END IF; + + RETURN 0; +END; +$$; + +-- remove triggers for weightedVotes and weightedDownVotes, replacing with functions called directly +DROP TRIGGER IF EXISTS weighted_votes_after_act ON "ItemAct"; +DROP FUNCTION weighted_votes_after_act(); +CREATE OR REPLACE FUNCTION weighted_votes_after_tip(item_id INTEGER, user_id INTEGER, sats INTEGER) RETURNS INTEGER AS $$ +DECLARE + user_trust DOUBLE PRECISION; + sats_past INTEGER; + multiplier DOUBLE PRECISION; +BEGIN + -- grab user's trust who is upvoting + SELECT trust INTO user_trust FROM users WHERE id = user_id; + + -- in order to add this to weightedVotes, we need to do log((satsN+satsPrior)/satsPrior) + -- so compute sats prior + SELECT SUM(msats) / 1000 INTO sats_past + FROM "ItemAct" + WHERE "userId" = user_id AND "itemId" = item_id AND act IN ('TIP', 'FEE'); + + IF sats_past IS NULL OR sats_past = 0 THEN + multiplier := LOG(sats); + ELSE + multiplier := LOG((sats+sats_past)/sats_past::FLOAT); + END IF; + + -- update item + UPDATE "Item" + SET "weightedVotes" = "weightedVotes" + (user_trust * multiplier) + WHERE id = item_id AND "userId" <> user_id; + + RETURN 0; +END; +$$ LANGUAGE plpgsql; + +-- TODO: maybe let sats affect downvoting as well +DROP TRIGGER IF EXISTS weighted_downvotes_after_act ON "ItemAct"; +DROP FUNCTION weighted_downvotes_after_act(); +CREATE OR REPLACE FUNCTION weighted_downvotes_after_act(item_id INTEGER, user_id INTEGER, sats INTEGER) RETURNS INTEGER AS $$ +DECLARE + user_trust DOUBLE PRECISION; + sats_past INTEGER; + multiplier DOUBLE PRECISION; +BEGIN + -- grab user's trust + SELECT trust INTO user_trust FROM users WHERE id = user_id; + + -- update item + UPDATE "Item" + SET "weightedDownVotes" = "weightedDownVotes" + user_trust + WHERE id = item_id AND "userId" <> user_id; + + RETURN 0; +END; +$$ LANGUAGE plpgsql; + + +-- remove triggers to ItemAct sats and replace with functions called directly +DROP TRIGGER IF EXISTS sats_after_act_trigger ON "ItemAct"; +DROP FUNCTION sats_after_act(); +CREATE OR REPLACE FUNCTION sats_after_tip(item_id INTEGER, user_id INTEGER, tip_msats BIGINT) RETURNS INTEGER AS $$ +DECLARE + item "Item"; +BEGIN + SELECT * FROM "Item" WHERE id = item_id INTO item; + IF item."userId" = user_id THEN + RETURN 0; + END IF; + + UPDATE "Item" + SET "msats" = "msats" + tip_msats + WHERE id = item.id; + + UPDATE "Item" + SET "commentMsats" = "commentMsats" + tip_msats + WHERE id <> item.id and path @> item.path; + + RETURN 1; +END; +$$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 503a0268..eb3f2f8f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -311,6 +311,7 @@ enum ItemActType { STREAM POLL DONT_LIKE_THIS + FEE } model ItemAct { diff --git a/styles/satistics.module.css b/styles/satistics.module.css index 633580eb..0f7f3f73 100644 --- a/styles/satistics.module.css +++ b/styles/satistics.module.css @@ -9,6 +9,11 @@ text-align: right; } +.sats>div { + display: flex; + align-items: center; +} + .failed { text-decoration: line-through; } diff --git a/worker/earn.js b/worker/earn.js index 8f666fdb..1a87a330 100644 --- a/worker/earn.js +++ b/worker/earn.js @@ -14,8 +14,7 @@ function earn ({ models }) { SELECT sum("ItemAct".msats) FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id - WHERE ("ItemAct".act in ('BOOST', 'STREAM') - OR ("ItemAct".act IN ('VOTE','POLL') AND "Item"."userId" = "ItemAct"."userId")) + WHERE "ItemAct".act <> 'TIP' AND "ItemAct".created_at > now_utc() - INTERVAL '1 day'` /* @@ -42,8 +41,8 @@ function earn ({ models }) { CASE WHEN "weightedVotes" > 0 THEN "weightedVotes"/(sum("weightedVotes") OVER (PARTITION BY "parentId" IS NULL)) ELSE 0 END AS ratio FROM ( SELECT *, - NTILE(100) OVER (PARTITION BY "parentId" IS NULL ORDER BY "weightedVotes" desc) AS percentile, - ROW_NUMBER() OVER (PARTITION BY "parentId" IS NULL ORDER BY "weightedVotes" desc) AS rank + NTILE(100) OVER (PARTITION BY "parentId" IS NULL ORDER BY ("weightedVotes"-"weightedDownVotes") desc) AS percentile, + ROW_NUMBER() OVER (PARTITION BY "parentId" IS NULL ORDER BY ("weightedVotes"-"weightedDownVotes") desc) AS rank FROM "Item" WHERE created_at >= now_utc() - interval '36 hours' @@ -56,8 +55,7 @@ function earn ({ models }) { sum("ItemAct".msats) as tipped, min("ItemAct".created_at) as acted_at FROM item_ratios JOIN "ItemAct" on "ItemAct"."itemId" = item_ratios.id - WHERE act IN ('VOTE','TIP') - AND "ItemAct"."userId" <> item_ratios."userId" + WHERE act = 'TIP' GROUP BY "ItemAct"."userId", item_ratios.id, item_ratios.ratio, item_ratios."parentId" ), upvoter_ratios AS ( diff --git a/worker/trust.js b/worker/trust.js index a10f9ba4..da5551d6 100644 --- a/worker/trust.js +++ b/worker/trust.js @@ -13,6 +13,9 @@ function trust ({ boss, models }) { const MAX_DEPTH = 6 const MAX_TRUST = 0.9 const MIN_SUCCESS = 5 +// increasing disgree_mult increases distrust when there's disagreement, at 1x we double count disagreement, +// at 2x we triple count, etc ... this count is reflected/added in the number of total "trials" between users +const DISAGREE_MULT = 1 // https://en.wikipedia.org/wiki/Normal_distribution#Quantile_function const Z_CONFIDENCE = 2.326347874041 // 98% confidence @@ -207,22 +210,24 @@ async function getGraph (models) { SELECT id, json_agg(json_build_object('node', oid, 'trust', trust)) AS hops FROM ( WITH user_votes AS ( - SELECT "ItemAct"."userId" AS user_id, users.name AS name, "ItemAct"."itemId" AS item_id, "ItemAct".created_at AS act_at, - users.created_at AS user_at, "Item".created_at AS item_at, count(*) OVER (partition by "ItemAct"."userId") AS user_vote_count + SELECT "ItemAct"."userId" AS user_id, users.name AS name, "ItemAct"."itemId" AS item_id, min("ItemAct".created_at) AS act_at, + users.created_at AS user_at, "ItemAct".act = 'DONT_LIKE_THIS' AS against, count(*) OVER (partition by "ItemAct"."userId") AS user_vote_count FROM "ItemAct" - JOIN "Item" ON "Item".id = "ItemAct"."itemId" AND "ItemAct".act = 'VOTE' AND "Item"."parentId" IS NULL + JOIN "Item" ON "Item".id = "ItemAct"."itemId" AND "ItemAct".act IN ('FEE', 'TIP', 'DONT_LIKE_THIS') AND "Item"."parentId" IS NULL JOIN users ON "ItemAct"."userId" = users.id + GROUP BY user_id, name, item_id, user_at, against ), user_pair AS ( SELECT a.user_id AS a_id, a.name AS a_name, b.user_id AS b_id, b.name AS b_name, - count(*) FILTER(WHERE a.act_at > b.act_at) AS before, - count(*) FILTER(WHERE b.act_at > a.act_at) AS after, + count(*) FILTER(WHERE a.act_at > b.act_at AND a.against = b.against) AS before, + count(*) FILTER(WHERE b.act_at > a.act_at AND a.against = b.against) AS after, + count(*) FILTER(WHERE a.against <> b.against)*${DISAGREE_MULT} AS disagree, CASE WHEN b.user_at > a.user_at THEN b.user_vote_count ELSE a.user_vote_count END AS total FROM user_votes a JOIN user_votes b ON a.item_id = b.item_id GROUP BY a.user_id, a.name, a.user_at, a.user_vote_count, b.user_id, b.name, b.user_at, b.user_vote_count ) - SELECT a_id AS id, a_name, b_id AS oid, b_name, confidence(before, total - after, ${Z_CONFIDENCE}) AS trust, before, after, total + SELECT a_id AS id, a_name, b_id AS oid, b_name, confidence(before, total + disagree - after, ${Z_CONFIDENCE}) AS trust, before, after, disagree, total FROM user_pair WHERE before >= ${MIN_SUCCESS} ) a From de863021f9c96ba407d3f124f9855c5d20707fe7 Mon Sep 17 00:00:00 2001 From: keyan Date: Thu, 24 Nov 2022 13:22:58 -0600 Subject: [PATCH 13/42] prevent apollo caching on the server --- api/ssrApollo.js | 4 +++- lib/apollo.js | 17 +++++++++++++---- pages/_app.js | 2 +- worker/index.js | 8 ++++---- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/api/ssrApollo.js b/api/ssrApollo.js index 3931c76d..92f50701 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -13,7 +13,7 @@ import { getPrice } from '../components/price' export default async function getSSRApolloClient (req, me = null) { const session = req && await getSession({ req }) - return new ApolloClient({ + const client = new ApolloClient({ ssrMode: true, link: new SchemaLink({ schema: makeExecutableSchema({ @@ -31,6 +31,8 @@ export default async function getSSRApolloClient (req, me = null) { }), cache: new InMemoryCache() }) + await client.clearStore() + return client } export function getGetServerSideProps (query, variables = null, notFoundFunc, requireVar) { diff --git a/lib/apollo.js b/lib/apollo.js index 291e3d2f..9d22b3e7 100644 --- a/lib/apollo.js +++ b/lib/apollo.js @@ -19,8 +19,19 @@ function isFirstPage (cursor, existingThings) { } export default function getApolloClient () { - global.apolloClient ||= new ApolloClient({ - link: new HttpLink({ uri: '/api/graphql' }), + if (typeof window === 'undefined') { + const client = getClient(`${process.env.SELF_URL}/api/graphql`) + client.clearStore() + return client + } else { + global.apolloClient ||= getClient('/api/graphql') + return global.apolloClient + } +} + +function getClient (uri) { + return new ApolloClient({ + link: new HttpLink({ uri }), cache: new InMemoryCache({ typePolicies: { Query: { @@ -201,6 +212,4 @@ export default function getApolloClient () { } } }) - - return global.apolloClient } diff --git a/pages/_app.js b/pages/_app.js index e9a3c6d7..dee988af 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -62,7 +62,7 @@ function MyApp ({ Component, pageProps: { session, ...props } }) { ssr data */ const { apollo, data, me, price } = props - if (typeof window !== 'undefined' && apollo && data) { + if (apollo && data) { client.writeQuery({ query: gql`${apollo.query}`, data: data, diff --git a/worker/index.js b/worker/index.js index 3399acd5..238448ad 100644 --- a/worker/index.js +++ b/worker/index.js @@ -22,12 +22,12 @@ async function work () { cache: new InMemoryCache(), defaultOptions: { watchQuery: { - fetchPolicy: 'network-only', - nextFetchPolicy: 'network-only' + fetchPolicy: 'no-cache', + nextFetchPolicy: 'no-cache' }, query: { - fetchPolicy: 'network-only', - nextFetchPolicy: 'network-only' + fetchPolicy: 'no-cache', + nextFetchPolicy: 'no-cache' } } }) From ebbd1175b15efbb01e99eee45bb399402a85cc8c Mon Sep 17 00:00:00 2001 From: keyan Date: Sat, 26 Nov 2022 18:23:49 -0600 Subject: [PATCH 14/42] don't mix int types --- pages/api/lnwith.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/api/lnwith.js b/pages/api/lnwith.js index 313a7dc3..551c189e 100644 --- a/pages/api/lnwith.js +++ b/pages/api/lnwith.js @@ -32,7 +32,7 @@ export default async ({ query }, res) => { k1: query.k1, // Random or non-random string to identify the user's LN WALLET when using the callback URL defaultDescription: `Withdrawal for @${user.name} on SN`, // A default withdrawal invoice description minWithdrawable: 1000, // Min amount (in millisatoshis) the user can withdraw from LN SERVICE, or 0 - maxWithdrawable: user.msats - 10000 // Max amount (in millisatoshis) the user can withdraw from LN SERVICE, or equal to minWithdrawable if the user has no choice over the amounts + maxWithdrawable: Number(user.msats - 10000n) // Max amount (in millisatoshis) the user can withdraw from LN SERVICE, or equal to minWithdrawable if the user has no choice over the amounts }) } else { reason = 'user not found' From 7df375e7520fc2a8df00d7c3bf45ce3f3a5e08fe Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 29 Nov 2022 11:28:57 -0600 Subject: [PATCH 15/42] improvements to jobs --- api/resolvers/item.js | 3 -- api/resolvers/notifications.js | 2 +- api/resolvers/user.js | 2 +- components/item-job.js | 24 ++++++----- components/job-form.js | 7 +++- .../20221128224540_job_cost/migration.sql | 42 +++++++++++++++++++ 6 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 prisma/migrations/20221128224540_job_cost/migration.sql diff --git a/api/resolvers/item.js b/api/resolvers/item.js index 6cc30a61..ccb3fa9f 100644 --- a/api/resolvers/item.js +++ b/api/resolvers/item.js @@ -236,9 +236,6 @@ export default { switch (subFull?.rankingType) { case 'AUCTION': - // it might be sufficient to sort by the floor(maxBid / 1000) desc, created_at desc - // we pull from their wallet - // TODO: need to filter out by payment status items = await models.$queryRaw(` SELECT * FROM ( diff --git a/api/resolvers/notifications.js b/api/resolvers/notifications.js index 06b93be6..afe97dbe 100644 --- a/api/resolvers/notifications.js +++ b/api/resolvers/notifications.js @@ -98,7 +98,7 @@ export default { FROM "Item" WHERE "Item"."userId" = $1 AND "maxBid" IS NOT NULL - AND "statusUpdatedAt" <= $2 + AND "statusUpdatedAt" <= $2 AND "statusUpdatedAt" <> created_at ORDER BY "sortTime" DESC LIMIT ${LIMIT}+$3)` ) diff --git a/api/resolvers/user.js b/api/resolvers/user.js index 4ea16225..6cd59e9c 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -212,7 +212,7 @@ export default { } } }) - if (job) { + if (job && job.statusUpdatedAt > job.createdAt) { return true } diff --git a/components/item-job.js b/components/item-job.js index 7061f5a1..8c18773e 100644 --- a/components/item-job.js +++ b/components/item-job.js @@ -1,6 +1,6 @@ import * as Yup from 'yup' import Toc from './table-of-contents' -import { Button, Image } from 'react-bootstrap' +import { Badge, Button, Image } from 'react-bootstrap' import { SearchTitle } from './item' import styles from './item.module.css' import Link from 'next/link' @@ -59,16 +59,18 @@ export default function ItemJob ({ item, toc, rank, children }) { {item.mine && - <> - - \ - - - edit - - - {item.status !== 'ACTIVE' && {item.status}} - } + ( + <> + + \ + + + edit + + + {item.status !== 'ACTIVE' && {item.status}} + )} + {item.maxBid > 0 && item.status === 'ACTIVE' && PROMOTED}
{toc && } diff --git a/components/job-form.js b/components/job-form.js index 11ed57d0..9d07dcbf 100644 --- a/components/job-form.js +++ b/components/job-form.js @@ -14,6 +14,7 @@ import Avatar from './avatar' import BootstrapForm from 'react-bootstrap/Form' import Alert from 'react-bootstrap/Alert' import { useMe } from './me' +import ActionTooltip from './action-tooltip' Yup.addMethod(Yup.string, 'or', function (schemas, msg) { return this.test({ @@ -183,7 +184,11 @@ export default function JobForm ({ item, sub }) { /> {item && } - {item ? 'save' : 'post'} +
+ + {item ? 'save' : <>post 1000 sats} + +
) diff --git a/prisma/migrations/20221128224540_job_cost/migration.sql b/prisma/migrations/20221128224540_job_cost/migration.sql new file mode 100644 index 00000000..36215aec --- /dev/null +++ b/prisma/migrations/20221128224540_job_cost/migration.sql @@ -0,0 +1,42 @@ +CREATE OR REPLACE FUNCTION create_job( + title TEXT, url TEXT, text TEXT, user_id INTEGER, job_bid INTEGER, job_company TEXT, + job_location TEXT, job_remote BOOLEAN, job_upload_id INTEGER) +RETURNS "Item" +LANGUAGE plpgsql +AS $$ +DECLARE + item "Item"; + user_msats BIGINT; + cost_msats BIGINT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + -- 1000 sats to create a job + cost_msats := 1000000; + + SELECT msats + INTO user_msats + FROM users + WHERE id = user_id; + + IF cost_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + -- create item + INSERT INTO "Item" (title, url, text, "userId", "maxBid", company, location, remote, "uploadId", "subName", "statusUpdatedAt", created_at, updated_at) + VALUES (title, url, text, user_id, job_bid, job_company, job_location, job_remote, job_upload_id, 'jobs', now_utc(), now_utc(), now_utc()) RETURNING * INTO item; + + -- deduct from user + UPDATE users SET msats = msats - cost_msats WHERE id = user_id; + + -- record fee + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (cost_msats, item.id, user_id, 'FEE', now_utc(), now_utc()); + + -- run_auction + EXECUTE run_auction(item.id); + + RETURN item; +END; +$$; \ No newline at end of file From a2db3e18b42932fa0d7c2935fba9acabb3716e6a Mon Sep 17 00:00:00 2001 From: keyan Date: Thu, 1 Dec 2022 15:31:04 -0600 Subject: [PATCH 16/42] better user analytics mostly --- api/resolvers/growth.js | 249 ++++++++---------- api/resolvers/user.js | 7 +- api/typeDefs/growth.js | 51 +--- api/typeDefs/user.js | 3 +- components/footer.js | 2 +- components/usage-header.js | 47 ++-- fragments/users.js | 8 +- pages/notifications.js | 35 --- pages/settings.js | 7 + pages/users/[when].js | 214 +++++++++++++++ pages/users/forever.js | 151 ----------- pages/users/week.js | 101 ------- .../migration.sql | 2 + prisma/schema.prisma | 3 +- 14 files changed, 382 insertions(+), 498 deletions(-) create mode 100644 pages/users/[when].js delete mode 100644 pages/users/forever.js delete mode 100644 pages/users/week.js create mode 100644 prisma/migrations/20221129182008_hide_top_users/migration.sql diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 5a1df669..31a67db1 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -1,157 +1,140 @@ const PLACEHOLDERS_NUM = 616 +function interval (when) { + switch (when) { + case 'week': + return '1 week' + case 'month': + return '1 month' + case 'year': + return '1 year' + case 'forever': + return null + default: + return '1 day' + } +} + +function timeUnit (when) { + switch (when) { + case 'week': + case 'month': + return 'day' + case 'year': + case 'forever': + return 'month' + default: + return 'hour' + } +} + +function withClause (when) { + const ival = interval(when) + const unit = timeUnit(when) + + return ` + WITH range_values AS ( + SELECT date_trunc('${unit}', ${ival ? "now_utc() - interval '" + ival + "'" : "'2021-06-07'::timestamp"}) as minval, + date_trunc('${unit}', now_utc()) as maxval), + times AS ( + SELECT generate_series(minval, maxval, interval '1 ${unit}') as time + FROM range_values + ) + ` +} + export default { Query: { - registrationGrowth: async (parent, args, { models }) => { + registrationGrowth: async (parent, { when }, { models }) => { return await models.$queryRaw( - `SELECT date_trunc('month', created_at) AS time, count("inviteId") as invited, count(*) - count("inviteId") as organic - FROM users - WHERE id > ${PLACEHOLDERS_NUM} AND date_trunc('month', now_utc()) <> date_trunc('month', created_at) + `${withClause(when)} + SELECT time, json_build_array( + json_build_object('name', 'invited', 'value', count("inviteId")), + json_build_object('name', 'organic', 'value', count(users.id) FILTER(WHERE id > ${PLACEHOLDERS_NUM}) - count("inviteId")) + ) AS data + FROM times + LEFT JOIN users ON time = date_trunc('${timeUnit(when)}', created_at) GROUP BY time ORDER BY time ASC`) }, - activeGrowth: async (parent, args, { models }) => { + spenderGrowth: async (parent, { when }, { models }) => { return await models.$queryRaw( - `SELECT date_trunc('month', created_at) AS time, count(DISTINCT "userId") as num - FROM "ItemAct" - WHERE date_trunc('month', now_utc()) <> date_trunc('month', created_at) + `${withClause(when)} + SELECT time, json_build_array( + json_build_object('name', 'spenders', 'value', count(DISTINCT "userId")) + ) AS data + FROM times + LEFT JOIN "ItemAct" ON time = date_trunc('${timeUnit(when)}', created_at) GROUP BY time ORDER BY time ASC`) }, - itemGrowth: async (parent, args, { models }) => { + itemGrowth: async (parent, { when }, { models }) => { return await models.$queryRaw( - `SELECT date_trunc('month', created_at) AS time, count("parentId") as comments, - count("subName") as jobs, count(*)-count("parentId")-count("subName") as posts - FROM "Item" - WHERE date_trunc('month', now_utc()) <> date_trunc('month', created_at) - GROUP BY time - ORDER BY time ASC`) - }, - spentGrowth: async (parent, args, { models }) => { - // add up earn for each month - // add up non-self votes/tips for posts and comments - - return await models.$queryRaw( - `SELECT date_trunc('month', "ItemAct".created_at) AS time, - floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000) as jobs, - floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM') THEN "ItemAct".msats ELSE 0 END)/1000) as fees, - floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000) as boost, - floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000) as tips - FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id - WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) - GROUP BY time - ORDER BY time ASC`) - }, - earnerGrowth: async (parent, args, { models }) => { - return await models.$queryRaw( - `SELECT time, count(distinct user_id) as num - FROM - ((SELECT date_trunc('month', "ItemAct".created_at) AS time, "Item"."userId" as user_id - FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" - WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at)) - UNION ALL - (SELECT date_trunc('month', created_at) AS time, "userId" as user_id - FROM "Earn" - WHERE date_trunc('month', now_utc()) <> date_trunc('month', created_at))) u - GROUP BY time - ORDER BY time ASC`) - }, - stackedGrowth: async (parent, args, { models }) => { - return await models.$queryRaw( - `SELECT time, floor(sum(airdrop)/1000) as rewards, floor(sum(post)/1000) as posts, floor(sum(comment)/1000) as comments - FROM - ((SELECT date_trunc('month', "ItemAct".created_at) AS time, 0 as airdrop, - CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".msats END as comment, - CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post - FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" - WHERE date_trunc('month', now_utc()) <> date_trunc('month', "ItemAct".created_at) AND - "ItemAct".act = 'TIP') - UNION ALL - (SELECT date_trunc('month', created_at) AS time, msats as airdrop, 0 as post, 0 as comment - FROM "Earn" - WHERE date_trunc('month', now_utc()) <> date_trunc('month', created_at))) u - GROUP BY time - ORDER BY time ASC`) - }, - registrationsWeekly: async (parent, args, { models }) => { - return await models.user.count({ - where: { - createdAt: { - gte: new Date(new Date().setDate(new Date().getDate() - 7)) - } - } - }) - }, - activeWeekly: async (parent, args, { models }) => { - const [{ active }] = await models.$queryRaw( - `SELECT count(DISTINCT "userId") as active - FROM "ItemAct" - WHERE created_at >= now_utc() - interval '1 week'` - ) - return active - }, - earnersWeekly: async (parent, args, { models }) => { - const [{ earners }] = await models.$queryRaw( - `SELECT count(distinct user_id) as earners - FROM - ((SELECT "Item"."userId" as user_id - FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" - WHERE "ItemAct".created_at >= now_utc() - interval '1 week') - UNION ALL - (SELECT "userId" as user_id - FROM "Earn" - WHERE created_at >= now_utc() - interval '1 week')) u`) - return earners - }, - itemsWeekly: async (parent, args, { models }) => { - const [stats] = await models.$queryRaw( - `SELECT json_build_array( + `${withClause(when)} + SELECT time, json_build_array( json_build_object('name', 'comments', 'value', count("parentId")), json_build_object('name', 'jobs', 'value', count("subName")), - json_build_object('name', 'posts', 'value', count(*)-count("parentId")-count("subName"))) as array - FROM "Item" - WHERE created_at >= now_utc() - interval '1 week'`) - - return stats?.array + json_build_object('name', 'posts', 'value', count("Item".id)-count("parentId")-count("subName")) + ) AS data + FROM times + LEFT JOIN "Item" ON time = date_trunc('${timeUnit(when)}', created_at) + GROUP BY time + ORDER BY time ASC`) }, - spentWeekly: async (parent, args, { models }) => { - const [stats] = await models.$queryRaw( - `SELECT json_build_array( - json_build_object('name', 'jobs', 'value', floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000)), - json_build_object('name', 'fees', 'value', floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM') THEN "ItemAct".msats ELSE 0 END)/1000)), - json_build_object('name', 'boost', 'value',floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000)), - json_build_object('name', 'tips', 'value', floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000))) as array - FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id - WHERE "ItemAct".created_at >= now_utc() - interval '1 week'`) - - return stats?.array + spendingGrowth: async (parent, { when }, { models }) => { + return await models.$queryRaw( + `${withClause(when)} + SELECT time, json_build_array( + json_build_object('name', 'jobs', 'value', coalesce(floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000),0)), + json_build_object('name', 'boost', 'value', coalesce(floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000),0)), + json_build_object('name', 'fees', 'value', coalesce(floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM') THEN "ItemAct".msats ELSE 0 END)/1000),0)), + json_build_object('name', 'tips', 'value', coalesce(floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000),0)) + ) AS data + FROM times + LEFT JOIN "ItemAct" ON time = date_trunc('${timeUnit(when)}', created_at) + JOIN "Item" ON "ItemAct"."itemId" = "Item".id + GROUP BY time + ORDER BY time ASC`) }, - stackedWeekly: async (parent, args, { models }) => { - const [stats] = await models.$queryRaw( - `SELECT json_build_array( - json_build_object('name', 'rewards', 'value', floor(sum(airdrop)/1000)), - json_build_object('name', 'posts', 'value', floor(sum(post)/1000)), - json_build_object('name', 'comments', 'value', floor(sum(comment)/1000)) - ) as array - FROM - ((SELECT 0 as airdrop, + stackerGrowth: async (parent, { when }, { models }) => { + return await models.$queryRaw( + `${withClause(when)} + SELECT time, json_build_array( + json_build_object('name', 'stackers', 'value', count(distinct user_id)) + ) AS data + FROM times + LEFT JOIN + ((SELECT "ItemAct".created_at, "Item"."userId" as user_id + FROM "ItemAct" + JOIN "Item" on "ItemAct"."itemId" = "Item".id + WHERE "ItemAct".act = 'TIP') + UNION ALL + (SELECT created_at, "userId" as user_id + FROM "Earn")) u ON time = date_trunc('${timeUnit(when)}', u.created_at) + GROUP BY time + ORDER BY time ASC`) + }, + stackingGrowth: async (parent, { when }, { models }) => { + return await models.$queryRaw( + `${withClause(when)} + SELECT time, json_build_array( + json_build_object('name', 'rewards', 'value', coalesce(floor(sum(airdrop)/1000),0)), + json_build_object('name', 'posts', 'value', coalesce(floor(sum(post)/1000),0)), + json_build_object('name', 'comments', 'value', coalesce(floor(sum(comment)/1000),0)) + ) AS data + FROM times + LEFT JOIN + ((SELECT "ItemAct".created_at, 0 as airdrop, CASE WHEN "Item"."parentId" IS NULL THEN 0 ELSE "ItemAct".msats END as comment, CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id AND "Item"."userId" <> "ItemAct"."userId" - WHERE "ItemAct".created_at >= now_utc() - interval '1 week' AND - "ItemAct".act = 'TIP') + JOIN "Item" on "ItemAct"."itemId" = "Item".id + WHERE "ItemAct".act = 'TIP') UNION ALL - (SELECT msats as airdrop, 0 as post, 0 as comment - FROM "Earn" - WHERE created_at >= now_utc() - interval '1 week')) u`) - - return stats?.array + (SELECT created_at, msats as airdrop, 0 as post, 0 as comment + FROM "Earn")) u ON time = date_trunc('${timeUnit(when)}', u.created_at) + GROUP BY time + ORDER BY time ASC`) } } } diff --git a/api/resolvers/user.js b/api/resolvers/user.js index 6cd59e9c..a120ec3a 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -97,6 +97,7 @@ export default { FROM "ItemAct" JOIN users on "ItemAct"."userId" = users.id WHERE "ItemAct".created_at <= $1 + AND NOT users."hideFromTopUsers" ${within('ItemAct', when)} GROUP BY users.id, users.name ORDER BY spent DESC NULLS LAST, users.created_at DESC @@ -108,6 +109,7 @@ export default { FROM users JOIN "Item" on "Item"."userId" = users.id WHERE "Item".created_at <= $1 AND "Item"."parentId" IS NULL + AND NOT users."hideFromTopUsers" ${within('Item', when)} GROUP BY users.id ORDER BY nitems DESC NULLS LAST, users.created_at DESC @@ -119,6 +121,7 @@ export default { FROM users JOIN "Item" on "Item"."userId" = users.id WHERE "Item".created_at <= $1 AND "Item"."parentId" IS NOT NULL + AND NOT users."hideFromTopUsers" ${within('Item', when)} GROUP BY users.id ORDER BY ncomments DESC NULLS LAST, users.created_at DESC @@ -133,12 +136,14 @@ export default { JOIN "Item" on "ItemAct"."itemId" = "Item".id JOIN users on "Item"."userId" = users.id WHERE act <> 'BOOST' AND "ItemAct"."userId" <> users.id AND "ItemAct".created_at <= $1 + AND NOT users."hideFromTopUsers" ${within('ItemAct', when)}) UNION ALL (SELECT users.*, "Earn".msats as amount FROM "Earn" JOIN users on users.id = "Earn"."userId" - WHERE "Earn".msats > 0 ${within('Earn', when)})) u + WHERE "Earn".msats > 0 ${within('Earn', when)} + AND NOT users."hideFromTopUsers")) u GROUP BY u.id, u.name, u.created_at, u."photoId" ORDER BY stacked DESC NULLS LAST, created_at DESC OFFSET $2 diff --git a/api/typeDefs/growth.js b/api/typeDefs/growth.js index db222e6a..56c0b635 100644 --- a/api/typeDefs/growth.js +++ b/api/typeDefs/growth.js @@ -2,24 +2,12 @@ import { gql } from 'apollo-server-micro' export default gql` extend type Query { - registrationGrowth: [RegistrationGrowth!]! - activeGrowth: [TimeNum!]! - itemGrowth: [ItemGrowth!]! - spentGrowth: [SpentGrowth!]! - stackedGrowth: [StackedGrowth!]! - earnerGrowth: [TimeNum!]! - - registrationsWeekly: Int! - activeWeekly: Int! - earnersWeekly: Int! - itemsWeekly: [NameValue!]! - spentWeekly: [NameValue!]! - stackedWeekly: [NameValue!]! - } - - type TimeNum { - time: String! - num: Int! + registrationGrowth(when: String): [TimeData!]! + itemGrowth(when: String): [TimeData!]! + spendingGrowth(when: String): [TimeData!]! + spenderGrowth(when: String): [TimeData!]! + stackingGrowth(when: String): [TimeData!]! + stackerGrowth(when: String): [TimeData!]! } type NameValue { @@ -27,31 +15,8 @@ export default gql` value: Int! } - type RegistrationGrowth { + type TimeData { time: String! - invited: Int! - organic: Int! - } - - type ItemGrowth { - time: String! - jobs: Int! - posts: Int! - comments: Int! - } - - type StackedGrowth { - time: String! - rewards: Int! - posts: Int! - comments: Int! - } - - type SpentGrowth { - time: String! - jobs: Int! - fees: Int! - boost: Int! - tips: Int! + data: [NameValue!]! } ` diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index c6fffb6a..1fe2bdf0 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -21,7 +21,7 @@ export default gql` setName(name: String!): Boolean setSettings(tipDefault: Int!, fiatCurrency: String!, noteItemSats: Boolean!, noteEarning: Boolean!, noteAllDescendants: Boolean!, noteMentions: Boolean!, noteDeposits: Boolean!, - noteInvites: Boolean!, noteJobIndicator: Boolean!, hideInvoiceDesc: Boolean!, + noteInvites: Boolean!, noteJobIndicator: Boolean!, hideInvoiceDesc: Boolean!, hideFromTopUsers: Boolean!, wildWestMode: Boolean!, greeterMode: Boolean!): User setPhoto(photoId: ID!): Int! upsertBio(bio: String!): User! @@ -64,6 +64,7 @@ export default gql` noteInvites: Boolean! noteJobIndicator: Boolean! hideInvoiceDesc: Boolean! + hideFromTopUsers: Boolean! wildWestMode: Boolean! greeterMode: Boolean! lastCheckedJobs: String diff --git a/components/footer.js b/components/footer.js index e72fa59e..7b013e68 100644 --- a/components/footer.js +++ b/components/footer.js @@ -98,7 +98,7 @@ const AnalyticsPopover = ( visitors \ - + users diff --git a/components/usage-header.js b/components/usage-header.js index 1d2c30ba..d3f11923 100644 --- a/components/usage-header.js +++ b/components/usage-header.js @@ -1,35 +1,26 @@ -import Link from 'next/link' import { useRouter } from 'next/router' -import { Nav, Navbar } from 'react-bootstrap' -import styles from './header.module.css' +import { Form, Select } from './form' export function UsageHeader () { const router = useRouter() + return ( - - - +
+
+ user analytics for + router.push(e.target.value === 'posts' ? '/recent' : `/recent/${e.target.value}`)} + /> +
+
) } diff --git a/fragments/items.js b/fragments/items.js index 91fdc26c..2804f776 100644 --- a/fragments/items.js +++ b/fragments/items.js @@ -56,8 +56,8 @@ export const ITEM_FIELDS = gql` export const ITEMS = gql` ${ITEM_FIELDS} - query items($sub: String, $sort: String, $cursor: String, $name: String, $within: String) { - items(sub: $sub, sort: $sort, cursor: $cursor, name: $name, within: $within) { + query items($sub: String, $sort: String, $type: String, $cursor: String, $name: String, $within: String) { + items(sub: $sub, sort: $sort, type: $type, cursor: $cursor, name: $name, within: $within) { cursor items { ...ItemFields diff --git a/lib/apollo.js b/lib/apollo.js index 9d22b3e7..96a53581 100644 --- a/lib/apollo.js +++ b/lib/apollo.js @@ -50,7 +50,7 @@ function getClient (uri) { } }, items: { - keyArgs: ['sub', 'sort', 'name', 'within'], + keyArgs: ['sub', 'sort', 'type', 'name', 'within'], merge (existing, incoming) { if (isFirstPage(incoming.cursor, existing?.items)) { return incoming diff --git a/pages/recent/[type].js b/pages/recent/[type].js new file mode 100644 index 00000000..cc9a466e --- /dev/null +++ b/pages/recent/[type].js @@ -0,0 +1,22 @@ +import Layout from '../../components/layout' +import Items from '../../components/items' +import { getGetServerSideProps } from '../../api/ssrApollo' +import { ITEMS } from '../../fragments/items' +import RecentHeader from '../../components/recent-header' +import { useRouter } from 'next/router' + +const variables = { sort: 'recent' } +export const getServerSideProps = getGetServerSideProps(ITEMS, variables) + +export default function Index ({ data: { items: { items, cursor } } }) { + const router = useRouter() + return ( + + + + + ) +} diff --git a/pages/recent/comments.js b/pages/recent/comments.js index 651ed16e..5ddf8829 100644 --- a/pages/recent/comments.js +++ b/pages/recent/comments.js @@ -10,7 +10,7 @@ export const getServerSideProps = getGetServerSideProps(MORE_FLAT_COMMENTS, vari export default function Index ({ data: { moreFlatComments: { comments, cursor } } }) { return ( - + - + { case 'forever': return `${('0' + (date.getMonth() % 12 + 1)).slice(-2)}/${String(date.getFullYear()).slice(-2)}` default: - return `${date.getHours() % 12 || 12}${date.getHours() >= 12 ? 'p' : 'a'}` + return `${date.getHours() % 12 || 12}${date.getHours() >= 12 ? 'pm' : 'am'}` } } } From c3892d8a25726e2daba60c4fbf693a32122c5caa Mon Sep 17 00:00:00 2001 From: keyan Date: Thu, 1 Dec 2022 17:14:16 -0600 Subject: [PATCH 18/42] use indices to query growth --- api/resolvers/growth.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 31a67db1..963d37ac 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -43,6 +43,15 @@ function withClause (when) { ` } +// HACKY AF this is a performance enhancement that allows us to use the created_at indices on tables +function intervalClause (when, table, and) { + if (when === 'forever') { + return and ? '' : 'TRUE' + } + + return `"${table}".created_at >= now_utc() - interval '${interval(when)}' ${and ? 'AND' : ''} ` +} + export default { Query: { registrationGrowth: async (parent, { when }, { models }) => { @@ -53,7 +62,7 @@ export default { json_build_object('name', 'organic', 'value', count(users.id) FILTER(WHERE id > ${PLACEHOLDERS_NUM}) - count("inviteId")) ) AS data FROM times - LEFT JOIN users ON time = date_trunc('${timeUnit(when)}', created_at) + LEFT JOIN users ON ${intervalClause(when, 'users', true)} time = date_trunc('${timeUnit(when)}', created_at) GROUP BY time ORDER BY time ASC`) }, @@ -64,7 +73,7 @@ export default { json_build_object('name', 'spenders', 'value', count(DISTINCT "userId")) ) AS data FROM times - LEFT JOIN "ItemAct" ON time = date_trunc('${timeUnit(when)}', created_at) + LEFT JOIN "ItemAct" ON ${intervalClause(when, 'ItemAct', true)} time = date_trunc('${timeUnit(when)}', created_at) GROUP BY time ORDER BY time ASC`) }, @@ -77,7 +86,7 @@ export default { json_build_object('name', 'posts', 'value', count("Item".id)-count("parentId")-count("subName")) ) AS data FROM times - LEFT JOIN "Item" ON time = date_trunc('${timeUnit(when)}', created_at) + LEFT JOIN "Item" ON ${intervalClause(when, 'Item', true)} time = date_trunc('${timeUnit(when)}', created_at) GROUP BY time ORDER BY time ASC`) }, @@ -91,7 +100,7 @@ export default { json_build_object('name', 'tips', 'value', coalesce(floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000),0)) ) AS data FROM times - LEFT JOIN "ItemAct" ON time = date_trunc('${timeUnit(when)}', created_at) + LEFT JOIN "ItemAct" ON ${intervalClause(when, 'ItemAct', true)} time = date_trunc('${timeUnit(when)}', created_at) JOIN "Item" ON "ItemAct"."itemId" = "Item".id GROUP BY time ORDER BY time ASC`) @@ -107,10 +116,11 @@ export default { ((SELECT "ItemAct".created_at, "Item"."userId" as user_id FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id - WHERE "ItemAct".act = 'TIP') + WHERE ${intervalClause(when, 'ItemAct', true)} "ItemAct".act = 'TIP') UNION ALL (SELECT created_at, "userId" as user_id - FROM "Earn")) u ON time = date_trunc('${timeUnit(when)}', u.created_at) + FROM "Earn" + WHERE ${intervalClause(when, 'Earn', false)})) u ON time = date_trunc('${timeUnit(when)}', u.created_at) GROUP BY time ORDER BY time ASC`) }, @@ -129,10 +139,11 @@ export default { CASE WHEN "Item"."parentId" IS NULL THEN "ItemAct".msats ELSE 0 END as post FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id - WHERE "ItemAct".act = 'TIP') + WHERE ${intervalClause(when, 'ItemAct', true)} "ItemAct".act = 'TIP') UNION ALL (SELECT created_at, msats as airdrop, 0 as post, 0 as comment - FROM "Earn")) u ON time = date_trunc('${timeUnit(when)}', u.created_at) + FROM "Earn" + WHERE ${intervalClause(when, 'Earn', false)})) u ON time = date_trunc('${timeUnit(when)}', u.created_at) GROUP BY time ORDER BY time ASC`) } From e28b74fd851724d646b185cecc37e8395201ea87 Mon Sep 17 00:00:00 2001 From: keyan Date: Thu, 1 Dec 2022 17:46:56 -0600 Subject: [PATCH 19/42] extract day/month/year as UTC --- pages/users/[when].js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/users/[when].js b/pages/users/[when].js index c0bdd881..9a59ac1b 100644 --- a/pages/users/[when].js +++ b/pages/users/[when].js @@ -62,10 +62,10 @@ const dateFormatter = when => { switch (when) { case 'week': case 'month': - return `${('0' + (date.getMonth() % 12 + 1)).slice(-2)}/${date.getDate()}` + return `${('0' + (date.getUTCMonth() % 12 + 1)).slice(-2)}/${date.getUTCDate()}` case 'year': case 'forever': - return `${('0' + (date.getMonth() % 12 + 1)).slice(-2)}/${String(date.getFullYear()).slice(-2)}` + return `${('0' + (date.getUTCMonth() % 12 + 1)).slice(-2)}/${String(date.getUTCFullYear()).slice(-2)}` default: return `${date.getHours() % 12 || 12}${date.getHours() >= 12 ? 'pm' : 'am'}` } From f6a95c81eb17bc73f7ebd082666f4f983a34e6b1 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 6 Dec 2022 13:26:33 -0600 Subject: [PATCH 20/42] add spender/stacker types --- api/resolvers/growth.js | 15 +++++++++++---- pages/users/[when].js | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 963d37ac..18a78b1f 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -70,7 +70,11 @@ export default { return await models.$queryRaw( `${withClause(when)} SELECT time, json_build_array( - json_build_object('name', 'spenders', 'value', count(DISTINCT "userId")) + json_build_object('name', 'any', 'value', count(DISTINCT "userId")), + json_build_object('name', 'jobs', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'STREAM')), + json_build_object('name', 'boost', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'BOOST')), + json_build_object('name', 'fees', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'FEE')), + json_build_object('name', 'tips', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'TIP')) ) AS data FROM times LEFT JOIN "ItemAct" ON ${intervalClause(when, 'ItemAct', true)} time = date_trunc('${timeUnit(when)}', created_at) @@ -109,16 +113,19 @@ export default { return await models.$queryRaw( `${withClause(when)} SELECT time, json_build_array( - json_build_object('name', 'stackers', 'value', count(distinct user_id)) + json_build_object('name', 'any', 'value', count(distinct user_id)), + json_build_object('name', 'posts', 'value', count(distinct user_id) FILTER (WHERE type = 'POST')), + json_build_object('name', 'comments', 'value', count(distinct user_id) FILTER (WHERE type = 'COMMENT')), + json_build_object('name', 'rewards', 'value', count(distinct user_id) FILTER (WHERE type = 'EARN')) ) AS data FROM times LEFT JOIN - ((SELECT "ItemAct".created_at, "Item"."userId" as user_id + ((SELECT "ItemAct".created_at, "Item"."userId" as user_id, CASE WHEN "Item"."parentId" IS NULL THEN 'POST' ELSE 'COMMENT' END as type FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE ${intervalClause(when, 'ItemAct', true)} "ItemAct".act = 'TIP') UNION ALL - (SELECT created_at, "userId" as user_id + (SELECT created_at, "userId" as user_id, 'EARN' as type FROM "Earn" WHERE ${intervalClause(when, 'Earn', false)})) u ON time = date_trunc('${timeUnit(when)}', u.created_at) GROUP BY time diff --git a/pages/users/[when].js b/pages/users/[when].js index 9a59ac1b..976df325 100644 --- a/pages/users/[when].js +++ b/pages/users/[when].js @@ -140,7 +140,7 @@ const COLORS = [ 'var(--info)', 'var(--success)', 'var(--boost)', - 'var(--grey)' + 'var(--theme-grey)' ] function GrowthAreaChart ({ data }) { From 439c83f975fa6d65437391de490fd06e148a8a1f Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 6 Dec 2022 15:23:45 -0600 Subject: [PATCH 21/42] all things being equal, sort comments by sats --- api/resolvers/item.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/resolvers/item.js b/api/resolvers/item.js index 3f0888eb..d963875f 100644 --- a/api/resolvers/item.js +++ b/api/resolvers/item.js @@ -14,13 +14,13 @@ async function comments (me, models, id, sort) { let orderBy switch (sort) { case 'top': - orderBy = `ORDER BY ${await orderByNumerator(me, models)} DESC, "Item".id DESC` + orderBy = `ORDER BY ${await orderByNumerator(me, models)} DESC, "Item".msats DESC, "Item".id DESC` break case 'recent': - orderBy = 'ORDER BY "Item".created_at DESC, "Item".id DESC' + orderBy = 'ORDER BY "Item".created_at DESC, "Item".msats DESC, "Item".id DESC' break default: - orderBy = `ORDER BY ${await orderByNumerator(me, models)}/POWER(GREATEST(3, EXTRACT(EPOCH FROM (now_utc() - "Item".created_at))/3600), 1.3) DESC NULLS LAST, "Item".id DESC` + orderBy = `ORDER BY ${await orderByNumerator(me, models)}/POWER(GREATEST(3, EXTRACT(EPOCH FROM (now_utc() - "Item".created_at))/3600), 1.3) DESC NULLS LAST, "Item".msats DESC, "Item".id DESC` break } From e1bdb9c7691d00ea2193ea0e9b46bf22f1260528 Mon Sep 17 00:00:00 2001 From: keyan Date: Wed, 7 Dec 2022 18:04:02 -0600 Subject: [PATCH 22/42] donations to rewards --- api/resolvers/growth.js | 31 +++- api/resolvers/index.js | 3 +- api/resolvers/rewards.js | 48 ++++++ api/resolvers/user.js | 18 ++- api/resolvers/wallet.js | 10 ++ api/typeDefs/index.js | 3 +- api/typeDefs/rewards.js | 16 ++ components/footer.js | 7 + components/layout-center.js | 4 +- pages/rewards.js | 142 ++++++++++++++++++ pages/satistics.js | 11 ++ pages/users/[when].js | 3 +- .../20221206213226_donate/migration.sql | 39 +++++ .../20221207212053_donate_func/migration.sql | 25 +++ prisma/schema.prisma | 10 ++ worker/earn.js | 10 +- 16 files changed, 360 insertions(+), 20 deletions(-) create mode 100644 api/resolvers/rewards.js create mode 100644 api/typeDefs/rewards.js create mode 100644 pages/rewards.js create mode 100644 prisma/migrations/20221206213226_donate/migration.sql create mode 100644 prisma/migrations/20221207212053_donate_func/migration.sql diff --git a/api/resolvers/growth.js b/api/resolvers/growth.js index 18a78b1f..f048d109 100644 --- a/api/resolvers/growth.js +++ b/api/resolvers/growth.js @@ -74,10 +74,18 @@ export default { json_build_object('name', 'jobs', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'STREAM')), json_build_object('name', 'boost', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'BOOST')), json_build_object('name', 'fees', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'FEE')), - json_build_object('name', 'tips', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'TIP')) + json_build_object('name', 'tips', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'TIP')), + json_build_object('name', 'donation', 'value', count(DISTINCT "userId") FILTER (WHERE act = 'DONATION')) ) AS data FROM times - LEFT JOIN "ItemAct" ON ${intervalClause(when, 'ItemAct', true)} time = date_trunc('${timeUnit(when)}', created_at) + LEFT JOIN + ((SELECT "ItemAct".created_at, "userId", act::text as act + FROM "ItemAct" + WHERE ${intervalClause(when, 'ItemAct', false)}) + UNION ALL + (SELECT created_at, "userId", 'DONATION' as act + FROM "Donation" + WHERE ${intervalClause(when, 'Donation', false)})) u ON time = date_trunc('${timeUnit(when)}', u.created_at) GROUP BY time ORDER BY time ASC`) }, @@ -98,14 +106,21 @@ export default { return await models.$queryRaw( `${withClause(when)} SELECT time, json_build_array( - json_build_object('name', 'jobs', 'value', coalesce(floor(sum(CASE WHEN act = 'STREAM' THEN "ItemAct".msats ELSE 0 END)/1000),0)), - json_build_object('name', 'boost', 'value', coalesce(floor(sum(CASE WHEN act = 'BOOST' THEN "ItemAct".msats ELSE 0 END)/1000),0)), - json_build_object('name', 'fees', 'value', coalesce(floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM') THEN "ItemAct".msats ELSE 0 END)/1000),0)), - json_build_object('name', 'tips', 'value', coalesce(floor(sum(CASE WHEN act = 'TIP' THEN "ItemAct".msats ELSE 0 END)/1000),0)) + json_build_object('name', 'jobs', 'value', coalesce(floor(sum(CASE WHEN act = 'STREAM' THEN msats ELSE 0 END)/1000),0)), + json_build_object('name', 'boost', 'value', coalesce(floor(sum(CASE WHEN act = 'BOOST' THEN msats ELSE 0 END)/1000),0)), + json_build_object('name', 'fees', 'value', coalesce(floor(sum(CASE WHEN act NOT IN ('BOOST', 'TIP', 'STREAM', 'DONATION') THEN msats ELSE 0 END)/1000),0)), + json_build_object('name', 'tips', 'value', coalesce(floor(sum(CASE WHEN act = 'TIP' THEN msats ELSE 0 END)/1000),0)), + json_build_object('name', 'donations', 'value', coalesce(floor(sum(CASE WHEN act = 'DONATION' THEN msats ELSE 0 END)/1000),0)) ) AS data FROM times - LEFT JOIN "ItemAct" ON ${intervalClause(when, 'ItemAct', true)} time = date_trunc('${timeUnit(when)}', created_at) - JOIN "Item" ON "ItemAct"."itemId" = "Item".id + LEFT JOIN + ((SELECT "ItemAct".created_at, msats, act::text as act + FROM "ItemAct" + WHERE ${intervalClause(when, 'ItemAct', false)}) + UNION ALL + (SELECT created_at, sats * 1000 as msats, 'DONATION' as act + FROM "Donation" + WHERE ${intervalClause(when, 'Donation', false)})) u ON time = date_trunc('${timeUnit(when)}', u.created_at) GROUP BY time ORDER BY time ASC`) }, diff --git a/api/resolvers/index.js b/api/resolvers/index.js index d2bb87d9..7798a789 100644 --- a/api/resolvers/index.js +++ b/api/resolvers/index.js @@ -9,7 +9,8 @@ import sub from './sub' import upload from './upload' import growth from './growth' import search from './search' +import rewards from './rewards' import { GraphQLJSONObject } from 'graphql-type-json' export default [user, item, message, wallet, lnurl, notifications, invite, sub, - upload, growth, search, { JSONObject: GraphQLJSONObject }] + upload, growth, search, rewards, { JSONObject: GraphQLJSONObject }] diff --git a/api/resolvers/rewards.js b/api/resolvers/rewards.js new file mode 100644 index 00000000..55e16cfd --- /dev/null +++ b/api/resolvers/rewards.js @@ -0,0 +1,48 @@ +import { AuthenticationError } from 'apollo-server-micro' +import serialize from './serial' + +export default { + Query: { + expectedRewards: async (parent, args, { models }) => { + // get the last reward time, then get all contributions to rewards since then + const lastReward = await models.earn.findFirst({ + orderBy: { + createdAt: 'desc' + } + }) + + const [result] = await models.$queryRaw` + SELECT coalesce(sum(sats), 0) as total, json_build_array( + json_build_object('name', 'donations', 'value', coalesce(sum(sats) FILTER(WHERE type = 'DONATION'), 0)), + json_build_object('name', 'fees', 'value', coalesce(sum(sats) FILTER(WHERE type NOT IN ('BOOST', 'STREAM')), 0)), + json_build_object('name', 'boost', 'value', coalesce(sum(sats) FILTER(WHERE type = 'BOOST'), 0)), + json_build_object('name', 'jobs', 'value', coalesce(sum(sats) FILTER(WHERE type = 'STREAM'), 0)) + ) AS sources + FROM ( + (SELECT msats / 1000 as sats, act::text as type + FROM "ItemAct" + WHERE created_at > ${lastReward.createdAt} AND "ItemAct".act <> 'TIP') + UNION ALL + (SELECT sats, 'DONATION' as type + FROM "Donation" + WHERE created_at > ${lastReward.createdAt}) + ) subquery` + + return result + } + }, + Mutation: { + donateToRewards: async (parent, { sats }, { me, models }) => { + if (!me) { + throw new AuthenticationError('you must be logged in') + } + + await serialize(models, + models.$queryRaw( + 'SELECT donate($1, $2)', + sats, Number(me.id))) + + return sats + } + } +} diff --git a/api/resolvers/user.js b/api/resolvers/user.js index a120ec3a..3485189d 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -93,12 +93,20 @@ export default { let users if (sort === 'spent') { users = await models.$queryRaw(` - SELECT users.*, floor(sum("ItemAct".msats)/1000) as spent - FROM "ItemAct" - JOIN users on "ItemAct"."userId" = users.id - WHERE "ItemAct".created_at <= $1 + SELECT users.*, sum(sats_spent) as spent + FROM + ((SELECT "userId", floor(sum("ItemAct".msats)/1000) as sats_spent + FROM "ItemAct" + WHERE "ItemAct".created_at <= $1 + ${within('ItemAct', when)} + GROUP BY "userId") + UNION ALL + (SELECT "userId", sats as sats_spent + FROM "Donation" + WHERE created_at <= $1 + ${within('Donation', when)})) spending + JOIN users on spending."userId" = users.id AND NOT users."hideFromTopUsers" - ${within('ItemAct', when)} GROUP BY users.id, users.name ORDER BY spent DESC NULLS LAST, users.created_at DESC OFFSET $2 diff --git a/api/resolvers/wallet.js b/api/resolvers/wallet.js index b8dafcec..3255b230 100644 --- a/api/resolvers/wallet.js +++ b/api/resolvers/wallet.js @@ -122,6 +122,13 @@ export default { WHERE "ItemAct"."userId" = $1 AND "ItemAct".created_at <= $2 GROUP BY "Item".id)`) + queries.push( + `(SELECT ('donation' || "Donation".id) as id, "Donation".id as "factId", NULL as bolt11, + created_at as "createdAt", sats * 1000 as msats, + 0 as "msatsFee", NULL as status, 'donation' as type + FROM "Donation" + WHERE "userId" = $1 + AND created_at <= $2)`) } if (queries.length === 0) { @@ -157,6 +164,9 @@ export default { case 'spent': f.msats *= -1 break + case 'donation': + f.msats *= -1 + break default: break } diff --git a/api/typeDefs/index.js b/api/typeDefs/index.js index 5768cc88..183069da 100644 --- a/api/typeDefs/index.js +++ b/api/typeDefs/index.js @@ -10,6 +10,7 @@ import invite from './invite' import sub from './sub' import upload from './upload' import growth from './growth' +import rewards from './rewards' const link = gql` type Query { @@ -26,4 +27,4 @@ const link = gql` ` export default [link, user, item, message, wallet, lnurl, notifications, invite, - sub, upload, growth] + sub, upload, growth, rewards] diff --git a/api/typeDefs/rewards.js b/api/typeDefs/rewards.js new file mode 100644 index 00000000..e9776c20 --- /dev/null +++ b/api/typeDefs/rewards.js @@ -0,0 +1,16 @@ +import { gql } from 'apollo-server-micro' + +export default gql` + extend type Query { + expectedRewards: ExpectedRewards! + } + + extend type Mutation { + donateToRewards(sats: Int!): Int! + } + + type ExpectedRewards { + total: Int! + sources: [NameValue!]! + } +` diff --git a/components/footer.js b/components/footer.js index 7b013e68..f3cb2377 100644 --- a/components/footer.js +++ b/components/footer.js @@ -151,6 +151,13 @@ export default function Footer ({ noLinks }) { darkMode.toggle()} className='fill-grey theme' />
} +
diff --git a/components/layout-center.js b/components/layout-center.js index c326de15..41b3d769 100644 --- a/components/layout-center.js +++ b/components/layout-center.js @@ -1,10 +1,10 @@ import Layout from './layout' import styles from './layout-center.module.css' -export default function LayoutCenter ({ children, ...props }) { +export default function LayoutCenter ({ children, footerLinks, ...props }) { return (
- +
{children}
diff --git a/pages/rewards.js b/pages/rewards.js new file mode 100644 index 00000000..17a44da3 --- /dev/null +++ b/pages/rewards.js @@ -0,0 +1,142 @@ +import { gql } from 'apollo-server-micro' +import { useEffect, useRef, useState } from 'react' +import { Button, InputGroup, Modal } from 'react-bootstrap' +import { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts' +import { getGetServerSideProps } from '../api/ssrApollo' +import { Form, Input, SubmitButton } from '../components/form' +import LayoutCenter from '../components/layout-center' +import * as Yup from 'yup' +import { useMutation, useQuery } from '@apollo/client' +import Link from 'next/link' + +const REWARDS = gql` +{ + expectedRewards { + total + sources { + name + value + } + } +} +` + +export const getServerSideProps = getGetServerSideProps(REWARDS) + +export default function Rewards ({ data: { expectedRewards: { total, sources } } }) { + const { data } = useQuery(REWARDS, { pollInterval: 1000 }) + + if (data) { + ({ expectedRewards: { total, sources } } = data) + } + + return ( + +

+
{total} sats to be rewarded today
+ + learn about rewards + +

+
+ +
+ +
+ ) +} + +const COLORS = [ + 'var(--secondary)', + 'var(--info)', + 'var(--success)', + 'var(--boost)', + 'var(--grey)' +] + +function GrowthPieChart ({ data }) { + return ( + + + + { + data.map((entry, index) => ( + + )) + } + + + + + ) +} + +export const DonateSchema = Yup.object({ + amount: Yup.number().typeError('must be a number').required('required') + .positive('must be positive').integer('must be whole') +}) + +export function DonateButton () { + const [show, setShow] = useState(false) + const inputRef = useRef(null) + const [donateToRewards] = useMutation( + gql` + mutation donateToRewards($sats: Int!) { + donateToRewards(sats: $sats) + }`) + + useEffect(() => { + inputRef.current?.focus() + }, [show]) + + return ( + <> + + { + setShow(false) + }} + > +
setShow(false)}>X
+ +
{ + await donateToRewards({ + variables: { + sats: Number(amount) + } + }) + setShow(false) + }} + > + sats} + /> +
+ donate +
+
+
+
+ + ) +} diff --git a/pages/satistics.js b/pages/satistics.js index 97cbacea..8cdf4f14 100644 --- a/pages/satistics.js +++ b/pages/satistics.js @@ -98,6 +98,16 @@ function Detail ({ fact }) { ) } + if (fact.type === 'donation') { + return ( + <> +
+ You made a donation to daily rewards! +
+ + ) + } + if (!fact.item) { return ( <> @@ -145,6 +155,7 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor case 'invoice': return `/${fact.type}s/${fact.factId}` case 'earn': + case 'donation': return default: return `/items/${fact.factId}` diff --git a/pages/users/[when].js b/pages/users/[when].js index 976df325..9a19c700 100644 --- a/pages/users/[when].js +++ b/pages/users/[when].js @@ -140,7 +140,8 @@ const COLORS = [ 'var(--info)', 'var(--success)', 'var(--boost)', - 'var(--theme-grey)' + 'var(--theme-grey)', + 'var(--danger)' ] function GrowthAreaChart ({ data }) { diff --git a/prisma/migrations/20221206213226_donate/migration.sql b/prisma/migrations/20221206213226_donate/migration.sql new file mode 100644 index 00000000..d0f37e7a --- /dev/null +++ b/prisma/migrations/20221206213226_donate/migration.sql @@ -0,0 +1,39 @@ +-- CreateTable +CREATE TABLE "Donation" ( + "id" SERIAL NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "sats" INTEGER NOT NULL, + "userId" INTEGER NOT NULL, + + PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Donation" ADD FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +CREATE OR REPLACE FUNCTION donate(sats INTEGER, user_id INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_sats INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats / 1000 + INTO user_sats + FROM users WHERE id = user_id; + + IF sats > user_sats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + UPDATE users SET msats = msats - (sats * 1000) WHERE id = user_id; + + INSERT INTO "Donate" (sats, "userId", created_at, updated_at) + VALUES (sats, user_id, now_utc(), now_utc()); + + RETURN sats; +END; +$$; \ No newline at end of file diff --git a/prisma/migrations/20221207212053_donate_func/migration.sql b/prisma/migrations/20221207212053_donate_func/migration.sql new file mode 100644 index 00000000..cdd50f4c --- /dev/null +++ b/prisma/migrations/20221207212053_donate_func/migration.sql @@ -0,0 +1,25 @@ +CREATE OR REPLACE FUNCTION donate(sats INTEGER, user_id INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_sats INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats / 1000 + INTO user_sats + FROM users WHERE id = user_id; + + IF sats > user_sats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + UPDATE users SET msats = msats - (sats * 1000) WHERE id = user_id; + + INSERT INTO "Donate" (sats, "userId", created_at, updated_at) + VALUES (sats, user_id, now_utc(), now_utc()); + + RETURN sats; +END; +$$; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1d620f50..062292b1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -68,12 +68,22 @@ model User { Earn Earn[] Upload Upload[] @relation(name: "Uploads") PollVote PollVote[] + Donation Donation[] @@index([createdAt]) @@index([inviteId]) @@map(name: "users") } +model Donation { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @updatedAt @map(name: "updated_at") + sats Int + userId Int + user User @relation(fields: [userId], references: [id]) +} + model Upload { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @map(name: "created_at") diff --git a/worker/earn.js b/worker/earn.js index 1a87a330..4b07a2cb 100644 --- a/worker/earn.js +++ b/worker/earn.js @@ -10,13 +10,19 @@ function earn ({ models }) { console.log('running', name) // compute how much sn earned today - const [{ sum }] = await models.$queryRaw` - SELECT sum("ItemAct".msats) + let [{ sum }] = await models.$queryRaw` + SELECT coalesce(sum("ItemAct".msats), 0) as sum FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE "ItemAct".act <> 'TIP' AND "ItemAct".created_at > now_utc() - INTERVAL '1 day'` + const [{ sum: donatedSum }] = await models.$queryRaw` + SELECT coalesce(sum(sats), 0) as sum + FROM "Donation" + WHERE created_at > now_utc() - INTERVAL '1 day'` + sum += donatedSum * 1000 + /* How earnings work: 1/3: top 21% posts over last 36 hours, scored on a relative basis From 7b7ed0047cf0f2880e46fa1d2e98d6880a45c353 Mon Sep 17 00:00:00 2001 From: keyan Date: Fri, 9 Dec 2022 13:25:38 -0600 Subject: [PATCH 23/42] turbo tipping --- api/typeDefs/user.js | 5 +-- components/upvote.js | 20 +++++++---- fragments/users.js | 10 +++--- pages/settings.js | 36 +++++++++++++++++++ .../migration.sql | 2 ++ prisma/schema.prisma | 5 ++- 6 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 prisma/migrations/20221208224752_turbo_tipping/migration.sql diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index 1fe2bdf0..e79a4722 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -19,8 +19,8 @@ export default gql` extend type Mutation { setName(name: String!): Boolean - setSettings(tipDefault: Int!, fiatCurrency: String!, noteItemSats: Boolean!, noteEarning: Boolean!, - noteAllDescendants: Boolean!, noteMentions: Boolean!, noteDeposits: Boolean!, + setSettings(tipDefault: Int!, turboTipping: Boolean!, fiatCurrency: String!, noteItemSats: Boolean!, + noteEarning: Boolean!, noteAllDescendants: Boolean!, noteMentions: Boolean!, noteDeposits: Boolean!, noteInvites: Boolean!, noteJobIndicator: Boolean!, hideInvoiceDesc: Boolean!, hideFromTopUsers: Boolean!, wildWestMode: Boolean!, greeterMode: Boolean!): User setPhoto(photoId: ID!): Int! @@ -49,6 +49,7 @@ export default gql` freeComments: Int! hasInvites: Boolean! tipDefault: Int! + turboTipping: Boolean! fiatCurrency: String! bio: Item bioId: Int diff --git a/components/upvote.js b/components/upvote.js index f1c44404..f2ef5190 100644 --- a/components/upvote.js +++ b/components/upvote.js @@ -152,11 +152,19 @@ export default function UpVote ({ item, className }) { } ) - const overlayText = () => { - if (me?.tipDefault) { - return `${me.tipDefault} sat${me.tipDefault > 1 ? 's' : ''}` + // what should our next tip be? + let sats = me?.tipDefault || 1 + if (me?.turboTipping && item?.meSats) { + let raiseTip = sats + while (item?.meSats >= raiseTip) { + raiseTip *= 10 } - return '1 sat' + + sats = raiseTip - item.meSats + } + + const overlayText = () => { + return `${sats} sat${sats > 1 ? 's' : ''}` } const color = getColor(item?.meSats) @@ -196,11 +204,11 @@ export default function UpVote ({ item, className }) { try { await act({ - variables: { id: item.id, sats: me.tipDefault || 1 }, + variables: { id: item.id, sats }, optimisticResponse: { act: { id: `Item:${item.id}`, - sats: me.tipDefault || 1, + sats, vote: 0 } } diff --git a/fragments/users.js b/fragments/users.js index 8fed0d9f..0458ddc7 100644 --- a/fragments/users.js +++ b/fragments/users.js @@ -12,6 +12,7 @@ export const ME = gql` freePosts freeComments tipDefault + turboTipping fiatCurrency bioId upvotePopover @@ -34,6 +35,7 @@ export const ME = gql` export const SETTINGS_FIELDS = gql` fragment SettingsFields on User { tipDefault + turboTipping fiatCurrency noteItemSats noteEarning @@ -65,12 +67,12 @@ ${SETTINGS_FIELDS} export const SET_SETTINGS = gql` ${SETTINGS_FIELDS} -mutation setSettings($tipDefault: Int!, $fiatCurrency: String!, $noteItemSats: Boolean!, $noteEarning: Boolean!, - $noteAllDescendants: Boolean!, $noteMentions: Boolean!, $noteDeposits: Boolean!, +mutation setSettings($tipDefault: Int!, $turboTipping: Boolean!, $fiatCurrency: String!, $noteItemSats: Boolean!, + $noteEarning: Boolean!, $noteAllDescendants: Boolean!, $noteMentions: Boolean!, $noteDeposits: Boolean!, $noteInvites: Boolean!, $noteJobIndicator: Boolean!, $hideInvoiceDesc: Boolean!, $hideFromTopUsers: Boolean!, $wildWestMode: Boolean!, $greeterMode: Boolean!) { - setSettings(tipDefault: $tipDefault, fiatCurrency: $fiatCurrency, noteItemSats: $noteItemSats, - noteEarning: $noteEarning, noteAllDescendants: $noteAllDescendants, + setSettings(tipDefault: $tipDefault, turboTipping: $turboTipping, fiatCurrency: $fiatCurrency, + noteItemSats: $noteItemSats, noteEarning: $noteEarning, noteAllDescendants: $noteAllDescendants, noteMentions: $noteMentions, noteDeposits: $noteDeposits, noteInvites: $noteInvites, noteJobIndicator: $noteJobIndicator, hideInvoiceDesc: $hideInvoiceDesc, hideFromTopUsers: $hideFromTopUsers, wildWestMode: $wildWestMode, greeterMode: $greeterMode) { diff --git a/pages/settings.js b/pages/settings.js index 41c75073..37793fc9 100644 --- a/pages/settings.js +++ b/pages/settings.js @@ -14,6 +14,7 @@ import { useRouter } from 'next/router' import Info from '../components/info' import { CURRENCY_SYMBOLS } from '../components/price' import Link from 'next/link' +import AccordianItem from '../components/accordian-item' export const getServerSideProps = getGetServerSideProps(SETTINGS) @@ -59,6 +60,7 @@ export default function Settings ({ data: { settings } }) {
sats} + hint={note: you can also press and hold the lightning bolt to tip custom amounts} /> +
+ advanced
} + body={turbo tipping + +
    +
  • Makes every additional bolt click raise your total tip to another 10x multiple of your default tip
  • +
  • e.g. if your tip default is 10 sats +
      +
    • 1st click: 10 sats total tipped
    • +
    • 2nd click: 100 sats total tipped
    • +
    • 3rd click: 1000 sats total tipped
    • +
    • 4th click: 10000 sats total tipped
    • +
    • and so on ...
    • +
    +
  • +
  • You can still custom tip via long press +
      +
    • the next bolt click rounds up to the next greatest 10x multiple of your default
    • +
    +
  • +
+
+
+ } + />} + /> +
router.push(`/referrals/${e.target.value}`)} + /> + + + + +
+
referral link:
+ +
+
    +
  • {`appending /r/${me.name} to any SN link makes it a ref link`} +
      +
    • e.g. https://stacker.news/items/1/r/{me.name}
    • +
    +
  • +
  • earn 21% of boost and job fees spent by referred stackers
  • +
  • earn 2.1% of all tips received by referred stackers
  • +
  • invite links are also implicitly referral links
  • +
+ + ) +} diff --git a/pages/satistics.js b/pages/satistics.js index 8cdf4f14..771c1d4c 100644 --- a/pages/satistics.js +++ b/pages/satistics.js @@ -15,7 +15,6 @@ import { useRouter } from 'next/router' import Item from '../components/item' import Comment from '../components/comment' import React from 'react' -import Info from '../components/info' export const getServerSideProps = getGetServerSideProps(WALLET_HISTORY) @@ -102,7 +101,16 @@ function Detail ({ fact }) { return ( <>
- You made a donation to daily rewards! + You made a donation to daily rewards! +
+ + ) + } + if (fact.type === 'referral') { + return ( + <> +
+ You stacked sats from a referral!
) @@ -156,6 +164,7 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor return `/${fact.type}s/${fact.factId}` case 'earn': case 'donation': + case 'referral': return default: return `/items/${fact.factId}` @@ -212,11 +221,7 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor type detail -
sats - -
Sats are rounded down from millisats to the nearest sat, so the actual amount might be slightly larger.
-
-
+ sats @@ -231,7 +236,7 @@ export default function Satistics ({ data: { me, walletHistory: { facts, cursor - {Math.floor(f.sats)} + {f.sats} ) diff --git a/pages/settings.js b/pages/settings.js index 37793fc9..e955dcf1 100644 --- a/pages/settings.js +++ b/pages/settings.js @@ -146,7 +146,7 @@ export default function Settings ({ data: { settings } }) { groupClassName='mb-0' /> diff --git a/pages/users/[when].js b/pages/users/[when].js index 9a19c700..6a3db864 100644 --- a/pages/users/[when].js +++ b/pages/users/[when].js @@ -1,11 +1,9 @@ import { gql } from '@apollo/client' import { getGetServerSideProps } from '../../api/ssrApollo' import Layout from '../../components/layout' -import { LineChart, Line, XAxis, YAxis, Tooltip, Legend, ResponsiveContainer, AreaChart, Area } from 'recharts' import { Col, Row } from 'react-bootstrap' -import { abbrNum } from '../../lib/format' import { UsageHeader } from '../../components/usage-header' -import { useRouter } from 'next/router' +import { WhenLineChart, WhenAreaChart } from '../../components/when-charts' export const getServerSideProps = getGetServerSideProps( gql` @@ -55,46 +53,6 @@ export const getServerSideProps = getGetServerSideProps( } }`) -// todo: this needs to accomodate hours, days, months now -const dateFormatter = when => { - return timeStr => { - const date = new Date(timeStr) - switch (when) { - case 'week': - case 'month': - return `${('0' + (date.getUTCMonth() % 12 + 1)).slice(-2)}/${date.getUTCDate()}` - case 'year': - case 'forever': - return `${('0' + (date.getUTCMonth() % 12 + 1)).slice(-2)}/${String(date.getUTCFullYear()).slice(-2)}` - default: - return `${date.getHours() % 12 || 12}${date.getHours() >= 12 ? 'pm' : 'am'}` - } - } -} - -function xAxisName (when) { - switch (when) { - case 'week': - case 'month': - return 'days' - case 'year': - case 'forever': - return 'months' - default: - return 'hours' - } -} - -const transformData = data => { - return data.map(entry => { - const obj = { time: entry.time } - entry.data.forEach(entry1 => { - obj[entry1.name] = entry1.value - }) - return obj - }) -} - export default function Growth ({ data: { registrationGrowth, itemGrowth, spendingGrowth, spenderGrowth, stackingGrowth, stackerGrowth } }) { @@ -104,112 +62,33 @@ export default function Growth ({
stackers
- +
stacking
- +
spenders
- +
spending
- +
registrations
- +
items
- +
) } - -const COLORS = [ - 'var(--secondary)', - 'var(--info)', - 'var(--success)', - 'var(--boost)', - 'var(--theme-grey)', - 'var(--danger)' -] - -function GrowthAreaChart ({ data }) { - const router = useRouter() - if (!data || data.length === 0) { - return null - } - // transform data into expected shape - data = transformData(data) - // need to grab when - const when = router.query.when - - return ( - - - - - - - {Object.keys(data[0]).filter(v => v !== 'time' && v !== '__typename').map((v, i) => - )} - - - ) -} - -function GrowthLineChart ({ data }) { - const router = useRouter() - if (!data || data.length === 0) { - return null - } - // transform data into expected shape - data = transformData(data) - // need to grab when - const when = router.query.when - - return ( - - - - - - - {Object.keys(data[0]).filter(v => v !== 'time' && v !== '__typename').map((v, i) => - )} - - - ) -} diff --git a/prisma/migrations/20221213220945_referral/migration.sql b/prisma/migrations/20221213220945_referral/migration.sql new file mode 100644 index 00000000..70d474d7 --- /dev/null +++ b/prisma/migrations/20221213220945_referral/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "users" ADD COLUMN "referrerId" INTEGER; + +-- AddForeignKey +ALTER TABLE "users" ADD FOREIGN KEY ("referrerId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20221214175911_referral_act/migration.sql b/prisma/migrations/20221214175911_referral_act/migration.sql new file mode 100644 index 00000000..46b01055 --- /dev/null +++ b/prisma/migrations/20221214175911_referral_act/migration.sql @@ -0,0 +1,17 @@ +-- CreateTable +CREATE TABLE "ReferralAct" ( + "id" SERIAL NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "referrerId" INTEGER NOT NULL, + "itemActId" INTEGER NOT NULL, + "msats" BIGINT NOT NULL, + + PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "ReferralAct" ADD FOREIGN KEY ("referrerId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ReferralAct" ADD FOREIGN KEY ("itemActId") REFERENCES "ItemAct"("id") ON DELETE CASCADE ON UPDATE CASCADE; \ No newline at end of file diff --git a/prisma/migrations/20221214201527_referral_funcs/migration.sql b/prisma/migrations/20221214201527_referral_funcs/migration.sql new file mode 100644 index 00000000..2afdf709 --- /dev/null +++ b/prisma/migrations/20221214201527_referral_funcs/migration.sql @@ -0,0 +1,202 @@ +CREATE OR REPLACE FUNCTION referral_act(referrer_id INTEGER, item_act_id INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + act_msats BIGINT; + referral_act "ItemActType"; + referral_msats BIGINT; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + SELECT msats, act INTO act_msats, referral_act FROM "ItemAct" WHERE id = item_act_id; + + IF referral_act IN ('FEE', 'BOOST', 'STREAM') THEN + referral_msats := CEIL(act_msats * .21); + INSERT INTO "ReferralAct" ("referrerId", "itemActId", msats, created_at, updated_at) + VALUES(referrer_id, item_act_id, referral_msats, now_utc(), now_utc()); + UPDATE users + SET msats = msats + referral_msats, "stackedMsats" = "stackedMsats" + referral_msats + WHERE id = referrer_id; + END IF; + + RETURN 0; +END; +$$; + +-- add referral act on item_act +CREATE OR REPLACE FUNCTION item_act(item_id INTEGER, user_id INTEGER, act "ItemActType", act_sats INTEGER) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + user_msats BIGINT; + act_msats BIGINT; + fee_msats BIGINT; + item_act_id INTEGER; + referrer_id INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + + act_msats := act_sats * 1000; + SELECT msats, "referrerId" INTO user_msats, referrer_id FROM users WHERE id = user_id; + IF act_msats > user_msats THEN + RAISE EXCEPTION 'SN_INSUFFICIENT_FUNDS'; + END IF; + + -- deduct msats from actor + UPDATE users SET msats = msats - act_msats WHERE id = user_id; + + IF act = 'VOTE' THEN + RAISE EXCEPTION 'SN_UNSUPPORTED'; + END IF; + + IF act = 'TIP' THEN + -- call to influence weightedVotes ... we need to do this before we record the acts because + -- the priors acts are taken into account + PERFORM weighted_votes_after_tip(item_id, user_id, act_sats); + + -- take 10% and insert as FEE + fee_msats := CEIL(act_msats * 0.1); + act_msats := act_msats - fee_msats; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (fee_msats, item_id, user_id, 'FEE', now_utc(), now_utc()) + RETURNING id INTO item_act_id; + + -- add sats to actee's balance and stacked count + UPDATE users + SET msats = msats + act_msats, "stackedMsats" = "stackedMsats" + act_msats + WHERE id = (SELECT COALESCE("fwdUserId", "userId") FROM "Item" WHERE id = item_id) + RETURNING "referrerId" INTO referrer_id; + + -- leave the rest as a tip + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, 'TIP', now_utc(), now_utc()); + + -- call to denormalize sats and commentSats + PERFORM sats_after_tip(item_id, user_id, act_msats + fee_msats); + ELSE -- BOOST, POLL, DONT_LIKE_THIS, STREAM + -- call to influence if DONT_LIKE_THIS weightedDownVotes + IF act = 'DONT_LIKE_THIS' THEN + -- make sure they haven't done this before + IF EXISTS (SELECT 1 FROM "ItemAct" WHERE "itemId" = item_id AND "userId" = user_id AND "ItemAct".act = 'DONT_LIKE_THIS') THEN + RAISE EXCEPTION 'SN_DUPLICATE'; + END IF; + + PERFORM weighted_downvotes_after_act(item_id, user_id, act_sats); + END IF; + + INSERT INTO "ItemAct" (msats, "itemId", "userId", act, created_at, updated_at) + VALUES (act_msats, item_id, user_id, act, now_utc(), now_utc()) + RETURNING id INTO item_act_id; + END IF; + + -- they have a referrer and the referrer isn't the one tipping them + IF referrer_id IS NOT NULL AND user_id <> referrer_id THEN + PERFORM referral_act(referrer_id, item_act_id); + END IF; + + RETURN 0; +END; +$$; + +CREATE OR REPLACE FUNCTION run_auction(item_id INTEGER) RETURNS void AS $$ + DECLARE + bid_sats INTEGER; + user_msats BIGINT; + user_id INTEGER; + item_status "Status"; + status_updated_at timestamp(3); + BEGIN + PERFORM ASSERT_SERIALIZED(); + + -- extract data we need + SELECT "maxBid", "userId", status, "statusUpdatedAt" INTO bid_sats, user_id, item_status, status_updated_at FROM "Item" WHERE id = item_id; + SELECT msats INTO user_msats FROM users WHERE id = user_id; + + -- 0 bid items expire after 30 days unless updated + IF bid_sats = 0 THEN + IF item_status <> 'STOPPED' THEN + IF status_updated_at < now_utc() - INTERVAL '30 days' THEN + UPDATE "Item" SET status = 'STOPPED', "statusUpdatedAt" = now_utc() WHERE id = item_id; + ELSEIF item_status = 'NOSATS' THEN + UPDATE "Item" SET status = 'ACTIVE' WHERE id = item_id; + END IF; + END IF; + RETURN; + END IF; + + -- check if user wallet has enough sats + IF bid_sats * 1000 > user_msats THEN + -- if not, set status = NOSATS and statusUpdatedAt to now_utc if not already set + IF item_status <> 'NOSATS' THEN + UPDATE "Item" SET status = 'NOSATS', "statusUpdatedAt" = now_utc() WHERE id = item_id; + END IF; + ELSE + PERFORM item_act(item_id, user_id, 'STREAM', bid_sats); + + -- update item status = ACTIVE and statusUpdatedAt = now_utc if NOSATS + IF item_status = 'NOSATS' THEN + UPDATE "Item" SET status = 'ACTIVE', "statusUpdatedAt" = now_utc() WHERE id = item_id; + END IF; + END IF; + END; +$$ LANGUAGE plpgsql; + +-- retro actively, turn all invites into referrals +UPDATE users +SET "referrerId" = subquery.inviter +FROM ( + SELECT invitees.id AS invitee, inviters.id AS inviter + FROM users invitees + JOIN "Invite" ON invitees."inviteId" = "Invite".id + JOIN users inviters ON inviters.id = "Invite"."userId") subquery +WHERE id = subquery.invitee; + +-- make inviters referrers too +CREATE OR REPLACE FUNCTION invite_drain(user_id INTEGER, invite_id TEXT) +RETURNS INTEGER +LANGUAGE plpgsql +AS $$ +DECLARE + inviter_id INTEGER; + inviter_sats INTEGER; + gift INTEGER; +BEGIN + PERFORM ASSERT_SERIALIZED(); + -- check user was created in last hour + -- check user did not already redeem an invite + PERFORM FROM users + WHERE id = user_id AND users.created_at >= NOW() AT TIME ZONE 'UTC' - INTERVAL '1 HOUR' + AND users."inviteId" IS NULL; + IF NOT FOUND THEN + RAISE EXCEPTION 'SN_INELIGIBLE'; + END IF; + + -- check that invite has not reached limit + -- check that invite is not revoked + SELECT "Invite"."userId", "Invite".gift INTO inviter_id, gift FROM "Invite" + LEFT JOIN users ON users."inviteId" = invite_id + WHERE "Invite".id = invite_id AND NOT "Invite".revoked + GROUP BY "Invite".id + HAVING COUNT(DISTINCT users.id) < "Invite".limit OR "Invite".limit IS NULL; + IF NOT FOUND THEN + RAISE EXCEPTION 'SN_REVOKED_OR_EXHAUSTED'; + END IF; + + -- check that inviter has sufficient balance + SELECT (msats / 1000) INTO inviter_sats + FROM users WHERE id = inviter_id; + IF inviter_sats < gift THEN + RAISE EXCEPTION 'SN_REVOKED_OR_EXHAUSTED'; + END IF; + + -- subtract amount from inviter + UPDATE users SET msats = msats - (1000 * gift) WHERE id = inviter_id; + -- add amount to invitee + UPDATE users SET msats = msats + (1000 * gift), "inviteId" = invite_id, "referrerId" = inviter_id WHERE id = user_id; + + RETURN 0; +END; +$$; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 185caf3c..814d1138 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -47,6 +47,11 @@ model User { upvotePopover Boolean @default(false) tipPopover Boolean @default(false) + // referrals + referrer User? @relation("referrals", fields: [referrerId], references: [id]) + referrerId Int? + referrees User[] @relation("referrals") + // tip settings tipDefault Int @default(10) turboTipping Boolean @default(false) @@ -68,10 +73,11 @@ model User { wildWestMode Boolean @default(false) greeterMode Boolean @default(false) - Earn Earn[] - Upload Upload[] @relation(name: "Uploads") - PollVote PollVote[] - Donation Donation[] + Earn Earn[] + Upload Upload[] @relation(name: "Uploads") + PollVote PollVote[] + Donation Donation[] + ReferralAct ReferralAct[] @@index([createdAt]) @@index([inviteId]) @@ -318,6 +324,17 @@ model Pin { Item Item[] } +model ReferralAct { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @updatedAt @map(name: "updated_at") + referrerId Int + referrer User @relation(fields: [referrerId], references: [id]) + itemActId Int + itemAct ItemAct @relation(fields: [itemActId], references: [id]) + msats BigInt +} + enum ItemActType { VOTE BOOST @@ -329,15 +346,16 @@ enum ItemActType { } model ItemAct { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) @map(name: "created_at") - updatedAt DateTime @updatedAt @map(name: "updated_at") - msats BigInt - act ItemActType - item Item @relation(fields: [itemId], references: [id]) - itemId Int - user User @relation(fields: [userId], references: [id]) - userId Int + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @updatedAt @map(name: "updated_at") + msats BigInt + act ItemActType + item Item @relation(fields: [itemId], references: [id]) + itemId Int + user User @relation(fields: [userId], references: [id]) + userId Int + ReferralAct ReferralAct[] @@index([itemId]) @@index([userId]) diff --git a/svgs/share-fill.svg b/svgs/share-fill.svg new file mode 100644 index 00000000..ef3faa93 --- /dev/null +++ b/svgs/share-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/share-forward-fill.svg b/svgs/share-forward-fill.svg new file mode 100644 index 00000000..1c7c3f4d --- /dev/null +++ b/svgs/share-forward-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/worker/earn.js b/worker/earn.js index 4b07a2cb..5adde9b4 100644 --- a/worker/earn.js +++ b/worker/earn.js @@ -11,9 +11,10 @@ function earn ({ models }) { // compute how much sn earned today let [{ sum }] = await models.$queryRaw` - SELECT coalesce(sum("ItemAct".msats), 0) as sum + SELECT coalesce(sum("ItemAct".msats - coalesce("ReferralAct".msats, 0)), 0) as sum FROM "ItemAct" - JOIN "Item" on "ItemAct"."itemId" = "Item".id + JOIN "Item" ON "ItemAct"."itemId" = "Item".id + LEFT JOIN "ReferralAct" ON "ItemAct".id = "ReferralAct"."itemActId" WHERE "ItemAct".act <> 'TIP' AND "ItemAct".created_at > now_utc() - INTERVAL '1 day'` From ee17518abfca9e168b1ab27012f879d5963957eb Mon Sep 17 00:00:00 2001 From: keyan Date: Mon, 19 Dec 2022 17:00:53 -0600 Subject: [PATCH 29/42] add referrer stats to top --- api/resolvers/user.js | 39 ++++++++++++++++++++++++++++++++++++--- api/typeDefs/user.js | 1 + components/top-header.js | 2 +- components/user-list.js | 1 + fragments/users.js | 1 + 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/api/resolvers/user.js b/api/resolvers/user.js index 8bb44ac7..7794b84c 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -135,6 +135,18 @@ export default { ORDER BY ncomments DESC NULLS LAST, users.created_at DESC OFFSET $2 LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) + } else if (sort === 'referrals') { + users = await models.$queryRaw(` + SELECT users.*, count(*) as referrals + FROM users + JOIN "users" referree on users.id = referree."referrerId" + WHERE referree.created_at <= $1 + AND NOT users."hideFromTopUsers" + ${within('referree', when)} + GROUP BY users.id + ORDER BY referrals DESC NULLS LAST, users.created_at DESC + OFFSET $2 + LIMIT ${LIMIT}`, decodedCursor.time, decodedCursor.offset) } else { users = await models.$queryRaw(` SELECT u.id, u.name, u."photoId", floor(sum(amount)/1000) as stacked @@ -151,7 +163,13 @@ export default { FROM "Earn" JOIN users on users.id = "Earn"."userId" WHERE "Earn".msats > 0 ${within('Earn', when)} - AND NOT users."hideFromTopUsers")) u + AND NOT users."hideFromTopUsers") + UNION ALL + (SELECT users.*, "ReferralAct".msats as amount + FROM "ReferralAct" + JOIN users on users.id = "ReferralAct"."referrerId" + WHERE "ReferralAct".msats > 0 ${within('ReferralAct', when)} + AND NOT users."hideFromTopUsers")) u GROUP BY u.id, u.name, u.created_at, u."photoId" ORDER BY stacked DESC NULLS LAST, created_at DESC OFFSET $2 @@ -453,13 +471,18 @@ export default { const [{ stacked }] = await models.$queryRaw(` SELECT sum(amount) as stacked FROM - ((SELECT sum("ItemAct".msats) as amount + ((SELECT coalesce(sum("ItemAct".msats),0) as amount FROM "ItemAct" JOIN "Item" on "ItemAct"."itemId" = "Item".id WHERE act <> 'BOOST' AND "ItemAct"."userId" <> $2 AND "Item"."userId" = $2 AND "ItemAct".created_at >= $1) UNION ALL - (SELECT sum("Earn".msats) as amount + (SELECT coalesce(sum("ReferralAct".msats),0) as amount + FROM "ReferralAct" + WHERE "ReferralAct".msats > 0 AND "ReferralAct"."referrerId" = $2 + AND "ReferralAct".created_at >= $1) + UNION ALL + (SELECT coalesce(sum("Earn".msats), 0) as amount FROM "Earn" WHERE "Earn".msats > 0 AND "Earn"."userId" = $2 AND "Earn".created_at >= $1)) u`, withinDate(when), Number(user.id)) @@ -485,6 +508,16 @@ export default { return (msats && msatsToSats(msats)) || 0 }, + referrals: async (user, { when }, { models }) => { + return await models.user.count({ + where: { + referrerId: user.id, + createdAt: { + gte: withinDate(when) + } + } + }) + }, sats: async (user, args, { models, me }) => { if (me?.id !== user.id) { return 0 diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index e79a4722..c6810bd5 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -45,6 +45,7 @@ export default gql` ncomments(when: String): Int! stacked(when: String): Int! spent(when: String): Int! + referrals(when: String): Int! freePosts: Int! freeComments: Int! hasInvites: Boolean! diff --git a/components/top-header.js b/components/top-header.js index 72175c78..e2cffb4f 100644 --- a/components/top-header.js +++ b/components/top-header.js @@ -41,7 +41,7 @@ export default function TopHeader ({ cat }) { onChange={(formik, e) => top({ ...formik?.values, sort: e.target.value })} name='sort' size='sm' - items={cat === 'users' ? ['stacked', 'spent', 'comments', 'posts'] : ['votes', 'comments', 'sats']} + items={cat === 'users' ? ['stacked', 'spent', 'comments', 'posts', 'referrals'] : ['votes', 'comments', 'sats']} /> for + alt text optional} + name='alt' + /> +
+ ok +
+ + ) +} + +export default function ImageInsertPlugin ({ + captionsEnabled +}) { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + if (!editor.hasNodes([ImageNode])) { + throw new Error('ImagesPlugin: ImageNode not registered on editor') + } + + return mergeRegister( + editor.registerCommand( + INSERT_IMAGE_COMMAND, + (payload) => { + const imageNode = $createImageNode(payload) + $insertNodes([imageNode]) + if ($isRootOrShadowRoot(imageNode.getParentOrThrow())) { + $wrapNodeInElement(imageNode, $createParagraphNode).selectEnd() + } + + return true + }, + COMMAND_PRIORITY_EDITOR + ), + editor.registerCommand( + DRAGSTART_COMMAND, + (event) => { + return onDragStart(event) + }, + COMMAND_PRIORITY_HIGH + ), + editor.registerCommand( + DRAGOVER_COMMAND, + (event) => { + return onDragover(event) + }, + COMMAND_PRIORITY_LOW + ), + editor.registerCommand( + DROP_COMMAND, + (event) => { + return onDrop(event, editor) + }, + COMMAND_PRIORITY_HIGH + ) + ) + }, [captionsEnabled, editor]) + + return null +} + +const TRANSPARENT_IMAGE = + 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' +const img = typeof window !== 'undefined' ? document.createElement('img') : undefined +if (img) { + img.src = TRANSPARENT_IMAGE +} + +function onDragStart (event) { + const node = getImageNodeInSelection() + if (!node) { + return false + } + const dataTransfer = event.dataTransfer + if (!dataTransfer) { + return false + } + dataTransfer.setData('text/plain', '_') + img.src = node.getSrc() + dataTransfer.setDragImage(img, 0, 0) + dataTransfer.setData( + 'application/x-lexical-drag', + JSON.stringify({ + data: { + altText: node.__altText, + caption: node.__caption, + height: node.__height, + maxHeight: '25vh', + key: node.getKey(), + maxWidth: node.__maxWidth, + showCaption: node.__showCaption, + src: node.__src, + width: node.__width + }, + type: 'image' + }) + ) + + return true +} + +function onDragover (event) { + const node = getImageNodeInSelection() + if (!node) { + return false + } + if (!canDropImage(event)) { + event.preventDefault() + } + return true +} + +function onDrop (event, editor) { + const node = getImageNodeInSelection() + if (!node) { + return false + } + const data = getDragImageData(event) + if (!data) { + return false + } + event.preventDefault() + if (canDropImage(event)) { + const range = getDragSelection(event) + node.remove() + const rangeSelection = $createRangeSelection() + if (range !== null && range !== undefined) { + rangeSelection.applyDOMRange(range) + } + $setSelection(rangeSelection) + editor.dispatchCommand(INSERT_IMAGE_COMMAND, data) + } + return true +} + +function getImageNodeInSelection () { + const selection = $getSelection() + const nodes = selection.getNodes() + const node = nodes[0] + return $isImageNode(node) ? node : null +} + +function getDragImageData (event) { + const dragData = event.dataTransfer?.getData('application/x-lexical-drag') + if (!dragData) { + return null + } + const { type, data } = JSON.parse(dragData) + if (type !== 'image') { + return null + } + + return data +} + +function canDropImage (event) { + const target = event.target + return !!( + target && + target instanceof HTMLElement && + !target.closest('code, span.editor-image') && + target.parentElement && + target.parentElement.closest(`div.${styles.editorInput}`) + ) +} + +function getDragSelection (event) { + let range + const target = event.target + const targetWindow = + target == null + ? null + : target.nodeType === 9 + ? target.defaultView + : target.ownerDocument.defaultView + const domSelection = getDOMSelection(targetWindow) + if (document.caretRangeFromPoint) { + range = document.caretRangeFromPoint(event.clientX, event.clientY) + } else if (event.rangeParent && domSelection !== null) { + domSelection.collapse(event.rangeParent, event.rangeOffset || 0) + range = domSelection.getRangeAt(0) + } else { + throw Error('Cannot get the selection when dragging') + } + + return range +} diff --git a/lexical/plugins/link-insert.js b/lexical/plugins/link-insert.js new file mode 100644 index 00000000..7b33f111 --- /dev/null +++ b/lexical/plugins/link-insert.js @@ -0,0 +1,134 @@ +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import { $createTextNode, $getSelection, $insertNodes, $setSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical' +import { $wrapNodeInElement, mergeRegister } from '@lexical/utils' +import { $createLinkNode, $isLinkNode } from '@lexical/link' +import { Modal } from 'react-bootstrap' +import React, { useState, useCallback, useContext, useRef, useEffect } from 'react' +import * as Yup from 'yup' +import { Form, Input, SubmitButton } from '../../components/form' +import { ensureProtocol, URL_REGEXP } from '../../lib/url' +import { getSelectedNode } from '../utils/selected-node' + +export const INSERT_LINK_COMMAND = createCommand('INSERT_LINK_COMMAND') + +export default function LinkInsertPlugin () { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + return mergeRegister( + editor.registerCommand( + INSERT_LINK_COMMAND, + (payload) => { + const selection = $getSelection() + const node = getSelectedNode(selection) + const parent = node.getParent() + if ($isLinkNode(parent)) { + parent.remove() + } else if ($isLinkNode(node)) { + node.remove() + } + const textNode = $createTextNode(payload.text) + $insertNodes([textNode]) + const linkNode = $createLinkNode(payload.url) + $wrapNodeInElement(textNode, () => linkNode) + $setSelection(textNode.select()) + return true + }, + COMMAND_PRIORITY_EDITOR + ) + ) + }, [editor]) + + return null +} + +export const LinkInsertContext = React.createContext({ + link: null, + setLink: () => {} +}) + +export function LinkInsertProvider ({ children }) { + const [link, setLink] = useState(null) + + const contextValue = { + link, + setLink: useCallback(link => setLink(link), []) + } + + return ( + + + {children} + + ) +} + +export function useLinkInsert () { + const { link, setLink } = useContext(LinkInsertContext) + return { link, setLink } +} + +const LinkSchema = Yup.object({ + text: Yup.string().required('required'), + url: Yup.string().matches(URL_REGEXP, 'invalid url').required('required') +}) + +export function LinkInsertModal () { + const [editor] = useLexicalComposerContext() + const { link, setLink } = useLinkInsert() + const inputRef = useRef(null) + + useEffect(() => { + if (link) { + inputRef.current?.focus() + } + }, [link]) + + return ( + { + setLink(null) + setTimeout(() => editor.focus(), 100) + }} + > +
{ + setLink(null) + // I think bootstrap messes with the focus on close so we have to do this ourselves + setTimeout(() => editor.focus(), 100) + }} + >X +
+ +
{ + editor.dispatchCommand(INSERT_LINK_COMMAND, { url: ensureProtocol(url), text }) + await setLink(null) + setTimeout(() => editor.focus(), 100) + }} + > + + +
+ ok +
+
+
+
+ ) +} diff --git a/lexical/plugins/link-tooltip.js b/lexical/plugins/link-tooltip.js new file mode 100644 index 00000000..2ddbf2c8 --- /dev/null +++ b/lexical/plugins/link-tooltip.js @@ -0,0 +1,232 @@ +import { $isAutoLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link' +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import { $findMatchingParent, mergeRegister } from '@lexical/utils' +import styles from '../styles.module.css' +import { + $getSelection, + $isRangeSelection, + COMMAND_PRIORITY_CRITICAL, + COMMAND_PRIORITY_HIGH, + COMMAND_PRIORITY_LOW, + KEY_ESCAPE_COMMAND, + SELECTION_CHANGE_COMMAND +} from 'lexical' +import { useCallback, useEffect, useRef, useState } from 'react' +import * as React from 'react' + +import { getSelectedNode } from '../utils/selected-node' +import { setTooltipPosition } from '../utils/tooltip-position' +import { useLinkInsert } from './link-insert' +import { getLinkFromSelection } from '../utils/link-from-selection' + +function FloatingLinkEditor ({ + editor, + isLink, + setIsLink, + anchorElem +}) { + const { setLink } = useLinkInsert() + const editorRef = useRef(null) + const inputRef = useRef(null) + const [linkUrl, setLinkUrl] = useState('') + const [isEditMode, setEditMode] = useState(false) + + const updateLinkEditor = useCallback(() => { + const selection = $getSelection() + if ($isRangeSelection(selection)) { + const node = getSelectedNode(selection) + const parent = node.getParent() + if ($isLinkNode(parent)) { + setLinkUrl(parent.getURL()) + } else if ($isLinkNode(node)) { + setLinkUrl(node.getURL()) + } else { + setLinkUrl('') + } + } + const editorElem = editorRef.current + const nativeSelection = window.getSelection() + const activeElement = document.activeElement + + if (editorElem === null) { + return + } + + const rootElement = editor.getRootElement() + + if ( + selection !== null && + nativeSelection !== null && + rootElement !== null && + rootElement.contains(nativeSelection.anchorNode) && + editor.isEditable() + ) { + const domRange = nativeSelection.getRangeAt(0) + let rect + if (nativeSelection.anchorNode === rootElement) { + let inner = rootElement + while (inner.firstElementChild != null) { + inner = inner.firstElementChild + } + rect = inner.getBoundingClientRect() + } else { + rect = domRange.getBoundingClientRect() + } + + setTooltipPosition(rect, editorElem, anchorElem) + } else if (!activeElement) { + if (rootElement !== null) { + setTooltipPosition(null, editorElem, anchorElem) + } + setEditMode(false) + setLinkUrl('') + } + + return true + }, [anchorElem, editor]) + + useEffect(() => { + const scrollerElem = anchorElem.parentElement + + const update = () => { + editor.getEditorState().read(() => { + updateLinkEditor() + }) + } + + window.addEventListener('resize', update) + + if (scrollerElem) { + scrollerElem.addEventListener('scroll', update) + } + + return () => { + window.removeEventListener('resize', update) + + if (scrollerElem) { + scrollerElem.removeEventListener('scroll', update) + } + } + }, [anchorElem.parentElement, editor, updateLinkEditor]) + + useEffect(() => { + return mergeRegister( + editor.registerUpdateListener(({ editorState }) => { + editorState.read(() => { + updateLinkEditor() + }) + }), + + editor.registerCommand( + SELECTION_CHANGE_COMMAND, + () => { + updateLinkEditor() + return true + }, + COMMAND_PRIORITY_LOW + ), + editor.registerCommand( + KEY_ESCAPE_COMMAND, + () => { + if (isLink) { + setIsLink(false) + return true + } + return false + }, + COMMAND_PRIORITY_HIGH + ) + ) + }, [editor, updateLinkEditor, setIsLink, isLink]) + + useEffect(() => { + editor.getEditorState().read(() => { + updateLinkEditor() + }) + }, [editor, updateLinkEditor]) + + useEffect(() => { + if (isEditMode && inputRef.current) { + inputRef.current.focus() + } + }, [isEditMode]) + + return ( + linkUrl && +
+
+ {linkUrl.replace('https://', '').replace('http://', '')} + \ + { + editor.update(() => { + // we need to replace the link + // their playground simple 'TOGGLE's it with a new url + // but we need to potentiallyr replace the text + setLink(getLinkFromSelection()) + }) + }} + >edit + + \ + { + editor.dispatchCommand(TOGGLE_LINK_COMMAND, null) + }} + >remove + +
+
+ ) +} + +function useFloatingLinkEditorToolbar ({ editor, anchorElem }) { + const [activeEditor, setActiveEditor] = useState(editor) + const [isLink, setIsLink] = useState(false) + + const updateToolbar = useCallback(() => { + const selection = $getSelection() + if ($isRangeSelection(selection)) { + const node = getSelectedNode(selection) + const linkParent = $findMatchingParent(node, $isLinkNode) + const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode) + + // We don't want this menu to open for auto links. + if (linkParent != null && autoLinkParent == null) { + setIsLink(true) + } else { + setIsLink(false) + } + } + }, []) + + useEffect(() => { + return editor.registerCommand( + SELECTION_CHANGE_COMMAND, + (_payload, newEditor) => { + updateToolbar() + setActiveEditor(newEditor) + return false + }, + COMMAND_PRIORITY_CRITICAL + ) + }, [editor, updateToolbar]) + + return isLink + ? + : null +} + +export default function LinkTooltipPlugin ({ + anchorElem = document.body +}) { + const [editor] = useLexicalComposerContext() + return useFloatingLinkEditorToolbar({ editor, anchorElem }) +} diff --git a/lexical/plugins/list-max-indent.js b/lexical/plugins/list-max-indent.js new file mode 100644 index 00000000..3a09a068 --- /dev/null +++ b/lexical/plugins/list-max-indent.js @@ -0,0 +1,68 @@ +import { $getListDepth, $isListItemNode, $isListNode } from '@lexical/list' +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import { + $getSelection, + $isElementNode, + $isRangeSelection, + INDENT_CONTENT_COMMAND, + COMMAND_PRIORITY_HIGH +} from 'lexical' +import { useEffect } from 'react' + +function getElementNodesInSelection (selection) { + const nodesInSelection = selection.getNodes() + + if (nodesInSelection.length === 0) { + return new Set([ + selection.anchor.getNode().getParentOrThrow(), + selection.focus.getNode().getParentOrThrow() + ]) + } + + return new Set( + nodesInSelection.map((n) => ($isElementNode(n) ? n : n.getParentOrThrow())) + ) +} + +function isIndentPermitted (maxDepth) { + const selection = $getSelection() + + if (!$isRangeSelection(selection)) { + return false + } + + const elementNodesInSelection = getElementNodesInSelection(selection) + + let totalDepth = 0 + + for (const elementNode of elementNodesInSelection) { + if ($isListNode(elementNode)) { + totalDepth = Math.max($getListDepth(elementNode) + 1, totalDepth) + } else if ($isListItemNode(elementNode)) { + const parent = elementNode.getParent() + if (!$isListNode(parent)) { + throw new Error( + 'ListMaxIndentLevelPlugin: A ListItemNode must have a ListNode for a parent.' + ) + } + + totalDepth = Math.max($getListDepth(parent) + 1, totalDepth) + } + } + + return totalDepth <= maxDepth +} + +export default function ListMaxIndentLevelPlugin ({ maxDepth }) { + const [editor] = useLexicalComposerContext() + + useEffect(() => { + return editor.registerCommand( + INDENT_CONTENT_COMMAND, + () => !isIndentPermitted(maxDepth ?? 7), + COMMAND_PRIORITY_HIGH + ) + }, [editor, maxDepth]) + + return null +} diff --git a/lexical/plugins/toolbar.js b/lexical/plugins/toolbar.js new file mode 100644 index 00000000..90b60538 --- /dev/null +++ b/lexical/plugins/toolbar.js @@ -0,0 +1,383 @@ +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import { useCallback, useEffect, useRef, useState } from 'react' +import { + SELECTION_CHANGE_COMMAND, + FORMAT_TEXT_COMMAND, + INDENT_CONTENT_COMMAND, + OUTDENT_CONTENT_COMMAND, + $getSelection, + $isRangeSelection, + $createParagraphNode +} from 'lexical' +import { $isLinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link' +import { + $wrapNodes +} from '@lexical/selection' +import { $getNearestNodeOfType, mergeRegister } from '@lexical/utils' +import { + INSERT_ORDERED_LIST_COMMAND, + INSERT_UNORDERED_LIST_COMMAND, + REMOVE_LIST_COMMAND, + $isListNode, + ListNode +} from '@lexical/list' +import { + $createHeadingNode, + $createQuoteNode, + $isHeadingNode +} from '@lexical/rich-text' +// import { +// $createCodeNode +// } from '@lexical/code' +import BoldIcon from '../../svgs/bold.svg' +import ItalicIcon from '../../svgs/italic.svg' +// import StrikethroughIcon from '../../svgs/strikethrough.svg' +import LinkIcon from '../../svgs/link.svg' +import ListOrderedIcon from '../../svgs/list-ordered.svg' +import ListUnorderedIcon from '../../svgs/list-unordered.svg' +import IndentIcon from '../../svgs/indent-increase.svg' +import OutdentIcon from '../../svgs/indent-decrease.svg' +import ImageIcon from '../../svgs/image-line.svg' +import FontSizeIcon from '../../svgs/font-size-2.svg' +import QuoteIcon from '../../svgs/double-quotes-r.svg' +// import CodeIcon from '../../svgs/code-line.svg' +// import CodeBoxIcon from '../../svgs/code-box-line.svg' +import ArrowDownIcon from '../../svgs/arrow-down-s-fill.svg' +import CheckIcon from '../../svgs/check-line.svg' + +import styles from '../styles.module.css' +import { Dropdown } from 'react-bootstrap' +import { useLinkInsert } from './link-insert' +import { getSelectedNode } from '../utils/selected-node' +import { getLinkFromSelection } from '../utils/link-from-selection' +import { ImageInsertModal } from './image-insert' +import useModal from '../utils/modal' + +const LowPriority = 1 + +function Divider () { + return
+} + +function FontSizeDropdown ({ + editor, + blockType +}) { + const formatParagraph = () => { + if (blockType !== 'paragraph') { + editor.update(() => { + const selection = $getSelection() + + if ($isRangeSelection(selection)) { + $wrapNodes(selection, () => $createParagraphNode()) + } + setTimeout(() => editor.focus(), 100) + }) + } + } + + const formatLargeHeading = () => { + if (blockType !== 'h1') { + editor.update(() => { + const selection = $getSelection() + + if ($isRangeSelection(selection)) { + $wrapNodes(selection, () => $createHeadingNode('h1')) + } + + setTimeout(() => editor.focus(), 100) + }) + } + } + + const formatSmallHeading = () => { + if (blockType !== 'h2') { + editor.update(() => { + const selection = $getSelection() + + if ($isRangeSelection(selection)) { + $wrapNodes(selection, () => $createHeadingNode('h2')) + } + + setTimeout(() => editor.focus(), 100) + }) + } + } + + return ( + + + + + + + + + + normal + + + + subheading + + + + heading + + + + ) +} + +export default function ToolbarPlugin () { + const [editor] = useLexicalComposerContext() + const { setLink } = useLinkInsert() + const toolbarRef = useRef(null) + const [blockType, setBlockType] = useState('paragraph') + const [isLink, setIsLink] = useState(false) + const [isBold, setIsBold] = useState(false) + const [isItalic, setIsItalic] = useState(false) + // const [isStrikethrough, setIsStrikethrough] = useState(false) + // const [isCode, setIsCode] = useState(false) + const [modal, showModal] = useModal() + + const updateToolbar = useCallback(() => { + const selection = $getSelection() + if ($isRangeSelection(selection)) { + const anchorNode = selection.anchor.getNode() + const element = + anchorNode.getKey() === 'root' + ? anchorNode + : anchorNode.getTopLevelElementOrThrow() + const elementKey = element.getKey() + const elementDOM = editor.getElementByKey(elementKey) + if (elementDOM !== null) { + if ($isListNode(element)) { + const parentList = $getNearestNodeOfType(anchorNode, ListNode) + const type = parentList ? parentList.getTag() : element.getTag() + setBlockType(type) + } else { + const type = $isHeadingNode(element) + ? element.getTag() + : element.getType() + setBlockType(type) + } + } + // Update text format + setIsBold(selection.hasFormat('bold')) + setIsItalic(selection.hasFormat('italic')) + // setIsStrikethrough(selection.hasFormat('strikethrough')) + // setIsCode(selection.hasFormat('code')) + + // Update links + const node = getSelectedNode(selection) + const parent = node.getParent() + if ($isLinkNode(parent) || $isLinkNode(node)) { + setIsLink(true) + } else { + setIsLink(false) + } + } + }, [editor]) + + useEffect(() => { + return mergeRegister( + editor.registerUpdateListener(({ editorState }) => { + editorState.read(() => { + updateToolbar() + }) + }), + editor.registerCommand( + SELECTION_CHANGE_COMMAND, + (_payload, newEditor) => { + updateToolbar() + return false + }, + LowPriority + ) + ) + }, [editor, updateToolbar]) + + const insertLink = useCallback(() => { + if (isLink) { + // unlink it + editor.dispatchCommand(TOGGLE_LINK_COMMAND, null) + } else { + editor.update(() => { + setLink(getLinkFromSelection()) + }) + } + }, [editor, isLink]) + + const formatBulletList = () => { + if (blockType !== 'ul') { + editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND) + } else { + editor.dispatchCommand(REMOVE_LIST_COMMAND) + } + } + + const formatNumberedList = () => { + if (blockType !== 'ol') { + editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND) + } else { + editor.dispatchCommand(REMOVE_LIST_COMMAND) + } + } + + const formatQuote = () => { + if (blockType !== 'quote') { + editor.update(() => { + const selection = $getSelection() + + if ($isRangeSelection(selection)) { + $wrapNodes(selection, () => $createQuoteNode()) + } + }) + } else { + editor.update(() => { + const selection = $getSelection() + + if ($isRangeSelection(selection)) { + $wrapNodes(selection, () => $createParagraphNode()) + } + }) + } + } + + // const formatCode = () => { + // if (blockType !== 'code') { + // editor.update(() => { + // const selection = $getSelection() + + // if ($isRangeSelection(selection)) { + // $wrapNodes(selection, () => { + // const node = $createCodeNode() + // node.setLanguage('plain') + // return node + // }) + // } + // }) + // } + // } + + return ( +
+ + + <> + + + + + + + + + {/* */} + {/* */} + {/* */} + {/* */} + + + + {modal} + +
+ ) +} diff --git a/lexical/styles.module.css b/lexical/styles.module.css new file mode 100644 index 00000000..6e8ead3d --- /dev/null +++ b/lexical/styles.module.css @@ -0,0 +1,256 @@ +/* editor */ + +.editor { + height: 100%; + position: relative; +} + +.editorContainer { + margin: 20px auto 20px auto; + width: 100%; + color: var(--theme-color); + position: relative; + line-height: 20px; + font-weight: 400; + text-align: left; + border-top-left-radius: .4rem; + border-top-right-radius: .4rem; +} + +.editorInner { + position: relative; +} + +.editorInput>hr { + border-top: 1px solid var(--theme-clickToContextColor); +} + +.editorInput { + min-height: 150px; + resize: auto; + font-size: 15px; + caret-color: var(--theme-color); + background-color: var(--theme-body); + position: relative; + tab-size: 1; + outline: 0; + padding: 15px 10px; + border: 1px solid; + border-bottom-left-radius: .4rem; + border-bottom-right-radius: .4rem; + /* border-top: 0px; */ +} + +.editorPlaceholder { + color: var(--theme-grey); + overflow: hidden; + position: absolute; + text-overflow: ellipsis; + top: 15px; + left: 10px; + font-size: 15px; + user-select: none; + display: inline-block; + pointer-events: none; +} + +/* blocks */ + +.image { + display: inline-block; +} + +.paragraph { + margin: 0; + margin-bottom: 8px; + position: relative; +} + +.paragraph:last-child { + margin-bottom: 0; +} + +.quote { + margin: 0; + margin-left: 20px; + font-size: 15px; + color: var(--theme-quoteColor); + border-left-color: var(--theme-quoteBar); + border-left-width: 4px; + border-left-style: solid; + padding-left: 16px; +} + +.heading1 { + font-size: 24px; + color: var(--theme-color); + font-weight: 400; + margin: 0; + margin-bottom: 12px; +} + +.heading2 { + font-size: 15px; + color: var(--theme-navLink); + font-weight: 700; + margin: 0; + margin-top: 10px; + text-transform: uppercase; +} + + +.code { + background-color: rgb(240, 242, 245); + font-family: Menlo, Consolas, Monaco, monospace; + display: block; + padding: 8px 8px 8px 52px; + line-height: 1.53; + font-size: 13px; + margin: 0; + margin-top: 8px; + margin-bottom: 8px; + tab-size: 2; + /* white-space: pre; */ + overflow-x: auto; + position: relative; +} + +/* inline blocks */ + +.link { + color: var(--theme-link); + text-decoration: none; +} + +/* lists */ + +.listOl { + padding: 0; + margin: 0; + margin-left: 16px; +} + +.listUl { + padding: 0; + margin: 0; + margin-left: 16px; +} + +.listItem { + margin: 8px 32px 8px 32px; +} + +.nestedListItem { + list-style-type: none; +} + +/* text */ + +.textBold { + font-weight: bold; +} + +.textItalic { + font-style: italic; +} + +.textUnderline { + text-decoration: underline; +} + +.textStrikethrough { + text-decoration: line-through; +} + +.textUnderlineStrikethrough { + text-decoration: underline line-through; +} + +.textCode { + background-color: rgb(240, 242, 245); + padding: 1px 0.25rem; + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 94%; +} + +/* toolbar */ +.toolbar { + display: flex; + background: var(--theme-toolbar); + padding: 4px; + border-top-left-radius: .4rem; + border-top-right-radius: .4rem; + vertical-align: middle; + flex-wrap: wrap; +} + +.toolbar button.toolbarItem { + border: 0; + display: flex; + background: none; + border-radius: .4rem; + padding: 8px; + cursor: pointer; + vertical-align: middle; +} + +.toolbar button.toolbarItem:disabled { + cursor: not-allowed; +} + +.toolbar button.toolbarItem.spaced { + margin-right: 2px; +} + +.toolbar button.toolbarItem svg { + background-size: contain; + display: inline-block; + height: 18px; + width: 18px; + margin-top: 2px; + vertical-align: -0.25em; + display: flex; + opacity: 0.6; +} + +.toolbar button.toolbarItem:disabled svg { + opacity: 0.2; +} + +.toolbar button.toolbarItem.active { + background-color: var(--theme-toolbarActive); +} + +.toolbar button.toolbarItem.active svg { + opacity: 1; +} + +.toolbar .toolbarItem:hover:not([disabled]) { + background-color: var(--theme-toolbarHover); +} + +.toolbar .divider { + width: 1px; + background-color: var(--theme-borderColor); + margin: 0 4px; +} + +.toolbar .toolbarItem svg { + fill: var(--theme-color) !important; +} + +.linkTooltip { + position: absolute; + top: 0; + left: 0; + z-index: 10; + font-size: 0.7875rem; + opacity: 0; + will-change: transform; +} + +.tooltipUrl { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} \ No newline at end of file diff --git a/lexical/theme.js b/lexical/theme.js new file mode 100644 index 00000000..0501a52a --- /dev/null +++ b/lexical/theme.js @@ -0,0 +1,36 @@ +import styles from './styles.module.css' + +const theme = { + paragraph: styles.paragraph, + quote: styles.quote, + heading: { + h1: styles.heading1, + h2: styles.heading2, + h3: styles.heading2, + h4: styles.heading2, + h5: styles.heading2 + }, + image: styles.image, + link: styles.link, + code: styles.code, + list: { + nested: { + listitem: styles.nestedListItem + }, + ol: styles.listOl, + ul: styles.listUl, + listitem: styles.listItem + }, + text: { + bold: styles.textBold, + italic: styles.textItalic, + // overflowed: 'editor-text-overflowed', + // hashtag: 'editor-text-hashtag', + underline: styles.textUnderline, + strikethrough: styles.textStrikethrough, + underlineStrikethrough: styles.underlineStrikethrough, + code: styles.textCode + } +} + +export default theme diff --git a/lexical/utils/image-markdown-transformer.js b/lexical/utils/image-markdown-transformer.js new file mode 100644 index 00000000..637e437b --- /dev/null +++ b/lexical/utils/image-markdown-transformer.js @@ -0,0 +1,55 @@ +import { + $createImageNode, + $isImageNode, + ImageNode +} from '../nodes/image' +import { + $createHorizontalRuleNode, + $isHorizontalRuleNode, + HorizontalRuleNode +} from '@lexical/react/LexicalHorizontalRuleNode' +import { TRANSFORMERS } from '@lexical/markdown' + +export const IMAGE = { + dependencies: [ImageNode], + export: (node, exportChildren, exportFormat) => { + if (!$isImageNode(node)) { + return null + } + return `![${node.getAltText()}](${node.getSrc()})` + }, + importRegExp: /!(?:\[([^[]*)\])(?:\(([^(]+)\))/, + regExp: /!(?:\[([^[]*)\])(?:\(([^(]+)\))$/, + replace: (textNode, match) => { + const [, altText, src] = match + const imageNode = $createImageNode({ altText, src }) + textNode.replace(imageNode) + }, + trigger: ')', + type: 'text-match' +} + +export const HR = { + dependencies: [HorizontalRuleNode], + export: (node) => { + return $isHorizontalRuleNode(node) ? '***' : null + }, + regExp: /^(-{3,}|\*{3,}|_{3,})\s?$/, + replace: (parentNode, _1, _2, isImport) => { + const line = $createHorizontalRuleNode() + + // TODO: Get rid of isImport flag + if (isImport || parentNode.getNextSibling() != null) { + parentNode.replace(line) + } else { + parentNode.insertBefore(line) + } + + line.selectNext() + }, + type: 'element' +} + +export const SN_TRANSFORMERS = [ + HR, IMAGE, ...TRANSFORMERS +] diff --git a/lexical/utils/link-from-selection.js b/lexical/utils/link-from-selection.js new file mode 100644 index 00000000..012bda90 --- /dev/null +++ b/lexical/utils/link-from-selection.js @@ -0,0 +1,24 @@ +import { $getSelection, $getTextContent, $isRangeSelection } from 'lexical' +import { getSelectedNode } from './selected-node' +import { $isLinkNode } from '@lexical/link' + +export function getLinkFromSelection () { + const selection = $getSelection() + let url = '' + let text = '' + if ($isRangeSelection(selection)) { + const node = getSelectedNode(selection) + const parent = node.getParent() + if ($isLinkNode(parent)) { + url = parent.getURL() + text = parent.getTextContent() + } else if ($isLinkNode(node)) { + url = node.getURL() + text = node.getTextContent() + } else { + url = '' + text = $getTextContent(selection) + } + } + return { url, text } +} diff --git a/lexical/utils/modal.js b/lexical/utils/modal.js new file mode 100644 index 00000000..6c515834 --- /dev/null +++ b/lexical/utils/modal.js @@ -0,0 +1,34 @@ +import { useCallback, useMemo, useState } from 'react' +import * as React from 'react' +import { Modal } from 'react-bootstrap' + +export default function useModal () { + const [modalContent, setModalContent] = useState(null) + + const onClose = useCallback(() => { + setModalContent(null) + }, []) + + const modal = useMemo(() => { + if (modalContent === null) { + return null + } + return ( + +
X
+ + {modalContent} + +
+ ) + }, [modalContent, onClose]) + + const showModal = useCallback( + (getContent) => { + setModalContent(getContent(onClose)) + }, + [onClose] + ) + + return [modal, showModal] +} diff --git a/lexical/utils/selected-node.js b/lexical/utils/selected-node.js new file mode 100644 index 00000000..276e716f --- /dev/null +++ b/lexical/utils/selected-node.js @@ -0,0 +1,17 @@ +import { $isAtNodeEnd } from '@lexical/selection' + +export function getSelectedNode (selection) { + const anchor = selection.anchor + const focus = selection.focus + const anchorNode = selection.anchor.getNode() + const focusNode = selection.focus.getNode() + if (anchorNode === focusNode) { + return anchorNode + } + const isBackward = selection.isBackward() + if (isBackward) { + return $isAtNodeEnd(focus) ? anchorNode : focusNode + } else { + return $isAtNodeEnd(anchor) ? anchorNode : focusNode + } +} diff --git a/lexical/utils/tooltip-position.js b/lexical/utils/tooltip-position.js new file mode 100644 index 00000000..713818d9 --- /dev/null +++ b/lexical/utils/tooltip-position.js @@ -0,0 +1,41 @@ +const VERTICAL_GAP = 5 +const HORIZONTAL_OFFSET = 5 + +export function setTooltipPosition ( + targetRect, + floatingElem, + anchorElem, + verticalGap = VERTICAL_GAP, + horizontalOffset = HORIZONTAL_OFFSET +) { + const scrollerElem = anchorElem.parentElement + + if (targetRect === null || !scrollerElem) { + floatingElem.style.opacity = '0' + floatingElem.style.transform = 'translate(-10000px, -10000px)' + return + } + + const floatingElemRect = floatingElem.getBoundingClientRect() + const anchorElementRect = anchorElem.getBoundingClientRect() + const editorScrollerRect = scrollerElem.getBoundingClientRect() + + let top = targetRect.top - floatingElemRect.height - verticalGap + let left = targetRect.left - horizontalOffset + + top += floatingElemRect.height + targetRect.height + verticalGap * 2 + + if (left + floatingElemRect.width > editorScrollerRect.right) { + left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset + } + + top -= anchorElementRect.top + left -= anchorElementRect.left + + if (top > 0 && left > 0) { + floatingElem.style.opacity = '1' + } else { + floatingElem.style.opacity = '0' + } + floatingElem.style.transform = `translate(${left}px, ${top}px)` +} diff --git a/lexical/utils/url.js b/lexical/utils/url.js new file mode 100644 index 00000000..f662a8aa --- /dev/null +++ b/lexical/utils/url.js @@ -0,0 +1,24 @@ +export function sanitizeUrl (url) { + /** A pattern that matches safe URLs. */ + const SAFE_URL_PATTERN = + /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi + + /** A pattern that matches safe data URLs. */ + const DATA_URL_PATTERN = + /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i + + url = String(url).trim() + + if (url.match(SAFE_URL_PATTERN) || url.match(DATA_URL_PATTERN)) return url + + return 'https://' +} + +// Source: https://stackoverflow.com/a/8234912/2013580 +const urlRegExp = + /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/ +export function validateUrl (url) { + // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://. + // Maybe show a dialog where they user can type the URL before inserting it. + return url === 'https://' || urlRegExp.test(url) +} diff --git a/lib/url.js b/lib/url.js index 434ac50d..8075cef4 100644 --- a/lib/url.js +++ b/lib/url.js @@ -4,3 +4,6 @@ export function ensureProtocol (value) { } return value } + +// eslint-disable-next-line +const URL_REGEXP = /^((https?|ftp):\/\/)?(www.)?(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 690f3f21..b9ef7ff4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1143,6 +1143,172 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@lexical/clipboard": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.7.5.tgz", + "integrity": "sha512-H5KA7CfrCYJs3fcDG2LkG/s5dfT1KcuOxEZwinCE0Quzu4aPxHLWKRXImwNsN/zVU5zTnvjd29Zv2NYtfYfBiA==", + "requires": { + "@lexical/html": "0.7.5", + "@lexical/list": "0.7.5", + "@lexical/selection": "0.7.5", + "@lexical/utils": "0.7.5" + } + }, + "@lexical/code": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/code/-/code-0.7.5.tgz", + "integrity": "sha512-WjLkKdP/fpCfokhXmUHIWm9SMJHnD2/u3X6DplQBAQ/BKHfSWHbIpkzOpxB+SPHezzhwX49/j2I3jiJSr4AMbw==", + "requires": { + "@lexical/utils": "0.7.5", + "prismjs": "^1.27.0" + } + }, + "@lexical/dragon": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/dragon/-/dragon-0.7.5.tgz", + "integrity": "sha512-/EWJJNhlSW/4ixvDyhaS7sBkbKX5fW5wEvpBldmfPvVuALJxj0p/2vN2FVFmLxWlQGxCoFvDU5IA7RJ+Y/U+SQ==" + }, + "@lexical/hashtag": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/hashtag/-/hashtag-0.7.5.tgz", + "integrity": "sha512-5867EAZJvAThHta1JG85n/eLTRirkHaqb/7SI+WAIZSkGfYVJUhk0LjxF5B3GfzBbdGlqJ7NyKZ0DE9QqhL0oA==", + "requires": { + "@lexical/utils": "0.7.5" + } + }, + "@lexical/history": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/history/-/history-0.7.5.tgz", + "integrity": "sha512-vvUr7wQ9KiGXSm8dvozAMs/oOqi6ePcI7QyD1hwD2QF8z8x1f+0D6R9MMdN5y35XsnH6N2ujHI14LX5CuNXeqw==", + "requires": { + "@lexical/utils": "0.7.5" + } + }, + "@lexical/html": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/html/-/html-0.7.5.tgz", + "integrity": "sha512-aHG0pxvVmYvyXstCVmzXpVYR7n3rMUQ6aSCd7fnreJGSxOr/LafT5+8CZQkUm7iR2IiiK8umX8NHzz4cMNgR3Q==", + "requires": { + "@lexical/selection": "0.7.5" + } + }, + "@lexical/link": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/link/-/link-0.7.5.tgz", + "integrity": "sha512-95V183O7uotiF8JRS1CN2272ckgNe3EJI1ezT5dGjdw8JJYDN6mAMhUVQWKBR/kKpNXuznprMH8QjkLLESBakw==", + "requires": { + "@lexical/utils": "0.7.5" + } + }, + "@lexical/list": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/list/-/list-0.7.5.tgz", + "integrity": "sha512-YCDsP0hxIMwjtN3wDKLsFdjrDenX+OdOswm+4Zt/mtLMCOSwibcDDyzWnA7UbR2s4Fwy1Rvhl56xdR2egGCQhw==", + "requires": { + "@lexical/utils": "0.7.5" + } + }, + "@lexical/mark": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/mark/-/mark-0.7.5.tgz", + "integrity": "sha512-fKEyAUKTJt79YTN24Qi5Uc3HHYZCJs/HPq/yn3Y09Z74K258cW9uyj7LPpjRBeuiD47SVF1Mq7wbbqQ0ak4GPA==", + "requires": { + "@lexical/utils": "0.7.5" + } + }, + "@lexical/markdown": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/markdown/-/markdown-0.7.5.tgz", + "integrity": "sha512-kSg1qAgDGGrXo+LBEnOaAOkR0KPYorKjldBnlttH8x0qMIKrblDd6v56oOK7Yl/LgGT3uq7RpAJFK5gKDnVn6w==", + "requires": { + "@lexical/code": "0.7.5", + "@lexical/link": "0.7.5", + "@lexical/list": "0.7.5", + "@lexical/rich-text": "0.7.5", + "@lexical/text": "0.7.5", + "@lexical/utils": "0.7.5" + } + }, + "@lexical/offset": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/offset/-/offset-0.7.5.tgz", + "integrity": "sha512-RvBCkXnpgESx0UUXg4G6xJMcT3PBe+kuSQElkFB2KqRqTF0S3eMskLoakFdpSA0yc89Ubrh9+zKMzxoIwGtrmg==" + }, + "@lexical/overflow": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/overflow/-/overflow-0.7.5.tgz", + "integrity": "sha512-JoY2jKfoDBVDy6XDCVMakWV7jJO8ks++wx+1uvPrK1s5Qx7UMvaUtID6f1+hph0437JuLKA0IpfDQFKQfp6RIg==" + }, + "@lexical/plain-text": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/plain-text/-/plain-text-0.7.5.tgz", + "integrity": "sha512-sZta4HgT8ShIHCDXF3sBrj7APtBKaLL6Lm9nwyVmv8NWLb1TItOKGy0+i3FrAAVSFNW+RHWJFltMiRUoPRBQFw==" + }, + "@lexical/react": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/react/-/react-0.7.5.tgz", + "integrity": "sha512-Lk51Y514kOfUMF3+92dKKVuPlFrL1r19hOTGhvdi71DF1ewUzTVbbS9oyMFzNAA+rsuKqLKn0zILT43CHRk22w==", + "requires": { + "@lexical/clipboard": "0.7.5", + "@lexical/code": "0.7.5", + "@lexical/dragon": "0.7.5", + "@lexical/hashtag": "0.7.5", + "@lexical/history": "0.7.5", + "@lexical/link": "0.7.5", + "@lexical/list": "0.7.5", + "@lexical/mark": "0.7.5", + "@lexical/markdown": "0.7.5", + "@lexical/overflow": "0.7.5", + "@lexical/plain-text": "0.7.5", + "@lexical/rich-text": "0.7.5", + "@lexical/selection": "0.7.5", + "@lexical/table": "0.7.5", + "@lexical/text": "0.7.5", + "@lexical/utils": "0.7.5", + "@lexical/yjs": "0.7.5", + "react-error-boundary": "^3.1.4" + } + }, + "@lexical/rich-text": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/rich-text/-/rich-text-0.7.5.tgz", + "integrity": "sha512-z4sscX2Xq7hRUXcLIqgQVcBsifTHreTcC4McXwyD5TC5U+2rk+guREeb6Rq/+Mhct1VttdWIdblw8Odw0oHSqA==" + }, + "@lexical/selection": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/selection/-/selection-0.7.5.tgz", + "integrity": "sha512-8AUwsDz/i1fshmRlXUQuDFKcilgzi5GIUc38Lpp7HN5ErvyH7EjbFWA+b8qKWidTnWQ9yKHQLUsIFlYMy91V/Q==" + }, + "@lexical/table": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/table/-/table-0.7.5.tgz", + "integrity": "sha512-6hPtEZq+0qOki8vU/sEBL5CHYJ7obt5kbCknEHW3xm38gW7NWMqZ15tvnw1owJnPJNhu4wfCSHPR1JeUHfcJLg==", + "requires": { + "@lexical/utils": "0.7.5" + } + }, + "@lexical/text": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/text/-/text-0.7.5.tgz", + "integrity": "sha512-JGx89XATNdqi3BD60kWdTv15kgV7HoFTgdgrzBc4ZJ2AYj6p16pMl1UaF+x5O++sNWONbQ0mGPyYjfRWhOxqvQ==" + }, + "@lexical/utils": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/utils/-/utils-0.7.5.tgz", + "integrity": "sha512-WGf96y1h1qDsJK9wztXPzcEupyToa4TmoSzSKhOvebFqS/yg3WlRVUBne6oBj3hptjGoeU9MhGdcGK61EQ/TOw==", + "requires": { + "@lexical/list": "0.7.5", + "@lexical/table": "0.7.5" + } + }, + "@lexical/yjs": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@lexical/yjs/-/yjs-0.7.5.tgz", + "integrity": "sha512-pNyw175VfWhJQj4pnvXgddfjyZhF/lotn7/4MTKbtGxyAI61LrjV7Z3M7v76003v4SEIyQ3WqWOU4TCjNt+alQ==", + "requires": { + "@lexical/offset": "0.7.5" + } + }, "@mdn/browser-compat-data": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", @@ -5280,6 +5446,11 @@ "type-check": "~0.4.0" } }, + "lexical": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/lexical/-/lexical-0.7.5.tgz", + "integrity": "sha512-NrSWqggN1/9EzKLwYKURc+AGTQcPh4kXrE8qemp5yYCJG0XGu25CVNXKFXQkCHJJbdAsfn6qmprH5aVV7sDp5Q==" + }, "lightning": { "version": "6.2.7", "resolved": "https://registry.npmjs.org/lightning/-/lightning-6.2.7.tgz", @@ -7545,6 +7716,14 @@ "scheduler": "^0.20.2" } }, + "react-error-boundary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", + "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", + "requires": { + "@babel/runtime": "^7.12.5" + } + }, "react-fast-compare": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", diff --git a/package.json b/package.json index 093a342a..411ea8cf 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@apollo/client": "^3.7.1", + "@lexical/react": "^0.7.5", "@opensearch-project/opensearch": "^1.1.0", "@prisma/client": "^2.30.3", "apollo-server-micro": "^3.11.1", @@ -29,6 +30,7 @@ "graphql-tools": "^8.3.10", "graphql-type-json": "^0.3.2", "jquery": "^3.6.1", + "lexical": "^0.7.5", "ln-service": "^54.2.6", "mdast-util-find-and-replace": "^1.1.1", "mdast-util-from-markdown": "^1.2.0", diff --git a/pages/lexical.js b/pages/lexical.js new file mode 100644 index 00000000..85a59b2f --- /dev/null +++ b/pages/lexical.js @@ -0,0 +1,146 @@ +import LayoutCenter from '../components/layout-center' +import styles from '../lexical/styles.module.css' + +import Theme from '../lexical/theme' +import ListMaxIndentLevelPlugin from '../lexical/plugins/list-max-indent' +import AutoLinkPlugin from '../lexical/plugins/autolink' +import ToolbarPlugin from '../lexical/plugins/toolbar' +import LinkTooltipPlugin from '../lexical/plugins/link-tooltip' + +import { LexicalComposer } from '@lexical/react/LexicalComposer' +import { RichTextPlugin } from '@lexical/react/LexicalRichTextPlugin' +import { ContentEditable } from '@lexical/react/LexicalContentEditable' +import { AutoFocusPlugin } from '@lexical/react/LexicalAutoFocusPlugin' +import { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin' +import LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary' +import { HorizontalRuleNode } from '@lexical/react/LexicalHorizontalRuleNode' +import { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin' +import { HeadingNode, QuoteNode } from '@lexical/rich-text' +import { TableCellNode, TableNode, TableRowNode } from '@lexical/table' +import { ListItemNode, ListNode } from '@lexical/list' +import { CodeHighlightNode, CodeNode } from '@lexical/code' +import { AutoLinkNode, LinkNode } from '@lexical/link' +import { LinkPlugin } from '@lexical/react/LexicalLinkPlugin' +import { ListPlugin } from '@lexical/react/LexicalListPlugin' +import { MarkdownShortcutPlugin } from '@lexical/react/LexicalMarkdownShortcutPlugin' +import { useState } from 'react' +import LinkInsertPlugin, { LinkInsertProvider } from '../lexical/plugins/link-insert' +import { ImageNode } from '../lexical/nodes/image' +import ImageInsertPlugin from '../lexical/plugins/image-insert' +import { SN_TRANSFORMERS } from '../lexical/utils/image-markdown-transformer' +import { $convertToMarkdownString, $convertFromMarkdownString } from '@lexical/markdown' +import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' +import Text from '../components/text' +import { Button } from 'react-bootstrap' + +const editorConfig = { + // The editor theme + theme: Theme, + // Handling of errors during update + onError (error) { + throw error + }, + // Any custom nodes go here + nodes: [ + HeadingNode, + ListNode, + ListItemNode, + QuoteNode, + CodeNode, + CodeHighlightNode, + TableNode, + TableCellNode, + TableRowNode, + AutoLinkNode, + LinkNode, + HorizontalRuleNode, + ImageNode + ] +} + +function Editor ({ markdown }) { + const [floatingAnchorElem, setFloatingAnchorElem] = useState(null) + + const onRef = (_floatingAnchorElem) => { + if (_floatingAnchorElem !== null) { + setFloatingAnchorElem(_floatingAnchorElem) + } + } + + let initialConfig = editorConfig + if (markdown) { + initialConfig = { ...initialConfig, editorState: () => $convertFromMarkdownString(markdown, SN_TRANSFORMERS) } + } + + return ( + +
+
+ + + + + + + +
+ } + placeholder={null} + ErrorBoundary={LexicalErrorBoundary} + /> + + + + + + + + +
+
+ {!markdown && } + + ) +} + +function Markdown () { + const [editor] = useLexicalComposerContext() + const [markdown, setMarkdown] = useState(null) + const [preview, togglePreview] = useState(true) + + return ( + <> +
+ editor.update(() => { + setMarkdown($convertToMarkdownString(SN_TRANSFORMERS)) + })} + /> + +
+ + {preview + ? ( + + {markdown} + + ) + : ( +
+                {markdown}
+              
+ )} +
+
+ + ) +} + +export default function Lexical () { + return ( + + + + ) +} diff --git a/public/darkmode.js b/public/darkmode.js index 6ccb7495..4bb7756a 100644 --- a/public/darkmode.js +++ b/public/darkmode.js @@ -18,6 +18,11 @@ const COLORS = { brandColor: 'rgba(0, 0, 0, 0.9)', grey: '#707070', link: '#007cbe', + toolbarActive: 'rgba(0, 0, 0, 0.10)', + toolbarHover: 'rgba(0, 0, 0, 0.20)', + toolbar: '#ffffff', + quoteBar: 'rgb(206, 208, 212)', + quoteColor: 'rgb(101, 103, 107)', linkHover: '#004a72', linkVisited: '#537587' }, @@ -37,6 +42,11 @@ const COLORS = { brandColor: 'var(--primary)', grey: '#969696', link: '#2e99d1', + toolbarActive: 'rgba(255, 255, 255, 0.10)', + toolbarHover: 'rgba(255, 255, 255, 0.20)', + toolbar: '#3e3f3f', + quoteBar: 'rgb(158, 159, 163)', + quoteColor: 'rgb(141, 144, 150)', linkHover: '#007cbe', linkVisited: '#56798E' } diff --git a/styles/globals.scss b/styles/globals.scss index d43cd89f..d5e3b7eb 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -155,17 +155,22 @@ a:hover { } select.custom-select, +div[contenteditable], .form-control { background-color: var(--theme-inputBg); color: var(--theme-color); border-color: var(--theme-borderColor); } +div[contenteditable]:focus, .form-control:focus { background-color: var(--theme-inputBg); color: var(--theme-color); + outline: 0; + box-shadow: 0 0 0 0.2rem rgb(250 218 94 / 25%); } +div[contenteditable]:disabled, .form-control:disabled, .form-control[readonly] { background-color: var(--theme-inputDisabledBg); @@ -222,15 +227,15 @@ select.custom-select, } .dropdown-item { - color: var(--theme-dropdownItemColor); + color: var(--theme-dropdownItemColor) !important; } .dropdown-item:hover { - color: var(--theme-dropdownItemColorHover); + color: var(--theme-dropdownItemColorHover) !important; } .dropdown-item.active { - color: var(--theme-brandColor); + color: var(--theme-brandColor) !important; text-shadow: 0 0 10px var(--primary); } @@ -286,12 +291,15 @@ footer { textarea, .form-control, .form-control:focus, + div[contenteditable], + div[contenteditable]:focus, .input-group-text { font-size: 1rem !important; } } -textarea.form-control { +textarea.form-control, +div[contenteditable] { line-height: 1rem; } @@ -364,6 +372,7 @@ textarea.form-control { text-shadow: 0 0 10px var(--primary); } +div[contenteditable]:focus, .form-control:focus { border-color: var(--primary); } diff --git a/svgs/bold.svg b/svgs/bold.svg new file mode 100644 index 00000000..01231712 --- /dev/null +++ b/svgs/bold.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/check-line.svg b/svgs/check-line.svg new file mode 100644 index 00000000..4a987a60 --- /dev/null +++ b/svgs/check-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/code-box-line.svg b/svgs/code-box-line.svg new file mode 100644 index 00000000..d94ca92c --- /dev/null +++ b/svgs/code-box-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/code-line.svg b/svgs/code-line.svg new file mode 100644 index 00000000..e4919bfe --- /dev/null +++ b/svgs/code-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/double-quotes-r.svg b/svgs/double-quotes-r.svg new file mode 100644 index 00000000..c37f4073 --- /dev/null +++ b/svgs/double-quotes-r.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/font-size-2.svg b/svgs/font-size-2.svg new file mode 100644 index 00000000..693916d7 --- /dev/null +++ b/svgs/font-size-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/image-add-line.svg b/svgs/image-add-line.svg new file mode 100644 index 00000000..d01565e9 --- /dev/null +++ b/svgs/image-add-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/image-line.svg b/svgs/image-line.svg new file mode 100644 index 00000000..0090d377 --- /dev/null +++ b/svgs/image-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/indent-decrease.svg b/svgs/indent-decrease.svg new file mode 100644 index 00000000..54403802 --- /dev/null +++ b/svgs/indent-decrease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/indent-increase.svg b/svgs/indent-increase.svg new file mode 100644 index 00000000..e9f8aef8 --- /dev/null +++ b/svgs/indent-increase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/italic.svg b/svgs/italic.svg new file mode 100644 index 00000000..3268b1d4 --- /dev/null +++ b/svgs/italic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/list-ordered.svg b/svgs/list-ordered.svg new file mode 100644 index 00000000..7664d042 --- /dev/null +++ b/svgs/list-ordered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/strikethrough.svg b/svgs/strikethrough.svg new file mode 100644 index 00000000..9b0f45ad --- /dev/null +++ b/svgs/strikethrough.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/underline.svg b/svgs/underline.svg new file mode 100644 index 00000000..b07a2361 --- /dev/null +++ b/svgs/underline.svg @@ -0,0 +1 @@ + \ No newline at end of file From 76b5b7743ed0f288c9ef062ff7931c3da9921eae Mon Sep 17 00:00:00 2001 From: keyan Date: Thu, 5 Jan 2023 19:06:31 -0600 Subject: [PATCH 33/42] fix blockquote spacing --- components/text.module.css | 2 +- lexical/theme.js | 1 + pages/lexical.js | 2 +- styles/globals.scss | 4 ++++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/components/text.module.css b/components/text.module.css index 6d2e0947..089e3507 100644 --- a/components/text.module.css +++ b/components/text.module.css @@ -59,7 +59,7 @@ margin-bottom: 0 !important; } -.text blockquote>* { +.text blockquote:last-child { margin-bottom: 0 !important; } diff --git a/lexical/theme.js b/lexical/theme.js index 0501a52a..cba6539a 100644 --- a/lexical/theme.js +++ b/lexical/theme.js @@ -13,6 +13,7 @@ const theme = { image: styles.image, link: styles.link, code: styles.code, + hr: styles.hr, list: { nested: { listitem: styles.nestedListItem diff --git a/pages/lexical.js b/pages/lexical.js index 85a59b2f..91c5e2c6 100644 --- a/pages/lexical.js +++ b/pages/lexical.js @@ -112,7 +112,7 @@ function Markdown () { return ( <> -
+
editor.update(() => { setMarkdown($convertToMarkdownString(SN_TRANSFORMERS)) })} diff --git a/styles/globals.scss b/styles/globals.scss index d5e3b7eb..483bb8e4 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -61,6 +61,10 @@ $tooltip-bg: #5c8001; } } +.lexical blockquote>* { + margin-bottom: 0 !important; +} + .modal-close { cursor: pointer; display: flex; From 7a4a24c6df65e865331eef56bd18dec3a5df3a3a Mon Sep 17 00:00:00 2001 From: keyan Date: Thu, 5 Jan 2023 19:15:48 -0600 Subject: [PATCH 34/42] make notification icon change on hover --- components/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/header.js b/components/header.js index 34c81fc1..a624021f 100644 --- a/components/header.js +++ b/components/header.js @@ -61,7 +61,7 @@ export default function Header ({ sub }) { - + {hasNewNotes?.hasNewNotes && {' '} From 2d012ba7fe7f3191e5e34a0d7cca4c4f82bc5e4c Mon Sep 17 00:00:00 2001 From: keyan Date: Fri, 6 Jan 2023 18:53:09 -0600 Subject: [PATCH 35/42] allow nip05 for users --- api/resolvers/user.js | 28 +++++++++- api/typeDefs/user.js | 4 +- components/form.js | 6 +-- components/poll-form.js | 1 + fragments/users.js | 6 ++- lib/constants.js | 1 + lib/url.js | 5 +- next.config.js | 16 ++++++ pages/api/nostr/nip05.js | 28 ++++++++++ pages/settings.js | 53 +++++++++++++++++-- .../20230106183533_nip05/migration.sql | 2 + .../20230106200624_nostr_relays/migration.sql | 24 +++++++++ prisma/schema.prisma | 23 ++++++++ 13 files changed, 183 insertions(+), 14 deletions(-) create mode 100644 pages/api/nostr/nip05.js create mode 100644 prisma/migrations/20230106183533_nip05/migration.sql create mode 100644 prisma/migrations/20230106200624_nostr_relays/migration.sql diff --git a/api/resolvers/user.js b/api/resolvers/user.js index 7794b84c..94cde4a1 100644 --- a/api/resolvers/user.js +++ b/api/resolvers/user.js @@ -334,12 +334,29 @@ export default { throw error } }, - setSettings: async (parent, data, { me, models }) => { + setSettings: async (parent, { nostrRelays, ...data }, { me, models }) => { if (!me) { throw new AuthenticationError('you must be logged in') } - return await models.user.update({ where: { id: me.id }, data }) + if (nostrRelays?.length) { + const connectOrCreate = [] + for (const nr of nostrRelays) { + await models.nostrRelay.upsert({ + where: { addr: nr }, + update: { addr: nr }, + create: { addr: nr } + }) + connectOrCreate.push({ + where: { userId_nostrRelayAddr: { userId: me.id, nostrRelayAddr: nr } }, + create: { nostrRelayAddr: nr } + }) + } + + return await models.user.update({ where: { id: me.id }, data: { ...data, nostrRelays: { deleteMany: {}, connectOrCreate } } }) + } else { + return await models.user.update({ where: { id: me.id }, data: { ...data, nostrRelays: { deleteMany: {} } } }) + } }, setWalkthrough: async (parent, { upvotePopover, tipPopover }, { me, models }) => { if (!me) { @@ -533,6 +550,13 @@ export default { }).invites({ take: 1 }) return invites.length > 0 + }, + nostrRelays: async (user, args, { models }) => { + const relays = await models.userNostrRelay.findMany({ + where: { userId: user.id } + }) + + return relays?.map(r => r.nostrRelayAddr) } } } diff --git a/api/typeDefs/user.js b/api/typeDefs/user.js index c6810bd5..ddd7229e 100644 --- a/api/typeDefs/user.js +++ b/api/typeDefs/user.js @@ -22,7 +22,7 @@ export default gql` setSettings(tipDefault: Int!, turboTipping: Boolean!, fiatCurrency: String!, noteItemSats: Boolean!, noteEarning: Boolean!, noteAllDescendants: Boolean!, noteMentions: Boolean!, noteDeposits: Boolean!, noteInvites: Boolean!, noteJobIndicator: Boolean!, hideInvoiceDesc: Boolean!, hideFromTopUsers: Boolean!, - wildWestMode: Boolean!, greeterMode: Boolean!): User + wildWestMode: Boolean!, greeterMode: Boolean!, nostrPubkey: String, nostrRelays: [String!]): User setPhoto(photoId: ID!): Int! upsertBio(bio: String!): User! setWalkthrough(tipPopover: Boolean, upvotePopover: Boolean): Boolean @@ -52,6 +52,8 @@ export default gql` tipDefault: Int! turboTipping: Boolean! fiatCurrency: String! + nostrPubkey: String + nostrRelays: [String!] bio: Item bioId: Int photoId: Int diff --git a/components/form.js b/components/form.js index 1360763b..47817e9c 100644 --- a/components/form.js +++ b/components/form.js @@ -299,7 +299,7 @@ export function Input ({ label, groupClassName, ...props }) { ) } -export function VariableInput ({ label, groupClassName, name, hint, max, readOnlyLen, ...props }) { +export function VariableInput ({ label, groupClassName, name, hint, max, min, readOnlyLen, ...props }) { return ( @@ -307,11 +307,11 @@ export function VariableInput ({ label, groupClassName, name, hint, max, readOnl const options = form.values[name] return ( <> - {options.map((_, i) => ( + {options?.map((_, i) => (
- 1 ? 'optional' : undefined} /> + = min ? 'optional' : undefined} /> {options.length - 1 === i && options.length !== max ? fieldArrayHelpers.push('')} /> diff --git a/components/poll-form.js b/components/poll-form.js index 664ea441..1a7616dd 100644 --- a/components/poll-form.js +++ b/components/poll-form.js @@ -86,6 +86,7 @@ export function PollForm ({ item, editThreshold }) { name='options' readOnlyLen={initialOptions?.length} max={MAX_POLL_NUM_CHOICES} + min={2} hint={editThreshold ?
: null} diff --git a/fragments/users.js b/fragments/users.js index 251a6e91..5eb55934 100644 --- a/fragments/users.js +++ b/fragments/users.js @@ -46,6 +46,8 @@ export const SETTINGS_FIELDS = gql` noteJobIndicator hideInvoiceDesc hideFromTopUsers + nostrPubkey + nostrRelays wildWestMode greeterMode authMethods { @@ -70,12 +72,12 @@ ${SETTINGS_FIELDS} mutation setSettings($tipDefault: Int!, $turboTipping: Boolean!, $fiatCurrency: String!, $noteItemSats: Boolean!, $noteEarning: Boolean!, $noteAllDescendants: Boolean!, $noteMentions: Boolean!, $noteDeposits: Boolean!, $noteInvites: Boolean!, $noteJobIndicator: Boolean!, $hideInvoiceDesc: Boolean!, $hideFromTopUsers: Boolean!, - $wildWestMode: Boolean!, $greeterMode: Boolean!) { + $wildWestMode: Boolean!, $greeterMode: Boolean!, $nostrPubkey: String, $nostrRelays: [String!]) { setSettings(tipDefault: $tipDefault, turboTipping: $turboTipping, fiatCurrency: $fiatCurrency, noteItemSats: $noteItemSats, noteEarning: $noteEarning, noteAllDescendants: $noteAllDescendants, noteMentions: $noteMentions, noteDeposits: $noteDeposits, noteInvites: $noteInvites, noteJobIndicator: $noteJobIndicator, hideInvoiceDesc: $hideInvoiceDesc, hideFromTopUsers: $hideFromTopUsers, - wildWestMode: $wildWestMode, greeterMode: $greeterMode) { + wildWestMode: $wildWestMode, greeterMode: $greeterMode, nostrPubkey: $nostrPubkey, nostrRelays: $nostrRelays) { ...SettingsFields } } diff --git a/lib/constants.js b/lib/constants.js index 185cb5a4..aa1ad66f 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -16,3 +16,4 @@ export const ITEM_SPAM_INTERVAL = '10m' export const MAX_POLL_NUM_CHOICES = 10 export const ITEM_FILTER_THRESHOLD = 1.2 export const DONT_LIKE_THIS_COST = 1 +export const MAX_NOSTR_RELAY_NUM = 20 diff --git a/lib/url.js b/lib/url.js index 8075cef4..df69264b 100644 --- a/lib/url.js +++ b/lib/url.js @@ -6,4 +6,7 @@ export function ensureProtocol (value) { } // eslint-disable-next-line -const URL_REGEXP = /^((https?|ftp):\/\/)?(www.)?(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i \ No newline at end of file +export const URL_REGEXP = /^((https?|ftp):\/\/)?(www.)?(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i + +// eslint-disable-next-line +export const WS_REGEXP = /^(wss?:\/\/)([0-9]{1,3}(?:\.[0-9]{1,3}){3}|(?=[^\/]{1,254}(?![^\/]))(?:(?=[a-zA-Z0-9-]{1,63}\.)(?:xn--+)?[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,63})(:([0-9]{1,5}))?$/ diff --git a/next.config.js b/next.config.js index ebfa15ff..13074b09 100644 --- a/next.config.js +++ b/next.config.js @@ -42,6 +42,18 @@ module.exports = withPlausibleProxy()({ value: 'public, max-age=31536000, immutable' } ] + }, + { + source: '/.well-known/:slug*', + headers: [ + ...corsHeaders + ] + }, + { + source: '/api/lnauth', + headers: [ + ...corsHeaders + ] } ] }, @@ -71,6 +83,10 @@ module.exports = withPlausibleProxy()({ source: '/.well-known/lnurlp/:username', destination: '/api/lnurlp/:username' }, + { + source: '/.well-known/nostr.json', + destination: '/api/nostr/nip05' + }, { source: '/~:sub', destination: '/~/:sub' diff --git a/pages/api/nostr/nip05.js b/pages/api/nostr/nip05.js new file mode 100644 index 00000000..54d1d7c5 --- /dev/null +++ b/pages/api/nostr/nip05.js @@ -0,0 +1,28 @@ +import models from '../../../api/models' + +export default async function Nip05 ({ query: { name } }, res) { + const names = {} + let relays = {} + + const users = await models.user.findMany({ + where: { + name, + nostrPubkey: { not: null } + }, + include: { nostrRelays: true } + }) + + for (const user of users) { + names[user.name] = user.nostrPubkey + if (user.nostrRelays.length) { + // append relays with key pubkey + relays[user.nostrPubkey] = [] + for (const relay of user.nostrRelays) { + relays[user.nostrPubkey].push(relay.nostrRelayAddr) + } + } + } + + relays = Object.keys(relays).length ? relays : undefined + return res.status(200).json({ names, relays }) +} diff --git a/pages/settings.js b/pages/settings.js index e955dcf1..9aac401f 100644 --- a/pages/settings.js +++ b/pages/settings.js @@ -1,4 +1,4 @@ -import { Checkbox, Form, Input, SubmitButton, Select } from '../components/form' +import { Checkbox, Form, Input, SubmitButton, Select, VariableInput } from '../components/form' import * as Yup from 'yup' import { Alert, Button, InputGroup, Modal } from 'react-bootstrap' import LayoutCenter from '../components/layout-center' @@ -15,6 +15,8 @@ import Info from '../components/info' import { CURRENCY_SYMBOLS } from '../components/price' import Link from 'next/link' import AccordianItem from '../components/accordian-item' +import { MAX_NOSTR_RELAY_NUM } from '../lib/constants' +import { WS_REGEXP } from '../lib/url' export const getServerSideProps = getGetServerSideProps(SETTINGS) @@ -23,7 +25,12 @@ const supportedCurrencies = Object.keys(CURRENCY_SYMBOLS) export const SettingsSchema = Yup.object({ tipDefault: Yup.number().typeError('must be a number').required('required') .positive('must be positive').integer('must be whole'), - fiatCurrency: Yup.string().required('required').oneOf(supportedCurrencies) + fiatCurrency: Yup.string().required('required').oneOf(supportedCurrencies), + nostrPubkey: Yup.string().matches(/^[0-9a-fA-F]{64}$/, 'must be 64 hex chars'), + nostrRelays: Yup.array().of( + Yup.string().matches(WS_REGEXP, 'invalid web socket address') + ).max(MAX_NOSTR_RELAY_NUM, + ({ max, value }) => `${Math.abs(max - value.length)} too many`) }) const warningMessage = 'If I logout, even accidentally, I will never be able to access my account again' @@ -72,11 +79,26 @@ export default function Settings ({ data: { settings } }) { hideInvoiceDesc: settings?.hideInvoiceDesc, hideFromTopUsers: settings?.hideFromTopUsers, wildWestMode: settings?.wildWestMode, - greeterMode: settings?.greeterMode + greeterMode: settings?.greeterMode, + nostrPubkey: settings?.nostrPubkey || '', + nostrRelays: settings?.nostrRelays || [''] }} schema={SettingsSchema} - onSubmit={async ({ tipDefault, ...values }) => { - await setSettings({ variables: { tipDefault: Number(tipDefault), ...values } }) + onSubmit={async ({ tipDefault, nostrPubkey, nostrRelays, ...values }) => { + if (nostrPubkey.length === 0) { + nostrPubkey = null + } + + const nostrRelaysFiltered = nostrRelays?.filter(word => word.trim().length > 0) + + await setSettings({ + variables: { + tipDefault: Number(tipDefault), + nostrPubkey, + nostrRelays: nostrRelaysFiltered, + ...values + } + }) setSuccess('settings saved') }} > @@ -217,6 +239,27 @@ export default function Settings ({ data: { settings } }) { } name='greeterMode' /> + nostr NIP-05} + body={ + <> + pubkey optional} + name='nostrPubkey' + clear + /> + relays optional} + name='nostrRelays' + clear + min={0} + max={MAX_NOSTR_RELAY_NUM} + /> + + } + />
save
diff --git a/prisma/migrations/20230106183533_nip05/migration.sql b/prisma/migrations/20230106183533_nip05/migration.sql new file mode 100644 index 00000000..4afd7471 --- /dev/null +++ b/prisma/migrations/20230106183533_nip05/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "users" ADD COLUMN "nostrPubkey" TEXT; diff --git a/prisma/migrations/20230106200624_nostr_relays/migration.sql b/prisma/migrations/20230106200624_nostr_relays/migration.sql new file mode 100644 index 00000000..ebec1b8a --- /dev/null +++ b/prisma/migrations/20230106200624_nostr_relays/migration.sql @@ -0,0 +1,24 @@ +-- CreateTable +CREATE TABLE "NostrRelay" ( + "addr" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("addr") +); + +-- CreateTable +CREATE TABLE "UserNostrRelay" ( + "userId" INTEGER NOT NULL, + "nostrRelayAddr" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("userId","nostrRelayAddr") +); + +-- AddForeignKey +ALTER TABLE "UserNostrRelay" ADD FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserNostrRelay" ADD FOREIGN KEY ("nostrRelayAddr") REFERENCES "NostrRelay"("addr") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 814d1138..08152515 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -44,9 +44,14 @@ model User { photoId Int? photo Upload? @relation(fields: [photoId], references: [id]) + // walkthrough upvotePopover Boolean @default(false) tipPopover Boolean @default(false) + // nostr + nostrPubkey String? + nostrRelays UserNostrRelay[] + // referrals referrer User? @relation("referrals", fields: [referrerId], references: [id]) referrerId Int? @@ -84,6 +89,24 @@ model User { @@map(name: "users") } +model NostrRelay { + addr String @id + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @updatedAt @map(name: "updated_at") + users UserNostrRelay[] +} + +model UserNostrRelay { + User User @relation(fields: [userId], references: [id]) + userId Int + NostrRelay NostrRelay @relation(fields: [nostrRelayAddr], references: [addr]) + nostrRelayAddr String + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @updatedAt @map(name: "updated_at") + + @@id([userId, nostrRelayAddr]) +} + model Donation { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) @map(name: "created_at") From eada9d92ad712fb914f444866a0f8043216c0943 Mon Sep 17 00:00:00 2001 From: keyan Date: Fri, 6 Jan 2023 19:18:03 -0600 Subject: [PATCH 36/42] fix empty nostr relay settings --- pages/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings.js b/pages/settings.js index 9aac401f..aceb1c25 100644 --- a/pages/settings.js +++ b/pages/settings.js @@ -81,7 +81,7 @@ export default function Settings ({ data: { settings } }) { wildWestMode: settings?.wildWestMode, greeterMode: settings?.greeterMode, nostrPubkey: settings?.nostrPubkey || '', - nostrRelays: settings?.nostrRelays || [''] + nostrRelays: settings?.nostrRelays?.length ? settings?.nostrRelays : [''] }} schema={SettingsSchema} onSubmit={async ({ tipDefault, nostrPubkey, nostrRelays, ...values }) => { From c2685a659e7e94d3fc434fcd98b2ef9aed25516d Mon Sep 17 00:00:00 2001 From: keyan Date: Mon, 9 Jan 2023 18:33:44 -0600 Subject: [PATCH 37/42] sign up buttons --- components/header.js | 40 +++++++++++++++++++++++------------- components/header.module.css | 3 ++- components/login.js | 16 +++++++-------- components/price.js | 6 +++--- pages/invites/[id].js | 8 ++++---- pages/login.js | 16 ++++++++++++++- styles/globals.scss | 9 ++++++++ 7 files changed, 66 insertions(+), 32 deletions(-) diff --git a/components/header.js b/components/header.js index a624021f..ff965727 100644 --- a/components/header.js +++ b/components/header.js @@ -7,7 +7,7 @@ import { Button, Container, NavDropdown } from 'react-bootstrap' import Price from './price' import { useMe } from './me' import Head from 'next/head' -import { signOut, signIn } from 'next-auth/client' +import { signOut } from 'next-auth/client' import { useLightning } from './lightning' import { useEffect, useState } from 'react' import { randInRange } from '../lib/rand' @@ -50,7 +50,7 @@ export default function Header ({ sub }) { } setLastCheckedJobs(localStorage.getItem('lastCheckedJobs')) } - }) + }, [sub]) const Corner = () => { if (me) { @@ -134,18 +134,30 @@ export default function Header ({ sub }) { return () => { isMounted = false } }, []) } - return path !== '/login' && !path.startsWith('/invites') && - + return path !== '/login' && path !== '/signup' && !path.startsWith('/invites') && +
+ + +
} } diff --git a/components/header.module.css b/components/header.module.css index 2e3d7a6e..db0a43e3 100644 --- a/components/header.module.css +++ b/components/header.module.css @@ -11,6 +11,7 @@ .navLinkButton { border: 2px solid; + padding: 0.2rem .9rem !important; border-radius: .4rem; } @@ -57,6 +58,6 @@ padding: 0; } -.dropdown > a { +.dropdown>a { padding-left: 0 !important; } \ No newline at end of file diff --git a/components/login.js b/components/login.js index cbae1f64..eb188e31 100644 --- a/components/login.js +++ b/components/login.js @@ -16,7 +16,7 @@ export const EmailSchema = Yup.object({ email: Yup.string().email('email is no good').required('required') }) -export function EmailLoginForm ({ callbackUrl }) { +export function EmailLoginForm ({ text, callbackUrl }) { return (
- Login with Email + {text || 'Login'} with Email
) } -export default function Login ({ providers, callbackUrl, error, Header }) { +export default function Login ({ providers, callbackUrl, error, text, Header, Footer }) { const errors = { Signin: 'Try signing with a different account.', OAuthSignin: 'Try signing with a different account.', @@ -60,9 +60,6 @@ export default function Login ({ providers, callbackUrl, error, Header }) {
{Header &&
} -
- Not registered? Just login, we'll automatically create an account. -
{errorMessage && setErrorMessage(undefined)} dismissible>{errorMessage}} {router.query.type === 'lightning' @@ -81,7 +78,7 @@ export default function Login ({ providers, callbackUrl, error, Header }) { width={20} height={20} className='mr-3' - />Login with Lightning + />{text || 'Login'} with Lightning {Object.values(providers).map(provider => { if (provider.name === 'Email' || provider.name === 'Lightning') { @@ -101,13 +98,14 @@ export default function Login ({ providers, callbackUrl, error, Header }) { > Login with {provider.name} + />{text || 'Login'} with {provider.name} ) })}
or
- + )} + {Footer &&
}
) diff --git a/components/price.js b/components/price.js index e7edb0a3..76fa0f2f 100644 --- a/components/price.js +++ b/components/price.js @@ -78,7 +78,7 @@ export default function Price () { if (asSats === 'yep') { return ( - ) @@ -86,14 +86,14 @@ export default function Price () { if (asSats === '1btc') { return ( - ) } return ( - ) diff --git a/pages/invites/[id].js b/pages/invites/[id].js index d9c248d9..6beb8d19 100644 --- a/pages/invites/[id].js +++ b/pages/invites/[id].js @@ -63,7 +63,7 @@ function InviteHeader ({ invite }) { } else { Inner = () => (
- get {invite.gift} free sats from{' '} + Get {invite.gift} free sats from{' '} @{invite.user.name}{' '} when you sign up today
@@ -71,12 +71,12 @@ function InviteHeader ({ invite }) { } return ( -

+

-

+ ) } export default function Invite ({ invite, ...props }) { - return } {...props} /> + return } text='Sign up' {...props} /> } diff --git a/pages/login.js b/pages/login.js index 211567a5..ec227c20 100644 --- a/pages/login.js +++ b/pages/login.js @@ -1,4 +1,5 @@ import { providers, getSession } from 'next-auth/client' +import Link from 'next/link' import Login from '../components/login' export async function getServerSideProps ({ req, res, query: { callbackUrl, error = null } }) { @@ -21,4 +22,17 @@ export async function getServerSideProps ({ req, res, query: { callbackUrl, erro } } -export default Login +function LoginFooter ({ callbackUrl }) { + return ( + Don't have an account? sign up + ) +} + +export default function LoginPage (props) { + return ( + } + {...props} + /> + ) +} diff --git a/styles/globals.scss b/styles/globals.scss index 483bb8e4..562bc00b 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -7,6 +7,7 @@ $theme-colors: ( "twitter" : #1da1f2, "boost" : #8c25f4, "grey" : #e9ecef, + "grey-darkmode": #8c8c8c ); $body-bg: #f5f5f5; @@ -61,6 +62,10 @@ $tooltip-bg: #5c8001; } } +.line-height-1 { + line-height: 1; +} + .lexical blockquote>* { margin-bottom: 0 !important; } @@ -196,6 +201,10 @@ div[contenteditable]:disabled, fill: #212529; } +.btn-grey svg { + fill: #212529; +} + .fresh { background-color: var(--theme-clickToContextColor); border-radius: .4rem; From 79af1b5852f06b140fe9837c7fa3dff0b1ebaabb Mon Sep 17 00:00:00 2001 From: keyan Date: Mon, 9 Jan 2023 18:56:19 -0600 Subject: [PATCH 38/42] add missing signup file --- pages/signup.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 pages/signup.js diff --git a/pages/signup.js b/pages/signup.js new file mode 100644 index 00000000..83379975 --- /dev/null +++ b/pages/signup.js @@ -0,0 +1,51 @@ +import { providers, getSession } from 'next-auth/client' +import Link from 'next/link' +import Login from '../components/login' + +export async function getServerSideProps ({ req, res, query: { callbackUrl, error = null } }) { + const session = await getSession({ req }) + + if (session && res && callbackUrl) { + res.writeHead(302, { + Location: callbackUrl + }) + res.end() + return { props: {} } + } + + return { + props: { + providers: await providers({ req, res }), + callbackUrl, + error + } + } +} + +function SignUpHeader () { + return ( + <> +

+ Sign up +

+
Join 9000+ bitcoiners and start stacking sats today
+ + ) +} + +function SignUpFooter ({ callbackUrl }) { + return ( + Already have an account? login + ) +} + +export default function SignUp ({ ...props }) { + return ( + } + Footer={() => } + text='Sign up' + {...props} + /> + ) +} From d1a08eda366735b343f787b0a9a4eef207293d71 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 10 Jan 2023 09:40:56 -0600 Subject: [PATCH 39/42] make sure useEffect doesn't update state on every render --- components/footer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/footer.js b/components/footer.js index d69f01fe..55c2846f 100644 --- a/components/footer.js +++ b/components/footer.js @@ -136,7 +136,7 @@ export default function Footer ({ noLinks }) { useEffect(() => { setMounted(true) setLightning(localStorage.getItem('lnAnimate') || 'yes') - }) + }, []) const toggleLightning = () => { if (lightning === 'yes') { From e2d7506ebfd44fdb19857400110153e16d9cbcfb Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 10 Jan 2023 12:55:17 -0600 Subject: [PATCH 40/42] lightning login copy --- components/accordian-item.js | 3 +- components/invoice-status.js | 6 +- components/lightning-auth.js | 80 +++++++++++++++++++---- components/lightning-auth.module.css | 8 +++ components/lnqr.js | 2 +- components/login.js | 95 ++++++++++++++-------------- styles/globals.scss | 1 + svgs/arrow-left-fill.svg | 1 + svgs/arrow-left-line.svg | 1 + 9 files changed, 134 insertions(+), 63 deletions(-) create mode 100644 components/lightning-auth.module.css create mode 100644 svgs/arrow-left-fill.svg create mode 100644 svgs/arrow-left-line.svg diff --git a/components/accordian-item.js b/components/accordian-item.js index 878f1935..e4178ab7 100644 --- a/components/accordian-item.js +++ b/components/accordian-item.js @@ -3,7 +3,7 @@ import ArrowRight from '../svgs/arrow-right-s-fill.svg' import ArrowDown from '../svgs/arrow-down-s-fill.svg' import { useEffect, useState } from 'react' -export default function AccordianItem ({ header, body, headerColor = 'var(--theme-grey)', show }) { +export default function AccordianItem ({ header, body, className, headerColor = 'var(--theme-grey)', show }) { const [open, setOpen] = useState(show) useEffect(() => { @@ -19,6 +19,7 @@ export default function AccordianItem ({ header, body, headerColor = 'var(--them eventKey='0' style={{ cursor: 'pointer', display: 'flex', alignItems: 'center' }} onClick={() => setOpen(!open)} + className={className} > {open ? diff --git a/components/invoice-status.js b/components/invoice-status.js index 40f8cd6c..fa7132f7 100644 --- a/components/invoice-status.js +++ b/components/invoice-status.js @@ -4,7 +4,7 @@ import ThumbDown from '../svgs/thumb-down-fill.svg' function InvoiceDefaultStatus ({ status }) { return ( -
+
{status}
@@ -13,7 +13,7 @@ function InvoiceDefaultStatus ({ status }) { function InvoiceConfirmedStatus ({ status }) { return ( -
+
{status}
@@ -22,7 +22,7 @@ function InvoiceConfirmedStatus ({ status }) { function InvoiceFailedStatus ({ status }) { return ( -
+
{status}
diff --git a/components/lightning-auth.js b/components/lightning-auth.js index 4ffbaaa6..372ff03f 100644 --- a/components/lightning-auth.js +++ b/components/lightning-auth.js @@ -1,7 +1,12 @@ import { gql, useMutation, useQuery } from '@apollo/client' import { signIn } from 'next-auth/client' import { useEffect } from 'react' +import { Col, Container, Row } from 'react-bootstrap' +import AccordianItem from './accordian-item' import LnQR, { LnQRSkeleton } from './lnqr' +import styles from './lightning-auth.module.css' +import BackIcon from '../svgs/arrow-left-line.svg' +import { useRouter } from 'next/router' function LnQRAuth ({ k1, encodedUrl, callbackUrl }) { const query = gql` @@ -19,16 +24,67 @@ function LnQRAuth ({ k1, encodedUrl, callbackUrl }) { // output pubkey and k1 return ( - <> - - Does my wallet support lnurl-auth? - - - + ) } -export function LightningAuth ({ callbackUrl }) { +function LightningExplainer ({ text, children }) { + const router = useRouter() + return ( + +
+
router.back()}>
+

+ {text || 'Login'} with Lightning +

+
This is the most private way to use Stacker News. Just open your Lightning wallet and scan the QR code.
+ + + + + You can use any wallet that support lnurl-auth. These are some wallets you can use: + + + +
    +
  • Alby
  • +
  • Balance of Satoshis
  • +
  • Blixt
  • +
  • Breez
  • +
  • Blue Wallet
  • +
  • Coinos
  • +
  • LNBits
  • +
  • LNtxtbot
  • +
+ + +
    +
  • Phoenix
  • +
  • Simple Bitcoin Wallet
  • +
  • Sparrow Wallet
  • +
  • ThunderHub
  • +
  • Zap Desktop
  • +
  • Zeus
  • +
+ +
+ + } + /> + + + {children} + +
+
+
+ ) +} + +export function LightningAuth ({ text, callbackUrl }) { // query for challenge const [createAuth, { data, error }] = useMutation(gql` mutation createAuth { @@ -44,9 +100,9 @@ export function LightningAuth ({ callbackUrl }) { if (error) return
error
- if (!data) { - return - } - - return + return ( + + {data ? : } + + ) } diff --git a/components/lightning-auth.module.css b/components/lightning-auth.module.css new file mode 100644 index 00000000..39867553 --- /dev/null +++ b/components/lightning-auth.module.css @@ -0,0 +1,8 @@ +.login { + justify-content: center; + align-items: center; + display: flex; + flex-direction: column; + padding-top: 3rem; + padding-bottom: 3rem; +} \ No newline at end of file diff --git a/components/lnqr.js b/components/lnqr.js index e8286390..84e17093 100644 --- a/components/lnqr.js +++ b/components/lnqr.js @@ -23,7 +23,7 @@ export default function LnQR ({ value, webLn, statusVariant, status }) { return ( <> - + diff --git a/components/login.js b/components/login.js index eb188e31..fb49c435 100644 --- a/components/login.js +++ b/components/login.js @@ -57,56 +57,59 @@ export default function Login ({ providers, callbackUrl, error, text, Header, Fo const router = useRouter() return ( - -
- {Header &&
} - {errorMessage && - setErrorMessage(undefined)} dismissible>{errorMessage}} - {router.query.type === 'lightning' - ? - : ( - <> - - {Object.values(providers).map(provider => { - if (provider.name === 'Email' || provider.name === 'Lightning') { - return null - } - const [variant, Icon] = + + {router.query.type === 'lightning' + ? + : ( +
+ {Header &&
} + {errorMessage && + setErrorMessage(undefined)} + dismissible + >{errorMessage} + } + + {Object.values(providers).map(provider => { + if (provider.name === 'Email' || provider.name === 'Lightning') { + return null + } + const [variant, Icon] = provider.name === 'Twitter' ? ['twitter', TwitterIcon] : ['dark', GithubIcon] - return ( - - ) - })} -
or
- - )} - {Footer &&
} -
+ return ( + + ) + })} +
or
+ + {Footer &&
} +
)}
) } diff --git a/styles/globals.scss b/styles/globals.scss index 562bc00b..d48932fe 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -7,6 +7,7 @@ $theme-colors: ( "twitter" : #1da1f2, "boost" : #8c25f4, "grey" : #e9ecef, + "grey-medium" : #d2d2d2, "grey-darkmode": #8c8c8c ); diff --git a/svgs/arrow-left-fill.svg b/svgs/arrow-left-fill.svg new file mode 100644 index 00000000..4cdbaab6 --- /dev/null +++ b/svgs/arrow-left-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svgs/arrow-left-line.svg b/svgs/arrow-left-line.svg new file mode 100644 index 00000000..a656bcd4 --- /dev/null +++ b/svgs/arrow-left-line.svg @@ -0,0 +1 @@ + \ No newline at end of file From ae5c6c457f0aae25f89cc414494a82e7b25770b0 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 10 Jan 2023 17:13:37 -0600 Subject: [PATCH 41/42] global modal + small fixes/enhancements --- components/accordian-item.js | 3 +- components/dont-link-this.js | 9 ++- components/fund-error.js | 53 +++---------- components/item-act.js | 130 ++++++++++++-------------------- components/login.js | 100 ++++++++++++------------ components/modal.js | 51 +++++++++++++ components/poll.js | 9 ++- components/upvote.js | 34 ++++++--- pages/_app.js | 17 ++--- pages/api/auth/[...nextauth].js | 3 +- pages/email.js | 14 ++++ pages/invites/[id].js | 7 +- pages/login.js | 11 ++- pages/signup.js | 15 ++-- public/darkmode.js | 2 +- public/hello.gif | Bin 0 -> 428020 bytes styles/globals.scss | 2 +- 17 files changed, 238 insertions(+), 222 deletions(-) create mode 100644 components/modal.js create mode 100644 pages/email.js create mode 100644 public/hello.gif diff --git a/components/accordian-item.js b/components/accordian-item.js index e4178ab7..878f1935 100644 --- a/components/accordian-item.js +++ b/components/accordian-item.js @@ -3,7 +3,7 @@ import ArrowRight from '../svgs/arrow-right-s-fill.svg' import ArrowDown from '../svgs/arrow-down-s-fill.svg' import { useEffect, useState } from 'react' -export default function AccordianItem ({ header, body, className, headerColor = 'var(--theme-grey)', show }) { +export default function AccordianItem ({ header, body, headerColor = 'var(--theme-grey)', show }) { const [open, setOpen] = useState(show) useEffect(() => { @@ -19,7 +19,6 @@ export default function AccordianItem ({ header, body, className, headerColor = eventKey='0' style={{ cursor: 'pointer', display: 'flex', alignItems: 'center' }} onClick={() => setOpen(!open)} - className={className} > {open ? diff --git a/components/dont-link-this.js b/components/dont-link-this.js index 1ed60658..65da4cde 100644 --- a/components/dont-link-this.js +++ b/components/dont-link-this.js @@ -1,10 +1,11 @@ import { gql, useMutation } from '@apollo/client' import { Dropdown } from 'react-bootstrap' import MoreIcon from '../svgs/more-fill.svg' -import { useFundError } from './fund-error' +import FundError from './fund-error' +import { useShowModal } from './modal' export default function DontLikeThis ({ id }) { - const { setError } = useFundError() + const showModal = useShowModal() const [dontLikeThis] = useMutation( gql` @@ -41,7 +42,9 @@ export default function DontLikeThis ({ id }) { }) } catch (error) { if (error.toString().includes('insufficient funds')) { - setError(true) + showModal(onClose => { + return + }) } } }} diff --git a/components/fund-error.js b/components/fund-error.js index 125aa519..3a1f41d3 100644 --- a/components/fund-error.js +++ b/components/fund-error.js @@ -1,48 +1,15 @@ -import { Button, Modal } from 'react-bootstrap' -import React, { useState, useCallback, useContext } from 'react' import Link from 'next/link' +import { Button } from 'react-bootstrap' -export const FundErrorContext = React.createContext({ - error: null, - toggleError: () => {} -}) - -export function FundErrorProvider ({ children }) { - const [error, setError] = useState(false) - - const contextValue = { - error, - setError: useCallback(e => setError(e), []) - } - +export default function FundError ({ onClose }) { return ( - - {children} - - ) -} - -export function useFundError () { - const { error, setError } = useContext(FundErrorContext) - return { error, setError } -} - -export function FundErrorModal () { - const { error, setError } = useFundError() - return ( - setError(false)} - > -
setError(false)}>X
- -

you need more sats

-
- - - -
-
-
+ <> +

you need more sats

+
+ + + +
+ ) } diff --git a/components/item-act.js b/components/item-act.js index 79ccb16f..615f9995 100644 --- a/components/item-act.js +++ b/components/item-act.js @@ -1,105 +1,69 @@ -import { Button, InputGroup, Modal } from 'react-bootstrap' -import React, { useState, useCallback, useContext, useRef, useEffect } from 'react' +import { Button, InputGroup } from 'react-bootstrap' +import React, { useState, useRef, useEffect } from 'react' import * as Yup from 'yup' import { Form, Input, SubmitButton } from './form' import { useMe } from './me' import UpBolt from '../svgs/bolt.svg' -export const ItemActContext = React.createContext({ - item: null, - setItem: () => {} -}) - -export function ItemActProvider ({ children }) { - const [item, setItem] = useState(null) - - const contextValue = { - item, - setItem: useCallback(i => setItem(i), []) - } - - return ( - - {children} - - ) -} - -export function useItemAct () { - const { item, setItem } = useContext(ItemActContext) - return { item, setItem } -} - export const ActSchema = Yup.object({ amount: Yup.number().typeError('must be a number').required('required') .positive('must be positive').integer('must be whole') }) -export function ItemActModal () { - const { item, setItem } = useItemAct() +export default function ItemAct ({ onClose, itemId, act, strike }) { const inputRef = useRef(null) const me = useMe() const [oValue, setOValue] = useState() useEffect(() => { inputRef.current?.focus() - }, [item]) + }, [onClose, itemId]) return ( - { - setItem(null) +
{ + await act({ + variables: { + id: itemId, + sats: Number(amount) + } + }) + await strike() + onClose() }} > -
setItem(null)}>X
- - { - await item.act({ - variables: { - id: item.itemId, - sats: Number(amount) - } - }) - await item.strike() - setItem(null) - }} - > - sats} - /> -
- {[1, 10, 100, 1000, 10000].map(num => - )} -
-
- tip -
- -
-
+ sats} + /> +
+ {[1, 10, 100, 1000, 10000].map(num => + )} +
+
+ tip +
+ ) } diff --git a/components/login.js b/components/login.js index fb49c435..24443888 100644 --- a/components/login.js +++ b/components/login.js @@ -8,7 +8,6 @@ import { Form, Input, SubmitButton } from '../components/form' import * as Yup from 'yup' import { useState } from 'react' import Alert from 'react-bootstrap/Alert' -import LayoutCenter from '../components/layout-center' import { useRouter } from 'next/router' import { LightningAuth } from './lightning-auth' @@ -56,60 +55,59 @@ export default function Login ({ providers, callbackUrl, error, text, Header, Fo const [errorMessage, setErrorMessage] = useState(error && (errors[error] ?? errors.default)) const router = useRouter() + if (router.query.type === 'lightning') { + return + } + return ( - - {router.query.type === 'lightning' - ? - : ( -
- {Header &&
} - {errorMessage && - setErrorMessage(undefined)} - dismissible - >{errorMessage} - } - - {Object.values(providers).map(provider => { - if (provider.name === 'Email' || provider.name === 'Lightning') { - return null - } - const [variant, Icon] = +
+ {Header &&
} + {errorMessage && + setErrorMessage(undefined)} + dismissible + >{errorMessage} + } + + {providers && Object.values(providers).map(provider => { + if (provider.name === 'Email' || provider.name === 'Lightning') { + return null + } + const [variant, Icon] = provider.name === 'Twitter' ? ['twitter', TwitterIcon] : ['dark', GithubIcon] - return ( - - ) - })} -
or
- - {Footer &&
} -
)} - + return ( + + ) + })} +
or
+ + {Footer &&
} +
) } diff --git a/components/modal.js b/components/modal.js new file mode 100644 index 00000000..2a7ae3be --- /dev/null +++ b/components/modal.js @@ -0,0 +1,51 @@ +import { createContext, useCallback, useContext, useMemo, useState } from 'react' +import { Modal } from 'react-bootstrap' + +export const ShowModalContext = createContext(() => null) + +export function ShowModalProvider ({ children }) { + const [modal, showModal] = useModal() + const contextValue = showModal + + return ( + + {children} + {modal} + + ) +} + +export function useShowModal () { + return useContext(ShowModalContext) +} + +export default function useModal () { + const [modalContent, setModalContent] = useState(null) + + const onClose = useCallback(() => { + setModalContent(null) + }, []) + + const modal = useMemo(() => { + if (modalContent === null) { + return null + } + return ( + +
X
+ + {modalContent} + +
+ ) + }, [modalContent, onClose]) + + const showModal = useCallback( + (getContent) => { + setModalContent(getContent(onClose)) + }, + [onClose] + ) + + return [modal, showModal] +} diff --git a/components/poll.js b/components/poll.js index 952c511d..f5295623 100644 --- a/components/poll.js +++ b/components/poll.js @@ -6,12 +6,13 @@ import { useMe } from './me' import styles from './poll.module.css' import Check from '../svgs/checkbox-circle-fill.svg' import { signIn } from 'next-auth/client' -import { useFundError } from './fund-error' import ActionTooltip from './action-tooltip' +import { useShowModal } from './modal' +import FundError from './fund-error' export default function Poll ({ item }) { const me = useMe() - const { setError } = useFundError() + const showModal = useShowModal() const [pollVote] = useMutation( gql` mutation pollVote($id: ID!) { @@ -60,7 +61,9 @@ export default function Poll ({ item }) { }) } catch (error) { if (error.toString().includes('insufficient funds')) { - setError(true) + showModal(onClose => { + return + }) } } } diff --git a/components/upvote.js b/components/upvote.js index f2ef5190..ea2f3d1f 100644 --- a/components/upvote.js +++ b/components/upvote.js @@ -2,15 +2,16 @@ import { LightningConsumer } from './lightning' import UpBolt from '../svgs/bolt.svg' import styles from './upvote.module.css' import { gql, useMutation } from '@apollo/client' -import { signIn } from 'next-auth/client' -import { useFundError } from './fund-error' +import FundError from './fund-error' import ActionTooltip from './action-tooltip' -import { useItemAct } from './item-act' +import ItemAct from './item-act' import { useMe } from './me' import Rainbow from '../lib/rainbow' import { useRef, useState } from 'react' import LongPressable from 'react-longpressable' import { Overlay, Popover } from 'react-bootstrap' +import { useShowModal } from './modal' +import { useRouter } from 'next/router' const getColor = (meSats) => { if (!meSats || meSats <= 10) { @@ -63,8 +64,8 @@ const TipPopover = ({ target, show, handleClose }) => ( ) export default function UpVote ({ item, className }) { - const { setError } = useFundError() - const { setItem } = useItemAct() + const showModal = useShowModal() + const router = useRouter() const [voteShow, _setVoteShow] = useState(false) const [tipShow, _setTipShow] = useState(false) const ref = useRef() @@ -123,11 +124,14 @@ export default function UpVote ({ item, className }) { return existingSats + sats }, meSats (existingSats = 0) { - if (existingSats === 0) { - setVoteShow(true) - } else { - setTipShow(true) + if (sats <= me.sats) { + if (existingSats === 0) { + setVoteShow(true) + } else { + setTipShow(true) + } } + return existingSats + sats }, upvotes (existingUpvotes = 0) { @@ -183,7 +187,8 @@ export default function UpVote ({ item, className }) { } setTipShow(false) - setItem({ itemId: item.id, act, strike }) + showModal(onClose => + ) } } onShortPress={ @@ -215,13 +220,18 @@ export default function UpVote ({ item, className }) { }) } catch (error) { if (error.toString().includes('insufficient funds')) { - setError(true) + showModal(onClose => { + return + }) return } throw new Error({ message: error.toString() }) } } - : signIn + : async () => await router.push({ + pathname: '/signup', + query: { callbackUrl: window.location.origin + router.asPath } + }) } > diff --git a/pages/_app.js b/pages/_app.js index dee988af..6b94f3af 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,11 +1,9 @@ import '../styles/globals.scss' import { ApolloProvider, gql, useQuery } from '@apollo/client' import { Provider } from 'next-auth/client' -import { FundErrorModal, FundErrorProvider } from '../components/fund-error' import { MeProvider } from '../components/me' import PlausibleProvider from 'next-plausible' import { LightningProvider } from '../components/lightning' -import { ItemActModal, ItemActProvider } from '../components/item-act' import getApolloClient from '../lib/apollo' import NextNProgress from 'nextjs-progressbar' import { PriceProvider } from '../components/price' @@ -14,6 +12,7 @@ import { useRouter } from 'next/dist/client/router' import { useEffect } from 'react' import Moon from '../svgs/moon-fill.svg' import Layout from '../components/layout' +import { ShowModalProvider } from '../components/modal' function CSRWrapper ({ Component, apollo, ...props }) { const { data, error } = useQuery(gql`${apollo.query}`, { variables: apollo.variables, fetchPolicy: 'cache-first' }) @@ -89,15 +88,11 @@ function MyApp ({ Component, pageProps: { session, ...props } }) { - - - - - {data || !apollo?.query - ? - : } - - + + {data || !apollo?.query + ? + : } + diff --git a/pages/api/auth/[...nextauth].js b/pages/api/auth/[...nextauth].js index 7beffc55..792ebefb 100644 --- a/pages/api/auth/[...nextauth].js +++ b/pages/api/auth/[...nextauth].js @@ -136,7 +136,8 @@ export default (req, res) => NextAuth(req, res, { signingKey: process.env.JWT_SIGNING_PRIVATE_KEY }, pages: { - signIn: '/login' + signIn: '/login', + verifyRequest: '/email' } }) diff --git a/pages/email.js b/pages/email.js new file mode 100644 index 00000000..9911dc1b --- /dev/null +++ b/pages/email.js @@ -0,0 +1,14 @@ +import LayoutError from '../components/layout-error' +import { Image } from 'react-bootstrap' + +export default function Email () { + return ( + +
+

Check your email

+

A sign in link has been sent to your email address

+ +
+
+ ) +} diff --git a/pages/invites/[id].js b/pages/invites/[id].js index 6beb8d19..383145fa 100644 --- a/pages/invites/[id].js +++ b/pages/invites/[id].js @@ -6,6 +6,7 @@ import { gql } from '@apollo/client' import { INVITE_FIELDS } from '../../fragments/invites' import getSSRApolloClient from '../../api/ssrApollo' import Link from 'next/link' +import LayoutCenter from '../../components/layout-center' export async function getServerSideProps ({ req, res, query: { id, error = null } }) { const session = await getSession({ req }) @@ -78,5 +79,9 @@ function InviteHeader ({ invite }) { } export default function Invite ({ invite, ...props }) { - return } text='Sign up' {...props} /> + return ( + + } text='Sign up' {...props} /> + + ) } diff --git a/pages/login.js b/pages/login.js index ec227c20..b2c9d308 100644 --- a/pages/login.js +++ b/pages/login.js @@ -1,5 +1,6 @@ import { providers, getSession } from 'next-auth/client' import Link from 'next/link' +import LayoutCenter from '../components/layout-center' import Login from '../components/login' export async function getServerSideProps ({ req, res, query: { callbackUrl, error = null } }) { @@ -30,9 +31,11 @@ function LoginFooter ({ callbackUrl }) { export default function LoginPage (props) { return ( - } - {...props} - /> + + } + {...props} + /> + ) } diff --git a/pages/signup.js b/pages/signup.js index 83379975..269f239e 100644 --- a/pages/signup.js +++ b/pages/signup.js @@ -1,5 +1,6 @@ import { providers, getSession } from 'next-auth/client' import Link from 'next/link' +import LayoutCenter from '../components/layout-center' import Login from '../components/login' export async function getServerSideProps ({ req, res, query: { callbackUrl, error = null } }) { @@ -41,11 +42,13 @@ function SignUpFooter ({ callbackUrl }) { export default function SignUp ({ ...props }) { return ( - } - Footer={() => } - text='Sign up' - {...props} - /> + + } + Footer={() => } + text='Sign up' + {...props} + /> + ) } diff --git a/public/darkmode.js b/public/darkmode.js index 4bb7756a..607bffc1 100644 --- a/public/darkmode.js +++ b/public/darkmode.js @@ -2,7 +2,7 @@ // This will help to prevent a flash if dark mode is the default. const COLORS = { light: { - body: '#f5f5f5', + body: '#f5f5f7', color: '#212529', navbarVariant: 'light', navLink: 'rgba(0, 0, 0, 0.55)', diff --git a/public/hello.gif b/public/hello.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ada42c0e72ee4bcebc7d6455a57eea3f20e910e GIT binary patch literal 428020 zcmV(=K-s@XNk%w1VL$=j0Qb@W00093015yA3jhEU000~S03!ndDg+7(1_Ck&3ls_f z1q%QT695hq8Wa~O85sZz8vz9y1{NFu5*+~;9ReRCHXtMb6C?l{BmpBP0SG1!Ehqyf zC?8KL02C`UCM^IOEk-9U9}qGC6*B-FH2@(tR4g|F208#7Jpmg&02n?37d~7sK3yw8 zXf;D&E<U6j-KHS&Ttnr&eSE z0%W3EWtvuJsbp%GP-?MYYPn@<#b;}*U~9Q$Ysq74&}wX)W^BlCZH-NG8Vhr~c)(pDXOD3Ga>w@rzXPk!AFq zYV_yf^zHEWvTXL+Sof*{_qB@nuy**i0r=B2`L}%e;#B(b>-)k0`}Fkuy@dU}eEs(L z{>%XW_W1t!`TqL#|NHu7TwCmx2Q5L8cx%gua>$#O@S~0A@|y)}U7tDxCPX$JPfRXh zR+evLy4jKq+iF(!s!@|U4e-sX-B>HsmzRpNX?H9Mjc~KW;GSLM@5urc(Ggw?}9y2FHC}%Rf?8%yJ=x~ zQBAvAS^)n5A^!_bMO0HmK~P09E-(WD0000X`2+3AVCf}iUR4E1m!Lz^S%;B-yJbZbaZZ(V zQAQALkl%qEh6Ge|F{u}o2__ui5Dxb^(u4_hIX6&O6WI2lVB6VupICJ%g`anys0 zBo$ylf(s5%WP_&hhaH5N>D1F=iAl7YP)#u)8<1Fr^juP)#h8FXA;7`SGWUcK!ZNPl zG7C4(w0PDCClCasP0Y=xq;>`ocaU#7CUnwWQW}`$UIoBKB#}lgsNiZ_HcC})OXAsN zgziC9B~B2bHRz^{a&#$S6Pe)1EV!sC3OBCILMkqD5umBfatM_8mnxBMt(M3vr|QML2#2=mTL!_sTR?LnRYYMQ{aZ!IgG(`t4hXD!8bj%Qnoc zbct3s(p`~i)!&OZc6w7-4oT2Ka|f3PvHnOMhKfCAv$vTW=vxiFj(Y8CosB@kpY_Ne(t2qYc0!M|+ zA&4-QHCSFch@vLSDz7pN%jlxZ%{|#N}0_-N$G5s1aRbZ zu?jPc?1HN$oVb?ZRf`aK{OP(u&oKh5R7#nO4eq!~LU0etZ@*m)F)Xv3uBrFvP>ITp zWPsZPKtXV}la~GMJDl@fg!{(i@o4nOs4=blmW?aju;b4&>M-L!IqR`*KMRc6-(34< zxacDP*fnggJ*mSgYPy~(F{7mJe!A%{(}W{xyQ)A2_*cyH?>qwyQI1RcNMnv>ou(

G?v2N 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

h^d} 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

ks;kEky4>_jF@op&@CO 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 #IR_@ZDjEYNG%0*+Vm) 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

!bgddLlUM2)3LM4l+tM7Q>>&=l~K}7^N7qp%A|+ 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 literal 0 HcmV?d00001 diff --git a/styles/globals.scss b/styles/globals.scss index d48932fe..e3905d35 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -11,7 +11,7 @@ $theme-colors: ( "grey-darkmode": #8c8c8c ); -$body-bg: #f5f5f5; +$body-bg: #f5f5f7; $border-radius: .4rem; $enable-transitions: false; $enable-gradients: false; From 00fdbe753cefea4b79f008b52c9b759fb8c20650 Mon Sep 17 00:00:00 2001 From: keyan Date: Tue, 10 Jan 2023 17:55:11 -0600 Subject: [PATCH 42/42] fix typo in lnurl-auth copy --- components/lightning-auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/lightning-auth.js b/components/lightning-auth.js index 372ff03f..055cbea4 100644 --- a/components/lightning-auth.js +++ b/components/lightning-auth.js @@ -45,7 +45,7 @@ function LightningExplainer ({ text, children }) { body={ <> - You can use any wallet that support lnurl-auth. These are some wallets you can use: + You can use any wallet that supports lnurl-auth. These are some wallets you can use: