diff --git a/apps/parsley/package.json b/apps/parsley/package.json index 7c65feb16..1728c885d 100644 --- a/apps/parsley/package.json +++ b/apps/parsley/package.json @@ -66,7 +66,7 @@ "@leafygreen-ui/toggle": "10.0.4", "@leafygreen-ui/tooltip": "10.0.10", "@leafygreen-ui/typography": "19.0.0", - "@sentry/react": "7.114.0", + "@sentry/react": "8.7.0", "@sentry/types": "7.114.0", "ansi_up": "6.0.2", "graphql": "16.8.1", diff --git a/apps/parsley/src/components/ErrorHandling/initialize.test.ts b/apps/parsley/src/components/ErrorHandling/initialize.test.ts index 8cbb738ae..a77b0843a 100644 --- a/apps/parsley/src/components/ErrorHandling/initialize.test.ts +++ b/apps/parsley/src/components/ErrorHandling/initialize.test.ts @@ -1,14 +1,20 @@ -import * as Sentry from "@sentry/react"; +import { init, isInitialized } from "@sentry/react"; import { mockEnvironmentVariables } from "test_utils/utils"; import { initializeErrorHandling } from "."; const { cleanup, mockEnv } = mockEnvironmentVariables(); -describe("should initialize error handlers according to release stage", () => { - beforeEach(() => { - vi.spyOn(Sentry, "init").mockImplementation(vi.fn()); - }); +vi.mock("@sentry/react", async (importOriginal) => { + const actual = await importOriginal(); + return { + // @ts-expect-error + ...actual, + init: vi.fn(), + isInitialized: vi.fn().mockReturnValue(false), + }; +}); +describe("should initialize error handlers according to release stage", () => { afterEach(() => { vi.restoreAllMocks(); cleanup(); @@ -19,7 +25,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_RELEASE_STAGE", "production"); initializeErrorHandling(); - expect(Sentry.init).not.toHaveBeenCalled(); + expect(vi.mocked(init)).not.toHaveBeenCalled(); }); it("production", () => { @@ -28,7 +34,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_PARSLEY_SENTRY_DSN", "fake-sentry-key"); initializeErrorHandling(); - expect(Sentry.init).toHaveBeenCalledWith({ + expect(vi.mocked(init)).toHaveBeenCalledWith({ beforeBreadcrumb: expect.any(Function), debug: false, dsn: "fake-sentry-key", @@ -44,7 +50,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_PARSLEY_SENTRY_DSN", "fake-sentry-key"); initializeErrorHandling(); - expect(Sentry.init).toHaveBeenCalledWith({ + expect(vi.mocked(init)).toHaveBeenCalledWith({ beforeBreadcrumb: expect.any(Function), debug: true, dsn: "fake-sentry-key", @@ -60,7 +66,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_PARSLEY_SENTRY_DSN", "fake-sentry-key"); initializeErrorHandling(); - expect(Sentry.init).toHaveBeenCalledWith({ + expect(vi.mocked(init)).toHaveBeenCalledWith({ beforeBreadcrumb: expect.any(Function), debug: true, dsn: "fake-sentry-key", @@ -73,7 +79,6 @@ describe("should initialize error handlers according to release stage", () => { describe("should not initialize if the client is already running", () => { beforeEach(() => { - vi.spyOn(Sentry, "init").mockImplementation(vi.fn()); mockEnv("NODE_ENV", "production"); }); @@ -83,8 +88,8 @@ describe("should not initialize if the client is already running", () => { }); it("does not initialize Sentry twice", () => { - vi.spyOn(Sentry, "isInitialized").mockReturnValue(true); + vi.mocked(isInitialized).mockReturnValue(true); initializeErrorHandling(); - expect(Sentry.init).not.toHaveBeenCalled(); + expect(vi.mocked(init)).not.toHaveBeenCalled(); }); }); diff --git a/apps/parsley/src/utils/errorReporting/errorReporting.test.ts b/apps/parsley/src/utils/errorReporting/errorReporting.test.ts index 454d17e53..c5f12d20b 100644 --- a/apps/parsley/src/utils/errorReporting/errorReporting.test.ts +++ b/apps/parsley/src/utils/errorReporting/errorReporting.test.ts @@ -1,4 +1,4 @@ -import * as Sentry from "@sentry/react"; +import { addBreadcrumb, captureException, setTags } from "@sentry/react"; import { mockEnvironmentVariables } from "test_utils/utils"; import { SentryBreadcrumb, @@ -8,10 +8,20 @@ import { const { cleanup, mockEnv } = mockEnvironmentVariables(); +vi.mock("@sentry/react", async (importOriginal) => { + const actual = await importOriginal(); + return { + // @ts-expect-error + ...actual, + addBreadcrumb: vi.fn(), + captureException: vi.fn(), + setTags: vi.fn(), + }; +}); + describe("error reporting", () => { beforeEach(() => { vi.spyOn(console, "error").mockImplementation(() => {}); - vi.spyOn(Sentry, "captureException"); }); afterEach(() => { cleanup(); @@ -31,24 +41,22 @@ describe("error reporting", () => { err, severity: "warning", }); - expect(Sentry.captureException).not.toHaveBeenCalled(); + expect(vi.mocked(captureException)).not.toHaveBeenCalled(); }); it("should report errors to Sentry when in production", () => { mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "captureException").mockImplementation(vi.fn()); const err = new Error("test error"); const result = reportError(err); result.severe(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); result.warning(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); }); it("supports context field", () => { mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "captureException").mockImplementation(vi.fn()); const err = { message: "GraphQL Error", name: "Error Name", @@ -57,15 +65,13 @@ describe("error reporting", () => { const context = { anything: "foo" }; const result = reportError(err, { context }); result.severe(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); result.warning(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); }); it("supports tags", () => { mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "captureException").mockImplementation(vi.fn()); - vi.spyOn(Sentry, "setTags").mockImplementation(vi.fn()); const err = { message: "GraphQL Error", name: "Error Name", @@ -74,18 +80,17 @@ describe("error reporting", () => { const tags = { spruce: "true" }; const result = reportError(err, { tags }); result.severe(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); - expect(Sentry.setTags).toHaveBeenCalledWith(tags); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); + expect(vi.mocked(setTags)).toHaveBeenCalledWith(tags); result.warning(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); - expect(Sentry.setTags).toHaveBeenCalledWith(tags); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); + expect(vi.mocked(setTags)).toHaveBeenCalledWith(tags); }); }); describe("breadcrumbs", () => { beforeEach(() => { vi.spyOn(console, "debug").mockImplementation(() => {}); - vi.spyOn(Sentry, "addBreadcrumb"); }); afterEach(() => { cleanup(); @@ -103,20 +108,19 @@ describe("breadcrumbs", () => { metadata, type, }); - expect(Sentry.addBreadcrumb).not.toHaveBeenCalled(); + expect(vi.mocked(addBreadcrumb)).not.toHaveBeenCalled(); }); it("should report breadcrumbs to Sentry when in production", () => { vi.useFakeTimers().setSystemTime(new Date("2020-01-01")); mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "addBreadcrumb").mockImplementation(vi.fn()); const message = "my message"; const type = SentryBreadcrumb.Info; const metadata = { status_code: 401 }; leaveBreadcrumb(message, metadata, type); - expect(Sentry.addBreadcrumb).toHaveBeenCalledWith({ + expect(vi.mocked(addBreadcrumb)).toHaveBeenCalledWith({ data: { status_code: 401 }, message, timestamp: 1577836800, @@ -129,7 +133,6 @@ describe("breadcrumbs", () => { vi.useFakeTimers().setSystemTime(new Date("2020-01-01")); vi.spyOn(console, "warn").mockImplementation(() => {}); mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "addBreadcrumb").mockImplementation(vi.fn()); const message = "navigation message"; const type = SentryBreadcrumb.Navigation; @@ -144,7 +147,7 @@ describe("breadcrumbs", () => { 2, "Navigation breadcrumbs should include a 'to' metadata field.", ); - expect(Sentry.addBreadcrumb).toHaveBeenCalledWith({ + expect(vi.mocked(addBreadcrumb)).toHaveBeenCalledWith({ data: {}, message, timestamp: 1577836800, diff --git a/apps/spruce/package.json b/apps/spruce/package.json index b8bc16c95..551b9d6e4 100644 --- a/apps/spruce/package.json +++ b/apps/spruce/package.json @@ -99,7 +99,7 @@ "@leafygreen-ui/tooltip": "10.0.10", "@leafygreen-ui/typography": "19.0.0", "@rjsf/core": "4.2.3", - "@sentry/react": "7.114.0", + "@sentry/react": "8.7.0", "@sentry/types": "7.114.0", "ansi_up": "6.0.2", "antd": "4.20.0", diff --git a/apps/spruce/src/components/ErrorHandling/ErrorBoundary.test.tsx b/apps/spruce/src/components/ErrorHandling/ErrorBoundary.test.tsx index 413418fd9..78f0e37af 100644 --- a/apps/spruce/src/components/ErrorHandling/ErrorBoundary.test.tsx +++ b/apps/spruce/src/components/ErrorHandling/ErrorBoundary.test.tsx @@ -1,14 +1,22 @@ -import * as Sentry from "@sentry/react"; +import { captureException } from "@sentry/react"; import { render, screen } from "test_utils"; import { mockEnvironmentVariables } from "test_utils/utils"; import { ErrorBoundary } from "./ErrorBoundary"; const { cleanup } = mockEnvironmentVariables(); +vi.mock("@sentry/react", async (importOriginal) => { + const actual = await importOriginal(); + return { + // @ts-expect-error + ...actual, + captureException: vi.fn(), + }; +}); + describe("default error boundary", () => { beforeEach(() => { vi.spyOn(console, "error").mockImplementation(() => {}); - vi.spyOn(Sentry, "captureException"); }); afterEach(() => { @@ -46,6 +54,6 @@ describe("default error boundary", () => { componentStack: expect.any(String), }), }); - expect(Sentry.captureException).not.toHaveBeenCalled(); + expect(vi.mocked(captureException)).not.toHaveBeenCalled(); }); }); diff --git a/apps/spruce/src/components/ErrorHandling/initialize.test.ts b/apps/spruce/src/components/ErrorHandling/initialize.test.ts index aaf3f9548..345a43445 100644 --- a/apps/spruce/src/components/ErrorHandling/initialize.test.ts +++ b/apps/spruce/src/components/ErrorHandling/initialize.test.ts @@ -1,13 +1,21 @@ -import * as Sentry from "@sentry/react"; +import { init, isInitialized } from "@sentry/react"; import { mockEnvironmentVariables } from "test_utils/utils"; import { initializeErrorHandling } from "."; const { cleanup, mockEnv } = mockEnvironmentVariables(); +vi.mock("@sentry/react", async (importOriginal) => { + const actual = await importOriginal(); + return { + // @ts-expect-error + ...actual, + init: vi.fn(), + isInitialized: vi.fn().mockReturnValue(false), + }; +}); + describe("should initialize error handlers according to release stage", () => { - beforeEach(() => { - vi.spyOn(Sentry, "init").mockImplementation(vi.fn()); - }); + beforeEach(() => {}); afterEach(() => { vi.restoreAllMocks(); @@ -20,7 +28,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_RELEASE_STAGE", "production"); initializeErrorHandling(); - expect(Sentry.init).not.toHaveBeenCalled(); + expect(vi.mocked(init)).not.toHaveBeenCalled(); }); it("production", () => { @@ -30,7 +38,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_SPRUCE_SENTRY_DSN", "fake-sentry-key"); initializeErrorHandling(); - expect(Sentry.init).toHaveBeenCalledWith({ + expect(vi.mocked(init)).toHaveBeenCalledWith({ beforeBreadcrumb: expect.any(Function), dsn: "fake-sentry-key", debug: false, @@ -47,7 +55,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_SPRUCE_SENTRY_DSN", "fake-sentry-key"); initializeErrorHandling(); - expect(Sentry.init).toHaveBeenCalledWith({ + expect(vi.mocked(init)).toHaveBeenCalledWith({ beforeBreadcrumb: expect.any(Function), dsn: "fake-sentry-key", debug: true, @@ -64,7 +72,7 @@ describe("should initialize error handlers according to release stage", () => { mockEnv("REACT_APP_SPRUCE_SENTRY_DSN", "fake-sentry-key"); initializeErrorHandling(); - expect(Sentry.init).toHaveBeenCalledWith({ + expect(vi.mocked(init)).toHaveBeenCalledWith({ beforeBreadcrumb: expect.any(Function), dsn: "fake-sentry-key", debug: true, @@ -77,7 +85,6 @@ describe("should initialize error handlers according to release stage", () => { describe("should not initialize if the client is already running", () => { beforeEach(() => { - vi.spyOn(Sentry, "init").mockImplementation(vi.fn()); mockEnv("NODE_ENV", "production"); }); @@ -87,8 +94,8 @@ describe("should not initialize if the client is already running", () => { }); it("does not initialize Sentry twice", () => { - vi.spyOn(Sentry, "isInitialized").mockReturnValue(true); + vi.mocked(isInitialized).mockReturnValue(true); initializeErrorHandling(); - expect(Sentry.init).not.toHaveBeenCalled(); + expect(vi.mocked(init)).not.toHaveBeenCalled(); }); }); diff --git a/apps/spruce/src/utils/errorReporting.test.ts b/apps/spruce/src/utils/errorReporting.test.ts index d2bcdf7c3..e83e68b6d 100644 --- a/apps/spruce/src/utils/errorReporting.test.ts +++ b/apps/spruce/src/utils/errorReporting.test.ts @@ -1,4 +1,4 @@ -import * as Sentry from "@sentry/react"; +import { addBreadcrumb, captureException, setTags } from "@sentry/react"; import { mockEnvironmentVariables } from "test_utils/utils"; import { leaveBreadcrumb, @@ -8,11 +8,22 @@ import { const { cleanup, mockEnv } = mockEnvironmentVariables(); +vi.mock("@sentry/react", async (importOriginal) => { + const actual = await importOriginal(); + return { + // @ts-expect-error + ...actual, + addBreadcrumb: vi.fn(), + captureException: vi.fn(), + setTags: vi.fn(), + }; +}); + describe("error reporting", () => { beforeEach(() => { vi.spyOn(console, "error").mockImplementation(() => {}); - vi.spyOn(Sentry, "captureException"); }); + afterEach(() => { cleanup(); vi.restoreAllMocks(); @@ -31,24 +42,22 @@ describe("error reporting", () => { err, severity: "warning", }); - expect(Sentry.captureException).not.toHaveBeenCalled(); + expect(vi.mocked(captureException)).not.toHaveBeenCalled(); }); it("reports errors to Sentry when in production", () => { mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "captureException").mockImplementation(vi.fn()); const err = new Error("test error"); const result = reportError(err); result.severe(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); result.warning(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); }); it("supports context field", () => { mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "captureException").mockImplementation(vi.fn()); const err = { message: "GraphQL Error", name: "Error Name", @@ -57,15 +66,13 @@ describe("error reporting", () => { const context = { anything: "foo" }; const result = reportError(err, { context }); result.severe(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); result.warning(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); }); it("supports tags", () => { mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "captureException").mockImplementation(vi.fn()); - vi.spyOn(Sentry, "setTags").mockImplementation(vi.fn()); const err = { message: "GraphQL Error", name: "Error Name", @@ -74,18 +81,17 @@ describe("error reporting", () => { const tags = { spruce: "true" }; const result = reportError(err, { tags }); result.severe(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); - expect(Sentry.setTags).toHaveBeenCalledWith(tags); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); + expect(vi.mocked(setTags)).toHaveBeenCalledWith(tags); result.warning(); - expect(Sentry.captureException).toHaveBeenCalledWith(err); - expect(Sentry.setTags).toHaveBeenCalledWith(tags); + expect(vi.mocked(captureException)).toHaveBeenCalledWith(err); + expect(vi.mocked(setTags)).toHaveBeenCalledWith(tags); }); }); describe("breadcrumbs", () => { beforeEach(() => { vi.spyOn(console, "debug").mockImplementation(() => {}); - vi.spyOn(Sentry, "addBreadcrumb"); }); afterEach(() => { cleanup(); @@ -103,20 +109,19 @@ describe("breadcrumbs", () => { metadata, type, }); - expect(Sentry.addBreadcrumb).not.toHaveBeenCalled(); + expect(vi.mocked(addBreadcrumb)).not.toHaveBeenCalled(); }); it("should report breadcrumbs to Sentry when in production", () => { vi.useFakeTimers().setSystemTime(new Date("2020-01-01")); mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "addBreadcrumb").mockImplementation(vi.fn()); const message = "my message"; const type = SentryBreadcrumb.Info; const metadata = { status_code: 401 }; leaveBreadcrumb(message, metadata, type); - expect(Sentry.addBreadcrumb).toHaveBeenCalledWith({ + expect(vi.mocked(addBreadcrumb)).toHaveBeenCalledWith({ message, type: "info", timestamp: 1577836800, @@ -129,7 +134,6 @@ describe("breadcrumbs", () => { vi.useFakeTimers().setSystemTime(new Date("2020-01-01")); vi.spyOn(console, "warn").mockImplementation(() => {}); mockEnv("NODE_ENV", "production"); - vi.spyOn(Sentry, "addBreadcrumb").mockImplementation(vi.fn()); const message = "navigation message"; const type = SentryBreadcrumb.Navigation; @@ -144,7 +148,7 @@ describe("breadcrumbs", () => { 2, "Navigation breadcrumbs should include a 'to' metadata field.", ); - expect(Sentry.addBreadcrumb).toHaveBeenCalledWith({ + expect(vi.mocked(addBreadcrumb)).toHaveBeenCalledWith({ message, type, timestamp: 1577836800, diff --git a/yarn.lock b/yarn.lock index a71731901..2fbc4e096 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4321,52 +4321,61 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz#851959c4c1c3c6647aba1f388198c8243aed6917" integrity sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ== -"@sentry-internal/feedback@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.114.0.tgz#8a1c3d8bbd014c1823d30b9b1128eb244d357c3e" - integrity sha512-kUiLRUDZuh10QE9JbSVVLgqxFoD9eDPOzT0MmzlPuas8JlTmJuV4FtSANNcqctd5mBuLt2ebNXH0MhRMwyae4A== - dependencies: - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" - -"@sentry-internal/replay-canvas@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.114.0.tgz#b81e2c2ebec01c436ad6e687e563ba456e33b615" - integrity sha512-6rTiqmKi/FYtesdM2TM2U+rh6BytdPjLP65KTUodtxohJ+r/3m+termj2o4BhIYPE1YYOZNmbZfwebkuQPmWeg== - dependencies: - "@sentry/core" "7.114.0" - "@sentry/replay" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" - -"@sentry-internal/tracing@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.114.0.tgz#bdcd364f511e2de45db6e3004faf5685ca2e0f86" - integrity sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg== - dependencies: - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" +"@sentry-internal/browser-utils@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.7.0.tgz#8a75560c80c50e023db58faf055dacde670e9d78" + integrity sha512-RFBK1sYBwV5qGMEwWF0rjOTqQpp4/SvE+qHkOJNRUTVYmfjM+Y9lcxwn4B6lu3aboxePpBw/i1PlP6XwX4UnGA== + dependencies: + "@sentry/core" "8.7.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" + +"@sentry-internal/feedback@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.7.0.tgz#fa632c70de93b9c6626951f62c732984242097d8" + integrity sha512-qcGtWCtRB4eP7NVQoxW936oPkU4qu9otMLYELPGmOJPnuAG0lujlJXW7BucaM7ADyJgJTE75hG849bHecfnbmQ== + dependencies: + "@sentry/core" "8.7.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" + +"@sentry-internal/replay-canvas@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.7.0.tgz#78316619cc57b8d81cacabacdf0f5167eb805ef9" + integrity sha512-FOnvBPbq6MJVHPduc0hcsdE3PeeovQ2z5WJnZDGhvp/Obehxqe+XgX7K/595vRIknv4EokRn/3Kw0mFwG8E+ZQ== + dependencies: + "@sentry-internal/replay" "8.7.0" + "@sentry/core" "8.7.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" + +"@sentry-internal/replay@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.7.0.tgz#2898303529bb2273129e2e86c861d03f69e95622" + integrity sha512-bQzOkWplaWTe3u+aDBhxWY3Qy0aT7ss2A3VR8iC6N8ZIEP9PxqyJwTNoouhinfgmlnCguI7RDOO4f3r3e2M80Q== + dependencies: + "@sentry-internal/browser-utils" "8.7.0" + "@sentry/core" "8.7.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" "@sentry/babel-plugin-component-annotate@2.16.1": version "2.16.1" resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.1.tgz#da3bf4ec1c1dc68a97d6a7e27bd710001d6b07fb" integrity sha512-pJka66URsqQbk6hTs9H1XFpUeI0xxuqLYf9Dy5pRGNHSJMtfv91U+CaYSWt03aRRMGDXMduh62zAAY7Wf0HO+A== -"@sentry/browser@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.114.0.tgz#b0741bff89189d16c8b19f0775fe6e078147ec33" - integrity sha512-ijJ0vOEY6U9JJADVYGkUbLrAbpGSQgA4zV+KW3tcsBLX9M1jaWq4BV1PWHdzDPPDhy4OgfOjIfaMb5BSPn1U+g== - dependencies: - "@sentry-internal/feedback" "7.114.0" - "@sentry-internal/replay-canvas" "7.114.0" - "@sentry-internal/tracing" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/integrations" "7.114.0" - "@sentry/replay" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" +"@sentry/browser@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.7.0.tgz#78844ca196315327979ef7cfbad71788e95c9888" + integrity sha512-4EEp+PlcktsMN0p+MdCPl/lghTkq7eOtZjQG9NGhWzfyWrJ3tuL1nsDr2SSivJ1V277F01KtKYo6BFwP2NtBZA== + dependencies: + "@sentry-internal/browser-utils" "8.7.0" + "@sentry-internal/feedback" "8.7.0" + "@sentry-internal/replay" "8.7.0" + "@sentry-internal/replay-canvas" "8.7.0" + "@sentry/core" "8.7.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" "@sentry/bundler-plugin-core@2.16.1": version "2.16.1" @@ -4436,56 +4445,41 @@ "@sentry/cli-win32-i686" "2.31.0" "@sentry/cli-win32-x64" "2.31.0" -"@sentry/core@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.114.0.tgz#3efe86b92a5379c44dfd0fd4685266b1a30fa898" - integrity sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA== +"@sentry/core@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.7.0.tgz#c98bc47020cd48d899806baaebc7a4b6fe10b9ab" + integrity sha512-Sq/46B+5nWmgnCD6dEMZ6HTkKbV/KAdgaSvT8oXDb9OWoPy1jJ/gbLrhLs62KbjuDQk4/vWnOgHiKQbcslSzMw== dependencies: - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" -"@sentry/integrations@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.114.0.tgz#baf249cfa9e359510f41e486a75bf184db18927d" - integrity sha512-BJIBWXGKeIH0ifd7goxOS29fBA8BkEgVVCahs6xIOXBjX1IRS6PmX0zYx/GP23nQTfhJiubv2XPzoYOlZZmDxg== +"@sentry/react@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-8.7.0.tgz#fc3f4303abb2ccd1e23f75f9f5bb6e648e095fa0" + integrity sha512-JFo8QW8JB4eaFC8RdkOBO96JvlGgstywmyMZ39qWfFbD735vGl8PnOa0AnrC/5Auc86dZ98/I4OEPboqUE9q1w== dependencies: - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" - localforage "^1.8.1" - -"@sentry/react@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.114.0.tgz#aca57bbf943abe069c95f584184b5690bcb34733" - integrity sha512-zVPtvSy00Al25Z21f5GNzo3rd/TKS+iOX9wQwLrUZAxyf9RwBxKATLVJNJPkf8dQml6Qx+lfr0BHIlVcr1a1SQ== - dependencies: - "@sentry/browser" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/browser" "8.7.0" + "@sentry/core" "8.7.0" + "@sentry/types" "8.7.0" + "@sentry/utils" "8.7.0" hoist-non-react-statics "^3.3.2" -"@sentry/replay@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.114.0.tgz#f552e4803cacb233a2f5f2a4afbf5bed9052a744" - integrity sha512-UvEajoLIX9n2poeW3R4Ybz7D0FgCGXoFr/x/33rdUEMIdTypknxjJWxg6fJngIduzwrlrvWpvP8QiZXczYQy2Q== - dependencies: - "@sentry-internal/tracing" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" - "@sentry/types@7.114.0": version "7.114.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.114.0.tgz#ab8009d5f6df23b7342121083bed34ee2452e856" integrity sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w== -"@sentry/utils@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.114.0.tgz#59d30a79f4acff3c9268de0b345f0bcbc6335112" - integrity sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg== +"@sentry/types@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.7.0.tgz#92731af32318d6abb8759216cf6c3c5035894e6e" + integrity sha512-11KLOKumP6akugVGLvSoEig+JlP0ZEzW3nN9P+ppgdIx9HAxMIh6UvumbieG4/DWjAh2kh6NPNfUw3gk2Gfq1A== + +"@sentry/utils@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.7.0.tgz#26893acc5bca9bfd4998d2eafe724491e3ca78a2" + integrity sha512-aWmcbSoOmrbzll/FkNQFJcCtLAuJLvTYbRKiCSkV3FScA7UaA742HkTZAPFiioALFIESWk/fcGZqtN0s4I281Q== dependencies: - "@sentry/types" "7.114.0" + "@sentry/types" "8.7.0" "@sentry/vite-plugin@2.16.1": version "2.16.1" @@ -10644,11 +10638,6 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - immutable@~3.7.6: version "3.7.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" @@ -11625,13 +11614,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== - dependencies: - immediate "~3.0.5" - lilconfig@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" @@ -11721,13 +11703,6 @@ local-pkg@^0.5.0: mlly "^1.4.2" pkg-types "^1.0.3" -localforage@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" - integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== - dependencies: - lie "3.1.1" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -14643,7 +14618,16 @@ string-env-interpolation@1.0.1, string-env-interpolation@^1.0.1: resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -14735,7 +14719,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15989,7 +15980,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16007,6 +15998,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"