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