diff --git a/next.config.js b/next.config.js index efb84fd5a..58b39c3e1 100644 --- a/next.config.js +++ b/next.config.js @@ -1,67 +1,25 @@ -// Use the SentryWebpack plugin to upload the source maps during build step -const SentryWebpackPlugin = require('@sentry/webpack-plugin'); const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }); const withWorkbox = require('@ente-io/next-with-workbox'); -const { - NEXT_PUBLIC_SENTRY_DSN: SENTRY_DSN, - SENTRY_ORG, - SENTRY_PROJECT, - SENTRY_AUTH_TOKEN, - NODE_ENV, - GITHUB_COMMIT_SHA: COMMIT_SHA, -} = process.env; +const { withSentryConfig } = require('@sentry/nextjs'); -process.env.SENTRY_DSN = SENTRY_DSN; -const basePath = ''; +const cp = require('child_process'); +const gitSha = cp.execSync('git rev-parse --short HEAD', { + cwd: __dirname, + encoding: 'utf8', +}); -module.exports = withWorkbox(withBundleAnalyzer({ - productionBrowserSourceMaps: true, +module.exports = withSentryConfig(withWorkbox(withBundleAnalyzer({ future: { webpack5: true, }, env: { - // Make the COMMIT_SHA available to the client so that Sentry events can be - // marked for the release they belong to. It may be undefined if running - // outside of Vercel - NEXT_PUBLIC_COMMIT_SHA: COMMIT_SHA, + SENTRY_RELEASE: gitSha, }, workbox: { swSrc: 'src/serviceWorker.js', exclude: [/manifest\.json$/i], }, - webpack: (config, { isServer, webpack }) => { - if (!isServer) { - config.resolve.alias['@sentry/node'] = '@sentry/browser'; - } - // Define an environment variable so source code can check whether or not - // it's running on the server so we can correctly initialize Sentry - config.plugins.push( - new webpack.DefinePlugin({ - 'process.env.NEXT_IS_SERVER': JSON.stringify( - isServer.toString(), - ), - }), - ); - if ( - false && - SENTRY_DSN && - SENTRY_ORG && - SENTRY_PROJECT && - SENTRY_AUTH_TOKEN && - NODE_ENV === 'production' - ) { - config.plugins.push( - new SentryWebpackPlugin({ - include: '.next', - ignore: ['node_modules'], - stripPrefix: ['webpack://_N_E/'], - urlPrefix: `~${basePath}/_next`, - }), - ); - } - return config; - }, -})); +})), { release: gitSha }); diff --git a/package.json b/package.json index 3ec17d976..78962a4bd 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,8 @@ "postinstall": "husky install" }, "dependencies": { + "@sentry/nextjs": "^6.5.1", "@ente-io/next-with-workbox": "^1.0.3", - "@sentry/browser": "^5.21.3", - "@sentry/integrations": "^5.21.3", - "@sentry/node": "^5.21.3", - "@sentry/types": "^6.6.0", - "@sentry/webpack-plugin": "^1.12.1", "@stripe/stripe-js": "^1.13.2", "@typescript-eslint/eslint-plugin": "^4.25.0", "@typescript-eslint/parser": "^4.25.0", diff --git a/sentry.client.config.js b/sentry.client.config.js new file mode 100644 index 000000000..6b1e89086 --- /dev/null +++ b/sentry.client.config.js @@ -0,0 +1,15 @@ +import * as Sentry from '@sentry/nextjs'; + +const SENTRY_DSN = process.env.NEXT_PUBLIC_SENTRY_DSN ?? 'https://860186db60c54c7fbacfe255124958e8@errors.ente.io/4'; +const SENTRY_ENV = process.env.NEXT_PUBLIC_SENTRY_ENV ?? 'development'; +Sentry.init({ + dsn: SENTRY_DSN, + enabled: SENTRY_ENV !== 'development', + release: process.env.SENTRY_RELEASE, + attachStacktrace: true, + autoSessionTracking: false, + // ... + // Note: if you want to override the automatic release value, do not set a + // `release` value here - use the environment variable `SENTRY_RELEASE`, so + // that it will also get attached to your source maps +}); diff --git a/sentry.server.config.js b/sentry.server.config.js new file mode 100644 index 000000000..33af4278b --- /dev/null +++ b/sentry.server.config.js @@ -0,0 +1,12 @@ +import * as Sentry from '@sentry/nextjs'; + +const SENTRY_DSN = process.env.NEXT_PUBLIC_SENTRY_DSN ?? 'https://860186db60c54c7fbacfe255124958e8@errors.ente.io/4'; +const SENTRY_ENV = process.env.NEXT_PUBLIC_SENTRY_ENV ?? 'development'; + +Sentry.init({ + dsn: SENTRY_DSN, + enabled: SENTRY_ENV !== 'development', + environment: SENTRY_ENV, + release: process.env.SENTRY_RELEASE, + autoSessionTracking: false, +}); diff --git a/src/pages/404.js b/src/pages/404.js deleted file mode 100644 index 423922c80..000000000 --- a/src/pages/404.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; -import Error from 'next/error'; - -export default function NotFound() { - // Opinionated: do not record an exception in Sentry for 404 - return ; -} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 21dd3037a..c13831d36 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -8,7 +8,7 @@ import Head from 'next/head'; import 'bootstrap/dist/css/bootstrap.min.css'; import 'photoswipe/dist/photoswipe.css'; import EnteSpinner from 'components/EnteSpinner'; -import { logError, sentryInit } from '../utils/sentry'; +import { logError } from '../utils/sentry'; import { Workbox } from 'workbox-window'; import { getEndpoint } from 'utils/common/apiUtil'; import { getData, LS_KEYS } from 'utils/storage/localStorage'; @@ -339,7 +339,6 @@ export interface BannerMessage { variant: string; } -sentryInit(); type AppContextType = { showNavBar: (show: boolean) => void; diff --git a/src/pages/_error.js b/src/pages/_error.js deleted file mode 100644 index 741564291..000000000 --- a/src/pages/_error.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import NextErrorComponent from 'next/error'; -import * as Sentry from '@sentry/node'; - -const MyError = ({ statusCode, hasGetInitialPropsRun, err }) => { - if (!hasGetInitialPropsRun && err) { - // getInitialProps is not called in case of - // https://github.com/vercel/next.js/issues/8592. As a workaround, we pass - // err via _app.js so it can be captured - Sentry.captureException(err); - // Flushing is not required in this case as it only happens on the client - } - - return ; -}; - -MyError.getInitialProps = async ({ res, err, asPath }) => { - const errorInitialProps = await NextErrorComponent.getInitialProps({ - res, - err, - }); - - // Workaround for https://github.com/vercel/next.js/issues/8592, mark when - // getInitialProps has run - errorInitialProps.hasGetInitialPropsRun = true; - - // Running on the server, the response object (`res`) is available. - // - // Next.js will pass an err on the server if a page's data fetching methods - // threw or returned a Promise that rejected - // - // Running on the client (browser), Next.js will provide an err if: - // - // - a page's `getInitialProps` threw or returned a Promise that rejected - // - an exception was thrown somewhere in the React lifecycle (render, - // componentDidMount, etc) that was caught by Next.js's React Error - // Boundary. Read more about what types of exceptions are caught by Error - // Boundaries: https://reactjs.org/docs/error-boundaries.html - - if (err) { - Sentry.captureException(err); - - // Flushing before returning is necessary if deploying to Vercel, see - // https://vercel.com/docs/platform/limits#streaming-responses - await Sentry.flush(2000); - - return errorInitialProps; - } - - // If this point is reached, getInitialProps was called without any - // information about what the error might be. This is unexpected and may - // indicate a bug introduced in Next.js, so record it in Sentry - Sentry.captureException( - new Error(`_error.js getInitialProps missing data at path: ${asPath}`), - ); - await Sentry.flush(2000); - - return errorInitialProps; -}; - -export default MyError; diff --git a/src/utils/sentry/index.ts b/src/utils/sentry/index.ts index 56178e80b..a63f5acbf 100644 --- a/src/utils/sentry/index.ts +++ b/src/utils/sentry/index.ts @@ -1,47 +1,4 @@ -import * as Sentry from '@sentry/browser'; -import { RewriteFrames, CaptureConsole } from '@sentry/integrations'; - -export const sentryInit = () => { - if (process.env.NEXT_PUBLIC_SENTRY_DSN) { - const integrations = []; - if ( - process.env.NEXT_IS_SERVER === 'true' && - process.env.NEXT_PUBLIC_SENTRY_SERVER_ROOT_DIR - ) { - // For Node.js, rewrite Error.stack to use relative paths, so that source - // maps starting with ~/_next map to files in Error.stack with path - // app:///_next - integrations.push( - new RewriteFrames({ - iteratee: (frame) => { - frame.filename = frame.filename.replace( - process.env.NEXT_PUBLIC_SENTRY_SERVER_ROOT_DIR, - 'app:///', - ); - frame.filename = frame.filename.replace( - '.next', - '_next', - ); - return frame; - }, - }), - ); - } - integrations.push( - new CaptureConsole({ - levels: ['error'], - }), - ); - - Sentry.init({ - enabled: process.env.NODE_ENV === 'production', - environment: process.env.NODE_ENV, - integrations, - dsn: process.env.NEXT_PUBLIC_SENTRY_DSN, - attachStacktrace: true, - }); - } -}; +import * as Sentry from '@sentry/nextjs'; export const logError = (e: any, msg?: string) => { Sentry.captureException(e, { diff --git a/yarn.lock b/yarn.lock index f3ff2c163..91235ae0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1175,20 +1175,20 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@sentry/browser@^5.21.3": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.30.0.tgz#c28f49d551db3172080caef9f18791a7fd39e3b3" - integrity sha512-rOb58ZNVJWh1VuMuBG1mL9r54nZqKeaIlwSlvzJfc89vyfd7n6tQ1UXMN383QBz/MS5H5z44Hy5eE+7pCrYAfw== +"@sentry/browser@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.5.1.tgz#9a6ed5607b3b0f4e83f38720e3e202906f8c5bdb" + integrity sha512-iVLCdEFwsoWAzE/hNknexPQjjDpMQV7mmaq9Z1P63bD6MfhwVTx4hG4pHn8HEvC38VvCVf1wv0v/LxtoODAYXg== dependencies: - "@sentry/core" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" + "@sentry/core" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/cli@^1.64.1": - version "1.66.0" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.66.0.tgz#0526f1bc1c0570ce72ed817190af92f3b63a2e9a" - integrity sha512-2pZ+JHnvKqwyJWcGkKg/gCM/zURYronAnruBNllI+rH2g5IL0N90deMmjB1xcqXS66J222+MPTtWrGEK1Vl0/w== +"@sentry/cli@^1.63.1": + version "1.65.0" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.65.0.tgz#bdf613e3a4359b9e282b968a7387d5dca361931b" + integrity sha512-N5riXQ7H+tGMQ+VCEVJI8Qy4FoVDvDw7jmFYbcn5xLWTyM+g0rVEm7kUL33zZENxdL2plNlepklPU+rFk4KDRw== dependencies: https-proxy-agent "^5.0.0" mkdirp "^0.5.5" @@ -1197,95 +1197,116 @@ progress "^2.0.3" proxy-from-env "^1.1.0" -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== +"@sentry/core@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.5.1.tgz#c8b6c3ed86ed07b193c95d599c1b9a4a161e500e" + integrity sha512-Mh3sl/iUOT1myHmM6RlDy2ARzkUClx/g4DAt1rJ/IpQBOlDYQraplXSIW80i/hzRgQDfwhwgf4wUa5DicKBjKw== dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" + "@sentry/hub" "6.5.1" + "@sentry/minimal" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== +"@sentry/hub@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.5.1.tgz#135ef09d07d32e87a53f664c0ae8fcc4f5963519" + integrity sha512-lBRMBVMYP8B4PfRiM70murbtJAXiIAao/asDEMIRNGMP6pI2ArqXfJCBYDkStukhikYD0Kqb4trXq+JYF07Hbg== dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/integrations@^5.21.3": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-5.30.0.tgz#2f25fb998cb19c76b3803d84c1a577b3d837010f" - integrity sha512-Fqh4ALLoQWdd+1ih0iBduANWFyNmFWMxwvBu3V/wLDRi8OcquI0lEzWai1InzTJTiNhRHPnhuU++l/vkO0OCww== +"@sentry/integrations@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.5.1.tgz#e7016f3023a98e2ef893daba18ba74bd8d62654b" + integrity sha512-NYiW0rH7fwv7aRtrRnfCSIiwulfV2NoLjhmghCONsyo10DNtYmOpogLotCytZFWLDnTJW1+pmTomq8UW/OSTcQ== dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - localforage "1.8.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" + localforage "^1.8.1" tslib "^1.9.3" -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== +"@sentry/minimal@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.5.1.tgz#b8c1b382c2ea788eec3d32d203e5081b00eb6838" + integrity sha512-q9Do/oreu1RP695CXCLowVDuQyk7ilE6FGdz2QLpTXAfx8247qOwk6+zy9Kea/Djk93+BoSDVQUSneNiVwl0nQ== dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" + "@sentry/hub" "6.5.1" + "@sentry/types" "6.5.1" tslib "^1.9.3" -"@sentry/node@^5.21.3": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== +"@sentry/nextjs@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-6.5.1.tgz#a16d5b01ec46b853fc540ac081e83458461e9b43" + integrity sha512-cuSGvK8iCA9Nfakj5k903POE4kLSYWLLfjEfaP3CdfXD5KyZL6xhxvFJoZfq8mQT8dDLH4QArTpSIbUtic3meg== dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" + "@sentry/core" "6.5.1" + "@sentry/integrations" "6.5.1" + "@sentry/node" "6.5.1" + "@sentry/react" "6.5.1" + "@sentry/tracing" "6.5.1" + "@sentry/utils" "6.5.1" + "@sentry/webpack-plugin" "1.15.0" + tslib "^1.9.3" + +"@sentry/node@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.5.1.tgz#a572b380858de5aeaf98eade6d8d3afcba13d364" + integrity sha512-Yh8J/QJ5e8gRBVL9VLCDpUvmiaxsxVZm0CInPHw3V/smgMkrzSKEiqxSeMq8ImPlaJrCFECqdpv4gnvYKI+mQQ== + dependencies: + "@sentry/core" "6.5.1" + "@sentry/hub" "6.5.1" + "@sentry/tracing" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== +"@sentry/react@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.5.1.tgz#1c7019fc3d8b1168c1ab8936cb65971b314d060d" + integrity sha512-YeGi7FzInhMZQxiy5fKqb7kS6W+u4NfsjzsVV3bLjJ1kiVtbpzZ2gs+ObHqW3zVE622V4nL7A4P8/CBHbcm5PA== dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" + "@sentry/browser" "6.5.1" + "@sentry/minimal" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" + hoist-non-react-statics "^3.3.2" tslib "^1.9.3" -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/types@^6.6.0": - version "6.7.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.7.0.tgz#93f105c3bbca08224db79d9dd83bed0a56ef13d3" - integrity sha512-5pKv0yJEOnkjy3J3eiGaM1CD2+p3rXkctJa8loZH7QgY7mJgUTKpozO3YymUmGjblthlrbuhH+5wUIBnVF60Bg== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== +"@sentry/tracing@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.5.1.tgz#a5f3e497d4f1f319f36475df050e135cf65af750" + integrity sha512-y1W/xFC2hAuKqSuuaovkElHY4pbli3XoXrreesg8PtO7ilX6ZbatOQbHsEsHQyoUv0F6aVA+MABOxWH2jt7tfw== dependencies: - "@sentry/types" "5.30.0" + "@sentry/hub" "6.5.1" + "@sentry/minimal" "6.5.1" + "@sentry/types" "6.5.1" + "@sentry/utils" "6.5.1" tslib "^1.9.3" -"@sentry/webpack-plugin@^1.12.1": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.15.1.tgz#deb014fce8c1b51811100f25ec9050dd03addd9b" - integrity sha512-/Z06MJDXyWcN2+CbeDTMDwVzySjgZWQajOke773TvpkgqdtkeT1eYBsA+pfsje+ZE1prEgrZdlH/L9HdM1odnQ== +"@sentry/types@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.5.1.tgz#0a34ecfd1ae9275a416a105640eb4bed45a46a1d" + integrity sha512-b/7a6CMoytaeFPx4IBjfxPw3nPvsQh7ui1C8Vw0LxNNDgBwVhPLzUOWeLWbo5YZCVbGEMIWwtCUQYWxneceZSA== + +"@sentry/utils@6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.5.1.tgz#046baf7d1a6564d6d555437ad3674dba9bc0806a" + integrity sha512-Wv86JYGQH+ZJ5XGFQX7h6ijl32667ikenoL9EyXMn8UoOYX/MLwZoQZin1P60wmKkYR9ifTNVmpaI9OoTaH+UQ== dependencies: - "@sentry/cli" "^1.64.1" + "@sentry/types" "6.5.1" + tslib "^1.9.3" + +"@sentry/webpack-plugin@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.15.0.tgz#c7f9eafbbace1929c3fb81bb720fc0d7e8b4f86d" + integrity sha512-KHVug+xI+KH/xCL7otWcRRszw0rt6i/BCH5F8+6/njz2gCBrYQOzdMvzWm4GeXZUuw5ekgycYaUhDs1/6enjuQ== + dependencies: + "@sentry/cli" "^1.63.1" "@stripe/stripe-js@^1.13.2": version "1.15.0" @@ -3524,7 +3545,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -4093,20 +4114,13 @@ loader-utils@1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" -localforage@*, localforage@^1.9.0: +localforage@*, localforage@^1.8.1, localforage@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.9.0.tgz#f3e4d32a8300b362b4634cc4e066d9d00d2f09d1" integrity sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g== dependencies: lie "3.1.1" -localforage@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.8.1.tgz#f6c0a24b41ab33b10e4dc84342dd696f6f3e3433" - integrity sha512-azSSJJfc7h4bVpi0PGi+SmLQKJl2/8NErI+LhJsrORNikMZnhaQ7rv9fHj+ofwgSHrKRlsDCL/639a6nECIKuQ== - dependencies: - lie "3.1.1" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"