diff --git a/.changeset/nine-sloths-hear.md b/.changeset/nine-sloths-hear.md new file mode 100644 index 00000000000..b09e4107efb --- /dev/null +++ b/.changeset/nine-sloths-hear.md @@ -0,0 +1,5 @@ +--- +'web-app': minor +--- + +Example with sentry diff --git a/apps/web-app/.env b/apps/web-app/.env index 7e454682bc7..6eb30f9e0f0 100644 --- a/apps/web-app/.env +++ b/apps/web-app/.env @@ -7,5 +7,6 @@ # @see https://www.prisma.io/docs/concepts/components/prisma-client/deployment#recommended-connection-limit PRISMA_DATABASE_URL=postgresql://nextjs:!ChangeMe!@localhost:5432/maindb?schema=public -# Enable display of lambdas size for vercel deployments -# NEXT_DEBUG_FUNCTION_SIZE=1 +SENTRY_ENABLED=false +SENTRY_RELEASE= +NEXT_PUBLIC_SENTRY_DSN= diff --git a/apps/web-app/.size-limit.js b/apps/web-app/.size-limit.js index f5d790d0680..0dd9478af50 100644 --- a/apps/web-app/.size-limit.js +++ b/apps/web-app/.size-limit.js @@ -15,7 +15,7 @@ const limitCfg = { defaultSize: '100kb', pages: { '/_app': '120kb', - '/_error': '80kb', + '/_error': '100kb', '/': '95kb', '/demo': '95kb', }, diff --git a/apps/web-app/next.config.js b/apps/web-app/next.config.js index 136bd820ea6..05b470fc670 100644 --- a/apps/web-app/next.config.js +++ b/apps/web-app/next.config.js @@ -1,4 +1,6 @@ const path = require('path'); +const packageJson = require('./package'); +const { withSentryConfig } = require('@sentry/nextjs'); const { i18n } = require('./next-i18next.config'); const NEXTJS_BUILD_TARGET = process.env.NEXTJS_BUILD_TARGET || 'server'; const NEXTJS_IGNORE_ESLINT = process.env.NEXTJS_IGNORE_ESLINT === '1' || false; @@ -38,10 +40,6 @@ if (disableSourceMaps) { ); } -const withBundleAnalyzer = require('@next/bundle-analyzer')({ - enabled: process.env.ANALYZE === 'true', -}); - // Example of setting up secure headers // @link https://github.com/jagaapple/next-secure-headers const { createSecureHeaders } = require('next-secure-headers'); @@ -63,64 +61,90 @@ const secureHeaders = createSecureHeaders({ referrerPolicy: 'same-origin', }); -const config = withBundleAnalyzer( - withTM({ - target: NEXTJS_BUILD_TARGET, - reactStrictMode: true, - webpack5: true, - productionBrowserSourceMaps: !disableSourceMaps, - i18n, - optimizeFonts: true, +const baseConfig = withTM({ + target: NEXTJS_BUILD_TARGET, + reactStrictMode: true, + webpack5: true, + productionBrowserSourceMaps: !disableSourceMaps, + i18n, + optimizeFonts: true, - // @link https://nextjs.org/docs/basic-features/image-optimization - images: { - deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840], - imageSizes: [16, 32, 48, 64, 96, 128, 256, 384], - disableStaticImages: false, - // Allowed domains for next/image - domains: ['source.unsplash.com'], - }, + // @link https://nextjs.org/docs/basic-features/image-optimization + images: { + deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840], + imageSizes: [16, 32, 48, 64, 96, 128, 256, 384], + disableStaticImages: false, + // Allowed domains for next/image + domains: ['source.unsplash.com'], + }, - eslint: { - ignoreDuringBuilds: NEXTJS_IGNORE_ESLINT, - dirs: ['src'], - }, + eslint: { + ignoreDuringBuilds: NEXTJS_IGNORE_ESLINT, + dirs: ['src'], + }, - async headers() { - return [{ source: '/(.*)', headers: secureHeaders }]; - }, + async headers() { + return [{ source: '/(.*)', headers: secureHeaders }]; + }, - webpack: (config, { defaultLoaders, isServer }) => { - // This extra config allows to use paths defined in tsconfig - // rather than next-transpile-modules. - // @link https://github.com/vercel/next.js/pull/13542 - const resolvedBaseUrl = path.resolve(config.context, '../../'); - config.module.rules = [ - ...config.module.rules, - { - test: /\.(tsx|ts|js|jsx|json)$/, - include: [resolvedBaseUrl], - use: defaultLoaders.babel, - exclude: (excludePath) => { - return /node_modules/.test(excludePath); - }, + webpack: (config, { defaultLoaders, isServer }) => { + // This extra config allows to use paths defined in tsconfig + // rather than next-transpile-modules. + // @link https://github.com/vercel/next.js/pull/13542 + const resolvedBaseUrl = path.resolve(config.context, '../../'); + config.module.rules = [ + ...config.module.rules, + { + test: /\.(tsx|ts|js|jsx|json)$/, + include: [resolvedBaseUrl], + use: defaultLoaders.babel, + exclude: (excludePath) => { + return /node_modules/.test(excludePath); }, - ]; + }, + ]; - // A temp workaround for https://github.com/prisma/prisma/issues/6899#issuecomment-849126557 - if (isServer) { - config.externals.push('_http_common'); - } + // A temp workaround for https://github.com/prisma/prisma/issues/6899#issuecomment-849126557 + if (isServer) { + config.externals.push('_http_common'); + } - config.module.rules.push({ - test: /\.svg$/, - issuer: /\.(js|ts)x?$/, - use: ['@svgr/webpack'], - }); + config.module.rules.push({ + test: /\.svg$/, + issuer: /\.(js|ts)x?$/, + use: ['@svgr/webpack'], + }); - return config; - }, - }) -); + return config; + }, + env: { + APP_NAME: packageJson.name, + APP_VERSION: packageJson.version, + BUILD_TIME: new Date().getTime(), + SENTRY_RELEASE: process.env.SENTRY_RELEASE + ? process.env.SENTRY_RELEASE + : `${packageJson.name}@${packageJson.version}`, + NEXT_PUBLIC_SENTRY_DSN: process.env.SENTRY_DSN, + }, + serverRuntimeConfig: { + // to bypass https://github.com/zeit/next.js/issues/8251 + PROJECT_ROOT: __dirname, + }, +}); + +let config = baseConfig; + +if (process.env.SENTRY_ENABLED === 'true') { + config = withSentryConfig(baseConfig, { + dryRun: process.env.NODE_ENV !== 'production', + }); +} + +if (process.env.ANALYZE === 'true') { + const withBundleAnalyzer = require('@next/bundle-analyzer')({ + enabled: true, + }); + config = withBundleAnalyzer(config); +} module.exports = config; diff --git a/apps/web-app/package.json b/apps/web-app/package.json index 912cf0b05bf..f666a6b3bf2 100644 --- a/apps/web-app/package.json +++ b/apps/web-app/package.json @@ -105,6 +105,7 @@ "@emotion/styled": "11.3.0", "@headlessui/react": "1.4.0", "@heroicons/react": "1.0.3", + "@sentry/nextjs": "^6.10.0", "@tsed/exceptions": "6.62.0", "@your-org/core-lib": "workspace:*", "@your-org/db-main-prisma": "workspace:*", diff --git a/apps/web-app/sentry.client.config.js b/apps/web-app/sentry.client.config.js new file mode 100644 index 00000000000..ea36fe1c087 --- /dev/null +++ b/apps/web-app/sentry.client.config.js @@ -0,0 +1,11 @@ +import * as Sentry from '@sentry/nextjs'; + +const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; + +Sentry.init({ + dsn: SENTRY_DSN, + tracesSampleRate: 1.0, + // 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/apps/web-app/sentry.properties b/apps/web-app/sentry.properties new file mode 100644 index 00000000000..ae3d90e0436 --- /dev/null +++ b/apps/web-app/sentry.properties @@ -0,0 +1,10 @@ +# your base url +defaults.url= +# your org +defaults.org= +# your project +defaults.project= +# your auth token +auth.token= +# [optional] path to the cli executable +cli.executable= \ No newline at end of file diff --git a/apps/web-app/sentry.server.config.js b/apps/web-app/sentry.server.config.js new file mode 100644 index 00000000000..342d43c54dd --- /dev/null +++ b/apps/web-app/sentry.server.config.js @@ -0,0 +1,13 @@ +import * as Sentry from '@sentry/nextjs'; + +const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN; + +Sentry.init({ + dsn: SENTRY_DSN, + // for finer control + tracesSampleRate: 1.0, + // ... + // 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/apps/web-app/src/pages/_app.tsx b/apps/web-app/src/pages/_app.tsx index 9eaaeefc7cb..d9816ab8ffb 100644 --- a/apps/web-app/src/pages/_app.tsx +++ b/apps/web-app/src/pages/_app.tsx @@ -20,6 +20,7 @@ export type AppProps = NextAppProps & { const MyApp = ({ Component, pageProps, err }: AppProps) => { return ( + {/* Workaround for https://github.com/vercel/next.js/issues/8592 */} ); diff --git a/apps/web-app/src/pages/_error.tsx b/apps/web-app/src/pages/_error.tsx new file mode 100644 index 00000000000..af9ef4a838a --- /dev/null +++ b/apps/web-app/src/pages/_error.tsx @@ -0,0 +1,111 @@ +/** + * Typescript class based component for custom-error + * @link https://nextjs.org/docs/advanced-features/custom-error-page + */ + +import NextErrorComponent from 'next/error'; +import NextError, { ErrorProps } from 'next/error'; +import { NextPage, NextPageContext } from 'next'; + +import { + captureException as sentryCaptureException, + flush as sentryFlush, +} from '@sentry/nextjs'; +import { isNonEmptyString } from '@your-org/core-lib'; + +// Adds HttpException to the list of possible error types. +type AugmentedError = NonNullable | null; +type CustomErrorProps = { + err?: AugmentedError; + message?: string; + sentryErrorId?: string; + hasGetInitialPropsRun?: boolean; +} & Omit; + +type AugmentedNextPageContext = Omit & { + err: AugmentedError; +}; + +const captureException = async (err: string | Error) => { + if (isNonEmptyString(process.env.NEXT_PUBLIC_SENTRY_DSN)) { + sentryCaptureException(err); + } +}; + +const captureExceptionAndFlush = async ( + err: string | Error, + flushAfter = 2000 +) => { + if (isNonEmptyString(process.env.NEXT_PUBLIC_SENTRY_DSN)) { + sentryCaptureException(err); + if (flushAfter > 0) { + // Flushing before returning is necessary if deploying to Vercel, see + // https://vercel.com/docs/platform/limits#streaming-responses + await sentryFlush(flushAfter); + } + } +}; + +const CustomError: NextPage = (props) => { + const { statusCode, err, hasGetInitialPropsRun } = props; + + 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 + // Flushing is not required in this case as it only happens on the client + captureException(err); + } + + return ; +}; + +CustomError.getInitialProps = async ({ + res, + err, + asPath, +}: AugmentedNextPageContext) => { + const errorInitialProps = (await NextError.getInitialProps({ + res, + err, + } as NextPageContext)) as CustomErrorProps; + + // 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) { + // Flushing before returning is necessary if deploying to Vercel, see + // https://vercel.com/docs/platform/limits#streaming-responses + await captureExceptionAndFlush(err, 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 + // + // Flushing before returning is necessary if deploying to Vercel, see + // https://vercel.com/docs/platform/limits#streaming-responses + await captureExceptionAndFlush( + new Error(`_error.js getInitialProps missing data at path: ${asPath}`), + 2000 + ); + + return errorInitialProps; +}; + +export default CustomError; diff --git a/packages/core-lib/src/index.ts b/packages/core-lib/src/index.ts index a1e4395bd6e..17a2774b0f4 100644 --- a/packages/core-lib/src/index.ts +++ b/packages/core-lib/src/index.ts @@ -2,7 +2,7 @@ export { Asserts } from './utils/asserts'; export { ArrayUtils } from './utils/array-utils'; export { RandomUtils } from './utils/random-utils'; -export * as Typeguards from './utils/typeguards'; +export * from './utils/typeguards'; export type { UnPromisify } from './utils/type-utils'; export const sayHello = (name: string): string => { diff --git a/yarn.lock b/yarn.lock index 4aae5068ec0..a86603a4afa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2649,6 +2649,172 @@ __metadata: languageName: node linkType: hard +"@sentry/browser@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/browser@npm:6.10.0" + dependencies: + "@sentry/core": 6.10.0 + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + tslib: ^1.9.3 + checksum: f95fe3caf41dcaa199b402cec7a326316d4bb8e279fa89e3f38a7b58c2caeecf81abb4c117a0fb3d67056491263df530c5c5762b512def1b3e47b596caa256bd + languageName: node + linkType: hard + +"@sentry/cli@npm:^1.64.1": + version: 1.68.0 + resolution: "@sentry/cli@npm:1.68.0" + dependencies: + https-proxy-agent: ^5.0.0 + mkdirp: ^0.5.5 + node-fetch: ^2.6.0 + npmlog: ^4.1.2 + progress: ^2.0.3 + proxy-from-env: ^1.1.0 + bin: + sentry-cli: bin/sentry-cli + checksum: 7329a46403c5a78d55cb0b8cc8d72eb972ee0a10f7642caee4e7ecfd8332f67b4db9ee4ce7f00d8bedd3877ca8ca2afda201e0f0f0d708a141e75a32267f742d + languageName: node + linkType: hard + +"@sentry/core@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/core@npm:6.10.0" + dependencies: + "@sentry/hub": 6.10.0 + "@sentry/minimal": 6.10.0 + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + tslib: ^1.9.3 + checksum: 62a2801dbc9f4c46e79e3f0cfd09a1a0335549f16c43672211387fbd330ce9674207c1e36d34d4164bb6e549e696acc685547b34150fe64fa6aeacef0e3b3fe7 + languageName: node + linkType: hard + +"@sentry/hub@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/hub@npm:6.10.0" + dependencies: + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + tslib: ^1.9.3 + checksum: c4b66ee17bfbbd10afa1c5fedf165437fb4f575c9385f820a457773917ec943ccaebb49569c449183eacbb06d74aebda14b68a54d0a65b1bb3ab481749a89ed7 + languageName: node + linkType: hard + +"@sentry/integrations@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/integrations@npm:6.10.0" + dependencies: + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + localforage: ^1.8.1 + tslib: ^1.9.3 + checksum: dae446f41489615daa6795b9a1f6a87db9338f995cdb49353173ae332572cce0884806819951ecc70ce29d18ef43ff5846be03793810102fb2f04a54de1d639e + languageName: node + linkType: hard + +"@sentry/minimal@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/minimal@npm:6.10.0" + dependencies: + "@sentry/hub": 6.10.0 + "@sentry/types": 6.10.0 + tslib: ^1.9.3 + checksum: 5d2cc025295dbb2ccf5d79c3f630d9cfbd2305396f064ece906bb7abcc260937895d342aea4aa068c6eba8b9489b264f54ad1630241147cf41dd2cff68d658a4 + languageName: node + linkType: hard + +"@sentry/nextjs@npm:^6.10.0": + version: 6.10.0 + resolution: "@sentry/nextjs@npm:6.10.0" + dependencies: + "@sentry/core": 6.10.0 + "@sentry/integrations": 6.10.0 + "@sentry/node": 6.10.0 + "@sentry/react": 6.10.0 + "@sentry/tracing": 6.10.0 + "@sentry/utils": 6.10.0 + "@sentry/webpack-plugin": 1.15.1 + tslib: ^1.9.3 + peerDependencies: + next: ^10.0.8 || ^11.0 + react: 15.x || 16.x || 17.x + checksum: e61a3519d4b959652867e789a355d4cb3175432172f857c93a74ff6f777f8f17ccb00f509a53409a46dd69718d3457ec4415a260b746f3e92e2978a065f960ba + languageName: node + linkType: hard + +"@sentry/node@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/node@npm:6.10.0" + dependencies: + "@sentry/core": 6.10.0 + "@sentry/hub": 6.10.0 + "@sentry/tracing": 6.10.0 + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + cookie: ^0.4.1 + https-proxy-agent: ^5.0.0 + lru_map: ^0.3.3 + tslib: ^1.9.3 + checksum: 2b4b99682c4c37552c1ad5ac4f350c57c11b46a88f4912796610ca2f4e7dc4f156add60ad8258dfa383f61c8cde830b2d9b40870fe9e048ce1c5de34132dc7dc + languageName: node + linkType: hard + +"@sentry/react@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/react@npm:6.10.0" + dependencies: + "@sentry/browser": 6.10.0 + "@sentry/minimal": 6.10.0 + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + hoist-non-react-statics: ^3.3.2 + tslib: ^1.9.3 + peerDependencies: + react: 15.x || 16.x || 17.x + checksum: c61805bc73e068f66d9c2f669a04b4525e09867f8c1efbc9fc4829d9d5cb8a6934f626144d2cde912b5c8c5f946e13089b127f9703a3ec347593937870cfe68f + languageName: node + linkType: hard + +"@sentry/tracing@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/tracing@npm:6.10.0" + dependencies: + "@sentry/hub": 6.10.0 + "@sentry/minimal": 6.10.0 + "@sentry/types": 6.10.0 + "@sentry/utils": 6.10.0 + tslib: ^1.9.3 + checksum: f65e6a46f7ebfa6c819409aa369427fd41410750079757e5ed6291fdf7d615b497ac447b117db3c2ea3d9b8508488a8eba71d930e734f3784b9c4a7c73898929 + languageName: node + linkType: hard + +"@sentry/types@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/types@npm:6.10.0" + checksum: 17d5b91436503577c3b0852734f142f4872589ee0e2bc86ef886776efade19f8bc4e1d8fb67b3342e01220b4f7e8a7973cc81367f7ccf130964f227a0a100401 + languageName: node + linkType: hard + +"@sentry/utils@npm:6.10.0": + version: 6.10.0 + resolution: "@sentry/utils@npm:6.10.0" + dependencies: + "@sentry/types": 6.10.0 + tslib: ^1.9.3 + checksum: 1b6c68085d2e2e4ec16d039fd534e4e117194061b8f6720b71604143ed34212d54096f14302b9fc4e5d16b44605c86451d4fe6d924f22ff14f1d8406056a811c + languageName: node + linkType: hard + +"@sentry/webpack-plugin@npm:1.15.1": + version: 1.15.1 + resolution: "@sentry/webpack-plugin@npm:1.15.1" + dependencies: + "@sentry/cli": ^1.64.1 + checksum: d1c3b42ddde0610020f31e9f1444b685f3342caa4453c23ce9821932fa232a5efb19888ebe01c39d79d2732855008b8bb878cf9ff31f34b42a83c7a2a364f621 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^0.14.0": version: 0.14.0 resolution: "@sindresorhus/is@npm:0.14.0" @@ -5435,6 +5601,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^0.4.1": + version: 0.4.1 + resolution: "cookie@npm:0.4.1" + checksum: bd7c47f5d94ab70ccdfe8210cde7d725880d2fcda06d8e375afbdd82de0c8d3b73541996e9ce57d35f67f672c4ee6d60208adec06b3c5fc94cebb85196084cf8 + languageName: node + linkType: hard + "core-js-compat@npm:^3.14.0, core-js-compat@npm:^3.9.1": version: 3.14.0 resolution: "core-js-compat@npm:3.14.0" @@ -7955,7 +8128,7 @@ __metadata: languageName: node linkType: hard -"hoist-non-react-statics@npm:^3.2.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1": +"hoist-non-react-statics@npm:^3.2.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: @@ -8217,6 +8390,13 @@ __metadata: languageName: node linkType: hard +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 + languageName: node + linkType: hard + "import-cwd@npm:^3.0.0": version: 3.0.0 resolution: "import-cwd@npm:3.0.0" @@ -9815,6 +9995,15 @@ __metadata: languageName: node linkType: hard +"lie@npm:3.1.1": + version: 3.1.1 + resolution: "lie@npm:3.1.1" + dependencies: + immediate: ~3.0.5 + checksum: 6da9f2121d2dbd15f1eca44c0c7e211e66a99c7b326ec8312645f3648935bc3a658cf0e9fa7b5f10144d9e2641500b4f55bd32754607c3de945b5f443e50ddd1 + languageName: node + linkType: hard + "lilconfig@npm:^2.0.3": version: 2.0.3 resolution: "lilconfig@npm:2.0.3" @@ -9928,6 +10117,15 @@ __metadata: languageName: node linkType: hard +"localforage@npm:^1.8.1": + version: 1.9.0 + resolution: "localforage@npm:1.9.0" + dependencies: + lie: 3.1.1 + checksum: dc0256ce875a51f7d493b81cf54381323cd78018ff2bd5455c3f2f180b0932fb99f5b41641fd2ae9b08a455acae66273a0567ee77f7653bfd9373bfea3b0f7f9 + languageName: node + linkType: hard + "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" @@ -10181,6 +10379,13 @@ __metadata: languageName: node linkType: hard +"lru_map@npm:^0.3.3": + version: 0.3.3 + resolution: "lru_map@npm:0.3.3" + checksum: ca9dd43c65ed7a4f117c548028101c5b6855e10923ea9d1f635af53ad20c5868ff428c364d454a7b57fe391b89c704982275410c3c5099cca5aeee00d76e169a + languageName: node + linkType: hard + "lz-string@npm:^1.4.4": version: 1.4.4 resolution: "lz-string@npm:1.4.4" @@ -10681,7 +10886,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:~0.5.1": +"mkdirp@npm:^0.5.5, mkdirp@npm:~0.5.1": version: 0.5.5 resolution: "mkdirp@npm:0.5.5" dependencies: @@ -10976,7 +11181,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2.6.1, node-fetch@npm:^2.5.0": +"node-fetch@npm:2.6.1, node-fetch@npm:^2.5.0, node-fetch@npm:^2.6.0": version: 2.6.1 resolution: "node-fetch@npm:2.6.1" checksum: 91075bedd57879117e310fbcc36983ad5d699e522edb1ebcdc4ee5294c982843982652925c3532729fdc86b2d64a8a827797a745f332040d91823c8752ee4d7c @@ -13075,6 +13280,13 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + "pseudomap@npm:^1.0.2": version: 1.0.2 resolution: "pseudomap@npm:1.0.2" @@ -15467,7 +15679,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tslib@npm:^1.8.1, tslib@npm:^1.9.0": +"tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd @@ -16076,6 +16288,7 @@ resolve@^2.0.0-next.3: "@headlessui/react": 1.4.0 "@heroicons/react": 1.0.3 "@next/bundle-analyzer": 11.0.1 + "@sentry/nextjs": ^6.10.0 "@size-limit/file": 5.0.2 "@svgr/webpack": 5.5.0 "@tailwindcss/aspect-ratio": 0.2.1