diff --git a/.eslintrc.js b/.eslintrc.js index 55a5c70e3..d829b5933 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,11 +12,7 @@ module.exports = { settings: { version: 'detect', // React version. "detect" automatically picks the version you have installed. }, - ignorePatterns: [ - 'test/react-native/versions/**/*', - 'coverage/**/*', - 'test/typescript/**/*', - ], + ignorePatterns: ['test/react-native/versions/**/*', 'coverage/**/*', 'test/typescript/**/*'], overrides: [ { // Typescript Files @@ -24,10 +20,7 @@ module.exports = { extends: ['plugin:react/recommended'], plugins: ['react', 'react-native'], rules: { - '@typescript-eslint/typedef': [ - 'error', - { arrowParameter: false, variableDeclarationIgnoreFunction: true }, - ], + '@typescript-eslint/typedef': ['error', { arrowParameter: false, variableDeclarationIgnoreFunction: true }], }, }, { @@ -37,6 +30,7 @@ module.exports = { '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/unbound-method': 'off', }, }, { @@ -55,7 +49,7 @@ module.exports = { parserOptions: { ecmaVersion: 2017, }, - } + }, ], rules: { // Bundle size isn't too much of an issue for React Native. diff --git a/package.json b/package.json index 613c459f8..ee384f520 100644 --- a/package.json +++ b/package.json @@ -70,21 +70,21 @@ "@sentry-internal/eslint-plugin-sdk": "7.61.0", "@sentry/typescript": "^5.20.1", "@sentry/wizard": "3.9.1", - "@types/jest": "^29.2.5", + "@types/jest": "^29.5.3", "@types/react": "^18.2.14", - "babel-jest": "^29.3.1", + "babel-jest": "^29.6.2", "downlevel-dts": "^0.11.0", "eslint": "^7.6.0", "eslint-plugin-react": "^7.20.6", "eslint-plugin-react-native": "^3.8.1", - "jest": "^29.3.1", - "jest-environment-jsdom": "^29.4.1", + "jest": "^29.6.2", + "jest-environment-jsdom": "^29.6.2", "prettier": "^2.0.5", "react": "18.2.0", "react-native": "0.72.3", "replace-in-file": "^7.0.1", "rimraf": "^4.1.1", - "ts-jest": "^29.0.5", + "ts-jest": "^29.1.1", "typescript": "4.1.3" }, "rnpm": { @@ -98,6 +98,9 @@ "jest": { "collectCoverage": true, "preset": "react-native", + "setupFilesAfterEnv": [ + "/test/mockConsole.ts" + ], "globals": { "__DEV__": true, "ts-jest": { @@ -111,7 +114,8 @@ "js" ], "testPathIgnorePatterns": [ - "/test/e2e/" + "/test/e2e/", + "/test/react-native/versions" ], "testEnvironment": "node", "testMatch": [ diff --git a/test/client.test.ts b/test/client.test.ts index 9e0b11bf7..99ab33ff5 100644 --- a/test/client.test.ts +++ b/test/client.test.ts @@ -21,8 +21,6 @@ import { getSyncPromiseRejectOnFirstCall, } from './testutils'; -const EXAMPLE_DSN = 'https://6890c2f6677340daa4804f8194804ea2@o19635.ingest.sentry.io/148053'; - interface MockedReactNative { NativeModules: { RNSentry: { @@ -74,10 +72,10 @@ jest.mock( alert: jest.fn(), }, }), - /* virtual allows us to mock modules that aren't in package.json */ - { virtual: true }, ); +const EXAMPLE_DSN = 'https://6890c2f6677340daa4804f8194804ea2@o19635.ingest.sentry.io/148053'; + const DEFAULT_OPTIONS: ReactNativeClientOptions = { enableNative: true, enableNativeCrashHandling: true, @@ -94,11 +92,6 @@ const DEFAULT_OPTIONS: ReactNativeClientOptions = { stackParser: jest.fn().mockReturnValue([]), }; -afterEach(() => { - jest.clearAllMocks(); - NATIVE.enableNative = true; -}); - describe('Tests ReactNativeClient', () => { describe('initializing the client', () => { test('client initializes', async () => { @@ -110,7 +103,6 @@ describe('Tests ReactNativeClient', () => { await expect(client.eventFromMessage('test')).resolves.toBeDefined(); // @ts-ignore: Is Mocked - // eslint-disable-next-line @typescript-eslint/unbound-method await expect(RN.LogBox.ignoreLogs).toBeCalled(); }); @@ -150,9 +142,7 @@ describe('Tests ReactNativeClient', () => { dsn: EXAMPLE_DSN, transport: myCustomTransportFn, }); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(client.getTransport()?.flush).toBe(myFlush); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(client.getTransport()?.send).toBe(mySend); }); }); @@ -212,6 +202,7 @@ describe('Tests ReactNativeClient', () => { describe('nativeCrash', () => { test('calls NativeModules crash', () => { + NATIVE.enableNative = true; const RN: MockedReactNative = require('react-native'); const client = new ReactNativeClient({ diff --git a/test/e2e/test/e2e.test.ts b/test/e2e/test/e2e.test.ts index 97b1e5657..5b61c3f1a 100644 --- a/test/e2e/test/e2e.test.ts +++ b/test/e2e/test/e2e.test.ts @@ -96,23 +96,23 @@ beforeAll(async () => { } }); -afterAll(async () => { - await driver?.deleteSession(); -}); +describe('End to end tests for common events', () => { + afterAll(async () => { + await driver?.deleteSession(); + }); -beforeEach(async () => { - const element = await getElement('clearEventId'); - await element.click(); - await waitUntilEventIdIsEmpty(); -}); + beforeEach(async () => { + const element = await getElement('clearEventId'); + await element.click(); + await waitUntilEventIdIsEmpty(); + }); -afterEach(async () => { - const testName = expect.getState().currentTestName; - const fileName = `screen-${testName}.png`.replace(/[^0-9a-zA-Z-+.]/g, '_'); - await driver?.saveScreenshot(fileName); -}); + afterEach(async () => { + const testName = expect.getState().currentTestName; + const fileName = `screen-${testName}.png`.replace(/[^0-9a-zA-Z-+.]/g, '_'); + await driver?.saveScreenshot(fileName); + }); -describe('End to end tests for common events', () => { test('captureMessage', async () => { const element = await getElement('captureMessage'); await element.click(); diff --git a/test/integrations/reactnativeerrorhandlers.test.ts b/test/integrations/reactnativeerrorhandlers.test.ts index 7f6012a52..6a7067eb4 100644 --- a/test/integrations/reactnativeerrorhandlers.test.ts +++ b/test/integrations/reactnativeerrorhandlers.test.ts @@ -49,15 +49,15 @@ import type { Event, EventHint, SeverityLevel } from '@sentry/types'; import { ReactNativeErrorHandlers } from '../../src/js/integrations/reactnativeerrorhandlers'; -beforeEach(() => { - ErrorUtils.getGlobalHandler = () => jest.fn(); -}); +describe('ReactNativeErrorHandlers', () => { + beforeEach(() => { + ErrorUtils.getGlobalHandler = () => jest.fn(); + }); -afterEach(() => { - jest.clearAllMocks(); -}); + afterEach(() => { + jest.clearAllMocks(); + }); -describe('ReactNativeErrorHandlers', () => { describe('onError', () => { let errorHandlerCallback: (error: Error, isFatal: boolean) => Promise; @@ -107,7 +107,6 @@ describe('ReactNativeErrorHandlers', () => { function getActualCaptureEventArgs() { const hub = getCurrentHub(); - // eslint-disable-next-line @typescript-eslint/unbound-method const mockCall = (hub.captureEvent as jest.MockedFunction).mock.calls[0]; return mockCall; diff --git a/test/integrations/sdkinfo.test.ts b/test/integrations/sdkinfo.test.ts index f82902e6b..c4eeff138 100644 --- a/test/integrations/sdkinfo.test.ts +++ b/test/integrations/sdkinfo.test.ts @@ -28,11 +28,11 @@ jest.mock('../../src/js/wrapper', () => { }; }); -afterEach(() => { - NATIVE.platform = 'ios'; -}); - describe('Sdk Info', () => { + afterEach(() => { + NATIVE.platform = 'ios'; + }); + it('Adds native package and javascript platform to event on iOS', async () => { mockedFetchNativeSdkInfo = jest.fn().mockResolvedValue(mockCocoaPackage); const mockEvent: Event = {}; diff --git a/test/mockConsole.ts b/test/mockConsole.ts new file mode 100644 index 000000000..ac2409d0e --- /dev/null +++ b/test/mockConsole.ts @@ -0,0 +1,8 @@ +global.console = { + ...console, + log: jest.fn(), + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), +}; diff --git a/test/scope.test.ts b/test/scope.test.ts index ab10e1a23..cccf77207 100644 --- a/test/scope.test.ts +++ b/test/scope.test.ts @@ -1,4 +1,3 @@ -// eslint-disable @typescript-eslint/unbound-method import type { Breadcrumb } from '@sentry/types'; import { ReactNativeScope } from '../src/js/scope'; diff --git a/test/sdk.test.ts b/test/sdk.test.ts index 69abfbd1e..da1f97019 100644 --- a/test/sdk.test.ts +++ b/test/sdk.test.ts @@ -82,11 +82,11 @@ const usedOptions = (): ClientOptions | undefined => { return mockedInitAndBind.mock.calls[0]?.[1]; }; -afterEach(() => { - jest.clearAllMocks(); -}); - describe('Tests the SDK functionality', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + describe('init', () => { describe('enableAutoPerformanceTracing', () => { const usedOptions = (): Integration[] => { @@ -163,7 +163,6 @@ describe('Tests the SDK functionality', () => { if (mockClient) { const flushResult = await flush(); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockClient.flush).toBeCalled(); expect(flushResult).toBe(true); } @@ -178,10 +177,8 @@ describe('Tests the SDK functionality', () => { const flushResult = await flush(); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockClient.flush).toBeCalled(); expect(flushResult).toBe(false); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(logger.error).toBeCalledWith('Failed to flush the event queue.'); } }); @@ -219,7 +216,6 @@ describe('Tests the SDK functionality', () => { it('fetchTransport set and enableNative set to false', () => { (NATIVE.isNativeAvailable as jest.Mock).mockImplementation(() => false); init({}); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(NATIVE.isNativeAvailable).toBeCalled(); // @ts-ignore enableNative not publicly available here. expect(usedOptions()?.enableNative).toEqual(false); @@ -229,7 +225,6 @@ describe('Tests the SDK functionality', () => { it('fetchTransport set and passed enableNative ignored when true', () => { (NATIVE.isNativeAvailable as jest.Mock).mockImplementation(() => false); init({ enableNative: true }); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(NATIVE.isNativeAvailable).toBeCalled(); // @ts-ignore enableNative not publicly available here. expect(usedOptions()?.enableNative).toEqual(false); @@ -239,7 +234,6 @@ describe('Tests the SDK functionality', () => { it('fetchTransport set and isNativeAvailable not called when passed enableNative set to false', () => { (NATIVE.isNativeAvailable as jest.Mock).mockImplementation(() => false); init({ enableNative: false }); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(NATIVE.isNativeAvailable).not.toBeCalled(); // @ts-ignore enableNative not publicly available here. expect(usedOptions()?.enableNative).toEqual(false); @@ -253,7 +247,6 @@ describe('Tests the SDK functionality', () => { transport: mockTransport, }); expect(usedOptions()?.transport).toEqual(mockTransport); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(NATIVE.isNativeAvailable).toBeCalled(); // @ts-ignore enableNative not publicly available here. expect(usedOptions()?.enableNative).toEqual(false); @@ -284,7 +277,6 @@ describe('Tests the SDK functionality', () => { (NATIVE.isNativeAvailable as jest.Mock).mockImplementation(() => true); init({ enableNative: false }); expect(usedOptions()?.transport).toEqual(makeFetchTransport); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(NATIVE.isNativeAvailable).not.toBeCalled(); }); @@ -292,7 +284,6 @@ describe('Tests the SDK functionality', () => { (NATIVE.isNativeAvailable as jest.Mock).mockImplementation(() => true); init({ enableNative: true }); expect(usedOptions()?.transport).toEqual(makeNativeTransport); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(NATIVE.isNativeAvailable).toBeCalled(); }); }); diff --git a/test/tracing/nativeframes.test.ts b/test/tracing/nativeframes.test.ts index f149bfd21..c26ca4e36 100644 --- a/test/tracing/nativeframes.test.ts +++ b/test/tracing/nativeframes.test.ts @@ -22,7 +22,6 @@ describe('NativeFramesInstrumentation', () => { slowFrames: 20, frozenFrames: 5, }; - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(startFrames); const instance = new NativeFramesInstrumentation( @@ -55,7 +54,6 @@ describe('NativeFramesInstrumentation', () => { slowFrames: 40, frozenFrames: 10, }; - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(startFrames); let eventProcessor: EventProcessor; @@ -72,7 +70,6 @@ describe('NativeFramesInstrumentation', () => { instance.onTransactionStart(transaction); setImmediate(() => { - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(finishFrames); const finishTimestamp = Date.now() / 1000; @@ -140,7 +137,6 @@ describe('NativeFramesInstrumentation', () => { slowFrames: 40, frozenFrames: 10, }; - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(finishFrames); let eventProcessor: EventProcessor; @@ -215,7 +211,6 @@ describe('NativeFramesInstrumentation', () => { frozenFrames: 5, }; const finishFrames = null; - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(startFrames); let eventProcessor: EventProcessor; @@ -232,7 +227,6 @@ describe('NativeFramesInstrumentation', () => { instance.onTransactionStart(transaction); setImmediate(() => { - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(finishFrames); const finishTimestamp = Date.now() / 1000; @@ -286,7 +280,6 @@ describe('NativeFramesInstrumentation', () => { slowFrames: 20, frozenFrames: 5, }; - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockResolvedValue(startFrames); let eventProcessor: EventProcessor; @@ -303,7 +296,6 @@ describe('NativeFramesInstrumentation', () => { instance.onTransactionStart(transaction); setImmediate(() => { - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeFrames).mockImplementation( // eslint-disable-next-line @typescript-eslint/no-empty-function async () => new Promise(() => {}), diff --git a/test/tracing/reactnativetracing.test.ts b/test/tracing/reactnativetracing.test.ts index b62374f48..5fdeb454a 100644 --- a/test/tracing/reactnativetracing.test.ts +++ b/test/tracing/reactnativetracing.test.ts @@ -81,18 +81,21 @@ import { const DEFAULT_IDLE_TIMEOUT = 1000; -beforeEach(() => { - NATIVE.enableNative = true; -}); +describe('ReactNativeTracing', () => { + beforeEach(() => { + jest.useFakeTimers(); + NATIVE.enableNative = true; + }); -afterEach(() => { - jest.clearAllMocks(); -}); + afterEach(() => { + jest.runOnlyPendingTimers(); + jest.useRealTimers(); + jest.clearAllMocks(); + }); -describe('ReactNativeTracing', () => { describe('App Start', () => { describe('Without routing instrumentation', () => { - it('Starts route transaction (cold)', done => { + it('Starts route transaction (cold)', async () => { const integration = new ReactNativeTracing({ enableNativeFramesTracking: false, }); @@ -106,38 +109,34 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); + integration.onAppStartFinish(Date.now() / 1000); - // use setImmediate as app start is handled inside a promise. - setImmediate(() => { - integration.onAppStartFinish(Date.now() / 1000); - const transaction = mockHub.getScope()?.getTransaction(); + await jest.advanceTimersByTimeAsync(500); - expect(transaction).toBeDefined(); + const transaction = mockHub.getScope()?.getTransaction(); - if (transaction) { - expect(transaction.startTimestamp).toBe(appStartTimeMilliseconds / 1000); - expect(transaction.op).toBe(UI_LOAD); + expect(transaction).toBeDefined(); - expect( - // @ts-ignore access private for test - transaction._measurements[APP_START_COLD].value, - ).toEqual(timeOriginMilliseconds - appStartTimeMilliseconds); - expect( - // @ts-ignore access private for test - transaction._measurements[APP_START_COLD].unit, - ).toBe('millisecond'); + if (transaction) { + expect(transaction.startTimestamp).toBe(appStartTimeMilliseconds / 1000); + expect(transaction.op).toBe(UI_LOAD); - done(); - } - }); + expect( + // @ts-ignore access private for test + transaction._measurements[APP_START_COLD].value, + ).toEqual(timeOriginMilliseconds - appStartTimeMilliseconds); + expect( + // @ts-ignore access private for test + transaction._measurements[APP_START_COLD].unit, + ).toBe('millisecond'); + } }); - it('Starts route transaction (warm)', done => { + it('Starts route transaction (warm)', async () => { const integration = new ReactNativeTracing(); const timeOriginMilliseconds = Date.now(); @@ -149,37 +148,32 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - // use setImmediate as app start is handled inside a promise. - setImmediate(() => { - const transaction = mockHub.getScope()?.getTransaction(); - - expect(transaction).toBeDefined(); + await jest.advanceTimersByTimeAsync(500); + const transaction = mockHub.getScope()?.getTransaction(); - if (transaction) { - expect(transaction.startTimestamp).toBe(appStartTimeMilliseconds / 1000); - expect(transaction.op).toBe(UI_LOAD); + expect(transaction).toBeDefined(); - expect( - // @ts-ignore access private for test - transaction._measurements[APP_START_WARM].value, - ).toEqual(timeOriginMilliseconds - appStartTimeMilliseconds); - expect( - // @ts-ignore access private for test - transaction._measurements[APP_START_WARM].unit, - ).toBe('millisecond'); + if (transaction) { + expect(transaction.startTimestamp).toBe(appStartTimeMilliseconds / 1000); + expect(transaction.op).toBe(UI_LOAD); - done(); - } - }); + expect( + // @ts-ignore access private for test + transaction._measurements[APP_START_WARM].value, + ).toEqual(timeOriginMilliseconds - appStartTimeMilliseconds); + expect( + // @ts-ignore access private for test + transaction._measurements[APP_START_WARM].unit, + ).toBe('millisecond'); + } }); - it('Does not add app start measurement if more than 60s', done => { + it('Does not add app start measurement if more than 60s', async () => { const integration = new ReactNativeTracing(); const timeOriginMilliseconds = Date.now(); @@ -191,35 +185,31 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - // use setImmediate as app start is handled inside a promise. - setImmediate(() => { - const transaction = mockHub.getScope()?.getTransaction(); + await jest.advanceTimersByTimeAsync(500); - expect(transaction).toBeDefined(); + const transaction = mockHub.getScope()?.getTransaction(); - if (transaction) { - expect( - // @ts-ignore access private for test - transaction._measurements[APP_START_WARM], - ).toBeUndefined(); + expect(transaction).toBeDefined(); - expect( - // @ts-ignore access private for test - transaction._measurements[APP_START_COLD], - ).toBeUndefined(); + if (transaction) { + expect( + // @ts-ignore access private for test + transaction._measurements[APP_START_WARM], + ).toBeUndefined(); - done(); - } - }); + expect( + // @ts-ignore access private for test + transaction._measurements[APP_START_COLD], + ).toBeUndefined(); + } }); - it('Does not create app start transaction if didFetchAppStart == true', done => { + it('Does not create app start transaction if didFetchAppStart == true', async () => { const integration = new ReactNativeTracing(); const timeOriginMilliseconds = Date.now(); @@ -231,33 +221,20 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - // use setImmediate as app start is handled inside a promise. - setImmediate(() => { - const transaction = mockHub.getScope()?.getTransaction(); + await jest.advanceTimersByTimeAsync(500); - expect(transaction).toBeUndefined(); + const transaction = mockHub.getScope()?.getTransaction(); - done(); - }); + expect(transaction).toBeUndefined(); }); }); describe('With routing instrumentation', () => { - beforeEach(() => { - jest.useFakeTimers(); - }); - - afterEach(() => { - jest.runOnlyPendingTimers(); - jest.useRealTimers(); - }); - it('Adds measurements and child span onto existing routing transaction and sets the op (cold)', async () => { const routingInstrumentation = new RoutingInstrumentation(); const integration = new ReactNativeTracing({ @@ -273,7 +250,6 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); @@ -330,7 +306,6 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); @@ -387,7 +362,6 @@ describe('ReactNativeTracing', () => { }; mockFunction(getTimeOriginMilliseconds).mockReturnValue(timeOriginMilliseconds); - // eslint-disable-next-line @typescript-eslint/unbound-method mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(mockAppStartResponse); const mockHub = getMockHub(); @@ -421,110 +395,84 @@ describe('ReactNativeTracing', () => { }); }); - it('Does not instrument app start if app start is disabled', done => { + it('Does not instrument app start if app start is disabled', async () => { const integration = new ReactNativeTracing({ enableAppStartTracking: false, }); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - setImmediate(() => { - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(NATIVE.fetchNativeAppStart).not.toBeCalled(); + await jest.advanceTimersByTimeAsync(500); - const transaction = mockHub.getScope()?.getTransaction(); + expect(NATIVE.fetchNativeAppStart).not.toBeCalled(); - expect(transaction).toBeUndefined(); + const transaction = mockHub.getScope()?.getTransaction(); - done(); - }); + expect(transaction).toBeUndefined(); }); - it('Does not instrument app start if native is disabled', done => { + it('Does not instrument app start if native is disabled', async () => { NATIVE.enableNative = false; const integration = new ReactNativeTracing(); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - setImmediate(() => { - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(NATIVE.fetchNativeAppStart).not.toBeCalled(); + await jest.advanceTimersByTimeAsync(500); - const transaction = mockHub.getScope()?.getTransaction(); + expect(NATIVE.fetchNativeAppStart).not.toBeCalled(); - expect(transaction).toBeUndefined(); + const transaction = mockHub.getScope()?.getTransaction(); - done(); - }); + expect(transaction).toBeUndefined(); }); - it('Does not instrument app start if fetchNativeAppStart returns null', done => { - // eslint-disable-next-line @typescript-eslint/unbound-method + it('Does not instrument app start if fetchNativeAppStart returns null', async () => { mockFunction(NATIVE.fetchNativeAppStart).mockResolvedValue(null); const integration = new ReactNativeTracing(); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - setImmediate(() => { - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(NATIVE.fetchNativeAppStart).toBeCalledTimes(1); + await jest.advanceTimersByTimeAsync(500); - const transaction = mockHub.getScope()?.getTransaction(); + expect(NATIVE.fetchNativeAppStart).toBeCalledTimes(1); - expect(transaction).toBeUndefined(); + const transaction = mockHub.getScope()?.getTransaction(); - done(); - }); + expect(transaction).toBeUndefined(); }); }); describe('Native Frames', () => { - it('Initialize native frames instrumentation if flag is true', done => { + it('Initialize native frames instrumentation if flag is true', async () => { const integration = new ReactNativeTracing({ enableNativeFramesTracking: true, }); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - setImmediate(() => { - expect(integration.nativeFramesInstrumentation).toBeDefined(); - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(NATIVE.enableNativeFramesTracking).toBeCalledTimes(1); + await jest.advanceTimersByTimeAsync(500); - done(); - }); + expect(integration.nativeFramesInstrumentation).toBeDefined(); + expect(NATIVE.enableNativeFramesTracking).toBeCalledTimes(1); }); - it('Does not initialize native frames instrumentation if flag is false', done => { + it('Does not initialize native frames instrumentation if flag is false', async () => { const integration = new ReactNativeTracing({ enableNativeFramesTracking: false, }); const mockHub = getMockHub(); integration.setupOnce(addGlobalEventProcessor, () => mockHub); - setImmediate(() => { - expect(integration.nativeFramesInstrumentation).toBeUndefined(); - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(NATIVE.disableNativeFramesTracking).toBeCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(NATIVE.fetchNativeFrames).not.toBeCalled(); + await jest.advanceTimersByTimeAsync(500); - done(); - }); + expect(integration.nativeFramesInstrumentation).toBeUndefined(); + expect(NATIVE.disableNativeFramesTracking).toBeCalledTimes(1); + expect(NATIVE.fetchNativeFrames).not.toBeCalled(); }); }); describe('Routing Instrumentation', () => { - beforeEach(() => { - jest.useFakeTimers(); - }); - - afterEach(() => { - jest.runOnlyPendingTimers(); - jest.useRealTimers(); - }); - describe('_onConfirmRoute', () => { it('Sets tag and adds breadcrumb', () => { const routing = new RoutingInstrumentation(); @@ -655,14 +603,12 @@ describe('ReactNativeTracing', () => { tracing.startUserInteractionTransaction(mockedUserInteractionId); expect(tracing.options.enableUserInteractionTracing).toBeFalsy(); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockedScope.setSpan).not.toBeCalled(); }); }); describe('enabled user interaction', () => { beforeEach(() => { - jest.useFakeTimers(); tracing = new ReactNativeTracing({ routingInstrumentation: mockedRoutingInstrumentation, enableUserInteractionTracing: true, @@ -671,15 +617,9 @@ describe('ReactNativeTracing', () => { mockedRoutingInstrumentation.registeredOnConfirmRoute!(mockedConfirmedRouteTransactionContext); }); - afterEach(() => { - jest.runAllTimers(); - jest.useRealTimers(); - }); - test('user interaction tracing is enabled and transaction is bound to scope', () => { tracing.startUserInteractionTransaction(mockedUserInteractionId); - // eslint-disable-next-line @typescript-eslint/unbound-method const actualTransaction = mockFunction(mockedScope.setSpan).mock.calls[0][firstArg]; const actualTransactionContext = actualTransaction?.toContext(); expect(tracing.options.enableUserInteractionTracing).toBeTruthy(); @@ -696,7 +636,6 @@ describe('ReactNativeTracing', () => { jest.runAllTimers(); - // eslint-disable-next-line @typescript-eslint/unbound-method const actualTransaction = mockFunction(mockedScope.setSpan).mock.calls[0][firstArg]; const actualTransactionContext = actualTransaction?.toContext(); expect(actualTransactionContext?.sampled).toEqual(false); @@ -805,9 +744,7 @@ describe('ReactNativeTracing', () => { tracing.startUserInteractionTransaction(mockedUserInteractionId); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockedScope.setSpan).toBeCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockedScope.setSpan).toBeCalledWith(activeTransaction); }); @@ -847,13 +784,9 @@ describe('ReactNativeTracing', () => { const actualTransaction = mockedScope.getTransaction() as Transaction | undefined; jest.runAllTimers(); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(tracing.onTransactionStart).toBeCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(tracing.onTransactionFinish).toBeCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(tracing.onTransactionStart).toBeCalledWith(actualTransaction); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(tracing.onTransactionFinish).toBeCalledWith(actualTransaction); }); }); diff --git a/test/tracing/reactnavigation.test.ts b/test/tracing/reactnavigation.test.ts index 505265de8..f2f244985 100644 --- a/test/tracing/reactnavigation.test.ts +++ b/test/tracing/reactnavigation.test.ts @@ -31,13 +31,13 @@ const getMockTransaction = () => { return transaction; }; -afterEach(() => { - RN_GLOBAL_OBJ.__sentry_rn_v5_registered = false; +describe('ReactNavigationInstrumentation', () => { + afterEach(() => { + RN_GLOBAL_OBJ.__sentry_rn_v5_registered = false; - jest.resetAllMocks(); -}); + jest.resetAllMocks(); + }); -describe('ReactNavigationInstrumentation', () => { test('transaction set on initialize', () => { const instrumentation = new ReactNavigationInstrumentation(); @@ -276,9 +276,7 @@ describe('ReactNavigationInstrumentation', () => { expect(RN_GLOBAL_OBJ.__sentry_rn_v5_registered).toBe(true); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockNavigationContainer.addListener).toHaveBeenNthCalledWith(1, '__unsafe_action__', expect.any(Function)); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockNavigationContainer.addListener).toHaveBeenNthCalledWith(2, 'state', expect.any(Function)); }); @@ -289,9 +287,7 @@ describe('ReactNavigationInstrumentation', () => { expect(RN_GLOBAL_OBJ.__sentry_rn_v5_registered).toBe(true); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockNavigationContainer.addListener).toHaveBeenNthCalledWith(1, '__unsafe_action__', expect.any(Function)); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockNavigationContainer.addListener).toHaveBeenNthCalledWith(2, 'state', expect.any(Function)); }); @@ -306,9 +302,7 @@ describe('ReactNavigationInstrumentation', () => { expect(RN_GLOBAL_OBJ.__sentry_rn_v5_registered).toBe(true); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockNavigationContainer.addListener).not.toHaveBeenCalled(); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockNavigationContainer.addListener).not.toHaveBeenCalled(); }); diff --git a/test/tracing/reactnavigationv4.test.ts b/test/tracing/reactnavigationv4.test.ts index 0723991e2..ce84cdf2a 100644 --- a/test/tracing/reactnavigationv4.test.ts +++ b/test/tracing/reactnavigationv4.test.ts @@ -106,10 +106,8 @@ describe('ReactNavigationV4Instrumentation', () => { const firstRoute = mockAppContainerRef.current._navigation.state.routes[0] as NavigationRouteV4; - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenLastCalledWith(INITIAL_TRANSACTION_CONTEXT_V4); expect(mockTransaction.name).toBe(firstRoute.routeName); @@ -158,10 +156,8 @@ describe('ReactNavigationV4Instrumentation', () => { }; mockAppContainerRef.current._navigation.router.dispatchAction(action); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenLastCalledWith({ name: action.routeName, op: 'navigation', @@ -223,10 +219,8 @@ describe('ReactNavigationV4Instrumentation', () => { }; mockAppContainerRef.current._navigation.router.dispatchAction(action); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(tracingListener).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(tracingListener).toHaveBeenLastCalledWith({ name: 'New Name', op: 'navigation', @@ -278,7 +272,6 @@ describe('ReactNavigationV4Instrumentation', () => { }; mockAppContainerRef.current._navigation.router.dispatchAction(action); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenCalledTimes(1); }); @@ -302,7 +295,6 @@ describe('ReactNavigationV4Instrumentation', () => { expect(RN_GLOBAL_OBJ.__sentry_rn_v4_registered).toBe(true); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenCalledTimes(1); expect(mockTransaction.name).toBe(initialRoute.routeName); expect(mockTransaction.sampled).toBe(true); @@ -325,7 +317,6 @@ describe('ReactNavigationV4Instrumentation', () => { expect(RN_GLOBAL_OBJ.__sentry_rn_v4_registered).toBe(true); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(instrumentation.onRouteWillChange).toHaveBeenCalledTimes(1); expect(mockTransaction.name).toBe(initialRoute.routeName); expect(mockTransaction.sampled).toBe(true); diff --git a/test/tracing/stalltracking.test.ts b/test/tracing/stalltracking.test.ts index 2da515b53..88a70d32d 100644 --- a/test/tracing/stalltracking.test.ts +++ b/test/tracing/stalltracking.test.ts @@ -24,10 +24,6 @@ const expensiveOperation = () => { } }; -beforeEach(() => { - jest.clearAllMocks(); -}); - describe('StallTracking', () => { const localHub: Hub = mockHub as unknown as Hub; diff --git a/test/wrapper.test.ts b/test/wrapper.test.ts index ac3221fc5..5533445e8 100644 --- a/test/wrapper.test.ts +++ b/test/wrapper.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/unbound-method */ import type { Event, EventEnvelope, EventItem, SeverityLevel } from '@sentry/types'; import { createEnvelope, logger } from '@sentry/utils'; import * as RN from 'react-native'; @@ -8,60 +7,55 @@ import type { ReactNativeOptions } from '../src/js/options'; import { utf8ToBytes } from '../src/js/vendor'; import { NATIVE } from '../src/js/wrapper'; -jest.mock( - 'react-native', - () => { - let initPayload: ReactNativeOptions | null = null; - - const RNSentry: Spec = { - addBreadcrumb: jest.fn(), - captureEnvelope: jest.fn(), - clearBreadcrumbs: jest.fn(), - crash: jest.fn(), - fetchNativeDeviceContexts: jest.fn(() => - Promise.resolve({ - someContext: { - someValue: 0, - }, - }), - ), - fetchNativeRelease: jest.fn(() => - Promise.resolve({ - build: '1.0.0.1', - id: 'test-mock', - version: '1.0.0', - }), - ), - setContext: jest.fn(), - setExtra: jest.fn(), - setTag: jest.fn(), - setUser: jest.fn(() => { - return; - }), - initNativeSdk: jest.fn(options => { - initPayload = options; +jest.mock('react-native', () => { + let initPayload: ReactNativeOptions | null = null; - return Promise.resolve(true); + const RNSentry: Spec = { + addBreadcrumb: jest.fn(), + captureEnvelope: jest.fn(), + clearBreadcrumbs: jest.fn(), + crash: jest.fn(), + fetchNativeDeviceContexts: jest.fn(() => + Promise.resolve({ + someContext: { + someValue: 0, + }, }), - closeNativeSdk: jest.fn(() => Promise.resolve()), - // @ts-ignore for testing. - _getLastPayload: () => ({ initPayload }), - startProfiling: jest.fn(), - stopProfiling: jest.fn(), - }; - - return { - NativeModules: { - RNSentry, - }, - Platform: { - OS: 'ios', - }, - }; - }, - /* virtual allows us to mock modules that aren't in package.json */ - { virtual: true }, -); + ), + fetchNativeRelease: jest.fn(() => + Promise.resolve({ + build: '1.0.0.1', + id: 'test-mock', + version: '1.0.0', + }), + ), + setContext: jest.fn(), + setExtra: jest.fn(), + setTag: jest.fn(), + setUser: jest.fn(() => { + return; + }), + initNativeSdk: jest.fn(options => { + initPayload = options; + + return Promise.resolve(true); + }), + closeNativeSdk: jest.fn(() => Promise.resolve()), + // @ts-ignore for testing. + _getLastPayload: () => ({ initPayload }), + startProfiling: jest.fn(), + stopProfiling: jest.fn(), + }; + + return { + NativeModules: { + RNSentry, + }, + Platform: { + OS: 'ios', + }, + }; +}); const RNSentry = RN.NativeModules.RNSentry as Spec; @@ -90,16 +84,16 @@ const callAllScopeMethods = () => { NATIVE.setExtra('key', 'value'); }; -beforeEach(() => { - NATIVE.platform = 'ios'; - NATIVE.enableNative = true; -}); +describe('Tests Native Wrapper', () => { + beforeEach(() => { + NATIVE.platform = 'ios'; + NATIVE.enableNative = true; + }); -afterEach(() => { - jest.clearAllMocks(); -}); + afterEach(() => { + jest.clearAllMocks(); + }); -describe('Tests Native Wrapper', () => { describe('startWithOptions', () => { test('calls native module', async () => { await NATIVE.initNativeSdk({ dsn: 'test', enableNative: true }); diff --git a/yarn.lock b/yarn.lock index a506a670a..94ebf190b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1201,7 +1201,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.20.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== @@ -1361,49 +1361,49 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@jest/console@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.2.tgz#bf1d4101347c23e07c029a1b1ae07d550f5cc541" + integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.6.2" + jest-util "^29.6.2" slash "^3.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== +"@jest/core@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.2.tgz#6f2d1dbe8aa0265fcd4fb8082ae1952f148209c8" + integrity sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg== dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.6.2" + "@jest/reporters" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + jest-changed-files "^29.5.0" + jest-config "^29.6.2" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-resolve-dependencies "^29.6.2" + jest-runner "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + jest-watcher "^29.6.2" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.6.2" slash "^3.0.0" strip-ansi "^6.0.0" @@ -1414,7 +1414,7 @@ dependencies: "@jest/types" "^29.3.1" -"@jest/environment@^29.3.1", "@jest/environment@^29.5.0": +"@jest/environment@^29.3.1": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== @@ -1424,6 +1424,16 @@ "@types/node" "*" jest-mock "^29.5.0" +"@jest/environment@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.2.tgz#794c0f769d85e7553439d107d3f43186dc6874a9" + integrity sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q== + dependencies: + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + "@jest/expect-utils@^29.3.1": version "29.3.1" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" @@ -1431,13 +1441,20 @@ dependencies: jest-get-type "^29.2.0" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@jest/expect-utils@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.2.tgz#1b97f290d0185d264dd9fdec7567a14a38a90534" + integrity sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg== dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" + jest-get-type "^29.4.3" + +"@jest/expect@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.2.tgz#5a2ad58bb345165d9ce0a1845bbf873c480a4b28" + integrity sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg== + dependencies: + expect "^29.6.2" + jest-snapshot "^29.6.2" "@jest/fake-timers@^29.3.1", "@jest/fake-timers@^29.5.0": version "29.5.0" @@ -1451,27 +1468,39 @@ jest-mock "^29.5.0" jest-util "^29.5.0" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@jest/fake-timers@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.2.tgz#fe9d43c5e4b1b901168fe6f46f861b3e652a2df4" + integrity sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/types" "^29.6.1" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-util "^29.6.2" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@jest/globals@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.2.tgz#74af81b9249122cc46f1eb25793617eec69bf21a" + integrity sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/types" "^29.6.1" + jest-mock "^29.6.2" + +"@jest/reporters@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" + integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@jest/console" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -1483,9 +1512,9 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + jest-worker "^29.6.2" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" @@ -1505,55 +1534,62 @@ dependencies: "@sinclair/typebox" "^0.25.16" -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.0.tgz#bd34a05b5737cb1a99d43e1957020ac8e5b9ddb1" + integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== dependencies: - "@jridgewell/trace-mapping" "^0.3.15" + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.2.tgz#fdd11583cd1608e4db3114e8f0cce277bf7a32ed" + integrity sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.6.2" + "@jest/types" "^29.6.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-sequencer@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz#585eff07a68dd75225a7eacf319780cb9f6b9bf4" + integrity sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.6.2" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.6.2" slash "^3.0.0" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@jest/transform@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" + integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" + jest-haste-map "^29.6.2" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" "@jest/types@^26.6.2": version "26.6.2" @@ -1589,6 +1625,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + dependencies: + "@jest/schemas" "^29.6.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -1611,6 +1659,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -1629,7 +1682,12 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -1645,6 +1703,14 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@^0.3.18": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2112,6 +2178,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sinonjs/commons@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" @@ -2200,10 +2271,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.2.5": - version "29.2.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.5.tgz#c27f41a9d6253f288d1910d3c5f09484a56b73c0" - integrity sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw== +"@types/jest@^29.5.3": + version "29.5.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.3.tgz#7a35dc0044ffb8b56325c6802a4781a626b05777" + integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2237,11 +2308,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.1.tgz#56af902ad157e763f9ba63d671c39cda3193c835" integrity sha512-oTQgnd0hblfLsJ6BvJzzSL+Inogp3lq9fGgqRkMB/ziKMgEUaFl801OncOzUmalfzt14N0oPHMK47ipl+wbTIw== -"@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== - "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -2770,15 +2836,15 @@ babel-core@^7.0.0-bridge.0: resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +babel-jest@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.2.tgz#cada0a59e07f5acaeb11cbae7e3ba92aec9c1126" + integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.6.2" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2801,10 +2867,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2874,12 +2940,12 @@ babel-preset-fbjs@^3.4.0: "@babel/plugin-transform-template-literals" "^7.0.0" babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -3387,10 +3453,10 @@ decimal.js@^10.4.2: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== deep-is@^0.1.3: version "0.1.3" @@ -3478,6 +3544,11 @@ diff-sequences@^29.3.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4021,7 +4092,7 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^29.0.0, expect@^29.3.1: +expect@^29.0.0: version "29.3.1" resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== @@ -4032,6 +4103,18 @@ expect@^29.0.0, expect@^29.3.1: jest-message-util "^29.3.1" jest-util "^29.3.1" +expect@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521" + integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== + dependencies: + "@jest/expect-utils" "^29.6.2" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -4996,82 +5079,83 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.2.tgz#1e6ffca60151ac66cad63fce34f443f6b5bb4258" + integrity sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.6.2" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.6.2" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== +jest-cli@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.2.tgz#edb381763398d1a292cd1b636a98bfa5644b8fda" + integrity sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q== dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-config "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +jest-config@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.2.tgz#c68723f06b31ca5e63030686e604727d406cd7c3" + integrity sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.6.2" + "@jest/types" "^29.6.1" + babel-jest "^29.6.2" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-circus "^29.6.2" + jest-environment-node "^29.6.2" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-runner "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.6.2" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -5085,39 +5169,49 @@ jest-diff@^29.3.1: jest-get-type "^29.2.0" pretty-format "^29.3.1" -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== +jest-diff@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.2.tgz#c36001e5543e82a0805051d3ceac32e6825c1c46" + integrity sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.2.tgz#c9e4b340bcbe838c73adf46b76817b15712d02ce" + integrity sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.1" chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-get-type "^29.4.3" + jest-util "^29.6.2" + pretty-format "^29.6.2" -jest-environment-jsdom@^29.4.1: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" - integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== +jest-environment-jsdom@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.2.tgz#4fc68836a7774a771819a2f980cb47af3b1629da" + integrity sha512-7oa/+266AAEgkzae8i1awNEfTfjwawWKLpiw2XesZmaoVVj9u9t8JOYx18cG29rbPNtkUlZ8V4b5Jb36y/VxoQ== dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" + jest-mock "^29.6.2" + jest-util "^29.6.2" jsdom "^20.0.0" -jest-environment-node@^29.2.1, jest-environment-node@^29.3.1: +jest-environment-node@^29.2.1: version "29.3.1" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== @@ -5129,6 +5223,18 @@ jest-environment-node@^29.2.1, jest-environment-node@^29.3.1: jest-mock "^29.3.1" jest-util "^29.3.1" +jest-environment-node@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.2.tgz#a9ea2cabff39b08eca14ccb32c8ceb924c8bb1ad" + integrity sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + jest-util "^29.6.2" + jest-get-type@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" @@ -5139,32 +5245,32 @@ jest-get-type@^29.4.3: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== +jest-haste-map@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" + integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + jest-worker "^29.6.2" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== +jest-leak-detector@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz#e2b307fee78cab091c37858a98c7e1d73cdf5b38" + integrity sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ== dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" jest-matcher-utils@^29.3.1: version "29.3.1" @@ -5176,6 +5282,16 @@ jest-matcher-utils@^29.3.1: jest-get-type "^29.2.0" pretty-format "^29.3.1" +jest-matcher-utils@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz#39de0be2baca7a64eacb27291f0bd834fea3a535" + integrity sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + jest-message-util@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" @@ -5206,6 +5322,21 @@ jest-message-util@^29.5.0: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.2.tgz#af7adc2209c552f3f5ae31e77cf0a261f23dc2bb" + integrity sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^29.3.1, jest-mock@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" @@ -5215,6 +5346,15 @@ jest-mock@^29.3.1, jest-mock@^29.5.0: "@types/node" "*" jest-util "^29.5.0" +jest-mock@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.2.tgz#ef9c9b4d38c34a2ad61010a021866dad41ce5e00" + integrity sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-util "^29.6.2" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -5225,118 +5365,114 @@ jest-regex-util@^27.0.6: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +jest-resolve-dependencies@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz#36435269b6672c256bcc85fb384872c134cc4cf2" + integrity sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w== dependencies: - jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" + jest-regex-util "^29.4.3" + jest-snapshot "^29.6.2" -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.2.tgz#f18405fe4b50159b7b6d85e81f6a524d22afb838" + integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.6.2" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.6.2" + jest-validate "^29.6.2" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== +jest-runner@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.2.tgz#89e8e32a8fef24781a7c4c49cd1cb6358ac7fc01" + integrity sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w== dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.6.2" + "@jest/environment" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + jest-docblock "^29.4.3" + jest-environment-node "^29.6.2" + jest-haste-map "^29.6.2" + jest-leak-detector "^29.6.2" + jest-message-util "^29.6.2" + jest-resolve "^29.6.2" + jest-runtime "^29.6.2" + jest-util "^29.6.2" + jest-watcher "^29.6.2" + jest-worker "^29.6.2" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +jest-runtime@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.2.tgz#692f25e387f982e89ab83270e684a9786248e545" + integrity sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/globals" "^29.6.2" + "@jest/source-map" "^29.6.0" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.2.tgz#9b431b561a83f2bdfe041e1cab8a6becdb01af9c" + integrity sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" + "@jest/expect-utils" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.6.2" graceful-fs "^4.2.9" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" natural-compare "^1.4.0" - pretty-format "^29.3.1" - semver "^7.3.5" + pretty-format "^29.6.2" + semver "^7.5.3" jest-util@^27.2.0: version "27.5.1" @@ -5362,6 +5498,18 @@ jest-util@^29.0.0, jest-util@^29.3.1, jest-util@^29.5.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.2.tgz#8a052df8fff2eebe446769fd88814521a517664d" + integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^29.2.1: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" @@ -5374,30 +5522,30 @@ jest-validate@^29.2.1: leven "^3.1.0" pretty-format "^29.5.0" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +jest-validate@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.2.tgz#25d972af35b2415b83b1373baf1a47bb266c1082" + integrity sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.1" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.2.0" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.6.2" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +jest-watcher@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.2.tgz#77c224674f0620d9f6643c4cfca186d8893ca088" + integrity sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA== dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.3.1" + jest-util "^29.6.2" string-length "^4.0.1" jest-worker@^27.2.0: @@ -5409,25 +5557,25 @@ jest-worker@^27.2.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +jest-worker@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" + integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== dependencies: "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.6.2" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== +jest@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.2.tgz#3bd55b9fd46a161b2edbdf5f1d1bd0d1eab76c42" + integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== dependencies: - "@jest/core" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.6.2" + "@jest/types" "^29.6.1" import-local "^3.0.2" - jest-cli "^29.3.1" + jest-cli "^29.6.2" joi@^17.2.1: version "17.7.0" @@ -6689,6 +6837,15 @@ pretty-format@^29.5.0: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" + integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -6751,6 +6908,11 @@ punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -7103,10 +7265,10 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.1.6: version "1.22.2" @@ -7237,18 +7399,18 @@ scheduler@0.24.0-canary-efb381bbf-20230505: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3: +semver@^6.0.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.2.1, semver@^7.3.2, semver@^7.3.7, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -7815,10 +7977,10 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -ts-jest@^29.0.5: - version "29.0.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" - integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -7826,7 +7988,7 @@ ts-jest@^29.0.5: json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" - semver "7.x" + semver "^7.5.3" yargs-parser "^21.0.1" tsconfig-paths@^3.9.0: @@ -8264,7 +8426,7 @@ write-file-atomic@^2.3.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==