diff --git a/.gitignore b/.gitignore index e5e2becde3c4..3e1055d791aa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.swp *~ /examples/*/node_modules/ +/examples/react-native/.watchman-cookie-* /e2e/*/node_modules /e2e/*/.pnp @@ -12,6 +13,7 @@ !/e2e/presets/js/node_modules /e2e/transform/*/coverage /e2e/transform/*/node_modules +/e2e/custom-jsdom-version/*/node_modules /node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md index ca86cce4f524..c821cb1e6cc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ ## main +## 30.2.0 + +### Chore & Maintenance + +- `[*]` Update example repo for testing React Native projects ([#15832](https://github.com/jestjs/jest/pull/15832)) +- `[*]` Update `jest-watch-typeahead` to v3 ([#15830](https://github.com/jestjs/jest/pull/15830)) + +## Features + +- `[jest-environment-jsdom-abstract]` Add support for JSDOM v27 ([#15834](https://github.com/jestjs/jest/pull/15834)) + +### Fixes + +- `[babel-jest]` Export the `TransformerConfig` interface ([#15820](https://github.com/jestjs/jest/pull/15820)) +- `[jest-config]` Fix `jest.config.ts` with TS loader specified in docblock pragma ([#15839](https://github.com/jestjs/jest/pull/15839)) + ## 30.1.3 ### Fixes @@ -17,6 +33,7 @@ ### Fixes - `[jest-snapshot-utils]` Fix deprecated goo.gl snapshot warning not handling Windows end-of-line sequences ([#15800](https://github.com/jestjs/jest/pull/15800)) +- `[jest-snapshot-utils]` Improve messaging about goo.gl snapshot link change ([#15821](https://github.com/jestjs/jest/pull/15821)) ## 30.1.0 diff --git a/SECURITY.md b/SECURITY.md index a554f0f56ccf..68caf8ef239d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,5 +1,26 @@ +# Security Policy + ## Reporting a Vulnerability -If you discover a security vulnerability within Jest, please submit a report via the GitHub's [Private Vulnerability Reporting](https://github.com/jestjs/jest/security/advisories) feature. +Please report security issues **privately** using GitHub’s **Report a vulnerability** form on this repository (Security tab). + +**Do not** file public GitHub issues for security problems. + +When reporting, please include: + +- Affected project/repo and version(s) +- Impact and component(s) involved +- Reproduction steps or PoC (if available) +- Your contact and preferred credit name + +If you do not receive an acknowledgement of your report within **6 business days**, or if you cannot find a private security contact for the project, you may **escalate to the OpenJS Foundation CNA** at `security@lists.openjsf.org`. + +If the project acknowledges your report but does not provide any further response or engagement within **14 days**, escalation is also appropriate. + +## Coordination & Disclosure + +We follow coordinated vulnerability disclosure: -All security vulnerabilities will be promptly addressed. +- We will acknowledge your report, assess impact, and work on a fix. +- We aim to provide status updates at reasonable intervals until resolution. +- We will publish a security advisory (and **CVE via the OpenJS CNA when applicable**) once a fix or mitigation is available. We credit reporters by default unless you request otherwise. diff --git a/docs/Configuration.md b/docs/Configuration.md index 1d24892ffc40..8518ff1708f7 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -1135,7 +1135,7 @@ Default: `undefined` A preset that is used as a base for Jest's configuration. A preset should point to an npm module that has a `jest-preset.json`, `jest-preset.js`, `jest-preset.cjs` or `jest-preset.mjs` file at the root. -For example, this preset `foo-bar/jest-preset.js` will be configured as follows: +For example, this preset `foo-bar/jest-preset.js` will be used as follows: ```js tab /** @type {import('jest').Config} */ @@ -2472,7 +2472,7 @@ This option allows you to use custom watch plugins. Read more about watch plugin Examples of watch plugins include: - [`jest-watch-master`](https://github.com/rickhanlonii/jest-watch-master) -- [`jest-watch-select-projects`](https://github.com/rogeliog/jest-watch-select-projects) +- [`jest-watch-select-projects`](https://github.com/jest-community/jest-watch-select-projects) - [`jest-watch-suspend`](https://github.com/unional/jest-watch-suspend) - [`jest-watch-typeahead`](https://github.com/jest-community/jest-watch-typeahead) - [`jest-watch-yarn-workspaces`](https://github.com/cameronhunter/jest-watch-directories/tree/master/packages/jest-watch-yarn-workspaces) diff --git a/docs/SnapshotTesting.md b/docs/SnapshotTesting.md index 0144a2f64a3b..02f45482ddb3 100644 --- a/docs/SnapshotTesting.md +++ b/docs/SnapshotTesting.md @@ -9,17 +9,17 @@ A typical snapshot test case renders a UI component, takes a snapshot, then comp ## Snapshot Testing with Jest -A similar approach can be taken when it comes to testing your React components. Instead of rendering the graphical UI, which would require building the entire app, you can use a test renderer to quickly generate a serializable value for your React tree. Consider this [example test](https://github.com/jestjs/jest/blob/main/examples/snapshot/__tests__/link.test.js) for a [Link component](https://github.com/jestjs/jest/blob/main/examples/snapshot/Link.js): +A similar approach can be taken when it comes to testing your React components. Instead of rendering the graphical UI, which would require building the entire app, you can use a test renderer to quickly generate a serializable value for your React component. Consider this [example test](https://github.com/jestjs/jest/blob/main/examples/snapshot/__tests__/link.test.js) for a [Link component](https://github.com/jestjs/jest/blob/main/examples/snapshot/Link.js): ```tsx -import renderer from 'react-test-renderer'; +import {render} from '@testing-library/react'; import Link from '../Link'; it('renders correctly', () => { - const tree = renderer - .create(Facebook) - .toJSON(); - expect(tree).toMatchSnapshot(); + const {container} = render( + Facebook, + ); + expect(container.firstChild).toMatchSnapshot(); }); ``` @@ -28,10 +28,9 @@ The first time this test is run, Jest creates a [snapshot file](https://github.c ```javascript exports[`renders correctly 1`] = ` Facebook @@ -61,10 +60,10 @@ One such situation can arise if we intentionally change the address the Link com ```tsx // Updated test case with a Link to a different address it('renders correctly', () => { - const tree = renderer - .create(Instagram) - .toJSON(); - expect(tree).toMatchSnapshot(); + const {container} = render( + Instagram, + ); + expect(container.firstChild).toMatchSnapshot(); }); ``` @@ -112,10 +111,10 @@ First, you write a test, calling `.toMatchInlineSnapshot()` with no arguments: ```tsx it('renders correctly', () => { - const tree = renderer - .create(Example Site) - .toJSON(); - expect(tree).toMatchInlineSnapshot(); + const {container} = render( + Example Site, + ); + expect(container.firstChild).toMatchInlineSnapshot(); }); ``` @@ -123,15 +122,14 @@ The next time you run Jest, `tree` will be evaluated, and a snapshot will be wri ```tsx it('renders correctly', () => { - const tree = renderer - .create(Example Site) - .toJSON(); - expect(tree).toMatchInlineSnapshot(` + const {container} = render( + Example Site, + ); + expect(container.firstChild).toMatchInlineSnapshot(` Example Site diff --git a/docs/TutorialReactNative.md b/docs/TutorialReactNative.md index 70a6cbaf2cce..1ae94cbc35ff 100644 --- a/docs/TutorialReactNative.md +++ b/docs/TutorialReactNative.md @@ -5,28 +5,26 @@ title: Testing React Native Apps At Facebook, we use Jest to test [React Native](https://reactnative.dev/) applications. -Get a deeper insight into testing a working React Native app example by reading the following series: [Part 1: Jest – Snapshot come into play](https://callstack.com/blog/testing-react-native-with-the-new-jest-part-1-snapshots-come-into-play/) and [Part 2: Jest – Redux Snapshots for your Actions and Reducers](https://callstack.com/blog/testing-react-native-with-the-new-jest-part-2-redux-snapshots-for-your-actions-and-reducers/). +Get a deeper insight into testing a working React Native app example by reading the following series: + +- [Part 1: Jest – Snapshot come into play](https://callstack.com/blog/testing-react-native-with-the-new-jest-part-1-snapshots-come-into-play/) +- [Part 2: Jest – Redux Snapshots for your Actions and Reducers](https://callstack.com/blog/testing-react-native-with-the-new-jest-part-2-redux-snapshots-for-your-actions-and-reducers/). ## Setup -Starting from react-native version 0.38, a Jest setup is included by default when running `react-native init`. The following configuration should be automatically added to your package.json file: +Starting from react-native version 0.38, a Jest setup is included by default when running `npx @react-native-community/cli init`. The following configuration should be automatically added to your React Native's `jest.config.js` file: -```json -{ - "scripts": { - "test": "jest" - }, - "jest": { - "preset": "react-native" - } -} +```js +module.exports = { + preset: 'react-native', +}; ``` Run `yarn test` to run tests with Jest. :::tip -If you are upgrading your react-native application and previously used the `jest-react-native` preset, remove the dependency from your `package.json` file and change the preset to `react-native` instead. +If you are upgrading your react-native application and previously used the `jest-react-native` or `react-native` preset, remove the dependency from your `package.json` file and change the preset to `react-native` in `jest.config.js` instead. ::: @@ -133,7 +131,7 @@ The preset sets up the environment and is very opinionated and based on what we ### Environment -`react-native` ships with a Jest preset, so the `jest.preset` field of your `package.json` should point to `react-native`. The preset is a node environment that mimics the environment of a React Native app. Because it doesn't load any DOM or browser APIs, it greatly improves Jest's startup time. +`react-native` ships with a Jest preset, so the `preset` field of your `jest.config.js` should point to `react-native`. The preset is a node environment that mimics the environment of a React Native app. Because it doesn't load any DOM or browser APIs, it greatly improves Jest's startup time. ### transformIgnorePatterns customization diff --git a/e2e/__tests__/__snapshots__/circusConcurrent.test.ts.snap b/e2e/__tests__/__snapshots__/circusConcurrent.test.ts.snap index 711f8d8b926c..d978b00a8dec 100644 --- a/e2e/__tests__/__snapshots__/circusConcurrent.test.ts.snap +++ b/e2e/__tests__/__snapshots__/circusConcurrent.test.ts.snap @@ -16,6 +16,36 @@ exports[`all passing runs the tests in the correct order 1`] = ` at log (__tests__/concurrent.test.js:15:11) + console.log + START "eleven" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + START "twelve" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + END: "eleven" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + END: "twelve" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + END: "one" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + END: "two" + + at log (__tests__/concurrent.test.js:15:11) + console.log START "three" @@ -27,57 +57,57 @@ exports[`all passing runs the tests in the correct order 1`] = ` at log (__tests__/concurrent.test.js:15:11) console.log - START "five" + START "nine" at log (__tests__/concurrent.test.js:15:11) console.log - END: "three" + START "ten" at log (__tests__/concurrent.test.js:15:11) console.log - START "six" + END: "three" at log (__tests__/concurrent.test.js:15:11) console.log - END: "one" + END: "nine" at log (__tests__/concurrent.test.js:15:11) console.log - START "seven" + END: "four" at log (__tests__/concurrent.test.js:15:11) console.log - END: "two" + END: "ten" at log (__tests__/concurrent.test.js:15:11) console.log - START "eight" + START hook "beforeAll level 2, group 1" at log (__tests__/concurrent.test.js:15:11) console.log - END: "four" + END hook: "beforeAll level 2, group 1" at log (__tests__/concurrent.test.js:15:11) console.log - START "nine" + START "five" at log (__tests__/concurrent.test.js:15:11) console.log - END: "nine" + START "six" at log (__tests__/concurrent.test.js:15:11) console.log - START "ten" + END: "six" at log (__tests__/concurrent.test.js:15:11) @@ -87,17 +117,32 @@ exports[`all passing runs the tests in the correct order 1`] = ` at log (__tests__/concurrent.test.js:15:11) console.log - END: "six" + START hook "afterAll level 2, group 1" at log (__tests__/concurrent.test.js:15:11) console.log - END: "seven" + END hook: "afterAll level 2, group 1" at log (__tests__/concurrent.test.js:15:11) console.log - END: "ten" + START hook "beforeAll level 2, group 2" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + END hook: "beforeAll level 2, group 2" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + START "seven" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + START "eight" at log (__tests__/concurrent.test.js:15:11) @@ -106,6 +151,21 @@ exports[`all passing runs the tests in the correct order 1`] = ` at log (__tests__/concurrent.test.js:15:11) + console.log + END: "seven" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + START hook "afterAll level 2, group 2" + + at log (__tests__/concurrent.test.js:15:11) + + console.log + END hook: "afterAll level 2, group 2" + + at log (__tests__/concurrent.test.js:15:11) + console.log afterAll @@ -120,32 +180,32 @@ exports[`with only runs the tests in the correct order 1`] = ` at log (__tests__/concurrent-only.test.js:15:11) console.log - START "four" + START "nine" at log (__tests__/concurrent-only.test.js:15:11) console.log - START "six" + END: "nine" at log (__tests__/concurrent-only.test.js:15:11) console.log - START "nine" + START "four" at log (__tests__/concurrent-only.test.js:15:11) console.log - END: "nine" + END: "four" at log (__tests__/concurrent-only.test.js:15:11) console.log - END: "six" + START "six" at log (__tests__/concurrent-only.test.js:15:11) console.log - END: "four" + END: "six" at log (__tests__/concurrent-only.test.js:15:11) @@ -173,52 +233,52 @@ exports[`with skip runs the tests in the correct order 1`] = ` at log (__tests__/concurrent-skip.test.js:15:11) console.log - START "four" + START "ten" at log (__tests__/concurrent-skip.test.js:15:11) console.log - START "seven" + END: "ten" at log (__tests__/concurrent-skip.test.js:15:11) console.log - START "eight" + END: "one" at log (__tests__/concurrent-skip.test.js:15:11) console.log - END: "one" + END: "two" at log (__tests__/concurrent-skip.test.js:15:11) console.log - START "ten" + START "four" at log (__tests__/concurrent-skip.test.js:15:11) console.log - END: "two" + START "seven" at log (__tests__/concurrent-skip.test.js:15:11) console.log - END: "seven" + START "eight" at log (__tests__/concurrent-skip.test.js:15:11) console.log - END: "four" + END: "seven" at log (__tests__/concurrent-skip.test.js:15:11) console.log - END: "eight" + END: "four" at log (__tests__/concurrent-skip.test.js:15:11) console.log - END: "ten" + END: "eight" at log (__tests__/concurrent-skip.test.js:15:11) diff --git a/e2e/__tests__/__snapshots__/jest.config.ts.test.ts.snap b/e2e/__tests__/__snapshots__/jest.config.ts.test.ts.snap index 3a51ef8a6068..603749065b71 100644 --- a/e2e/__tests__/__snapshots__/jest.config.ts.test.ts.snap +++ b/e2e/__tests__/__snapshots__/jest.config.ts.test.ts.snap @@ -45,6 +45,19 @@ jest.config.ts(1,17): error TS1005: ';' expected. jest.config.ts(1,39): error TS1002: Unterminated string literal." `; +exports[`on node ^23.6 load typed jest.config.ts with TS loader specified in docblock pragma 1`] = ` +"PASS __tests__/a-giraffe.js + ✓ giraffe" +`; + +exports[`on node ^23.6 load typed jest.config.ts with TS loader specified in docblock pragma 2`] = ` +"Test Suites: 1 passed, 1 total +Tests: 1 passed, 1 total +Snapshots: 0 total +Time: <> +Ran all test suites." +`; + exports[`traverses directory tree up until it finds jest.config 1`] = ` " console.log <>/jest-config-ts/some/nested/directory diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index 35ee2757f2ce..081a86377d1c 100644 --- a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap +++ b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap @@ -41,7 +41,7 @@ exports[`moduleNameMapper wrong array configuration 1`] = ` 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1121:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1117:17) at Object.require (index.js:10:1) at Object.require (__tests__/index.js:10:20)" `; @@ -71,7 +71,7 @@ exports[`moduleNameMapper wrong configuration 1`] = ` 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1121:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1117:17) at Object.require (index.js:10:1) at Object.require (__tests__/index.js:10:20)" `; diff --git a/e2e/__tests__/__snapshots__/testRetries.test.ts.snap b/e2e/__tests__/__snapshots__/testRetries.test.ts.snap index 3513fcba7eb4..22ae9f7de914 100644 --- a/e2e/__tests__/__snapshots__/testRetries.test.ts.snap +++ b/e2e/__tests__/__snapshots__/testRetries.test.ts.snap @@ -33,7 +33,6 @@ exports[`Concurrent Test Retries with flag retryImmediately retry immediately af 20 | at Object.toBeFalsy (__tests__/retryImmediatelyConcurrent.test.js:17:18) - at async Promise.all (index 0) LOGGING RETRY ERRORS retryable test 2 RETRY 1 @@ -67,7 +66,6 @@ exports[`Concurrent Test Retries with flag retryImmediately retry immediately af 31 | it.concurrent('truthy test', () => { at Object.toBeFalsy (__tests__/retryImmediatelyConcurrent.test.js:28:18) - at async Promise.all (index 1) PASS __tests__/retryImmediatelyConcurrent.test.js ✓ retryable test 1 diff --git a/e2e/__tests__/__snapshots__/transform.test.ts.snap b/e2e/__tests__/__snapshots__/transform.test.ts.snap index 2a45dc91b63d..a34e43eb753a 100644 --- a/e2e/__tests__/__snapshots__/transform.test.ts.snap +++ b/e2e/__tests__/__snapshots__/transform.test.ts.snap @@ -6,7 +6,7 @@ exports[`babel-jest ignored tells user to match ignored files 1`] = ` babel-jest: Babel ignores __tests__/ignoredFile.test.js - make sure to include the file in Jest's transformIgnorePatterns as well. - at assertLoadedBabelConfig (../../../packages/babel-jest/build/index.js:137:11)" + at assertLoadedBabelConfig (../../../packages/babel-jest/build/index.js:148:11)" `; exports[`babel-jest instruments only specific files and collects coverage 1`] = ` diff --git a/e2e/__tests__/circusConcurrent.test.ts b/e2e/__tests__/circusConcurrent.test.ts index de2bfbcf7549..0dbdd3437a30 100644 --- a/e2e/__tests__/circusConcurrent.test.ts +++ b/e2e/__tests__/circusConcurrent.test.ts @@ -18,8 +18,8 @@ describe('all passing', () => { ]); expect(exitCode).toBe(0); - expect(json.numTotalTests).toBe(10); - expect(json.numPassedTests).toBe(10); + expect(json.numTotalTests).toBe(12); + expect(json.numPassedTests).toBe(12); expect(json.numFailedTests).toBe(0); expect(json.numPendingTests).toBe(0); }); diff --git a/e2e/__tests__/custom-jsdom-version.test.ts b/e2e/__tests__/custom-jsdom-version.test.ts new file mode 100644 index 000000000000..8ca813c8bc08 --- /dev/null +++ b/e2e/__tests__/custom-jsdom-version.test.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import path from 'node:path'; +import {onNodeVersions} from '@jest/test-utils'; +import runJest, {type RunJestResult} from '../runJest'; +import {runYarnInstall} from '../Utils'; + +const getLog = (result: RunJestResult) => result.stdout.split('\n')[1].trim(); + +const dir = path.resolve(__dirname, '../custom-jsdom-version/v27'); + +beforeEach(() => { + runYarnInstall(dir); +}); + +onNodeVersions('>=20.4.0', () => { + it('should work with custom jsdom version', () => { + const result = runJest(dir, ['env.test.js']); + expect(result.exitCode).toBe(0); + expect(getLog(result)).toBe('WINDOW'); + }); +}); diff --git a/e2e/__tests__/jest.config.ts.test.ts b/e2e/__tests__/jest.config.ts.test.ts index 3fc52fa9187f..5e338c861a39 100644 --- a/e2e/__tests__/jest.config.ts.test.ts +++ b/e2e/__tests__/jest.config.ts.test.ts @@ -176,6 +176,29 @@ onNodeVersions('^23.6', () => { ).toMatchSnapshot(); expect(exitCode).toBe(1); }); + + test('load typed jest.config.ts with TS loader specified in docblock pragma', () => { + writeFiles(DIR, { + '__tests__/a-giraffe.js': "test('giraffe', () => expect(1).toBe(1));", + 'foo.ts': 'export const a = () => {};', + 'jest.config.ts': ` + /** @jest-config-loader ts-node */ + import { a } from './foo' + a(); + import type {Config} from 'jest'; + const config: Config = { testTimeout: 10000 }; + export default config; + `, + 'package.json': '{}', + }); + const {stderr, exitCode} = runJest(DIR, ['-w=1', '--ci=false'], { + nodeOptions: '--no-warnings', + }); + const {rest, summary} = extractSummary(stderr); + expect(exitCode).toBe(0); + expect(rest).toMatchSnapshot(); + expect(summary).toMatchSnapshot(); + }); }); onNodeVersions('>=24', () => { diff --git a/e2e/__tests__/testRetries.test.ts b/e2e/__tests__/testRetries.test.ts index ca07427a0be6..971aaa65581c 100644 --- a/e2e/__tests__/testRetries.test.ts +++ b/e2e/__tests__/testRetries.test.ts @@ -205,13 +205,11 @@ describe('Concurrent Test Retries', () => { SECOND TRUTHY TEST at Object.log (__tests__/retryImmediatelyConcurrent.test.js:14:13) - at async Promise.all (index 0) console.log THIRD TRUTHY TEST - at Object.log (__tests__/retryImmediatelyConcurrent.test.js:25:13) - at async Promise.all (index 1)`; + at Object.log (__tests__/retryImmediatelyConcurrent.test.js:25:13)`; const result = runJest('test-retries', [ 'retryImmediatelyConcurrent.test.js', diff --git a/e2e/__tests__/toMatchInlineSnapshotWithJSX.test.ts b/e2e/__tests__/toMatchInlineSnapshotWithJSX.test.ts index 85d0f78fe9a6..1629284bc428 100644 --- a/e2e/__tests__/toMatchInlineSnapshotWithJSX.test.ts +++ b/e2e/__tests__/toMatchInlineSnapshotWithJSX.test.ts @@ -27,13 +27,15 @@ const babelConfig = { const pkg: PackageJson = { dependencies: { - react: '^17.0.0', + react: '^18.0.0', + 'react-dom': '^18.0.0', }, devDependencies: { '@babel/core': '^7.14.4', '@babel/preset-env': '^7.14.4', '@babel/preset-react': '^7.13.13', - 'react-test-renderer': '^17.0.2', + '@testing-library/dom': '^10.4.1', + '@testing-library/react': '^16.3.0', }, jest: { testEnvironment: 'jsdom', @@ -48,10 +50,10 @@ beforeEach(() => { writeFiles(DIR, { '__tests__/MismatchingSnapshot.test.js': ` import React from 'react'; - import renderer from 'react-test-renderer'; + import {render} from '@testing-library/react'; test('
x
', () => { - expect(renderer.create(
x
).toJSON()).toMatchInlineSnapshot(\` + expect(render(
x
).container.firstChild).toMatchInlineSnapshot(\`
y
@@ -94,13 +96,13 @@ it('successfully runs the tests with external babel config', () => { 3 | 4 | test('
x
', () => { - > 5 | expect(renderer.create(
x
).toJSON()).toMatchInlineSnapshot(\` - | ^ + > 5 | expect(render(
x
).container.firstChild).toMatchInlineSnapshot(\` + | ^ 6 |
7 | y 8 |
- at Object.toMatchInlineSnapshot (__tests__/MismatchingSnapshot.test.js:5:50) + at Object.toMatchInlineSnapshot (__tests__/MismatchingSnapshot.test.js:5:53) " `); @@ -143,13 +145,13 @@ it('successfully runs the tests with inline babel config', () => { 3 | 4 | test('
x
', () => { - > 5 | expect(renderer.create(
x
).toJSON()).toMatchInlineSnapshot(\` - | ^ + > 5 | expect(render(
x
).container.firstChild).toMatchInlineSnapshot(\` + | ^ 6 |
7 | y 8 |
- at Object.toMatchInlineSnapshot (__tests__/MismatchingSnapshot.test.js:5:50) + at Object.toMatchInlineSnapshot (__tests__/MismatchingSnapshot.test.js:5:53) " `); diff --git a/e2e/circus-concurrent/__tests__/concurrent.test.js b/e2e/circus-concurrent/__tests__/concurrent.test.js index 71fd346c1ec0..6fc14c835e45 100644 --- a/e2e/circus-concurrent/__tests__/concurrent.test.js +++ b/e2e/circus-concurrent/__tests__/concurrent.test.js @@ -34,6 +34,13 @@ const testFn = (name, delay, fail) => { marker(`END: "${name}"`); }; }; +const hookFn = (name, delay) => { + return async () => { + marker(`START hook "${name}"`); + await setTimeout(delay); + marker(`END hook: "${name}"`); + }; +}; it.concurrent('one', testFn('one', 85)); it.concurrent('two', testFn('two', 100)); @@ -43,21 +50,32 @@ describe('level 1', () => { afterEach(() => marker('afterEach level 1')); it.concurrent('three', testFn('three', 70)); - it.concurrent('four', testFn('four', 120)); - describe('level 2', () => { - beforeEach(() => marker('beforeEach level 2')); - afterEach(() => marker('afterEach level 2')); - it.concurrent('five', testFn('five', 160)); + describe('level 2, group 1', () => { + beforeAll(hookFn('beforeAll level 2, group 1', 85)); + afterAll(hookFn('afterAll level 2, group 1', 85)); + beforeEach(hookFn('beforeEach level 2, group 1', 85)); + afterEach(hookFn('afterEach level 2, group 1', 85)); + + it.concurrent('five', testFn('five', 160)); it.concurrent('six', testFn('six', 100)); }); + describe('level 2, group 2', () => { + beforeAll(hookFn('beforeAll level 2, group 2', 85)); + afterAll(hookFn('afterAll level 2, group 2', 85)); - it.concurrent('seven', testFn('seven', 100)); - it.concurrent('eight', testFn('eight', 120)); -}); + beforeEach(hookFn('beforeEach level 2, group 2', 85)); + afterEach(hookFn('afterEach level 2, group 2', 85)); -it.concurrent('nine', testFn('nine', 20)); + it.concurrent('seven', testFn('seven', 160)); + it.concurrent('eight', testFn('eight', 100)); + }); + + it.concurrent('nine', testFn('nine', 100)); + it.concurrent('ten', testFn('ten', 120)); +}); -it.concurrent('ten', testFn('ten', 50)); +it.concurrent('eleven', testFn('eleven', 20)); +it.concurrent('twelve', testFn('twelve', 50)); diff --git a/e2e/coverage-transform-instrumented/package.json b/e2e/coverage-transform-instrumented/package.json index 50df2753878d..4efc095705cd 100644 --- a/e2e/coverage-transform-instrumented/package.json +++ b/e2e/coverage-transform-instrumented/package.json @@ -25,6 +25,6 @@ "dependencies": { "@babel/core": "^7.0.0", "@babel/preset-env": "^7.0.0", - "babel-plugin-istanbul": "^7.0.0" + "babel-plugin-istanbul": "^7.0.1" } } diff --git a/e2e/coverage-transform-instrumented/yarn.lock b/e2e/coverage-transform-instrumented/yarn.lock index 2a4a9ee92489..9bf2cf3b1852 100644 --- a/e2e/coverage-transform-instrumented/yarn.lock +++ b/e2e/coverage-transform-instrumented/yarn.lock @@ -1162,16 +1162,16 @@ __metadata: languageName: node linkType: hard -"babel-plugin-istanbul@npm:^7.0.0": - version: 7.0.0 - resolution: "babel-plugin-istanbul@npm:7.0.0" +"babel-plugin-istanbul@npm:^7.0.1": + version: 7.0.1 + resolution: "babel-plugin-istanbul@npm:7.0.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.0.0" "@istanbuljs/load-nyc-config": "npm:^1.0.0" "@istanbuljs/schema": "npm:^0.1.3" istanbul-lib-instrument: "npm:^6.0.2" test-exclude: "npm:^6.0.0" - checksum: 10/4df567f29161c7f50737ed1884c7f08203f4d0cb1684c499fca374fcf5059396eacb02f8f727bf7a82bbf3e50b9f4a24bcb026a1678f63940d8f0f78546e3774 + checksum: 10/fe9f865f975aaa7a033de9ccb2b63fdcca7817266c5e98d3e02ac7ffd774c695093d215302796cb3770a71ef4574e7a9b298504c3c0c104cf4b48c8eda67b2a6 languageName: node linkType: hard @@ -1679,7 +1679,7 @@ __metadata: dependencies: "@babel/core": "npm:^7.0.0" "@babel/preset-env": "npm:^7.0.0" - babel-plugin-istanbul: "npm:^7.0.0" + babel-plugin-istanbul: "npm:^7.0.1" languageName: unknown linkType: soft diff --git a/packages/babel-jest/src/loadBabelConfig.ts b/e2e/custom-jsdom-version/v27/__tests__/env.test.js similarity index 60% rename from packages/babel-jest/src/loadBabelConfig.ts rename to e2e/custom-jsdom-version/v27/__tests__/env.test.js index 0c53df81a24b..b74e9004bc29 100644 --- a/packages/babel-jest/src/loadBabelConfig.ts +++ b/e2e/custom-jsdom-version/v27/__tests__/env.test.js @@ -4,6 +4,8 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ +'use strict'; -// this is a separate file so it can be mocked in tests -export {loadPartialConfig, loadPartialConfigAsync} from '@babel/core'; +console.log(globalThis.window ? 'WINDOW' : 'NO WINDOW'); + +test('stub', () => expect(1).toBe(1)); diff --git a/e2e/custom-jsdom-version/v27/custom-jsdom-env.js b/e2e/custom-jsdom-version/v27/custom-jsdom-env.js new file mode 100644 index 000000000000..5055a32d36fa --- /dev/null +++ b/e2e/custom-jsdom-version/v27/custom-jsdom-env.js @@ -0,0 +1,15 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import JSDOM from 'jsdom'; +import BaseEnv from '@jest/environment-jsdom-abstract'; + +export default class JestJSDOMEnvironment extends BaseEnv { + constructor(config, context) { + super(config, context, JSDOM); + } +} diff --git a/e2e/custom-jsdom-version/v27/package.json b/e2e/custom-jsdom-version/v27/package.json new file mode 100644 index 000000000000..5572a62683cd --- /dev/null +++ b/e2e/custom-jsdom-version/v27/package.json @@ -0,0 +1,8 @@ +{ + "devDependencies": { + "jsdom": "^27.0.0" + }, + "jest": { + "testEnvironment": "./custom-jsdom-env.js" + } +} diff --git a/e2e/custom-jsdom-version/v27/yarn.lock b/e2e/custom-jsdom-version/v27/yarn.lock new file mode 100644 index 000000000000..9ec713d136d6 --- /dev/null +++ b/e2e/custom-jsdom-version/v27/yarn.lock @@ -0,0 +1,440 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10 + +"@asamuzakjp/css-color@npm:^4.0.3": + version: 4.0.4 + resolution: "@asamuzakjp/css-color@npm:4.0.4" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + lru-cache: "npm:^11.1.0" + checksum: 10/2c991929d135067843bd768ba6fb9de231b98fdbcc0ac86aeb881fb09c4a12f3e0ae4a55170ebe7ff67ea5b7d9c83c6672f5d57d8c75805cc054ca7e7dcc13eb + languageName: node + linkType: hard + +"@asamuzakjp/dom-selector@npm:^6.5.4": + version: 6.5.5 + resolution: "@asamuzakjp/dom-selector@npm:6.5.5" + dependencies: + "@asamuzakjp/nwsapi": "npm:^2.3.9" + bidi-js: "npm:^1.0.3" + css-tree: "npm:^3.1.0" + is-potential-custom-element-name: "npm:^1.0.1" + checksum: 10/c44eba46d11bc7aa9eb1a91c90057d020542f544e572601681258c46b3a7a94863b8f70db99189ad72a98292bf1292b6246380f00bf1ded7ba69db8701e8af64 + languageName: node + linkType: hard + +"@asamuzakjp/nwsapi@npm:^2.3.9": + version: 2.3.9 + resolution: "@asamuzakjp/nwsapi@npm:2.3.9" + checksum: 10/95a6d1c102e1117fe818da087fcc5b914d23e0699855991bae50b891435dd1945ad7d384198f8bcf616207fd85b7ec32e3db6b96e9309d84c6903b8dc4151e34 + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@csstools/color-helpers@npm:5.1.0" + checksum: 10/0138b3d5ccbe77aeccf6721fd008a53523c70e932f0c82dca24a1277ca780447e1d8357da47512ebf96358476f8764de57002f3e491920d67e69202f5a74c383 + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.4": + version: 2.1.4 + resolution: "@csstools/css-calc@npm:2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/06975b650c0f44c60eeb7afdb3fd236f2dd607b2c622e0bc908d3f54de39eb84e0692833320d03dac04bd6c1ab0154aa3fa0dd442bd9e5f917cf14d8e2ba8d74 + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.0.10": + version: 3.1.0 + resolution: "@csstools/css-color-parser@npm:3.1.0" + dependencies: + "@csstools/color-helpers": "npm:^5.1.0" + "@csstools/css-calc": "npm:^2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/4741095fdc4501e8e7ada4ed14fbf9dbbe6fea9b989818790ebca15657c29c62defbebacf18592cde2aa638a1d098bbe86d742d2c84ba932fbc00fac51cb8805 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/css-parser-algorithms@npm:3.0.5" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/e93083b5cb36a3c1e7a47ce10cf62961d05bd1e4c608bb3ee50186ff740157ab0ec16a3956f7b86251efd10703034d849693201eea858ae904848c68d2d46ada + languageName: node + linkType: hard + +"@csstools/css-syntax-patches-for-csstree@npm:^1.0.14": + version: 1.0.14 + resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.0.14" + peerDependencies: + postcss: ^8.4 + checksum: 10/c783d5db307552f483d95266452a7765ca138a9e64f12d013c63e960c9c8abbf82c899a34028af1f5ad714e0e94edd97b1aa31784923c1d7d1756d775c3c1d0a + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-tokenizer@npm:3.0.4" + checksum: 10/eb6c84c086312f6bb8758dfe2c85addd7475b0927333c5e39a4d59fb210b9810f8c346972046f95e60a721329cffe98895abe451e51de753ad1ca7a8c24ec65f + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10/79bef167247789f955aaba113bae74bf64aa1e1acca4b1d6bb444bdf91d82c3e07e9451ef6a6e2e35e8f71a6f97ce33e3d855a5328eb9fad1bc3cc4cfd031ed8 + languageName: node + linkType: hard + +"bidi-js@npm:^1.0.3": + version: 1.0.3 + resolution: "bidi-js@npm:1.0.3" + dependencies: + require-from-string: "npm:^2.0.2" + checksum: 10/c4341c7a98797efe3d186cd99d6f97e9030a4f959794ca200ef2ec0a678483a916335bba6c2c0608a21d04a221288a31c9fd0faa0cd9b3903b93594b42466a6a + languageName: node + linkType: hard + +"css-tree@npm:^3.1.0": + version: 3.1.0 + resolution: "css-tree@npm:3.1.0" + dependencies: + mdn-data: "npm:2.12.2" + source-map-js: "npm:^1.0.1" + checksum: 10/e8c5c8e98e3aa4a620fda0b813ce57ccf99281652bf9d23e5cdfc9961c9a93a6769941f9a92e31e65d90f446f42fa83879ab0185206dc7a178d9f656d0913e14 + languageName: node + linkType: hard + +"cssstyle@npm:^5.3.0": + version: 5.3.1 + resolution: "cssstyle@npm:5.3.1" + dependencies: + "@asamuzakjp/css-color": "npm:^4.0.3" + "@csstools/css-syntax-patches-for-csstree": "npm:^1.0.14" + css-tree: "npm:^3.1.0" + checksum: 10/090f3a82b1731d346af369fd8e4b85a954ce738071caab6bfd20cc669f26952a60ef517acb17b18c95b90a17e3a0659a7a293c03bab1e77c68bb7301e906fd2d + languageName: node + linkType: hard + +"data-urls@npm:^6.0.0": + version: 6.0.0 + resolution: "data-urls@npm:6.0.0" + dependencies: + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^15.0.0" + checksum: 10/a47f0dde184337c4f168d455aedf0b486fed87b6ca583b4b9ad55d1515f4836b418d4bdc5b5b6fc55e321feb826029586a0d47e1c9a9e7ac4d52a78faceb7fb0 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad + languageName: node + linkType: hard + +"decimal.js@npm:^10.5.0": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 10/c0d45842d47c311d11b38ce7ccc911121953d4df3ebb1465d92b31970eb4f6738a065426a06094af59bee4b0d64e42e7c8984abd57b6767c64ea90cf90bb4a69 + languageName: node + linkType: hard + +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10/62af1307202884349d2867f0aac5c60d8b57102ea0b0e768b16246099512c28e239254ad772d6834e7e14cb1b6f153fc3d0c031934e3183b086c86d3838d874a + languageName: node + linkType: hard + +"html-encoding-sniffer@npm:^4.0.0": + version: 4.0.0 + resolution: "html-encoding-sniffer@npm:4.0.0" + dependencies: + whatwg-encoding: "npm:^3.1.1" + checksum: 10/e86efd493293a5671b8239bd099d42128433bb3c7b0fdc7819282ef8e118a21f5dead0ad6f358e024a4e5c84f17ebb7a9b36075220fac0a6222b207248bede6f + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.2": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10/d062acfa0cb82beeb558f1043c6ba770ea892b5fb7b28654dbc70ea2aeea55226dd34c02a294f6c1ca179a5aa483c4ea641846821b182edbd9cc5d89b54c6848 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.6": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10/784b628cbd55b25542a9d85033bdfd03d4eda630fb8b3c9477959367f3be95dc476ed2ecbb9836c359c7c698027fc7b45723a302324433590f45d6c1706e8c13 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10/24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f + languageName: node + linkType: hard + +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: 10/ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab + languageName: node + linkType: hard + +"jsdom@npm:^27.0.0": + version: 27.0.0 + resolution: "jsdom@npm:27.0.0" + dependencies: + "@asamuzakjp/dom-selector": "npm:^6.5.4" + cssstyle: "npm:^5.3.0" + data-urls: "npm:^6.0.0" + decimal.js: "npm:^10.5.0" + html-encoding-sniffer: "npm:^4.0.0" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" + is-potential-custom-element-name: "npm:^1.0.1" + parse5: "npm:^7.3.0" + rrweb-cssom: "npm:^0.8.0" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^6.0.0" + w3c-xmlserializer: "npm:^5.0.0" + webidl-conversions: "npm:^8.0.0" + whatwg-encoding: "npm:^3.1.1" + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^15.0.0" + ws: "npm:^8.18.2" + xml-name-validator: "npm:^5.0.0" + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10/bd20b5560a2d2528d2494500f1bb2f58c4c674f4a6deb164a9693c6a43f0a0ae0eec44ff56e6bf065022c76fb07f7a2e197e81c964fd60b4d0ce160beb4d5007 + languageName: node + linkType: hard + +"lru-cache@npm:^11.1.0": + version: 11.2.1 + resolution: "lru-cache@npm:11.2.1" + checksum: 10/cd1cc7a8d7617ede28702f80449d9c3f851bb6671d5ec37b34ca10ffb18d5aa068d798ed057e73092f25e563202d33ab6562c356b0c1ff4a6065525dbe577b1c + languageName: node + linkType: hard + +"mdn-data@npm:2.12.2": + version: 2.12.2 + resolution: "mdn-data@npm:2.12.2" + checksum: 10/854e41715a9358e69f9a530117cd6ca7e71d06176469de8d70b1e629753b6827f5bd730995c16ad3750f3c9bad92230f8e4e178de2b34926b05f5205d27d76af + languageName: node + linkType: hard + +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"parse5@npm:^7.3.0": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" + dependencies: + entities: "npm:^6.0.0" + checksum: 10/b0e48be20b820c655b138b86fa6fb3a790de6c891aa2aba536524f8027b4dca4fe538f11a0e5cf2f6f847d120dbb9e4822dcaeb933ff1e10850a2ef0154d1d88 + languageName: node + linkType: hard + +"punycode@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10/839a3a890102a658f4cb3e7b2aa13a1f80a3a976b512020c3d1efc418491c48a886b6e481ea56afc6c4cb5eef678f23b2a4e70575e7534eccadf5e30ed2e56eb + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + dependencies: + jsdom: "npm:^27.0.0" + languageName: unknown + linkType: soft + +"rrweb-cssom@npm:^0.8.0": + version: 0.8.0 + resolution: "rrweb-cssom@npm:0.8.0" + checksum: 10/07521ee36fb6569c17906afad1ac7ff8f099d49ade9249e190693ac36cdf27f88d9acf0cc66978935d5d0a23fca105643d7e9125b9a9d91ed9db9e02d31d7d80 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 + languageName: node + linkType: hard + +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10/97b50daf6ca3a153e89842efa18a862e446248296622b7473c169c84c823ee8a16e4a43bac2f73f11fc8cb9168c73fbb0d73340f26552bac17970e9052367aa9 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 + languageName: node + linkType: hard + +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 10/c09a00aadf279d47d0c5c46ca3b6b2fbaeb45f0a184976d599637d412d3a70bbdc043ff33effe1206dea0e36e0ad226cb957112e7ce9a4bf2daedf7fa4f85c53 + languageName: node + linkType: hard + +"tldts-core@npm:^7.0.15": + version: 7.0.15 + resolution: "tldts-core@npm:7.0.15" + checksum: 10/91d265fd1ae67ce34de40ba91463ac1ca9fd564e99e0402e1851de149a3b8e030d785041314a17817537b7499ceb534ee214a565c6f748df8d86aa698d169336 + languageName: node + linkType: hard + +"tldts@npm:^7.0.5": + version: 7.0.15 + resolution: "tldts@npm:7.0.15" + dependencies: + tldts-core: "npm:^7.0.15" + bin: + tldts: bin/cli.js + checksum: 10/184cb9307f5eeefacdf35ff4e243f50764e47b97a732a2385c8a0aa997fa15ee0b757ac977a11ef4617f44046e362240084b88eb9dcc57805ad8bb414ab44487 + languageName: node + linkType: hard + +"tough-cookie@npm:^6.0.0": + version: 6.0.0 + resolution: "tough-cookie@npm:6.0.0" + dependencies: + tldts: "npm:^7.0.5" + checksum: 10/1b0592241655912eb972e1c284ccf975af154576b8e9912cad4ed7b4b408a60ccfdad1bc53eef10d376f6a5ef9d84e2f8ea0b46c92263d52de855247ff100e27 + languageName: node + linkType: hard + +"tr46@npm:^6.0.0": + version: 6.0.0 + resolution: "tr46@npm:6.0.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10/e6d402eb2b780a40042f327f77b4ae316da1d2b18a29c16e48c239f5267c6005bbf780f854179cfae62b02dfaa70b0e9aad8f0078ccc4225f5b3b3b131928e8f + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^5.0.0": + version: 5.0.0 + resolution: "w3c-xmlserializer@npm:5.0.0" + dependencies: + xml-name-validator: "npm:^5.0.0" + checksum: 10/d78f59e6b4f924aa53b6dfc56949959229cae7fe05ea9374eb38d11edcec01398b7f5d7a12576bd5acc57ff446abb5c9115cd83b9d882555015437cf858d42f0 + languageName: node + linkType: hard + +"webidl-conversions@npm:^8.0.0": + version: 8.0.0 + resolution: "webidl-conversions@npm:8.0.0" + checksum: 10/8138d1b291c8f311d93de680653b13b04560aa35d83f9606642e746fca39d7dab9cddd9282ade21774115ea332b8b11f008106b82d4a0125e98a49479381aeee + languageName: node + linkType: hard + +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10/bbef815eb67f91487c7f2ef96329743f5fd8357d7d62b1119237d25d41c7e452dff8197235b2d3c031365a17f61d3bb73ca49d0ed1582475aa4a670815e79534 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10/894a618e2d90bf444b6f309f3ceb6e58cf21b2beaa00c8b333696958c4076f0c7b30b9d33413c9ffff7c5832a0a0c8569e5bb347ef44beded72aeefd0acd62e8 + languageName: node + linkType: hard + +"whatwg-url@npm:^15.0.0": + version: 15.1.0 + resolution: "whatwg-url@npm:15.1.0" + dependencies: + tr46: "npm:^6.0.0" + webidl-conversions: "npm:^8.0.0" + checksum: 10/9ae5ce70060f2a9ea73799062af6e796ec2477f44bf1a886953b405700e3ab11d15aa0fe7088c4215f839e56a845d5d1c44584ed292a832837a8c8549c566886 + languageName: node + linkType: hard + +"ws@npm:^8.18.2": + version: 8.18.3 + resolution: "ws@npm:8.18.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + languageName: node + linkType: hard + +"xml-name-validator@npm:^5.0.0": + version: 5.0.0 + resolution: "xml-name-validator@npm:5.0.0" + checksum: 10/43f30f3f6786e406dd665acf08cd742d5f8a46486bd72517edb04b27d1bcd1599664c2a4a99fc3f1e56a3194bff588b12f178b7972bc45c8047bdc4c3ac8d4a1 + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 10/4ad5924974efd004a47cce6acf5c0269aee0e62f9a805a426db3337af7bcbd331099df174b024ace4fb18971b8a56de386d2e73a1c4b020e3abd63a4a9b917f1 + languageName: node + linkType: hard diff --git a/e2e/transform/multiple-transformers/__tests__/__snapshots__/multipleTransformers.test.js.snap b/e2e/transform/multiple-transformers/__tests__/__snapshots__/multipleTransformers.test.js.snap index 45abb8c8bd32..cbc711579f43 100644 --- a/e2e/transform/multiple-transformers/__tests__/__snapshots__/multipleTransformers.test.js.snap +++ b/e2e/transform/multiple-transformers/__tests__/__snapshots__/multipleTransformers.test.js.snap @@ -2,14 +2,14 @@ exports[`generates a snapshot with correctly transformed dependencies 1`] = `

@@ -17,7 +17,7 @@ exports[`generates a snapshot with correctly transformed dependencies 1`] = `

To get started, edit diff --git a/e2e/transform/multiple-transformers/__tests__/multipleTransformers.test.js b/e2e/transform/multiple-transformers/__tests__/multipleTransformers.test.js index fe0d6288c56a..680a9155d545 100644 --- a/e2e/transform/multiple-transformers/__tests__/multipleTransformers.test.js +++ b/e2e/transform/multiple-transformers/__tests__/multipleTransformers.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment jsdom + */ + /** * Copyright (c) Meta Platforms, Inc. and affiliates. * @@ -6,10 +10,10 @@ */ import React from 'react'; -import renderer from 'react-test-renderer'; +import {render} from '@testing-library/react'; import App from '../src/App'; it('generates a snapshot with correctly transformed dependencies', () => { - const tree = renderer.create().toJSON(); - expect(tree).toMatchSnapshot(); + const {container} = render(); + expect(container.firstChild).toMatchSnapshot(); }); diff --git a/e2e/transform/multiple-transformers/package.json b/e2e/transform/multiple-transformers/package.json index 889c6879050a..4b11db5bb2af 100644 --- a/e2e/transform/multiple-transformers/package.json +++ b/e2e/transform/multiple-transformers/package.json @@ -17,8 +17,8 @@ "@babel/core": "^7.0.0", "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", + "@testing-library/react": "^16.3.0", "react": "18.2.0", - "react-dom": "18.2.0", - "react-test-renderer": "18.2.0" + "react-dom": "18.2.0" } } diff --git a/e2e/transform/multiple-transformers/yarn.lock b/e2e/transform/multiple-transformers/yarn.lock index 93f132eb482e..591f8e1b21a3 100644 --- a/e2e/transform/multiple-transformers/yarn.lock +++ b/e2e/transform/multiple-transformers/yarn.lock @@ -1131,6 +1131,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.12.5": + version: 7.28.3 + resolution: "@babel/runtime@npm:7.28.3" + checksum: 10/f2415e4dbface7496f6fc561d640b44be203071fb0dfb63fbe338c7d2d2047419cb054ef13d1ebb8fc11e35d2b55aa3045def4b985e8b82aea5d7e58e1133e52 + languageName: node + linkType: hard + "@babel/template@npm:^7.27.1": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" @@ -1209,6 +1216,26 @@ __metadata: languageName: node linkType: hard +"@testing-library/react@npm:^16.3.0": + version: 16.3.0 + resolution: "@testing-library/react@npm:16.3.0" + dependencies: + "@babel/runtime": "npm:^7.12.5" + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/0ee9e31dd0d2396a924682d0e61a4ecc6bfab8eaff23dbf8a72c3c2ce22c116fa578148baeb4de75b968ef99d22e6e6aa0a00dba40286f71184918bb6bb5b06a + languageName: node + linkType: hard + "babel-plugin-polyfill-corejs2@npm:^0.4.10": version: 0.4.13 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" @@ -1429,13 +1456,6 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -1462,38 +1482,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.2.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 - languageName: node - linkType: hard - -"react-shallow-renderer@npm:^16.15.0": - version: 16.15.0 - resolution: "react-shallow-renderer@npm:16.15.0" - dependencies: - object-assign: "npm:^4.1.1" - react-is: "npm:^16.12.0 || ^17.0.0 || ^18.0.0" - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 10/06457fe5bcaa44aeca998905b6849304742ea1cc2d3841e4a0964c745ff392bc4dec07f8c779f317faacce3a0bf6f84e15020ac0fa81adb931067dbb0baf707b - languageName: node - linkType: hard - -"react-test-renderer@npm:18.2.0": - version: 18.2.0 - resolution: "react-test-renderer@npm:18.2.0" - dependencies: - react-is: "npm:^18.2.0" - react-shallow-renderer: "npm:^16.15.0" - scheduler: "npm:^0.23.0" - peerDependencies: - react: ^18.2.0 - checksum: 10/39473e43f64eec92da35db9d4411f3887b368038670787d49dd23172eb3a29953eb13767d1bfa34cbe2665b6e25632cad146e362e8910ce33755d343537763ae - languageName: node - linkType: hard - "react@npm:18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -1584,9 +1572,9 @@ __metadata: "@babel/core": "npm:^7.0.0" "@babel/preset-env": "npm:^7.0.0" "@babel/preset-react": "npm:^7.0.0" + "@testing-library/react": "npm:^16.3.0" react: "npm:18.2.0" react-dom: "npm:18.2.0" - react-test-renderer: "npm:18.2.0" languageName: unknown linkType: soft diff --git a/examples/react-native/package.json b/examples/react-native/package.json index dce040aa525c..4f7dde6944bd 100644 --- a/examples/react-native/package.json +++ b/examples/react-native/package.json @@ -7,9 +7,9 @@ "test": "jest" }, "dependencies": { - "@react-native/babel-preset": "^0.79.2", + "@react-native/babel-preset": "^0.81.1", "react": "18.3.1", - "react-native": "0.76.6" + "react-native": "0.81.4" }, "devDependencies": { "@babel/core": "^7.27.4", diff --git a/examples/react-testing-library/package.json b/examples/react-testing-library/package.json index c639b2fd5b91..88b83e179cdf 100644 --- a/examples/react-testing-library/package.json +++ b/examples/react-testing-library/package.json @@ -10,7 +10,7 @@ "@babel/core": "^7.27.4", "@babel/preset-env": "^7.27.2", "@babel/preset-react": "^7.27.1", - "@testing-library/react": "^14.0.0", + "@testing-library/react": "^16.3.0", "babel-jest": "workspace:*", "jest": "workspace:*", "jest-environment-jsdom": "workspace:*" diff --git a/examples/snapshot/Link.js b/examples/snapshot/Link.js index 379ef9c30078..613d6354383a 100644 --- a/examples/snapshot/Link.js +++ b/examples/snapshot/Link.js @@ -20,6 +20,7 @@ export default function Link({page, children}) { return ( Facebook @@ -13,10 +12,9 @@ exports[`changes the class when hovered 1`] = ` exports[`changes the class when hovered 2`] = ` Facebook @@ -24,10 +22,9 @@ exports[`changes the class when hovered 2`] = ` exports[`changes the class when hovered 3`] = ` Facebook @@ -35,10 +32,9 @@ exports[`changes the class when hovered 3`] = ` exports[`properly escapes quotes 1`] = ` "Facebook" \\'is \\ 'awesome' @@ -46,10 +42,9 @@ exports[`properly escapes quotes 1`] = ` exports[`renders as an anchor when no page is set 1`] = ` Facebook @@ -57,10 +52,9 @@ exports[`renders as an anchor when no page is set 1`] = ` exports[`renders correctly 1`] = ` Facebook diff --git a/examples/snapshot/__tests__/clock.test.js b/examples/snapshot/__tests__/clock.test.js index ef5894f39a55..0f827f7762d1 100644 --- a/examples/snapshot/__tests__/clock.test.js +++ b/examples/snapshot/__tests__/clock.test.js @@ -2,17 +2,16 @@ 'use strict'; -import renderer from 'react-test-renderer'; +import {cleanup, render} from '@testing-library/react'; import Clock from '../Clock'; jest.useFakeTimers().setSystemTime(1_482_363_367_071); it('renders correctly', () => { - const testRenderer = renderer.create(); - + const {container} = render(); try { - expect(testRenderer.toJSON()).toMatchSnapshot(); + expect(container.firstChild).toMatchSnapshot(); } finally { - testRenderer.unmount(); + cleanup(); } }); diff --git a/examples/snapshot/__tests__/link.test.js b/examples/snapshot/__tests__/link.test.js index 8d51c48bb685..41042f6a1c6a 100644 --- a/examples/snapshot/__tests__/link.test.js +++ b/examples/snapshot/__tests__/link.test.js @@ -2,48 +2,41 @@ 'use strict'; -import renderer from 'react-test-renderer'; import Link from '../Link'; +import {cleanup, render} from '@testing-library/react'; +import {screen} from '@testing-library/dom'; +import userEvent from '@testing-library/user-event'; + +afterEach(() => cleanup()); it('renders correctly', () => { - const tree = renderer - .create(Facebook) - .toJSON(); - expect(tree).toMatchSnapshot(); + const {container} = render( + Facebook, + ); + expect(container.firstChild).toMatchSnapshot(); }); it('renders as an anchor when no page is set', () => { - const tree = renderer.create(Facebook).toJSON(); - expect(tree).toMatchSnapshot(); + const {container} = render(Facebook); + expect(container.firstChild).toMatchSnapshot(); }); it('properly escapes quotes', () => { - const tree = renderer - .create({"\"Facebook\" \\'is \\ 'awesome'"}) - .toJSON(); - expect(tree).toMatchSnapshot(); + const {container} = render({"\"Facebook\" \\'is \\ 'awesome'"}); + expect(container.firstChild).toMatchSnapshot(); }); -it('changes the class when hovered', () => { - const component = renderer.create( +it('changes the class when hovered', async () => { + const {container, rerender} = render( Facebook, ); - let tree = component.toJSON(); - expect(tree).toMatchSnapshot(); - - // manually trigger the callback - renderer.act(() => { - tree.props.onMouseEnter(); - }); - // re-rendering - tree = component.toJSON(); - expect(tree).toMatchSnapshot(); - - // manually trigger the callback - renderer.act(() => { - tree.props.onMouseLeave(); - }); - // re-rendering - tree = component.toJSON(); - expect(tree).toMatchSnapshot(); + expect(container.firstChild).toMatchSnapshot(); + + // hover the link + userEvent.hover(container.firstChild); + expect(await screen.findByLabelText('hovered')).toMatchSnapshot(); + + // unhover the link + userEvent.unhover(container.firstChild); + expect(await screen.findByLabelText('normal')).toMatchSnapshot(); }); diff --git a/examples/snapshot/package.json b/examples/snapshot/package.json index fbc8271ca288..b0008fe96e02 100644 --- a/examples/snapshot/package.json +++ b/examples/snapshot/package.json @@ -9,14 +9,16 @@ "@babel/core": "^7.27.4", "@babel/preset-env": "^7.27.2", "@babel/preset-react": "^7.27.1", + "@testing-library/dom": "^10.4.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", "babel-jest": "workspace:*", - "jest": "workspace:*", - "react-test-renderer": "18.3.1" + "jest": "workspace:*" }, "scripts": { "test": "jest" }, "jest": { - "testEnvironment": "node" + "testEnvironment": "jsdom" } } diff --git a/jest.config.mjs b/jest.config.mjs index c23c1539e8ae..01ab401df0d4 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -68,6 +68,9 @@ export default { '/packages/jest-snapshot/src/__tests__/fixtures/', '/e2e/__tests__/iterator-to-null-test.ts', '/e2e/__tests__/tsIntegration.test.ts', // this test needs types to be build, it runs in a separate CI job through `jest.config.ts.mjs` + Number.parseInt(process.versions.node, 10) >= 20 + ? '/.*\\.nodejs18\\..*' + : '/.*\\.nodejs20plus\\..*', ], testTimeout: 70_000, transform: { diff --git a/lerna.json b/lerna.json index 5832014a881e..f0852b5e9a37 100644 --- a/lerna.json +++ b/lerna.json @@ -8,5 +8,5 @@ "syncWorkspaceLock": true } }, - "version": "30.1.3" + "version": "30.2.0" } diff --git a/package.json b/package.json index 46c1b805e458..ea6c13cf5d28 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "jest-silent-reporter": "^0.6.0", "jest-snapshot": "workspace:*", "jest-util": "workspace:*", - "jest-watch-typeahead": "^2.2.2", + "jest-watch-typeahead": "^3.0.1", "jquery": "^3.2.1", "js-yaml": "^4.1.0", "micromatch": "^4.0.8", diff --git a/packages/babel-jest/package.json b/packages/babel-jest/package.json index ed319eaee00e..680637fcbca5 100644 --- a/packages/babel-jest/package.json +++ b/packages/babel-jest/package.json @@ -1,7 +1,7 @@ { "name": "babel-jest", "description": "Jest plugin to use babel for transformation.", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -22,19 +22,20 @@ "dependencies": { "@jest/transform": "workspace:*", "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "babel-preset-jest": "workspace:*", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "devDependencies": { + "@babel-8/core": "npm:@babel/core@8.0.0-beta.1", "@babel/core": "^7.27.4", "@jest/test-utils": "workspace:*", "@types/graceful-fs": "^4.1.9" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" diff --git a/packages/babel-jest/src/__tests__/getCacheKey.test.ts b/packages/babel-jest/src/__tests__/getCacheKey.test.ts index eb9b2da1107b..a3d986e21496 100644 --- a/packages/babel-jest/src/__tests__/getCacheKey.test.ts +++ b/packages/babel-jest/src/__tests__/getCacheKey.test.ts @@ -9,6 +9,17 @@ import type {TransformOptions as BabelTransformOptions} from '@babel/core'; import type {SyncTransformer, TransformOptions} from '@jest/transform'; import babelJest from '../index'; +// We need to use the Node.js implementation of `require` to load Babel 8 +// packages, instead of our sandboxed implementation, because Babel 8 is +// written in ESM and we don't support require(esm) yet. +import Module from 'node:module'; +import {pathToFileURL} from 'node:url'; +import {onNodeVersions} from '@jest/test-utils'; +const createOriginalNodeRequire = Object.getPrototypeOf(Module).createRequire; +const originalNodeRequire = createOriginalNodeRequire( + pathToFileURL(__filename), +); + const {getCacheKey} = babelJest.createTransformer() as SyncTransformer; @@ -33,173 +44,211 @@ afterEach(() => { } }); -describe('getCacheKey', () => { - const sourceText = 'mock source'; - const sourcePath = 'mock-source-path.js'; - - const transformOptions = { - config: {rootDir: 'mock-root-dir'}, - configString: 'mock-config-string', - instrument: true, - } as TransformOptions; - - const oldCacheKey = getCacheKey!(sourceText, sourcePath, transformOptions); - - test('returns cache key hash', () => { - expect(oldCacheKey).toHaveLength(32); - }); - - test('if `THIS_FILE` value is changing', async () => { - jest.doMock('graceful-fs', () => ({ - readFileSync: () => 'new this file', - })); - - const {createTransformer} = - require('../index') as typeof import('../index'); - - const newCacheKey = (await createTransformer()).getCacheKey!( - sourceText, - sourcePath, - transformOptions, - ); +describe('babel 7', () => { + defineTests({getBabel: () => require('@babel/core')}); +}); - expect(oldCacheKey).not.toEqual(newCacheKey); +describe('babel 8', () => { + onNodeVersions('>=20', () => { + defineTests({ + getBabel: () => originalNodeRequire('@babel-8/core'), + }); }); +}); - test('if `babelOptions.options` value is changing', async () => { - jest.doMock('../loadBabelConfig', () => { - const babel = require('@babel/core') as typeof import('@babel/core'); - - return { - loadPartialConfig: (options: BabelTransformOptions) => ({ - ...babel.loadPartialConfig(options), - options: 'new-options', - }), - }; +function defineTests({ + getBabel, +}: { + getBabel: () => typeof import('@babel-8/core'); +}) { + describe('getCacheKey', () => { + let babel: typeof import('@babel-8/core'); + beforeAll(() => { + babel = getBabel(); }); - const {createTransformer} = - require('../index') as typeof import('../index'); + const sourceText = 'mock source'; + const sourcePath = 'mock-source-path.js'; - const newCacheKey = (await createTransformer()).getCacheKey!( - sourceText, - sourcePath, - transformOptions, - ); + const transformOptions = { + config: {rootDir: 'mock-root-dir'}, + configString: 'mock-config-string', + instrument: true, + } as TransformOptions; - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + const oldCacheKey = getCacheKey!(sourceText, sourcePath, transformOptions); - test('if `sourceText` value is changing', () => { - const newCacheKey = getCacheKey!( - 'new source text', - sourcePath, - transformOptions, - ); + test('returns cache key hash', () => { + expect(oldCacheKey).toHaveLength(32); + }); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + test('if `THIS_FILE` value is changing', async () => { + jest.doMock('graceful-fs', () => ({ + readFileSync: () => 'new this file', + })); - test('if `sourcePath` value is changing', () => { - const newCacheKey = getCacheKey!( - sourceText, - 'new-source-path.js', - transformOptions, - ); + const {createTransformer} = + require('../index') as typeof import('../index'); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + const newCacheKey = (await createTransformer()).getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); - test('if `configString` value is changing', () => { - const newCacheKey = getCacheKey!(sourceText, sourcePath, { - ...transformOptions, - configString: 'new-config-string', + expect(oldCacheKey).not.toEqual(newCacheKey); }); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + test('if `babelOptions.options` value is changing', async () => { + jest.doMock('../babel', () => { + return { + ...babel, + loadPartialConfigSync: ( + options: Parameters[0], + ) => ({ + ...babel.loadPartialConfigSync(options), + options: 'new-options', + }), + }; + }); + + const {createTransformer} = + require('../index') as typeof import('../index'); + + const newCacheKey = (await createTransformer()).getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); + + expect(oldCacheKey).not.toEqual(newCacheKey); + }); - test('if `babelOptions.config` value is changing', async () => { - jest.doMock('../loadBabelConfig', () => { - const babel = require('@babel/core') as typeof import('@babel/core'); + test('if `sourceText` value is changing', () => { + const newCacheKey = getCacheKey!( + 'new source text', + sourcePath, + transformOptions, + ); - return { - loadPartialConfig: (options: BabelTransformOptions) => ({ - ...babel.loadPartialConfig(options), - config: 'new-config', - }), - }; + expect(oldCacheKey).not.toEqual(newCacheKey); }); - const {createTransformer} = - require('../index') as typeof import('../index'); - - const newCacheKey = (await createTransformer()).getCacheKey!( - sourceText, - sourcePath, - transformOptions, - ); + test('if `sourcePath` value is changing', () => { + const newCacheKey = getCacheKey!( + sourceText, + 'new-source-path.js', + transformOptions, + ); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + expect(oldCacheKey).not.toEqual(newCacheKey); + }); - test('if `babelOptions.babelrc` value is changing', async () => { - jest.doMock('../loadBabelConfig', () => { - const babel = require('@babel/core') as typeof import('@babel/core'); + test('if `configString` value is changing', () => { + const newCacheKey = getCacheKey!(sourceText, sourcePath, { + ...transformOptions, + configString: 'new-config-string', + }); - return { - loadPartialConfig: (options: BabelTransformOptions) => ({ - ...babel.loadPartialConfig(options), - babelrc: 'new-babelrc', - }), - }; + expect(oldCacheKey).not.toEqual(newCacheKey); }); - const {createTransformer} = - require('../index') as typeof import('../index'); + test('if `babelOptions.config` value is changing', async () => { + jest.doMock('../babel', () => { + return { + ...babel, + loadPartialConfigSync: ( + options: Parameters[0], + ) => ({ + ...babel.loadPartialConfigSync(options), + config: 'new-config', + }), + }; + }); + + const {createTransformer} = + require('../index') as typeof import('../index'); + + const newCacheKey = (await createTransformer()).getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); + + expect(oldCacheKey).not.toEqual(newCacheKey); + }); - const newCacheKey = (await createTransformer()).getCacheKey!( - sourceText, - sourcePath, - transformOptions, - ); + test('if `babelOptions.babelrc` value is changing', async () => { + jest.doMock('../babel', () => { + return { + ...babel, + loadPartialConfig: ( + options: Parameters[0], + ) => ({ + ...babel.loadPartialConfig(options), + babelrc: 'new-babelrc', + }), + }; + }); + + const {createTransformer} = + require('../index') as typeof import('../index'); + + const newCacheKey = (await createTransformer()).getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); + + expect(oldCacheKey).not.toEqual(newCacheKey); + }); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + test('if `instrument` value is changing', () => { + const newCacheKey = getCacheKey!(sourceText, sourcePath, { + ...transformOptions, + instrument: false, + }); - test('if `instrument` value is changing', () => { - const newCacheKey = getCacheKey!(sourceText, sourcePath, { - ...transformOptions, - instrument: false, + expect(oldCacheKey).not.toEqual(newCacheKey); }); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); - - test('if `process.env.NODE_ENV` value is changing', () => { - process.env.NODE_ENV = 'NEW_NODE_ENV'; + test('if `process.env.NODE_ENV` value is changing', () => { + process.env.NODE_ENV = 'NEW_NODE_ENV'; - const newCacheKey = getCacheKey!(sourceText, sourcePath, transformOptions); + const newCacheKey = getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + expect(oldCacheKey).not.toEqual(newCacheKey); + }); - test('if `process.env.BABEL_ENV` value is changing', () => { - process.env.BABEL_ENV = 'NEW_BABEL_ENV'; + test('if `process.env.BABEL_ENV` value is changing', () => { + process.env.BABEL_ENV = 'NEW_BABEL_ENV'; - const newCacheKey = getCacheKey!(sourceText, sourcePath, transformOptions); + const newCacheKey = getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); - expect(oldCacheKey).not.toEqual(newCacheKey); - }); + expect(oldCacheKey).not.toEqual(newCacheKey); + }); - test('if node version is changing', () => { - // @ts-expect-error: Testing purpose - delete process.version; - // @ts-expect-error: Testing purpose - process.version = 'new-node-version'; + test('if node version is changing', () => { + // @ts-expect-error: Testing purpose + delete process.version; + // @ts-expect-error: Testing purpose + process.version = 'new-node-version'; - const newCacheKey = getCacheKey!(sourceText, sourcePath, transformOptions); + const newCacheKey = getCacheKey!( + sourceText, + sourcePath, + transformOptions, + ); - expect(oldCacheKey).not.toEqual(newCacheKey); + expect(oldCacheKey).not.toEqual(newCacheKey); + }); }); -}); +} diff --git a/packages/babel-jest/src/__tests__/index.ts b/packages/babel-jest/src/__tests__/index.ts index b18844220fc7..5b932e33a3b7 100644 --- a/packages/babel-jest/src/__tests__/index.ts +++ b/packages/babel-jest/src/__tests__/index.ts @@ -9,23 +9,38 @@ import type { BabelFileResult, TransformOptions as BabelTransformOptions, } from '@babel/core'; -import {makeProjectConfig} from '@jest/test-utils'; +import {makeProjectConfig, onNodeVersions} from '@jest/test-utils'; import type {SyncTransformer, TransformOptions} from '@jest/transform'; import babelJest, {createTransformer} from '../index'; -import {loadPartialConfig} from '../loadBabelConfig'; - -jest.mock('../loadBabelConfig', () => { - const actual = - jest.requireActual('@babel/core'); - - return { - loadPartialConfig: jest.fn((...args) => - actual.loadPartialConfig(...args), - ), - loadPartialConfigAsync: jest.fn( - (...args) => actual.loadPartialConfigAsync(...args), - ), - }; + +// We need to use the Node.js implementation of `require` to load Babel 8 +// packages, instead of our sandboxed implementation, because Babel 8 is +// written in ESM and we don't support require(esm) yet. +import Module from 'node:module'; +import {pathToFileURL} from 'node:url'; +const createOriginalNodeRequire = Object.getPrototypeOf(Module).createRequire; +const originalNodeRequire = createOriginalNodeRequire( + pathToFileURL(__filename), +); + +type BabelCore = typeof import('@babel-8/core'); + +// We need to use `var` so that it's hoisted and we can set it in `jest.mock`. +// eslint-disable-next-line no-var +var mockedBabel!: { + transformSync: jest.Mock; + transformAsync: jest.Mock; + loadPartialConfigSync: jest.Mock; + loadPartialConfigAsync: jest.Mock; +}; + +jest.mock('../babel', () => { + return (mockedBabel = { + loadPartialConfigAsync: jest.fn(), + loadPartialConfigSync: jest.fn(), + transformAsync: jest.fn(), + transformSync: jest.fn(), + }); }); const defaultBabelJestTransformer = @@ -44,159 +59,192 @@ const customMultiply = (obj, mul) => { customMultiply({a: 32, dummy: "test"}, 2); `; -beforeEach(() => { - jest.clearAllMocks(); +describe('babel 7', () => { + defineTests({getBabel: () => require('@babel/core')}); }); -test('Returns source string with inline maps when no transformOptions is passed', () => { - const result = defaultBabelJestTransformer.process( - sourceString, - 'dummy_path.js', - { - cacheFS: new Map(), - config: makeProjectConfig(), - configString: JSON.stringify(makeProjectConfig()), - instrument: false, - transformerConfig: {}, - } as TransformOptions, - ); - - expect(typeof result).toBe('object'); - expect(result.code).toBeDefined(); - expect(result.map).toBeDefined(); - expect(result.code).toMatch('//# sourceMappingURL'); - expect(result.code).toMatch('customMultiply'); - expect((result as BabelFileResult).map!.sources).toEqual(['dummy_path.js']); - expect( - JSON.stringify((result as BabelFileResult).map!.sourcesContent), - ).toMatch('customMultiply'); +describe('babel 8', () => { + onNodeVersions('>=20', () => { + defineTests({ + getBabel: () => originalNodeRequire('@babel-8/core'), + }); + }); }); -test('Returns source string with inline maps when no transformOptions is passed async', async () => { - const result = await defaultBabelJestTransformer.processAsync!( - sourceString, - 'dummy_path.js', - { - cacheFS: new Map(), - config: makeProjectConfig(), - configString: JSON.stringify(makeProjectConfig()), - instrument: false, - transformerConfig: {}, - } as TransformOptions, - ); +function defineTests({ + getBabel, +}: { + getBabel: () => typeof import('@babel-8/core'); +}) { + let babel: typeof import('@babel-8/core'); + beforeAll(() => { + babel = getBabel(); + }); - expect(typeof result).toBe('object'); - expect(result.code).toBeDefined(); - expect(result.map).toBeDefined(); - expect(result.code).toMatch('//# sourceMappingURL'); - expect(result.code).toMatch('customMultiply'); + beforeEach(() => { + jest.clearAllMocks(); - const {map} = result; + mockedBabel.transformSync.mockImplementation(babel.transformSync); + mockedBabel.transformAsync.mockImplementation(babel.transformAsync); + mockedBabel.loadPartialConfigSync.mockImplementation( + babel.loadPartialConfigSync, + ); + mockedBabel.loadPartialConfigAsync.mockImplementation( + babel.loadPartialConfigAsync, + ); + }); + test('Returns source string with inline maps when no transformOptions is passed', () => { + const result = defaultBabelJestTransformer.process( + sourceString, + 'dummy_path.js', + { + cacheFS: new Map(), + config: makeProjectConfig(), + configString: JSON.stringify(makeProjectConfig()), + instrument: false, + transformerConfig: {}, + } as TransformOptions, + ); - expect(map).toBeTruthy(); - expect(typeof map).not.toBe('string'); + expect(typeof result).toBe('object'); + expect(result.code).toBeDefined(); + expect(result.map).toBeDefined(); + expect(result.code).toMatch('//# sourceMappingURL'); + expect(result.code).toMatch('customMultiply'); + expect((result as BabelFileResult).map!.sources).toEqual(['dummy_path.js']); + expect( + JSON.stringify((result as BabelFileResult).map!.sourcesContent), + ).toMatch('customMultiply'); + }); - if (map == null || typeof map === 'string') { - throw new Error('dead code'); - } + test('Returns source string with inline maps when no transformOptions is passed async', async () => { + const result = await defaultBabelJestTransformer.processAsync!( + sourceString, + 'dummy_path.js', + { + cacheFS: new Map(), + config: makeProjectConfig(), + configString: JSON.stringify(makeProjectConfig()), + instrument: false, + transformerConfig: {}, + } as TransformOptions, + ); - expect(map.sources).toEqual(['dummy_path.js']); - expect(JSON.stringify(map.sourcesContent)).toMatch('customMultiply'); -}); + expect(typeof result).toBe('object'); + expect(result.code).toBeDefined(); + expect(result.map).toBeDefined(); + expect(result.code).toMatch('//# sourceMappingURL'); + expect(result.code).toMatch('customMultiply'); -describe('caller option correctly merges from defaults and options', () => { - test.each([ - [ - {supportsDynamicImport: true, supportsStaticESM: true}, - {supportsDynamicImport: true, supportsStaticESM: true}, - ], - [ - {supportsDynamicImport: false, supportsStaticESM: false}, - {supportsDynamicImport: false, supportsStaticESM: false}, - ], - [ - {supportsStaticESM: false}, - {supportsDynamicImport: false, supportsStaticESM: false}, - ], - [ - {supportsDynamicImport: true}, - {supportsDynamicImport: true, supportsStaticESM: false}, - ], - ])('%j -> %j', (input, output) => { - defaultBabelJestTransformer.process(sourceString, 'dummy_path.js', { + const {map} = result; + + expect(map).toBeTruthy(); + expect(typeof map).not.toBe('string'); + + if (map == null || typeof map === 'string') { + throw new Error('dead code'); + } + + expect(map.sources).toEqual(['dummy_path.js']); + expect(JSON.stringify(map.sourcesContent)).toMatch('customMultiply'); + }); + + describe('caller option correctly merges from defaults and options', () => { + test.each([ + [ + {supportsDynamicImport: true, supportsStaticESM: true}, + {supportsDynamicImport: true, supportsStaticESM: true}, + ], + [ + {supportsDynamicImport: false, supportsStaticESM: false}, + {supportsDynamicImport: false, supportsStaticESM: false}, + ], + [ + {supportsStaticESM: false}, + {supportsDynamicImport: false, supportsStaticESM: false}, + ], + [ + {supportsDynamicImport: true}, + {supportsDynamicImport: true, supportsStaticESM: false}, + ], + ])('%j -> %j', (input, output) => { + defaultBabelJestTransformer.process(sourceString, 'dummy_path.js', { + cacheFS: new Map(), + config: makeProjectConfig(), + configString: JSON.stringify(makeProjectConfig()), + instrument: false, + transformerConfig: {}, + ...input, + } as TransformOptions); + + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledTimes(1); + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledWith( + expect.objectContaining({ + caller: { + name: 'babel-jest', + ...output, + supportsExportNamespaceFrom: false, + supportsTopLevelAwait: false, + }, + }), + ); + }); + }); + + test('can pass null to createTransformer', async () => { + const transformer = await createTransformer(); + transformer.process(sourceString, 'dummy_path.js', { cacheFS: new Map(), config: makeProjectConfig(), configString: JSON.stringify(makeProjectConfig()), instrument: false, transformerConfig: {}, - ...input, } as TransformOptions); - expect(loadPartialConfig).toHaveBeenCalledTimes(1); - expect(loadPartialConfig).toHaveBeenCalledWith( + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledTimes(1); + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledWith( expect.objectContaining({ caller: { name: 'babel-jest', - ...output, + supportsDynamicImport: false, supportsExportNamespaceFrom: false, + supportsStaticESM: false, supportsTopLevelAwait: false, }, }), ); }); -}); -test('can pass null to createTransformer', async () => { - const transformer = await createTransformer(); - transformer.process(sourceString, 'dummy_path.js', { - cacheFS: new Map(), - config: makeProjectConfig(), - configString: JSON.stringify(makeProjectConfig()), - instrument: false, - transformerConfig: {}, - } as TransformOptions); - - expect(loadPartialConfig).toHaveBeenCalledTimes(1); - expect(loadPartialConfig).toHaveBeenCalledWith( - expect.objectContaining({ - caller: { - name: 'babel-jest', - supportsDynamicImport: false, - supportsExportNamespaceFrom: false, - supportsStaticESM: false, - supportsTopLevelAwait: false, - }, - }), - ); -}); + test('include babel-preset-jest by default', () => { + defaultBabelJestTransformer.process(sourceString, 'dummy_path.js', { + cacheFS: new Map(), + config: makeProjectConfig(), + configString: JSON.stringify(makeProjectConfig()), + instrument: false, + transformerConfig: {}, + } as TransformOptions); -test('include babel-preset-jest by default', () => { - defaultBabelJestTransformer.process(sourceString, 'dummy_path.js', { - cacheFS: new Map(), - config: makeProjectConfig(), - configString: JSON.stringify(makeProjectConfig()), - instrument: false, - transformerConfig: {}, - } as TransformOptions); - - expect(loadPartialConfig).toHaveBeenCalledTimes(1); - expect(loadPartialConfig).toHaveBeenCalledWith( - expect.objectContaining({presets: [require.resolve('babel-preset-jest')]}), - ); -}); + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledTimes(1); + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledWith( + expect.objectContaining({ + presets: [require.resolve('babel-preset-jest')], + }), + ); + }); -test('can opting out of babel-preset-jest by passing excludeJestPreset: true', async () => { - const transformer = await createTransformer({excludeJestPreset: true}); - transformer.process(sourceString, 'dummy_path.js', { - cacheFS: new Map(), - config: makeProjectConfig(), - configString: JSON.stringify(makeProjectConfig()), - instrument: false, - transformerConfig: {}, - } as TransformOptions); - - expect(loadPartialConfig).toHaveBeenCalledTimes(1); - expect(loadPartialConfig).toHaveBeenCalledWith( - expect.objectContaining({presets: []}), - ); -}); + test('can opting out of babel-preset-jest by passing excludeJestPreset: true', async () => { + const transformer = await createTransformer({excludeJestPreset: true}); + transformer.process(sourceString, 'dummy_path.js', { + cacheFS: new Map(), + config: makeProjectConfig(), + configString: JSON.stringify(makeProjectConfig()), + instrument: false, + transformerConfig: {}, + } as TransformOptions); + + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledTimes(1); + expect(mockedBabel.loadPartialConfigSync).toHaveBeenCalledWith( + expect.objectContaining({presets: []}), + ); + }); +} diff --git a/packages/babel-jest/src/babel.ts b/packages/babel-jest/src/babel.ts new file mode 100644 index 000000000000..bf42d7231d39 --- /dev/null +++ b/packages/babel-jest/src/babel.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +// this is a separate file so it can be mocked in tests +export { + loadPartialConfigAsync, + transformSync, + transformAsync, +} from '@babel/core'; + +import { + loadPartialConfig, + // @ts-expect-error -- Wrong @types/babel__core definition + loadPartialConfigSync, +} from '@babel/core'; + +// Old babel 7 versions didn't have loadPartialConfigSync +const _loadPartialConfigSync: typeof loadPartialConfig = + loadPartialConfigSync ?? loadPartialConfig; +export {_loadPartialConfigSync as loadPartialConfigSync}; diff --git a/packages/babel-jest/src/index.ts b/packages/babel-jest/src/index.ts index 71b19dc7eeac..cb67aaf37669 100644 --- a/packages/babel-jest/src/index.ts +++ b/packages/babel-jest/src/index.ts @@ -7,11 +7,9 @@ import {createHash} from 'crypto'; import * as path from 'path'; -import { - type TransformOptions as BabelTransformOptions, - type PartialConfig, - transformSync as babelTransform, - transformAsync as babelTransformAsync, +import type { + TransformOptions as BabelTransformOptions, + PartialConfig, } from '@babel/core'; import chalk from 'chalk'; import * as fs from 'graceful-fs'; @@ -21,9 +19,14 @@ import type { SyncTransformer, TransformerCreator, } from '@jest/transform'; -import {loadPartialConfig, loadPartialConfigAsync} from './loadBabelConfig'; +import { + transformSync as babelTransform, + transformAsync as babelTransformAsync, + loadPartialConfigAsync, + loadPartialConfigSync, +} from './babel'; -interface TransformerConfig extends BabelTransformOptions { +export interface TransformerConfig extends BabelTransformOptions { excludeJestPreset?: boolean; } @@ -112,7 +115,7 @@ function loadBabelConfig( filename: string, transformOptions: BabelTransformOptions, ): PartialConfig { - const babelConfig = loadPartialConfig(transformOptions); + const babelConfig = loadPartialConfigSync(transformOptions); assertLoadedBabelConfig(babelConfig, cwd, filename); diff --git a/packages/babel-plugin-jest-hoist/package.json b/packages/babel-plugin-jest-hoist/package.json index 4696f7892fae..0eaacfd00939 100644 --- a/packages/babel-plugin-jest-hoist/package.json +++ b/packages/babel-plugin-jest-hoist/package.json @@ -1,6 +1,6 @@ { "name": "babel-plugin-jest-hoist", - "version": "30.0.1", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -22,14 +22,16 @@ "./package.json": "./package.json" }, "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", "@types/babel__core": "^7.20.5" }, "devDependencies": { + "@babel-8/core": "npm:@babel/core@8.0.0-beta.1", + "@babel-8/preset-react": "npm:@babel/preset-react@8.0.0-beta.1", + "@babel-8/preset-typescript": "npm:@babel/preset-typescript@8.0.0-beta.1", "@babel/core": "^7.27.4", "@babel/preset-react": "^7.27.1", "@babel/preset-typescript": "^7.27.1", + "@babel/types": "^7.27.3", "@prettier/sync": "^0.5.5", "@types/babel__template": "^7.4.4", "@types/babel__traverse": "^7.20.7", diff --git a/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.test.ts.snap b/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.nodejs18.test.ts.snap similarity index 76% rename from packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.test.ts.snap rename to packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.nodejs18.test.ts.snap index 2f15308e94f8..677f8d7e6951 100644 --- a/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.test.ts.snap +++ b/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.nodejs18.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`babel-plugin-jest-hoist 1. automatic react runtime: 1. automatic react runtime 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 1. automatic react runtime: 1. automatic react runtime 1`] = ` jest.mock('./App', () => () =>

Hello world
); @@ -35,7 +35,7 @@ function _getJestObj() { `; -exports[`babel-plugin-jest-hoist 2. top level mocking: 2. top level mocking 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 2. top level mocking: 2. top level mocking 1`] = ` require('x'); @@ -56,7 +56,7 @@ require('x'); `; -exports[`babel-plugin-jest-hoist 3. within a block: 3. within a block 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 3. within a block: 3. within a block 1`] = ` beforeEach(() => { require('x'); @@ -78,7 +78,7 @@ beforeEach(() => { `; -exports[`babel-plugin-jest-hoist 4. within a block with no siblings: 4. within a block with no siblings 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 4. within a block with no siblings: 4. within a block with no siblings 1`] = ` beforeEach(() => { jest.mock('someNode'); @@ -98,7 +98,7 @@ beforeEach(() => { `; -exports[`babel-plugin-jest-hoist 5. required \`jest\` within \`jest\`: 5. required \`jest\` within \`jest\` 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 5. required \`jest\` within \`jest\`: 5. required \`jest\` within \`jest\` 1`] = ` const {jest} = require('@jest/globals'); @@ -116,7 +116,7 @@ jest.mock('some-module', () => { `; -exports[`babel-plugin-jest-hoist 6. imported jest.mock within jest.mock: 6. imported jest.mock within jest.mock 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 6. imported jest.mock within jest.mock: 6. imported jest.mock within jest.mock 1`] = ` import {jest} from '@jest/globals'; @@ -139,7 +139,7 @@ import {jest} from '@jest/globals'; `; -exports[`babel-plugin-jest-hoist 7. global jest.mock within jest.mock: 7. global jest.mock within jest.mock 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 7. global jest.mock within jest.mock: 7. global jest.mock within jest.mock 1`] = ` jest.mock('some-module', () => { jest.mock('some-module'); @@ -159,7 +159,7 @@ function _getJestObj() { `; -exports[`babel-plugin-jest-hoist 8. imported jest.requireActual in jest.mock: 8. imported jest.requireActual in jest.mock 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 8. imported jest.requireActual in jest.mock: 8. imported jest.requireActual in jest.mock 1`] = ` import {jest} from '@jest/globals'; @@ -185,7 +185,7 @@ jest.requireActual('some-module'); `; -exports[`babel-plugin-jest-hoist 9. global jest.requireActual in jest.mock: 9. global jest.requireActual in jest.mock 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 9. global jest.requireActual in jest.mock: 9. global jest.requireActual in jest.mock 1`] = ` jest.mock('some-module', () => { jest.requireActual('some-module'); @@ -208,7 +208,7 @@ jest.requireActual('some-module'); `; -exports[`babel-plugin-jest-hoist 10. TS typeof usage in jest.mock: 10. TS typeof usage in jest.mock 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 10. TS typeof usage in jest.mock: 10. TS typeof usage in jest.mock 1`] = ` jest.mock('some-module', () => { const actual = jest.requireActual('some-module'); @@ -231,7 +231,7 @@ function _getJestObj() { `; -exports[`babel-plugin-jest-hoist 11. jest.spyOn call on the imported module: 11. jest.spyOn call on the imported module 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 11. jest.spyOn call on the imported module: 11. jest.spyOn call on the imported module 1`] = ` jest.mock('some-module', () => { const module = jest.requireActual('some-module'); @@ -255,7 +255,7 @@ function _getJestObj() { `; -exports[`babel-plugin-jest-hoist 12. jest.spyOn call in class constructor: 12. jest.spyOn call in class constructor 1`] = ` +exports[`babel 7 babel-plugin-jest-hoist 12. jest.spyOn call in class constructor: 12. jest.spyOn call in class constructor 1`] = ` jest.mock('some-module', () => { const Actual = jest.requireActual('some-module'); diff --git a/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.nodejs20plus.test.ts.snap b/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.nodejs20plus.test.ts.snap new file mode 100644 index 000000000000..df0656ba7f69 --- /dev/null +++ b/packages/babel-plugin-jest-hoist/src/__tests__/__snapshots__/hoistPlugin.nodejs20plus.test.ts.snap @@ -0,0 +1,575 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`babel 7 babel-plugin-jest-hoist 1. automatic react runtime: 1. automatic react runtime 1`] = ` + +jest.mock('./App', () => () =>
Hello world
); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +var _jsxFileName = '/root/project/src/file.js'; +_getJestObj().mock( + './App', + () => () => + /*#__PURE__*/ _jsxDEV( + 'div', + { + children: 'Hello world', + }, + void 0, + false, + { + fileName: _jsxFileName, + lineNumber: 1, + columnNumber: 32, + }, + this, + ), +); +import {jsxDEV as _jsxDEV} from 'react/jsx-dev-runtime'; +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 7 babel-plugin-jest-hoist 2. top level mocking: 2. top level mocking 1`] = ` + +require('x'); + +jest.enableAutomock(); +jest.disableAutomock(); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().enableAutomock(); +_getJestObj().disableAutomock(); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +require('x'); + +`; + +exports[`babel 7 babel-plugin-jest-hoist 3. within a block: 3. within a block 1`] = ` + +beforeEach(() => { + require('x'); + jest.mock('someNode'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +beforeEach(() => { + _getJestObj().mock('someNode'); + require('x'); +}); + +`; + +exports[`babel 7 babel-plugin-jest-hoist 4. within a block with no siblings: 4. within a block with no siblings 1`] = ` + +beforeEach(() => { + jest.mock('someNode'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +beforeEach(() => { + _getJestObj().mock('someNode'); +}); + +`; + +exports[`babel 7 babel-plugin-jest-hoist 5. required \`jest\` within \`jest\`: 5. required \`jest\` within \`jest\` 1`] = ` + +const {jest} = require('@jest/globals'); + +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +const {jest} = require('@jest/globals'); +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + +`; + +exports[`babel 7 babel-plugin-jest-hoist 6. imported jest.mock within jest.mock: 6. imported jest.mock within jest.mock 1`] = ` + +import {jest} from '@jest/globals'; + +jest.mock('some-module', () => { + jest.mock('some-module'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().mock('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +import {jest} from '@jest/globals'; + +`; + +exports[`babel 7 babel-plugin-jest-hoist 7. global jest.mock within jest.mock: 7. global jest.mock within jest.mock 1`] = ` + +jest.mock('some-module', () => { + jest.mock('some-module'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().mock('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 7 babel-plugin-jest-hoist 8. imported jest.requireActual in jest.mock: 8. imported jest.requireActual in jest.mock 1`] = ` + +import {jest} from '@jest/globals'; + +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + +jest.requireActual('some-module'); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().requireActual('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +import {jest} from '@jest/globals'; +jest.requireActual('some-module'); + +`; + +exports[`babel 7 babel-plugin-jest-hoist 9. global jest.requireActual in jest.mock: 9. global jest.requireActual in jest.mock 1`] = ` + +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + +jest.requireActual('some-module'); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().requireActual('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +jest.requireActual('some-module'); + +`; + +exports[`babel 7 babel-plugin-jest-hoist 10. TS typeof usage in jest.mock: 10. TS typeof usage in jest.mock 1`] = ` + +jest.mock('some-module', () => { + const actual = jest.requireActual('some-module'); + + return jest.fn(); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + const actual = jest.requireActual('some-module'); + return jest.fn(); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 7 babel-plugin-jest-hoist 11. jest.spyOn call on the imported module: 11. jest.spyOn call on the imported module 1`] = ` + +jest.mock('some-module', () => { + const module = jest.requireActual('some-module'); + jest.spyOn(module, 'add'); + return module; +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + const module = jest.requireActual('some-module'); + _getJestObj().spyOn(module, 'add'); + return module; +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 7 babel-plugin-jest-hoist 12. jest.spyOn call in class constructor: 12. jest.spyOn call in class constructor 1`] = ` + +jest.mock('some-module', () => { + const Actual = jest.requireActual('some-module'); + return class Mocked extends Actual { + constructor() { + super(); + jest.spyOn(this, 'add'); + } + }; +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + const Actual = jest.requireActual('some-module'); + return class Mocked extends Actual { + constructor() { + super(); + _getJestObj().spyOn(this, 'add'); + } + }; +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 8 babel-plugin-jest-hoist 13. automatic react runtime: 13. automatic react runtime 1`] = ` + +jest.mock('./App', () => () =>
Hello world
); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +var _jsxFileName = '/root/project/src/file.js'; +_getJestObj().mock( + './App', + () => () => + /*#__PURE__*/ _jsxDEV( + 'div', + { + children: 'Hello world', + }, + void 0, + false, + { + fileName: _jsxFileName, + lineNumber: 1, + columnNumber: 32, + }, + this, + ), +); +import {jsxDEV as _jsxDEV} from 'react/jsx-dev-runtime'; +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 8 babel-plugin-jest-hoist 14. top level mocking: 14. top level mocking 1`] = ` + +require('x'); + +jest.enableAutomock(); +jest.disableAutomock(); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().enableAutomock(); +_getJestObj().disableAutomock(); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +require('x'); + +`; + +exports[`babel 8 babel-plugin-jest-hoist 15. within a block: 15. within a block 1`] = ` + +beforeEach(() => { + require('x'); + jest.mock('someNode'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +beforeEach(() => { + _getJestObj().mock('someNode'); + require('x'); +}); + +`; + +exports[`babel 8 babel-plugin-jest-hoist 16. within a block with no siblings: 16. within a block with no siblings 1`] = ` + +beforeEach(() => { + jest.mock('someNode'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +beforeEach(() => { + _getJestObj().mock('someNode'); +}); + +`; + +exports[`babel 8 babel-plugin-jest-hoist 17. required \`jest\` within \`jest\`: 17. required \`jest\` within \`jest\` 1`] = ` + +const {jest} = require('@jest/globals'); + +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +const {jest} = require('@jest/globals'); +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + +`; + +exports[`babel 8 babel-plugin-jest-hoist 18. imported jest.mock within jest.mock: 18. imported jest.mock within jest.mock 1`] = ` + +import {jest} from '@jest/globals'; + +jest.mock('some-module', () => { + jest.mock('some-module'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().mock('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +import {jest} from '@jest/globals'; + +`; + +exports[`babel 8 babel-plugin-jest-hoist 19. global jest.mock within jest.mock: 19. global jest.mock within jest.mock 1`] = ` + +jest.mock('some-module', () => { + jest.mock('some-module'); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().mock('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 8 babel-plugin-jest-hoist 20. imported jest.requireActual in jest.mock: 20. imported jest.requireActual in jest.mock 1`] = ` + +import {jest} from '@jest/globals'; + +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + +jest.requireActual('some-module'); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().requireActual('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +import {jest} from '@jest/globals'; +jest.requireActual('some-module'); + +`; + +exports[`babel 8 babel-plugin-jest-hoist 21. global jest.requireActual in jest.mock: 21. global jest.requireActual in jest.mock 1`] = ` + +jest.mock('some-module', () => { + jest.requireActual('some-module'); +}); + +jest.requireActual('some-module'); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + _getJestObj().requireActual('some-module'); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} +jest.requireActual('some-module'); + +`; + +exports[`babel 8 babel-plugin-jest-hoist 22. TS typeof usage in jest.mock: 22. TS typeof usage in jest.mock 1`] = ` + +jest.mock('some-module', () => { + const actual = jest.requireActual('some-module'); + + return jest.fn(); +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + const actual = jest.requireActual('some-module'); + return jest.fn(); +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 8 babel-plugin-jest-hoist 23. jest.spyOn call on the imported module: 23. jest.spyOn call on the imported module 1`] = ` + +jest.mock('some-module', () => { + const module = jest.requireActual('some-module'); + jest.spyOn(module, 'add'); + return module; +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + const module = jest.requireActual('some-module'); + _getJestObj().spyOn(module, 'add'); + return module; +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; + +exports[`babel 8 babel-plugin-jest-hoist 24. jest.spyOn call in class constructor: 24. jest.spyOn call in class constructor 1`] = ` + +jest.mock('some-module', () => { + const Actual = jest.requireActual('some-module'); + return class Mocked extends Actual { + constructor() { + super(); + jest.spyOn(this, 'add'); + } + }; +}); + + + ↓ ↓ ↓ ↓ ↓ ↓ + +_getJestObj().mock('some-module', () => { + const Actual = jest.requireActual('some-module'); + return class Mocked extends Actual { + constructor() { + super(); + _getJestObj().spyOn(this, 'add'); + } + }; +}); +function _getJestObj() { + const {jest} = require('@jest/globals'); + _getJestObj = () => jest; + return jest; +} + +`; diff --git a/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.nodejs18.test.ts b/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.nodejs18.test.ts new file mode 100644 index 000000000000..7f0b6d4472ff --- /dev/null +++ b/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.nodejs18.test.ts @@ -0,0 +1,198 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +import * as path from 'path'; +import {format as formatCode, resolveConfig} from '@prettier/sync'; +import pluginTester from 'babel-plugin-tester'; +import type {Options} from 'prettier'; +import babelPluginJestHoist from '..'; + +const prettierOptions: Options = { + ...resolveConfig(__filename), + filepath: __filename, + parser: 'babel-ts', +}; + +const formatResult = (code: string) => formatCode(code, prettierOptions); + +describe('babel 7', () => { + defineTests({ + babel: require('@babel/core'), + presetReact: require('@babel/preset-react').default, + presetTypescript: require('@babel/preset-typescript').default, + }); +}); + +export function defineTests({ + babel, + presetReact, + presetTypescript, +}: { + babel: typeof import('@babel/core'); + presetReact: any; + presetTypescript: any; +}) { + pluginTester({ + babel, + plugin: babelPluginJestHoist, + pluginName: 'babel-plugin-jest-hoist', + tests: { + /* eslint-disable sort-keys */ + 'automatic react runtime': { + babelOptions: { + babelrc: false, + configFile: false, + filename: path.resolve(__dirname, '../file.js'), + presets: [[presetReact, {development: true, runtime: 'automatic'}]], + }, + code: formatResult(` + jest.mock('./App', () => () =>
Hello world
); + `), + formatResult(code) { + // replace the filename with something that will be the same across OSes and machine + const codeWithoutSystemPath = code.replace( + /var _jsxFileName = ".*";/, + 'var _jsxFileName = "/root/project/src/file.js";', + ); + + return formatResult(codeWithoutSystemPath); + }, + snapshot: true, + }, + 'top level mocking': { + code: formatResult(` + require('x'); + + jest.enableAutomock(); + jest.disableAutomock(); + `), + formatResult, + snapshot: true, + }, + 'within a block': { + code: formatResult(` + beforeEach(() => { + require('x') + jest.mock('someNode') + }) + `), + formatResult, + snapshot: true, + }, + 'within a block with no siblings': { + code: formatResult(` + beforeEach(() => { + jest.mock('someNode') + }) + `), + formatResult, + snapshot: true, + }, + + 'required `jest` within `jest`': { + code: formatResult(` + const {jest} = require('@jest/globals'); + + jest.mock('some-module', () => { + jest.requireActual('some-module'); + }); + `), + formatResult, + snapshot: true, + }, + 'imported jest.mock within jest.mock': { + code: formatResult(` + import {jest} from '@jest/globals'; + + jest.mock('some-module', () => { + jest.mock('some-module'); + }); + `), + formatResult, + snapshot: true, + }, + 'global jest.mock within jest.mock': { + code: formatResult(` + jest.mock('some-module', () => { + jest.mock('some-module'); + }); + `), + formatResult, + snapshot: true, + }, + 'imported jest.requireActual in jest.mock': { + code: formatResult(` + import {jest} from '@jest/globals'; + + jest.mock('some-module', () => { + jest.requireActual('some-module'); + }); + + jest.requireActual('some-module'); + `), + formatResult, + snapshot: true, + }, + 'global jest.requireActual in jest.mock': { + code: formatResult(` + jest.mock('some-module', () => { + jest.requireActual('some-module'); + }); + + jest.requireActual('some-module'); + `), + formatResult, + snapshot: true, + }, + 'TS typeof usage in jest.mock': { + babelOptions: { + babelrc: false, + configFile: false, + filename: path.resolve(__dirname, '../file.ts'), + presets: [presetTypescript], + }, + code: formatResult(` + jest.mock('some-module', () => { + const actual = jest.requireActual('some-module'); + + return jest.fn(); + }); + `), + formatResult, + snapshot: true, + }, + 'jest.spyOn call on the imported module': { + code: formatResult(` + jest.mock('some-module', () => { + const module = jest.requireActual('some-module'); + jest.spyOn(module, 'add'); + return module; + }); + `), + formatResult, + snapshot: true, + }, + 'jest.spyOn call in class constructor': { + code: formatResult(` + jest.mock('some-module', () => { + const Actual = jest.requireActual('some-module'); + return class Mocked extends Actual { + constructor() { + super(); + jest.spyOn(this, 'add'); + } + }; + }); + `), + formatResult, + snapshot: true, + }, + }, + /* eslint-enable */ + }); +} diff --git a/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.nodejs20plus.test.ts b/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.nodejs20plus.test.ts new file mode 100644 index 000000000000..1f6520ad41f2 --- /dev/null +++ b/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.nodejs20plus.test.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + +// We need to use the Node.js implementation of `require` to load Babel 8 +// packages, instead of our sandboxed implementation, because Babel 8 is +// written in ESM and we don't support require(esm) yet. +import Module from 'node:module'; +import {pathToFileURL} from 'node:url'; +const createOriginalNodeRequire = Object.getPrototypeOf(Module).createRequire; +const originalNodeRequire = createOriginalNodeRequire( + pathToFileURL(__filename), +); + +// This import will also `define()` the Babel 7 tests +import {defineTests} from './hoistPlugin.nodejs18.test'; + +describe('babel 8', () => { + defineTests({ + babel: originalNodeRequire('@babel-8/core'), + presetReact: originalNodeRequire('@babel-8/preset-react'), + presetTypescript: originalNodeRequire('@babel-8/preset-typescript'), + }); +}); diff --git a/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts b/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts deleted file mode 100644 index 642fbd31f885..000000000000 --- a/packages/babel-plugin-jest-hoist/src/__tests__/hoistPlugin.test.ts +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -import * as path from 'path'; -import {format as formatCode, resolveConfig} from '@prettier/sync'; -import pluginTester from 'babel-plugin-tester'; -import type {Options} from 'prettier'; -import babelPluginJestHoist from '..'; - -const prettierOptions: Options = { - ...resolveConfig(__filename), - filepath: __filename, - parser: 'babel-ts', -}; - -const formatResult = (code: string) => formatCode(code, prettierOptions); - -pluginTester({ - plugin: babelPluginJestHoist, - pluginName: 'babel-plugin-jest-hoist', - tests: { - /* eslint-disable sort-keys */ - 'automatic react runtime': { - babelOptions: { - babelrc: false, - configFile: false, - filename: path.resolve(__dirname, '../file.js'), - presets: [ - [ - require.resolve('@babel/preset-react'), - {development: true, runtime: 'automatic'}, - ], - ], - }, - code: formatResult(` - jest.mock('./App', () => () =>
Hello world
); - `), - formatResult(code) { - // replace the filename with something that will be the same across OSes and machine - const codeWithoutSystemPath = code.replace( - /var _jsxFileName = ".*";/, - 'var _jsxFileName = "/root/project/src/file.js";', - ); - - return formatResult(codeWithoutSystemPath); - }, - snapshot: true, - }, - 'top level mocking': { - code: formatResult(` - require('x'); - - jest.enableAutomock(); - jest.disableAutomock(); - `), - formatResult, - snapshot: true, - }, - 'within a block': { - code: formatResult(` - beforeEach(() => { - require('x') - jest.mock('someNode') - }) - `), - formatResult, - snapshot: true, - }, - 'within a block with no siblings': { - code: formatResult(` - beforeEach(() => { - jest.mock('someNode') - }) - `), - formatResult, - snapshot: true, - }, - - 'required `jest` within `jest`': { - code: formatResult(` - const {jest} = require('@jest/globals'); - - jest.mock('some-module', () => { - jest.requireActual('some-module'); - }); - `), - formatResult, - snapshot: true, - }, - 'imported jest.mock within jest.mock': { - code: formatResult(` - import {jest} from '@jest/globals'; - - jest.mock('some-module', () => { - jest.mock('some-module'); - }); - `), - formatResult, - snapshot: true, - }, - 'global jest.mock within jest.mock': { - code: formatResult(` - jest.mock('some-module', () => { - jest.mock('some-module'); - }); - `), - formatResult, - snapshot: true, - }, - 'imported jest.requireActual in jest.mock': { - code: formatResult(` - import {jest} from '@jest/globals'; - - jest.mock('some-module', () => { - jest.requireActual('some-module'); - }); - - jest.requireActual('some-module'); - `), - formatResult, - snapshot: true, - }, - 'global jest.requireActual in jest.mock': { - code: formatResult(` - jest.mock('some-module', () => { - jest.requireActual('some-module'); - }); - - jest.requireActual('some-module'); - `), - formatResult, - snapshot: true, - }, - 'TS typeof usage in jest.mock': { - babelOptions: { - babelrc: false, - configFile: false, - filename: path.resolve(__dirname, '../file.ts'), - presets: [[require.resolve('@babel/preset-typescript')]], - }, - code: formatResult(` - jest.mock('some-module', () => { - const actual = jest.requireActual('some-module'); - - return jest.fn(); - }); - `), - formatResult, - snapshot: true, - }, - 'jest.spyOn call on the imported module': { - code: formatResult(` - jest.mock('some-module', () => { - const module = jest.requireActual('some-module'); - jest.spyOn(module, 'add'); - return module; - }); - `), - formatResult, - snapshot: true, - }, - 'jest.spyOn call in class constructor': { - code: formatResult(` - jest.mock('some-module', () => { - const Actual = jest.requireActual('some-module'); - return class Mocked extends Actual { - constructor() { - super(); - jest.spyOn(this, 'add'); - } - }; - }); - `), - formatResult, - snapshot: true, - }, - }, - /* eslint-enable */ -}); diff --git a/packages/babel-plugin-jest-hoist/src/index.ts b/packages/babel-plugin-jest-hoist/src/index.ts index c59632ce9e63..4340b38026bc 100644 --- a/packages/babel-plugin-jest-hoist/src/index.ts +++ b/packages/babel-plugin-jest-hoist/src/index.ts @@ -7,22 +7,19 @@ */ import type {PluginObj} from '@babel/core'; -import {statement} from '@babel/template'; import type {NodePath} from '@babel/traverse'; -import { - type CallExpression, - type Expression, - type Identifier, - type ImportDeclaration, - type MemberExpression, - type Node, - type Statement, - type Super, - type VariableDeclaration, - type VariableDeclarator, - callExpression, - isIdentifier, - variableDeclaration, +import type { + CallExpression, + Expression, + Identifier, + ImportDeclaration, + MemberExpression, + Node, + Statement, + StringLiteral, + Super, + VariableDeclaration, + VariableDeclarator, } from '@babel/types'; const JEST_GLOBAL_NAME = 'jest'; @@ -170,10 +167,12 @@ FUNCTIONS.mock = args => { } else if (binding?.path.isImportSpecifier()) { const importDecl = binding.path .parentPath as NodePath; - const imported = binding.path.node.imported; + const imported = binding.path.get('imported'); if ( importDecl.node.source.value === JEST_GLOBALS_MODULE_NAME && - (isIdentifier(imported) ? imported.name : imported.value) === + (imported.isIdentifier() + ? imported.node.name + : (imported.node as StringLiteral).value) === JEST_GLOBALS_MODULE_JEST_EXPORT_NAME ) { isAllowedIdentifier = true; @@ -208,14 +207,6 @@ FUNCTIONS.deepUnmock = args => args.length === 1 && args[0].isStringLiteral(); FUNCTIONS.disableAutomock = FUNCTIONS.enableAutomock = args => args.length === 0; -const createJestObjectGetter = statement` -function GETTER_NAME() { - const { JEST_GLOBALS_MODULE_JEST_EXPORT_NAME } = require("JEST_GLOBALS_MODULE_NAME"); - GETTER_NAME = () => JEST_GLOBALS_MODULE_JEST_EXPORT_NAME; - return JEST_GLOBALS_MODULE_JEST_EXPORT_NAME; -} -`; - const isJestObject = ( expression: NodePath, ): expression is NodePath => { @@ -310,10 +301,22 @@ const extractJestObjExprIfHoistable = (expr: NodePath): JestObjInfo | null => { }; /* eslint-disable sort-keys */ -export default function jestHoist(): PluginObj<{ +export default function jestHoist( + babel: typeof import('@babel/core'), +): PluginObj<{ declareJestObjGetterIdentifier: () => Identifier; jestObjGetterIdentifier?: Identifier; }> { + const {template, types: t} = babel; + + const createJestObjectGetter = template.statement` + function GETTER_NAME() { + const { JEST_GLOBALS_MODULE_JEST_EXPORT_NAME } = require("JEST_GLOBALS_MODULE_NAME"); + GETTER_NAME = () => JEST_GLOBALS_MODULE_JEST_EXPORT_NAME; + return JEST_GLOBALS_MODULE_JEST_EXPORT_NAME; + } + `; + return { pre({path: program}) { this.declareJestObjGetterIdentifier = () => { @@ -341,7 +344,7 @@ export default function jestHoist(): PluginObj<{ exprStmt.get('expression'), ); if (jestObjInfo) { - const jestCallExpr = callExpression( + const jestCallExpr = t.callExpression( this.declareJestObjGetterIdentifier(), [], ); @@ -388,7 +391,9 @@ export default function jestHoist(): PluginObj<{ } else { varDecl.remove(); } - stack.at(-1)!.vars.push(variableDeclaration(kind, [varDecl.node])); + stack + .at(-1)! + .vars.push(t.variableDeclaration(kind, [varDecl.node])); } }, }); diff --git a/packages/babel-preset-jest/package.json b/packages/babel-preset-jest/package.json index bcc56adbba63..b38d3f4f25b8 100644 --- a/packages/babel-preset-jest/package.json +++ b/packages/babel-preset-jest/package.json @@ -1,6 +1,6 @@ { "name": "babel-preset-jest", - "version": "30.0.1", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -14,10 +14,10 @@ }, "dependencies": { "babel-plugin-jest-hoist": "workspace:*", - "babel-preset-current-node-syntax": "^1.1.0" + "babel-preset-current-node-syntax": "^1.2.0" }, "peerDependencies": { - "@babel/core": "^7.11.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" diff --git a/packages/create-jest/package.json b/packages/create-jest/package.json index 4e6fca86a311..a32aaf06e8d5 100644 --- a/packages/create-jest/package.json +++ b/packages/create-jest/package.json @@ -1,7 +1,7 @@ { "name": "create-jest", "description": "Create a new Jest project", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/expect-utils/package.json b/packages/expect-utils/package.json index 3ce905d0ecae..c5d8c14b4c05 100644 --- a/packages/expect-utils/package.json +++ b/packages/expect-utils/package.json @@ -1,6 +1,6 @@ { "name": "@jest/expect-utils", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/expect/package.json b/packages/expect/package.json index f7031a336184..16c0187690ad 100644 --- a/packages/expect/package.json +++ b/packages/expect/package.json @@ -1,6 +1,6 @@ { "name": "expect", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-changed-files/package.json b/packages/jest-changed-files/package.json index aa173657d299..a9a5305a794b 100644 --- a/packages/jest-changed-files/package.json +++ b/packages/jest-changed-files/package.json @@ -1,6 +1,6 @@ { "name": "jest-changed-files", - "version": "30.0.5", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-circus/package.json b/packages/jest-circus/package.json index 5a9ed12f0fe9..271ac46f5859 100644 --- a/packages/jest-circus/package.json +++ b/packages/jest-circus/package.json @@ -1,6 +1,6 @@ { "name": "jest-circus", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-circus/src/__tests__/__snapshots__/baseTest.test.ts.snap b/packages/jest-circus/src/__tests__/__snapshots__/baseTest.test.ts.snap index 63c2e1e4aa83..3a7d0443751e 100644 --- a/packages/jest-circus/src/__tests__/__snapshots__/baseTest.test.ts.snap +++ b/packages/jest-circus/src/__tests__/__snapshots__/baseTest.test.ts.snap @@ -11,6 +11,7 @@ finish_describe_definition: describe run_start run_describe_start: ROOT_DESCRIBE_BLOCK run_describe_start: describe +concurrent_tests_start test_start: one test_start: two test_start: three @@ -29,6 +30,7 @@ test_fn_success: three test_done: one test_done: two test_done: three +concurrent_tests_end run_describe_finish: describe run_describe_finish: ROOT_DESCRIBE_BLOCK run_finish @@ -47,6 +49,7 @@ finish_describe_definition: describe run_start run_describe_start: ROOT_DESCRIBE_BLOCK run_describe_start: describe +concurrent_tests_start test_start: one test_start: two test_start: three @@ -65,6 +68,7 @@ test_fn_success: three test_done: one test_done: two test_done: three +concurrent_tests_end run_describe_finish: describe run_describe_finish: ROOT_DESCRIBE_BLOCK run_finish @@ -83,12 +87,14 @@ finish_describe_definition: describe run_start run_describe_start: ROOT_DESCRIBE_BLOCK run_describe_start: describe +concurrent_tests_start test_start: one test_start: two test_start: three test_skip test_skip test_skip +concurrent_tests_end run_describe_finish: describe run_describe_finish: ROOT_DESCRIBE_BLOCK run_finish @@ -107,12 +113,14 @@ finish_describe_definition: describe run_start run_describe_start: ROOT_DESCRIBE_BLOCK run_describe_start: describe +concurrent_tests_start test_start: one test_start: two test_start: three test_skip test_skip test_skip +concurrent_tests_end run_describe_finish: describe run_describe_finish: ROOT_DESCRIBE_BLOCK run_finish @@ -185,13 +193,15 @@ finish_describe_definition: describe run_start run_describe_start: ROOT_DESCRIBE_BLOCK run_describe_start: describe +run_describe_start: nested +concurrent_tests_start test_start: one test_start: two test_start: three -run_describe_start: nested test_skip test_skip test_skip +concurrent_tests_end run_describe_finish: nested run_describe_finish: describe run_describe_finish: ROOT_DESCRIBE_BLOCK diff --git a/packages/jest-circus/src/__tests__/__snapshots__/concurrent.test.ts.snap b/packages/jest-circus/src/__tests__/__snapshots__/concurrent.test.ts.snap new file mode 100644 index 000000000000..1b8896f6207c --- /dev/null +++ b/packages/jest-circus/src/__tests__/__snapshots__/concurrent.test.ts.snap @@ -0,0 +1,277 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`{before,after}All + concurrent 1`] = ` +"add_hook: beforeAll +add_hook: afterAll +add_test: one +run_start +run_describe_start: ROOT_DESCRIBE_BLOCK +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: one +test_started: one +test_fn_start: one +hello one +test_fn_failure: one +test_done: one +concurrent_tests_end +hook_start: afterAll +hook_success: afterAll +run_describe_finish: ROOT_DESCRIBE_BLOCK +run_finish + +unhandledErrors: 0" +`; + +exports[`Execute concurrent as a single sequential unit in each describe 1`] = ` +"start_describe_definition: foo +add_hook: beforeAll +add_hook: afterAll +add_test: A +add_test: B +add_test: C +start_describe_definition: bar +add_hook: beforeAll +add_hook: afterAll +add_test: D +add_test: E +add_test: F +finish_describe_definition: bar +start_describe_definition: qux +add_hook: beforeAll +add_hook: afterAll +add_test: G +add_test: H +add_test: I +finish_describe_definition: qux +finish_describe_definition: foo +run_start +run_describe_start: ROOT_DESCRIBE_BLOCK +run_describe_start: foo +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: A +test_start: B +test_started: A +test_started: B +test_fn_start: A +test_fn_start: B +test_fn_success: A +test_fn_success: B +test_done: A +test_done: B +concurrent_tests_end +test_start: C +test_started: C +test_fn_start: C +test_fn_success: C +test_done: C +run_describe_start: bar +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: D +test_start: E +test_started: D +test_started: E +test_fn_start: D +test_fn_start: E +test_fn_success: D +test_fn_success: E +test_done: D +test_done: E +concurrent_tests_end +test_start: F +test_started: F +test_fn_start: F +test_fn_success: F +test_done: F +hook_start: afterAll +hook_success: afterAll +run_describe_finish: bar +run_describe_start: qux +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: G +test_start: H +test_started: G +test_started: H +test_fn_start: G +test_fn_start: H +test_fn_success: G +test_fn_success: H +test_done: G +test_done: H +concurrent_tests_end +test_start: I +test_started: I +test_fn_start: I +test_fn_success: I +test_done: I +hook_start: afterAll +hook_success: afterAll +run_describe_finish: qux +hook_start: afterAll +hook_success: afterAll +run_describe_finish: foo +run_describe_finish: ROOT_DESCRIBE_BLOCK +run_finish + +unhandledErrors: 0" +`; + +exports[`describe + {before,after}All + concurrent 1`] = ` +"start_describe_definition: describe +add_hook: beforeAll +add_hook: afterAll +add_test: one +add_test: two +finish_describe_definition: describe +run_start +run_describe_start: ROOT_DESCRIBE_BLOCK +run_describe_start: describe +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: one +test_start: two +test_started: one +test_started: two +test_fn_start: one +test_fn_start: two +test_fn_failure: one +test_fn_failure: two +test_done: one +test_done: two +concurrent_tests_end +hook_start: afterAll +hook_success: afterAll +run_describe_finish: describe +run_describe_finish: ROOT_DESCRIBE_BLOCK +run_finish + +unhandledErrors: 0" +`; + +exports[`describe + {before,after}All + concurrent multiple times 1`] = ` +"start_describe_definition: describe1 +add_hook: beforeAll +add_hook: afterAll +add_test: one +add_test: two +finish_describe_definition: describe1 +start_describe_definition: describe2 +add_hook: beforeAll +add_hook: afterAll +add_test: one +add_test: two +finish_describe_definition: describe2 +run_start +run_describe_start: ROOT_DESCRIBE_BLOCK +run_describe_start: describe1 +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: one +test_start: two +test_started: one +test_started: two +test_fn_start: one +test_fn_start: two +test_fn_failure: one +test_fn_success: two +test_done: one +test_done: two +concurrent_tests_end +hook_start: afterAll +hook_success: afterAll +run_describe_finish: describe1 +run_describe_start: describe2 +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: one +test_start: two +test_started: one +test_started: two +test_fn_start: one +test_fn_start: two +test_fn_failure: one +test_fn_success: two +test_done: one +test_done: two +concurrent_tests_end +hook_start: afterAll +hook_success: afterAll +run_describe_finish: describe2 +run_describe_finish: ROOT_DESCRIBE_BLOCK +run_finish + +unhandledErrors: 0" +`; + +exports[`describe + concurrent & non concurrent 1`] = ` +"start_describe_definition: describe +add_hook: beforeAll +add_hook: afterAll +add_test: one +add_test: two +add_test: three +add_test: four +add_test: five +add_test: six +add_test: seven +finish_describe_definition: describe +run_start +run_describe_start: ROOT_DESCRIBE_BLOCK +run_describe_start: describe +hook_start: beforeAll +hook_success: beforeAll +concurrent_tests_start +test_start: one +test_start: two +test_start: four +test_start: six +test_start: seven +test_started: one +test_started: two +test_started: four +test_started: six +test_started: seven +test_fn_start: one +test_fn_start: two +test_fn_start: four +test_fn_start: six +test_fn_start: seven +test_fn_success: one +test_fn_success: two +test_fn_success: four +test_fn_success: six +test_fn_success: seven +test_done: one +test_done: two +test_done: four +test_done: six +test_done: seven +concurrent_tests_end +test_start: three +test_started: three +test_fn_start: three +test_fn_success: three +test_done: three +test_start: five +test_started: five +test_fn_start: five +test_fn_success: five +test_done: five +hook_start: afterAll +hook_success: afterAll +run_describe_finish: describe +run_describe_finish: ROOT_DESCRIBE_BLOCK +run_finish + +unhandledErrors: 0" +`; diff --git a/packages/jest-circus/src/__tests__/baseTest.test.ts b/packages/jest-circus/src/__tests__/baseTest.test.ts index d3c870719c93..54ed4c4a5111 100644 --- a/packages/jest-circus/src/__tests__/baseTest.test.ts +++ b/packages/jest-circus/src/__tests__/baseTest.test.ts @@ -48,16 +48,16 @@ test('concurrent', () => { describe('describe', () => { beforeEach(() => {}); afterEach(() => { throw new Error('banana')}); - test.concurrent('one', () => { + test.concurrent('one', () => { console.log('hello one'); throw new Error('kentucky') }); test.concurrent('two', () => { console.log('hello two'); }); - test.concurrent('three', async () => { + test.concurrent('three', async () => { console.log('hello three'); - await Promise.resolve(); + await Promise.resolve(); }); }) `); @@ -76,7 +76,7 @@ test('concurrent.each', () => { ['three'], ])('%s', async (name) => { console.log('hello %s', name); - await Promise.resolve(); + await Promise.resolve(); }); }) `); diff --git a/packages/jest-circus/src/__tests__/concurrent.test.ts b/packages/jest-circus/src/__tests__/concurrent.test.ts new file mode 100644 index 000000000000..c44582cdb49b --- /dev/null +++ b/packages/jest-circus/src/__tests__/concurrent.test.ts @@ -0,0 +1,120 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {runTest} from '../__mocks__/testUtils'; + +test('{before,after}All + concurrent', () => { + const {stdout} = runTest(` + const {setTimeout} = require('timers/promises') + + beforeAll(async () => await setTimeout(100)); + afterAll(async () => await setTimeout(100)); + test.concurrent('one', () => { + console.log('hello one'); + throw new Error('kentucky') + }); + `); + + expect(stdout).toMatchSnapshot(); +}); + +test('describe + {before,after}All + concurrent', () => { + const {stdout} = runTest(` + const {setTimeout} = require('timers/promises') + + describe('describe', () => { + beforeAll(async () => await setTimeout(100)); + afterAll(async () => await setTimeout(100)); + test.concurrent('one', () => { + throw new Error('kentucky') + }); + test.concurrent('two', () => { + throw new Error('kentucky') + }); + }) + `); + + expect(stdout).toMatchSnapshot(); +}); + +test('describe + {before,after}All + concurrent multiple times', () => { + const {stdout} = runTest(` + const {setTimeout} = require('timers/promises') + + describe('describe1', () => { + beforeAll(async () => await setTimeout(100)); + afterAll(async () => await setTimeout(100)); + test.concurrent('one', () => { + throw new Error('kentucky') + }); + test.concurrent('two', () => {}); + }) + describe('describe2', () => { + beforeAll(async () => await setTimeout(100)); + afterAll(async () => await setTimeout(100)); + test.concurrent('one', () => { + throw new Error('kentucky') + }); + test.concurrent('two', () => {}); + }) + `); + + expect(stdout).toMatchSnapshot(); +}); + +test('describe + concurrent & non concurrent', () => { + const {stdout} = runTest(` + const {setTimeout} = require('timers/promises') + + describe('describe', () => { + beforeAll(async () => await setTimeout(100)); + afterAll(async () => await setTimeout(100)); + + test.concurrent('one', () => {}); + test.concurrent('two', () => {}); + + test('three', () => {}); + + test.concurrent('four', () => {}); + + test('five', () => {}); + + test.concurrent('six', () => {}); + test.concurrent('seven', () => {}); + }) + `); + + expect(stdout).toMatchSnapshot(); +}); + +test('Execute concurrent as a single sequential unit in each describe', () => { + const {stdout} = runTest(` + describe('foo', () => { + beforeAll(() => {}); + afterAll(() => {}); + test.concurrent('A', () => {}); + test.concurrent('B', () => {}); + test('C', () => {}); + describe('bar', () => { + beforeAll(() => {}); + afterAll(() => {}); + test.concurrent('D', () => {}); + test.concurrent('E', () => {}); + test('F', () => {}); + }); + describe('qux', () => { + beforeAll(() => {}); + afterAll(() => {}); + test.concurrent('G', () => {}); + test.concurrent('H', () => {}); + test('I', () => {}); + }); + }); + `); + + expect(stdout).toMatchSnapshot(); +}); diff --git a/packages/jest-circus/src/run.ts b/packages/jest-circus/src/run.ts index 00569d511ff5..00d36a4c4815 100644 --- a/packages/jest-circus/src/run.ts +++ b/packages/jest-circus/src/run.ts @@ -28,16 +28,16 @@ import { // the original values in the variables before we require any files. const {setTimeout} = globalThis; -type ConcurrentTestEntry = Omit & { - fn: Circus.ConcurrentTestFn; - done: Promise; -}; +const testNameStorage = new AsyncLocalStorage(); const run = async (): Promise => { const {rootDescribeBlock, seed, randomize} = getState(); + jestExpect.setState({ + currentConcurrentTestName: () => testNameStorage.getStore(), + }); const rng = randomize ? rngBuilder(seed) : undefined; await dispatch({name: 'run_start'}); - await _runTestsForDescribeBlock(rootDescribeBlock, rng, true); + await _runTestsForDescribeBlock(rootDescribeBlock, rng); await dispatch({name: 'run_finish'}); return makeRunResult( getState().rootDescribeBlock, @@ -45,10 +45,33 @@ const run = async (): Promise => { ); }; +function* regroupConcurrentChildren( + children: Array, +) { + const concurrentTests = children.filter( + (child): child is Circus.TestEntry => + child.type === 'test' && child.concurrent, + ); + if (concurrentTests.length === 0) { + yield* children; + return; + } + let collectedConcurrent = false; + for (const child of children) { + if (child.type === 'test' && child.concurrent) { + if (!collectedConcurrent) { + collectedConcurrent = true; + yield {tests: concurrentTests, type: 'test-concurrent' as const}; + } + } else { + yield child; + } + } +} + const _runTestsForDescribeBlock = async ( describeBlock: Circus.DescribeBlock, rng: RandomNumberGenerator | undefined, - isRootBlock = false, ) => { await dispatch({describeBlock, name: 'run_describe_start'}); const {beforeAll, afterAll} = getAllHooksForDescribe(describeBlock); @@ -61,17 +84,11 @@ const _runTestsForDescribeBlock = async ( } } - if (isRootBlock) { - const concurrentTests = collectConcurrentTests(describeBlock); - if (concurrentTests.length > 0) { - startTestsConcurrently(concurrentTests, isSkipped); - } - } - // Tests that fail and are retried we run after other tests const retryTimes = Number.parseInt((globalThis as Global.Global)[RETRY_TIMES] as string, 10) || 0; + const hasRetryTimes = retryTimes > 0; const waitBeforeRetry = Number.parseInt( @@ -87,6 +104,8 @@ const _runTestsForDescribeBlock = async ( if (rng) { describeBlock.children = shuffleArray(describeBlock.children, rng); } + // Regroup concurrent tests as a single "sequential" unit + const children = regroupConcurrentChildren(describeBlock.children); const rerunTest = async (test: Circus.TestEntry) => { let numRetriesAvailable = retryTimes; @@ -122,36 +141,45 @@ const _runTestsForDescribeBlock = async ( // If immediate retry is set, we retry the test immediately after the first run await rerunTest(test); }; + const runTestWithContext = async (child: Circus.TestEntry) => { + const hasErrorsBeforeTestRun = child.errors.length > 0; + return testNameStorage.run(getTestID(child), async () => { + await _runTest(child, isSkipped); + await handleRetry(child, hasErrorsBeforeTestRun, hasRetryTimes); + }); + }; - const concurrentTests = []; - - for (const child of describeBlock.children) { + for (const child of children) { switch (child.type) { case 'describeBlock': { await _runTestsForDescribeBlock(child, rng); break; } case 'test': { - const hasErrorsBeforeTestRun = child.errors.length > 0; - const hasRetryTimes = retryTimes > 0; - if (child.concurrent) { - concurrentTests.push( - (child as ConcurrentTestEntry).done.then(() => - handleRetry(child, hasErrorsBeforeTestRun, hasRetryTimes), - ), - ); - } else { - await _runTest(child, isSkipped); - await handleRetry(child, hasErrorsBeforeTestRun, hasRetryTimes); - } + await runTestWithContext(child); + break; + } + case 'test-concurrent': { + await dispatch({ + describeBlock, + name: 'concurrent_tests_start', + tests: child.tests, + }); + const concurrencyLimiter = pLimit(getState().maxConcurrency); + const tasks = child.tests.map(concurrentTest => + concurrencyLimiter(() => runTestWithContext(concurrentTest)), + ); + await Promise.all(tasks); + await dispatch({ + describeBlock, + name: 'concurrent_tests_end', + tests: child.tests, + }); break; } } } - // wait for concurrent tests to finish - await Promise.all(concurrentTests); - // Re-run failed tests n-times if configured for (const test of deferredRetryTests) { await rerunTest(test); @@ -166,51 +194,6 @@ const _runTestsForDescribeBlock = async ( await dispatch({describeBlock, name: 'run_describe_finish'}); }; -function collectConcurrentTests( - describeBlock: Circus.DescribeBlock, -): Array { - return describeBlock.children.flatMap(child => { - switch (child.type) { - case 'describeBlock': - return collectConcurrentTests(child); - case 'test': - if (child.concurrent) { - return [child as ConcurrentTestEntry]; - } - return []; - } - }); -} - -function startTestsConcurrently( - concurrentTests: Array, - parentSkipped: boolean, -) { - const mutex = pLimit(getState().maxConcurrency); - const testNameStorage = new AsyncLocalStorage(); - jestExpect.setState({ - currentConcurrentTestName: () => testNameStorage.getStore(), - }); - for (const test of concurrentTests) { - try { - const promise = mutex(() => - testNameStorage.run(getTestID(test), () => - _runTest(test, parentSkipped), - ), - ); - // Avoid triggering the uncaught promise rejection handler in case the - // test fails before being awaited on. - // eslint-disable-next-line @typescript-eslint/no-empty-function - promise.catch(() => {}); - test.done = promise; - } catch (error) { - test.fn = () => { - throw error; - }; - } - } -} - const _runTest = async ( test: Circus.TestEntry, parentSkipped: boolean, diff --git a/packages/jest-cli/package.json b/packages/jest-cli/package.json index 86b12fe2ed09..8d9d684e81f8 100644 --- a/packages/jest-cli/package.json +++ b/packages/jest-cli/package.json @@ -1,7 +1,7 @@ { "name": "jest-cli", "description": "Delightful JavaScript Testing.", - "version": "30.1.3", + "version": "30.2.0", "main": "./build/index.js", "types": "./build/index.d.ts", "exports": { diff --git a/packages/jest-config/package.json b/packages/jest-config/package.json index bfc666d30003..539e7a7675e7 100644 --- a/packages/jest-config/package.json +++ b/packages/jest-config/package.json @@ -1,6 +1,6 @@ { "name": "jest-config", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -61,6 +61,7 @@ "strip-json-comments": "^3.1.1" }, "devDependencies": { + "@jest/test-utils": "workspace:*", "@types/graceful-fs": "^4.1.9", "@types/micromatch": "^4.0.9", "@types/parse-json": "^4.0.2", diff --git a/packages/jest-config/src/__tests__/readConfigFileAndSetRootDir.test.ts b/packages/jest-config/src/__tests__/readConfigFileAndSetRootDir.test.ts index 1c049a94bd68..e83f3b7cdb02 100644 --- a/packages/jest-config/src/__tests__/readConfigFileAndSetRootDir.test.ts +++ b/packages/jest-config/src/__tests__/readConfigFileAndSetRootDir.test.ts @@ -9,6 +9,7 @@ import path from 'path'; import * as fs from 'graceful-fs'; import {requireOrImportModule} from 'jest-util'; import readConfigFileAndSetRootDir from '../readConfigFileAndSetRootDir'; +import {onNodeVersions} from '@jest/test-utils'; jest.mock('graceful-fs').mock('jest-util'); @@ -167,3 +168,23 @@ describe('readConfigFileAndSetRootDir', () => { }); }); }); + +onNodeVersions('^24', () => { + describe('TypeScript file', () => { + test('reaches into 2nd loadout by TS loader if specified in docblock', async () => { + jest + .mocked(requireOrImportModule) + .mockRejectedValueOnce(new Error('Module not found')); + jest.mocked(fs.readFileSync).mockReturnValue(` + /** @jest-config-loader tsx */ + export { testTimeout: 1_000 } + `); + const rootDir = path.resolve('some', 'path', 'to'); + await expect( + readConfigFileAndSetRootDir(path.join(rootDir, 'jest.config.ts')), + ).rejects.toThrow( + /Module not found\n.*'tsx' is not a valid TypeScript configuration loader./, + ); + }); + }); +}); diff --git a/packages/jest-config/src/__tests__/tsconfig.json b/packages/jest-config/src/__tests__/tsconfig.json index dd1bca103251..d603a17f8dfe 100644 --- a/packages/jest-config/src/__tests__/tsconfig.json +++ b/packages/jest-config/src/__tests__/tsconfig.json @@ -1,5 +1,5 @@ { "extends": "../../../../tsconfig.test.json", "include": ["./**/*"], - "references": [{"path": "../../"}] + "references": [{"path": "../../"}, {"path": "../../../test-utils"}] } diff --git a/packages/jest-config/src/readConfigFileAndSetRootDir.ts b/packages/jest-config/src/readConfigFileAndSetRootDir.ts index f71d1af715ba..1648afa1843e 100644 --- a/packages/jest-config/src/readConfigFileAndSetRootDir.ts +++ b/packages/jest-config/src/readConfigFileAndSetRootDir.ts @@ -11,7 +11,7 @@ import * as fs from 'graceful-fs'; import parseJson from 'parse-json'; import stripJsonComments from 'strip-json-comments'; import type {Config} from '@jest/types'; -import {extract, parse} from 'jest-docblock'; +import {type Pragmas, extract, parse} from 'jest-docblock'; import {interopRequireDefault, requireOrImportModule} from 'jest-util'; import { JEST_CONFIG_EXT_CTS, @@ -47,10 +47,15 @@ export default async function readConfigFileAndSetRootDir( configObject = await requireOrImportModule(configPath); } catch (requireOrImportModuleError) { if (!(requireOrImportModuleError instanceof SyntaxError)) { - throw requireOrImportModuleError; + if (!hasTsLoaderExplicitlyConfigured(configPath)) { + throw requireOrImportModuleError; + } } try { - // Likely ESM in a file interpreted as CJS, which means it needs to be + // There are various reasons of failed loadout of Jest config in Typescript: + // 1. User has specified a TypeScript loader in the docblock and + // desire non-native compilation (https://github.com/jestjs/jest/issues/15837) + // 2. Likely ESM in a file interpreted as CJS, which means it needs to be // compiled. We ignore the error and try to load it with a loader. configObject = await loadTSConfigFile(configPath); } catch (loadTSConfigFileError) { @@ -120,11 +125,22 @@ export default async function readConfigFileAndSetRootDir( // Load the TypeScript configuration let extraTSLoaderOptions: Record; +const hasTsLoaderExplicitlyConfigured = (configPath: string): boolean => { + const docblockPragmas = loadDocblockPragmasInConfig(configPath); + const tsLoader = docblockPragmas['jest-config-loader']; + return !Array.isArray(tsLoader) && (tsLoader ?? '').trim() !== ''; +}; + +const loadDocblockPragmasInConfig = (configPath: string): Pragmas => { + const docblockPragmas = parse(extract(fs.readFileSync(configPath, 'utf8'))); + return docblockPragmas; +}; + const loadTSConfigFile = async ( configPath: string, ): Promise => { // Get registered TypeScript compiler instance - const docblockPragmas = parse(extract(fs.readFileSync(configPath, 'utf8'))); + const docblockPragmas = loadDocblockPragmasInConfig(configPath); const tsLoader = docblockPragmas['jest-config-loader'] || 'ts-node'; const docblockTSLoaderOptions = docblockPragmas['jest-config-loader-options']; diff --git a/packages/jest-console/package.json b/packages/jest-console/package.json index 2d31b72e326b..c063333ec393 100644 --- a/packages/jest-console/package.json +++ b/packages/jest-console/package.json @@ -1,6 +1,6 @@ { "name": "@jest/console", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-console/src/__tests__/CustomConsole.test.ts b/packages/jest-console/src/__tests__/CustomConsole.test.ts index de9e934e8332..6f71cddeb858 100644 --- a/packages/jest-console/src/__tests__/CustomConsole.test.ts +++ b/packages/jest-console/src/__tests__/CustomConsole.test.ts @@ -79,7 +79,7 @@ describe('CustomConsole', () => { expect(_stderr).toMatch('AssertionError'); expect(_stderr).toMatch( // The message may differ across Node versions - /(false == true)|(The expression evaluated to a falsy value:)/, + /(false == true)|(The expression evaluated to a falsy value)/, ); }); diff --git a/packages/jest-core/package.json b/packages/jest-core/package.json index e07f0e8cac68..ef741723353a 100644 --- a/packages/jest-core/package.json +++ b/packages/jest-core/package.json @@ -1,7 +1,7 @@ { "name": "@jest/core", "description": "Delightful JavaScript Testing.", - "version": "30.1.3", + "version": "30.2.0", "main": "./build/index.js", "types": "./build/index.d.ts", "exports": { diff --git a/packages/jest-core/src/TestScheduler.ts b/packages/jest-core/src/TestScheduler.ts index 0b3fa990ddd4..9f92641c3228 100644 --- a/packages/jest-core/src/TestScheduler.ts +++ b/packages/jest-core/src/TestScheduler.ts @@ -41,6 +41,7 @@ import { import {ErrorWithStack, invariant, requireOrImportModule} from 'jest-util'; import type {TestWatcher} from 'jest-watcher'; import ReporterDispatcher from './ReporterDispatcher'; +import runGlobalHook from './runGlobalHook'; import {shouldRunInBand} from './testSchedulerHelper'; export type ReporterConstructor = new ( @@ -150,7 +151,12 @@ class TestScheduler { testResult, aggregatedResults, ); - return this._bailIfNeeded(testContexts, aggregatedResults, watcher); + return this._bailIfNeeded( + testContexts, + aggregatedResults, + watcher, + tests, + ); }; const onFailure = async (test: Test, error: SerializableError) => { @@ -408,6 +414,7 @@ class TestScheduler { testContexts: Set, aggregatedResults: AggregatedResult, watcher: TestWatcher, + allTests: Array, ): Promise { if ( this._globalConfig.bail !== 0 && @@ -421,8 +428,17 @@ class TestScheduler { try { await this._dispatcher.onRunComplete(testContexts, aggregatedResults); } finally { - const exitCode = this._globalConfig.testFailureExitCode; - exit(exitCode); + // Perform global teardown if client configures `bail` + if (allTests.length > 0) { + performance.mark('jest/globalTeardown:start'); + await runGlobalHook({ + allTests, + globalConfig: this._globalConfig, + moduleName: 'globalTeardown', + }); + performance.mark('jest/globalTeardown:end'); + exit(this._globalConfig.testFailureExitCode); + } } } } diff --git a/packages/jest-core/src/__tests__/TestScheduler.test.js b/packages/jest-core/src/__tests__/TestScheduler.test.js index 6f8c3977aefe..11030572d774 100644 --- a/packages/jest-core/src/__tests__/TestScheduler.test.js +++ b/packages/jest-core/src/__tests__/TestScheduler.test.js @@ -18,6 +18,7 @@ import {makeGlobalConfig, makeProjectConfig} from '@jest/test-utils'; import * as transform from '@jest/transform'; import {createTestScheduler} from '../TestScheduler'; import * as testSchedulerHelper from '../testSchedulerHelper'; +import * as runGlobalHook from '../runGlobalHook'; jest .mock('ci-info', () => ({GITHUB_ACTIONS: true})) @@ -35,7 +36,8 @@ jest __esModule: true, ...jest.requireActual('@jest/transform'), }; - }); + }) + .mock('exit-x', () => ({__esModule: true, default: jest.fn()})); const mockSerialRunner = { isSerial: true, runTests: jest.fn(), @@ -53,10 +55,13 @@ jest.mock('jest-runner-parallel', () => jest.fn(() => mockParallelRunner), { const spyShouldRunInBand = jest.spyOn(testSchedulerHelper, 'shouldRunInBand'); +const spyRunGlobalHook = jest.spyOn(runGlobalHook, 'default'); + beforeEach(() => { mockSerialRunner.runTests.mockClear(); mockParallelRunner.runTests.mockClear(); spyShouldRunInBand.mockClear(); + spyRunGlobalHook.mockClear(); }); describe('reporters', () => { @@ -449,6 +454,42 @@ test('should bail after `n` failures', async () => { expect(setState).toHaveBeenCalledWith({interrupted: true}); }); +test('should bail after `n` failures and perform global teardown', async () => { + const scheduler = await createTestScheduler( + makeGlobalConfig({bail: 3}), + {}, + {}, + ); + const test = { + context: { + config: makeProjectConfig({ + moduleFileExtensions: ['.js'], + rootDir: './', + runner: 'jest-runner-serial', + transform: [], + }), + hasteFS: { + matchFiles: jest.fn(() => []), + }, + }, + path: './test/path.js', + }; + + const tests = [test]; + const setState = jest.fn(); + await scheduler.scheduleTests(tests, { + isInterrupted: jest.fn(), + isWatchMode: () => false, + setState, + }); + await mockSerialRunner.runTests.mock.calls[0][3](test, { + numFailingTests: 3, + snapshot: {}, + testResults: [{}], + }); + expect(spyRunGlobalHook.mock.calls[0][0].moduleName).toBe('globalTeardown'); +}); + test('should not bail if less than `n` failures', async () => { const scheduler = await createTestScheduler( makeGlobalConfig({bail: 2}), diff --git a/packages/jest-create-cache-key-function/package.json b/packages/jest-create-cache-key-function/package.json index 2ad0ce4c8e5f..442d6a2af7bc 100644 --- a/packages/jest-create-cache-key-function/package.json +++ b/packages/jest-create-cache-key-function/package.json @@ -1,6 +1,6 @@ { "name": "@jest/create-cache-key-function", - "version": "30.0.5", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-diff/package.json b/packages/jest-diff/package.json index c34b35e23e28..846d375aac12 100644 --- a/packages/jest-diff/package.json +++ b/packages/jest-diff/package.json @@ -1,6 +1,6 @@ { "name": "jest-diff", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-docblock/package.json b/packages/jest-docblock/package.json index 03065680eb74..cc11833d873f 100644 --- a/packages/jest-docblock/package.json +++ b/packages/jest-docblock/package.json @@ -1,6 +1,6 @@ { "name": "jest-docblock", - "version": "30.0.1", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-docblock/src/index.ts b/packages/jest-docblock/src/index.ts index 87928ccacfed..da5518f5f887 100644 --- a/packages/jest-docblock/src/index.ts +++ b/packages/jest-docblock/src/index.ts @@ -8,7 +8,7 @@ import {EOL} from 'os'; import detectNewline from 'detect-newline'; -type Pragmas = Record>; +export type Pragmas = Record>; const commentEndRe = /\*\/$/; const commentStartRe = /^\/\*\*?/; diff --git a/packages/jest-each/package.json b/packages/jest-each/package.json index 843319ed90df..1068ea0baa97 100644 --- a/packages/jest-each/package.json +++ b/packages/jest-each/package.json @@ -1,6 +1,6 @@ { "name": "jest-each", - "version": "30.1.0", + "version": "30.2.0", "description": "Parameterised tests for Jest", "main": "./build/index.js", "types": "./build/index.d.ts", diff --git a/packages/jest-environment-jsdom-abstract/package.json b/packages/jest-environment-jsdom-abstract/package.json index 5a80fff99a9f..1dd90074dcc2 100644 --- a/packages/jest-environment-jsdom-abstract/package.json +++ b/packages/jest-environment-jsdom-abstract/package.json @@ -1,6 +1,6 @@ { "name": "@jest/environment-jsdom-abstract", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -28,6 +28,7 @@ "jest-util": "workspace:*" }, "devDependencies": { + "@jest/test-utils": "workspace:*", "jsdom": "^26.1.0" }, "peerDependencies": { diff --git a/packages/jest-environment-jsdom-abstract/src/__tests__/index.test.ts b/packages/jest-environment-jsdom-abstract/src/__tests__/index.test.ts new file mode 100644 index 000000000000..572379fdabe3 --- /dev/null +++ b/packages/jest-environment-jsdom-abstract/src/__tests__/index.test.ts @@ -0,0 +1,65 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import BaseJSDOMEnvironment from '..'; +import type { + EnvironmentContext, + JestEnvironmentConfig, +} from '@jest/environment'; +import * as jsdomModule from 'jsdom'; +import {makeGlobalConfig, makeProjectConfig} from '@jest/test-utils'; + +class CustomJSDOMEnvironment extends BaseJSDOMEnvironment { + constructor( + public config: JestEnvironmentConfig, + public context: EnvironmentContext, + ) { + super(config, context, jsdomModule); + } +} + +describe('JSDomEnvironment abstract', () => { + it('should work with custom jsdom version <= 26', () => { + Object.defineProperty(jsdomModule.VirtualConsole.prototype, 'sendTo', { + value: jest.fn(), + writable: true, + }); + Object.defineProperty(jsdomModule.VirtualConsole.prototype, 'forwardTo', { + value: undefined, + writable: true, + }); + const env = new CustomJSDOMEnvironment( + { + globalConfig: makeGlobalConfig(), + projectConfig: makeProjectConfig(), + }, + {console, docblockPragmas: {}, testPath: __filename}, + ); + + expect(env.dom).toBeDefined(); + }); + + it('should work with custom jsdom version >= 27', () => { + Object.defineProperty(jsdomModule.VirtualConsole.prototype, 'sendTo', { + value: undefined, + writable: true, + }); + Object.defineProperty(jsdomModule.VirtualConsole.prototype, 'forwardTo', { + value: jest.fn(), + writable: true, + }); + const env = new CustomJSDOMEnvironment( + { + globalConfig: makeGlobalConfig(), + projectConfig: makeProjectConfig(), + }, + {console, docblockPragmas: {}, testPath: __filename}, + ); + + expect(env.dom).toBeDefined(); + }); +}); diff --git a/packages/jest-environment-jsdom-abstract/src/__tests__/tsconfig.json b/packages/jest-environment-jsdom-abstract/src/__tests__/tsconfig.json new file mode 100644 index 000000000000..d603a17f8dfe --- /dev/null +++ b/packages/jest-environment-jsdom-abstract/src/__tests__/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../../tsconfig.test.json", + "include": ["./**/*"], + "references": [{"path": "../../"}, {"path": "../../../test-utils"}] +} diff --git a/packages/jest-environment-jsdom-abstract/src/index.ts b/packages/jest-environment-jsdom-abstract/src/index.ts index 17164455c8d5..9d5ef98575e5 100644 --- a/packages/jest-environment-jsdom-abstract/src/index.ts +++ b/packages/jest-environment-jsdom-abstract/src/index.ts @@ -52,7 +52,26 @@ export default abstract class BaseJSDOMEnvironment const {JSDOM, ResourceLoader, VirtualConsole} = jsdomModule; const virtualConsole = new VirtualConsole(); - virtualConsole.sendTo(context.console, {omitJSDOMErrors: true}); + + if ( + 'forwardTo' in virtualConsole && + typeof virtualConsole.forwardTo === 'function' + ) { + // JSDOM 27+ uses `forwardTo` + virtualConsole.forwardTo(context.console); + } else if ( + 'sendTo' in virtualConsole && + typeof virtualConsole.sendTo === 'function' + ) { + // JSDOM 26 uses `sendTo` + virtualConsole.sendTo(context.console, {omitJSDOMErrors: true}); + } else { + // Fallback for unexpected API changes + throw new TypeError( + 'Unable to forward JSDOM console output - neither sendTo nor forwardTo methods are available', + ); + } + virtualConsole.on('jsdomError', error => { context.console.error(error); }); diff --git a/packages/jest-environment-jsdom/package.json b/packages/jest-environment-jsdom/package.json index ed21351523a5..ea97231ff0fc 100644 --- a/packages/jest-environment-jsdom/package.json +++ b/packages/jest-environment-jsdom/package.json @@ -1,6 +1,6 @@ { "name": "jest-environment-jsdom", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-environment-node/package.json b/packages/jest-environment-node/package.json index d5b36433454f..474afb2aa28b 100644 --- a/packages/jest-environment-node/package.json +++ b/packages/jest-environment-node/package.json @@ -1,6 +1,6 @@ { "name": "jest-environment-node", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-environment/package.json b/packages/jest-environment/package.json index d564e4de81db..ed8d08e366ee 100644 --- a/packages/jest-environment/package.json +++ b/packages/jest-environment/package.json @@ -1,6 +1,6 @@ { "name": "@jest/environment", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-expect/package.json b/packages/jest-expect/package.json index 3792f3d47896..7ca95c4e3756 100644 --- a/packages/jest-expect/package.json +++ b/packages/jest-expect/package.json @@ -1,6 +1,6 @@ { "name": "@jest/expect", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-fake-timers/package.json b/packages/jest-fake-timers/package.json index 52e0ceb32f99..0d6436e31f43 100644 --- a/packages/jest-fake-timers/package.json +++ b/packages/jest-fake-timers/package.json @@ -1,6 +1,6 @@ { "name": "@jest/fake-timers", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-globals/package.json b/packages/jest-globals/package.json index 019d73aa5b32..705750787eda 100644 --- a/packages/jest-globals/package.json +++ b/packages/jest-globals/package.json @@ -1,6 +1,6 @@ { "name": "@jest/globals", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-haste-map/package.json b/packages/jest-haste-map/package.json index bf06891f18b4..08fc20872a51 100644 --- a/packages/jest-haste-map/package.json +++ b/packages/jest-haste-map/package.json @@ -1,6 +1,6 @@ { "name": "jest-haste-map", - "version": "30.1.0", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-jasmine2/package.json b/packages/jest-jasmine2/package.json index e76c448a9720..13724d915ff3 100644 --- a/packages/jest-jasmine2/package.json +++ b/packages/jest-jasmine2/package.json @@ -1,6 +1,6 @@ { "name": "jest-jasmine2", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-leak-detector/package.json b/packages/jest-leak-detector/package.json index 41717d998469..1cc1a2f1bcc7 100644 --- a/packages/jest-leak-detector/package.json +++ b/packages/jest-leak-detector/package.json @@ -1,6 +1,6 @@ { "name": "jest-leak-detector", - "version": "30.1.0", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-matcher-utils/package.json b/packages/jest-matcher-utils/package.json index 6343998b0495..38f829da9b0b 100644 --- a/packages/jest-matcher-utils/package.json +++ b/packages/jest-matcher-utils/package.json @@ -1,7 +1,7 @@ { "name": "jest-matcher-utils", "description": "A set of utility functions for expect and related packages", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-message-util/package.json b/packages/jest-message-util/package.json index b4b7aff1bda7..01f02767e0b2 100644 --- a/packages/jest-message-util/package.json +++ b/packages/jest-message-util/package.json @@ -1,6 +1,6 @@ { "name": "jest-message-util", - "version": "30.1.0", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-mock/package.json b/packages/jest-mock/package.json index 7d2e3d9bb1cb..e94281cafac0 100644 --- a/packages/jest-mock/package.json +++ b/packages/jest-mock/package.json @@ -1,6 +1,6 @@ { "name": "jest-mock", - "version": "30.0.5", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-phabricator/package.json b/packages/jest-phabricator/package.json index 7f7e171f7a77..cd29b9b53562 100644 --- a/packages/jest-phabricator/package.json +++ b/packages/jest-phabricator/package.json @@ -1,6 +1,6 @@ { "name": "jest-phabricator", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-reporters/package.json b/packages/jest-reporters/package.json index 1e461a2cc2b3..03541540f434 100644 --- a/packages/jest-reporters/package.json +++ b/packages/jest-reporters/package.json @@ -1,7 +1,7 @@ { "name": "@jest/reporters", "description": "Jest's reporters", - "version": "30.1.3", + "version": "30.2.0", "main": "./build/index.js", "types": "./build/index.d.ts", "exports": { diff --git a/packages/jest-resolve-dependencies/package.json b/packages/jest-resolve-dependencies/package.json index 2490882915c5..b0c5e1b30c6b 100644 --- a/packages/jest-resolve-dependencies/package.json +++ b/packages/jest-resolve-dependencies/package.json @@ -1,6 +1,6 @@ { "name": "jest-resolve-dependencies", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index ecfa18163934..cd26d192d758 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -1,6 +1,6 @@ { "name": "jest-resolve", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-runner/package.json b/packages/jest-runner/package.json index ce30c94ed2c2..0676b0452ee9 100644 --- a/packages/jest-runner/package.json +++ b/packages/jest-runner/package.json @@ -1,6 +1,6 @@ { "name": "jest-runner", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-runtime/package.json b/packages/jest-runtime/package.json index eae2a6a8b89c..7aa064cb59d4 100644 --- a/packages/jest-runtime/package.json +++ b/packages/jest-runtime/package.json @@ -1,6 +1,6 @@ { "name": "jest-runtime", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-snapshot-utils/package.json b/packages/jest-snapshot-utils/package.json index e95a1b98762f..fdbee8ceb73d 100644 --- a/packages/jest-snapshot-utils/package.json +++ b/packages/jest-snapshot-utils/package.json @@ -1,6 +1,6 @@ { "name": "@jest/snapshot-utils", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-snapshot-utils/src/__tests__/utils.test.ts b/packages/jest-snapshot-utils/src/__tests__/utils.test.ts index b3712ee17fc9..4c3b7c4d3090 100644 --- a/packages/jest-snapshot-utils/src/__tests__/utils.test.ts +++ b/packages/jest-snapshot-utils/src/__tests__/utils.test.ts @@ -178,8 +178,8 @@ test('getSnapshotData() throws for deprecated snapshot guide link', () => { `${chalk.red( `${chalk.red.bold( 'Outdated guide link', - )}: The snapshot guide link is outdated.` + - 'Please update all snapshots while upgrading of Jest', + )}: The snapshot guide link at the top of this snapshot is outdated. ` + + 'Please update all snapshots during this upgrade of Jest.', )}\n\nExpected: ${SNAPSHOT_GUIDE_LINK}\n` + `Received: ${deprecatedGuideLink}`, ); diff --git a/packages/jest-snapshot-utils/src/utils.ts b/packages/jest-snapshot-utils/src/utils.ts index ad1c0f18db34..9fab6d9c6e4a 100644 --- a/packages/jest-snapshot-utils/src/utils.ts +++ b/packages/jest-snapshot-utils/src/utils.ts @@ -79,8 +79,8 @@ const validateSnapshotHeader = (snapshotContents: string) => { chalk.red( `${chalk.red.bold( 'Outdated guide link', - )}: The snapshot guide link is outdated.` + - 'Please update all snapshots while upgrading of Jest', + )}: The snapshot guide link at the top of this snapshot is outdated. ` + + 'Please update all snapshots during this upgrade of Jest.', ) + '\n\n' + `Expected: ${SNAPSHOT_GUIDE_LINK}\n` + diff --git a/packages/jest-snapshot/package.json b/packages/jest-snapshot/package.json index 4edb78c22ecf..06a06b6b66cc 100644 --- a/packages/jest-snapshot/package.json +++ b/packages/jest-snapshot/package.json @@ -1,6 +1,6 @@ { "name": "jest-snapshot", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -29,7 +29,7 @@ "@jest/snapshot-utils": "workspace:*", "@jest/transform": "workspace:*", "@jest/types": "workspace:*", - "babel-preset-current-node-syntax": "^1.1.0", + "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "workspace:*", "graceful-fs": "^4.2.11", diff --git a/packages/jest-test-result/package.json b/packages/jest-test-result/package.json index 9b46793bdfac..1e636937977c 100644 --- a/packages/jest-test-result/package.json +++ b/packages/jest-test-result/package.json @@ -1,6 +1,6 @@ { "name": "@jest/test-result", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-test-sequencer/package.json b/packages/jest-test-sequencer/package.json index cc30623cde75..66b73c9bb176 100644 --- a/packages/jest-test-sequencer/package.json +++ b/packages/jest-test-sequencer/package.json @@ -1,6 +1,6 @@ { "name": "@jest/test-sequencer", - "version": "30.1.3", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-transform/package.json b/packages/jest-transform/package.json index 95e148810e41..7e42959cee6e 100644 --- a/packages/jest-transform/package.json +++ b/packages/jest-transform/package.json @@ -1,6 +1,6 @@ { "name": "@jest/transform", - "version": "30.1.2", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", @@ -22,7 +22,7 @@ "@babel/core": "^7.27.4", "@jest/types": "workspace:*", "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", + "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", diff --git a/packages/jest-types/package.json b/packages/jest-types/package.json index 3c42b84add20..4835c90e0f4c 100644 --- a/packages/jest-types/package.json +++ b/packages/jest-types/package.json @@ -1,6 +1,6 @@ { "name": "@jest/types", - "version": "30.0.5", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-types/src/Circus.ts b/packages/jest-types/src/Circus.ts index 46c86aef9eec..f796e118e237 100644 --- a/packages/jest-types/src/Circus.ts +++ b/packages/jest-types/src/Circus.ts @@ -160,6 +160,16 @@ export type AsyncEvent = name: 'test_done'; test: TestEntry; } + | { + name: 'concurrent_tests_start'; + tests: Array; + describeBlock: DescribeBlock; + } + | { + name: 'concurrent_tests_end'; + tests: Array; + describeBlock: DescribeBlock; + } | { name: 'run_describe_start'; describeBlock: DescribeBlock; diff --git a/packages/jest-util/package.json b/packages/jest-util/package.json index a85c9bb76f43..070a43251d34 100644 --- a/packages/jest-util/package.json +++ b/packages/jest-util/package.json @@ -1,6 +1,6 @@ { "name": "jest-util", - "version": "30.0.5", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-validate/package.json b/packages/jest-validate/package.json index d3bf10169899..54ad88e0506f 100644 --- a/packages/jest-validate/package.json +++ b/packages/jest-validate/package.json @@ -1,6 +1,6 @@ { "name": "jest-validate", - "version": "30.1.0", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest-watcher/package.json b/packages/jest-watcher/package.json index f00fdb707923..2d15c4423672 100644 --- a/packages/jest-watcher/package.json +++ b/packages/jest-watcher/package.json @@ -1,7 +1,7 @@ { "name": "jest-watcher", "description": "Delightful JavaScript Testing.", - "version": "30.1.3", + "version": "30.2.0", "main": "./build/index.js", "types": "./build/index.d.ts", "exports": { diff --git a/packages/jest-worker/package.json b/packages/jest-worker/package.json index 874f97f35b82..6905b349bcf3 100644 --- a/packages/jest-worker/package.json +++ b/packages/jest-worker/package.json @@ -1,6 +1,6 @@ { "name": "jest-worker", - "version": "30.1.0", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/jest/package.json b/packages/jest/package.json index 800d8c1cc3a0..e34932ae1c4e 100644 --- a/packages/jest/package.json +++ b/packages/jest/package.json @@ -1,7 +1,7 @@ { "name": "jest", "description": "Delightful JavaScript Testing.", - "version": "30.1.3", + "version": "30.2.0", "main": "./build/index.js", "types": "./build/index.d.ts", "exports": { diff --git a/packages/pretty-format/package.json b/packages/pretty-format/package.json index 10f7898a519c..22341c8fdd6e 100644 --- a/packages/pretty-format/package.json +++ b/packages/pretty-format/package.json @@ -1,6 +1,6 @@ { "name": "pretty-format", - "version": "30.0.5", + "version": "30.2.0", "repository": { "type": "git", "url": "https://github.com/jestjs/jest.git", diff --git a/packages/pretty-format/src/__tests__/prettyFormat.test.ts b/packages/pretty-format/src/__tests__/prettyFormat.test.ts index 22f9119341ee..8e0430cabe35 100644 --- a/packages/pretty-format/src/__tests__/prettyFormat.test.ts +++ b/packages/pretty-format/src/__tests__/prettyFormat.test.ts @@ -482,6 +482,11 @@ describe('prettyFormat()', () => { expect(prettyFormat(val)).toBe('WeakSet {}'); }); + it('prints a Promise', () => { + const val = Promise.resolve(); + expect(prettyFormat(val)).toBe('Promise {}'); + }); + it('prints deeply nested objects', () => { const val = {prop: {prop: {prop: 'value'}}}; expect(prettyFormat(val)).toBe( diff --git a/packages/pretty-format/src/index.ts b/packages/pretty-format/src/index.ts index 0a7dd6084272..f7469a20d55c 100644 --- a/packages/pretty-format/src/index.ts +++ b/packages/pretty-format/src/index.ts @@ -158,6 +158,9 @@ function printBasicValue( const toStringed = toString.call(val); + if (toStringed === '[object Promise]') { + return 'Promise {}'; + } if (toStringed === '[object WeakMap]') { return 'WeakMap {}'; } diff --git a/packages/test-globals/package.json b/packages/test-globals/package.json index a6fa9dffeda1..897b2753d6b0 100644 --- a/packages/test-globals/package.json +++ b/packages/test-globals/package.json @@ -1,6 +1,6 @@ { "name": "@jest/test-globals", - "version": "30.1.2", + "version": "30.2.0", "private": true, "main": "./build/index.js", "types": "./build/index.d.ts", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index ef920941b4f3..4dfe58d1acf9 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@jest/test-utils", - "version": "30.1.2", + "version": "30.2.0", "private": true, "main": "./build/index.js", "types": "./build/index.d.ts", diff --git a/website/static/img/content/failedSnapshotTest.png b/website/static/img/content/failedSnapshotTest.png index edf5d6bebb0b..09653e48f385 100644 Binary files a/website/static/img/content/failedSnapshotTest.png and b/website/static/img/content/failedSnapshotTest.png differ diff --git a/yarn.lock b/yarn.lock index e2c6694fb4c5..345126a2d7a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -363,7 +363,66 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.8.3": +"@babel-8/core@npm:@babel/core@8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/core@npm:8.0.0-beta.1" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^8.0.0-beta.1" + "@babel/generator": "npm:^8.0.0-beta.1" + "@babel/helper-compilation-targets": "npm:^8.0.0-beta.1" + "@babel/helpers": "npm:^8.0.0-beta.1" + "@babel/parser": "npm:^8.0.0-beta.1" + "@babel/template": "npm:^8.0.0-beta.1" + "@babel/traverse": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + "@types/gensync": "npm:^1.0.0" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^7.3.4" + peerDependencies: + "@babel/preset-typescript": ^7.21.4 || ^8.0.0-0 + peerDependenciesMeta: + "@babel/preset-typescript": + optional: true + checksum: 10/c486f9eeedf92903dcf73b68e5589f8086a01c46780688fad47a090e0b015908b01f8a507804bb6a32b87cd48ae3cc664cdcb12f7ee8f31e8b2dc40d87b1da44 + languageName: node + linkType: hard + +"@babel-8/preset-react@npm:@babel/preset-react@8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/preset-react@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + "@babel/helper-validator-option": "npm:^8.0.0-beta.1" + "@babel/plugin-transform-react-display-name": "npm:^8.0.0-beta.1" + "@babel/plugin-transform-react-jsx": "npm:^8.0.0-beta.1" + "@babel/plugin-transform-react-jsx-development": "npm:^8.0.0-beta.1" + "@babel/plugin-transform-react-pure-annotations": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/53cabfd5c8b96e77438b0270ebf40c6a33626da888ddbd2969dd6348408dce8e35c42d793e807da68eef815e485daaf5d0a1587108f6203c680bcf524452fd2c + languageName: node + linkType: hard + +"@babel-8/preset-typescript@npm:@babel/preset-typescript@8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/preset-typescript@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + "@babel/helper-validator-option": "npm:^8.0.0-beta.1" + "@babel/plugin-syntax-jsx": "npm:^8.0.0-beta.1" + "@babel/plugin-transform-modules-commonjs": "npm:^8.0.0-beta.1" + "@babel/plugin-transform-typescript": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/4fbca261c45acc43cc07ab81b09acd10c161d75d260066b5f41859a20245453340aac25b35ac4fadede8f8fcfd42acc2052362347ade59bf9c831c89448a5a78 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.26.2, @babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.8.3": version: 7.27.1 resolution: "@babel/code-frame@npm:7.27.1" dependencies: @@ -374,6 +433,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/code-frame@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-validator-identifier": "npm:^8.0.0-beta.1" + js-tokens: "npm:^8.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/3d60a5514b6dce15332c5b5256b609fdfc0c5bd205147a6c97e1d683c53fdaf27a506f7207cc19aa80d750119398abc851886bb413e5e3bee225c048946434ca + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.2": version: 7.27.2 resolution: "@babel/compat-data@npm:7.27.2" @@ -381,7 +451,14 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.13.16, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.25.9, @babel/core@npm:^7.27.4": +"@babel/compat-data@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/compat-data@npm:8.0.0-beta.1" + checksum: 10/10d5bae7048cfdcd6914412a71ffd406d08001405f9da5b302009e4272913d61458609dcfb1bb2becff81010c6aa08bc3b1e5db35863847fb4b8c29a8fb776ef + languageName: node + linkType: hard + +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.25.2, @babel/core@npm:^7.25.9, @babel/core@npm:^7.27.4": version: 7.27.4 resolution: "@babel/core@npm:7.27.4" dependencies: @@ -417,6 +494,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/generator@npm:8.0.0-beta.1" + dependencies: + "@babel/parser": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/ca377af327d996f31b86639241414b0cb96cc3c41de698a998dcd64a0bbb14297afc68bfe106ef60465e2e29c33491b180c6ef3a325bd4ca7ee1c7fd442bee75 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" @@ -426,6 +516,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-annotate-as-pure@npm:8.0.0-beta.1" + dependencies: + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/d200ef2ad21d39d692e1e5e84e9158505d4b902a7e721c7ac6875b2125bd9ea1356a89e244fd44c83d2292c358b8b3053dc1d060f2e59d5a475535ded1dfaebe + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" @@ -439,7 +538,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.27.1": +"@babel/helper-compilation-targets@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-compilation-targets@npm:8.0.0-beta.1" + dependencies: + "@babel/compat-data": "npm:^8.0.0-beta.1" + "@babel/helper-validator-option": "npm:^8.0.0-beta.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^7.14.1" + semver: "npm:^7.3.4" + checksum: 10/abc86605e31ba07ee6eecc592b47d6569a0658507bdd60a435a0f1264e8b2af43d27e04f1699e87ada800e04bb716d2503800d7f61f05765f440db694bf1140a + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" dependencies: @@ -456,6 +568,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-create-class-features-plugin@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^8.0.0-beta.1" + "@babel/helper-member-expression-to-functions": "npm:^8.0.0-beta.1" + "@babel/helper-optimise-call-expression": "npm:^8.0.0-beta.1" + "@babel/helper-replace-supers": "npm:^8.0.0-beta.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^8.0.0-beta.1" + "@babel/traverse": "npm:^8.0.0-beta.1" + semver: "npm:^7.3.4" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/0b9aa2e8c52ae4141e9fa179e887daaa2dc2c8bb9677e6ba3b678f4bad08556e0ce58816c2704a6e74c77e23e12ab39f18f2dc5975b76037002c1585375cb8cf + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" @@ -484,6 +613,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-globals@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-globals@npm:8.0.0-beta.1" + checksum: 10/414e0358f1d74b177c5031378b655be40aa0b4f1b58ac990e1bf11b3cdfec461827104ff83bdc604309b06fdda972dac97b0ba2cd27d39beb17e85847f5b6b7b + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" @@ -494,6 +630,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-member-expression-to-functions@npm:8.0.0-beta.1" + dependencies: + "@babel/traverse": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/523897dd0bf91dbeca9cedeca04d4e3f82478cb73cb797412cfd407e7d06693d414b1e99c9da8bc084b1191f6cc71b86f8f039aa448ca7ea0bc81661f1054f2c + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-module-imports@npm:7.27.1" @@ -504,6 +650,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-module-imports@npm:8.0.0-beta.1" + dependencies: + "@babel/traverse": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/7ce7a80ab8cd35c015fc3880118ab4402aa6d26b87fe8cae2226eddd25c13fe34603485ea1ba7dda0bd85f0b23e1bc265c1cdaaba85f5dfcda31fda3c300e74d + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3": version: 7.27.3 resolution: "@babel/helper-module-transforms@npm:7.27.3" @@ -517,6 +673,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-module-transforms@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-module-imports": "npm:^8.0.0-beta.1" + "@babel/helper-validator-identifier": "npm:^8.0.0-beta.1" + "@babel/traverse": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/9d24e9e7af9ef42b05c7dd00625aad929637630a6628fe5e5a3f91c1f3a33a8ff901c78e216b7963ec87c462eb3abfc610d7695348fd4c23996f8adda3ae8005 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" @@ -526,13 +695,31 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-optimise-call-expression@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-optimise-call-expression@npm:8.0.0-beta.1" + dependencies: + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/1ce45306f1335ca5f1e78d2b19ae74ddc341c264664381b9df04e0a0b965caa10388ccaabb8707b75fab5694b07ba2fff0632220109e6c973f9e4b9ec818e28e + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-plugin-utils@npm:8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/66aee91a5fe32adf8cc39bb47bcceda2fc9893839bb891a8c502916f1aafd5350be8c08d2313abffb43f9c9bc94ed25b65c07e6f586dbd26a9bb829d4ebbec54 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" @@ -559,7 +746,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0, @babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": +"@babel/helper-replace-supers@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-replace-supers@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-member-expression-to-functions": "npm:^8.0.0-beta.1" + "@babel/helper-optimise-call-expression": "npm:^8.0.0-beta.1" + "@babel/traverse": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/a3b5b33322ef1299bc1e65e2718f5762753f1d611c77d88dc219bb3bf2b900b44ec047f6abc6873aabbc1df7f9b0e1c40d4d88ec4e38ba7d0233d6d76ed9e717 + languageName: node + linkType: hard + +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" dependencies: @@ -569,6 +769,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:8.0.0-beta.1" + dependencies: + "@babel/traverse": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/1af15f949a93205fd3b7c19ad3fa0d61a9261d7cfdd605129f1569adf8bdb9dca0b0b5547f40fa5c03841c2a38b5b7de01b0a8632f889014495a3867533b7c8d + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -576,6 +786,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-string-parser@npm:8.0.0-beta.1" + checksum: 10/73f4d84ff62197e8e83ed493c475771ad44b43f0c86d29317b19188a5d3f635d0b6d22d44d52a701d4d1a0c600d8921bd199af71110321c5bf2ff7d543067d84 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-identifier@npm:7.27.1" @@ -583,6 +800,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-validator-identifier@npm:8.0.0-beta.1" + checksum: 10/03764d83050e638a0f609512d676048e6474601c5dc43ab341ca3a88b7f47bcd83e75f448f6d969a5a560a9a32dc8d8143aca1d3905d01d642b9f0b6a419f6b0 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -590,6 +814,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helper-validator-option@npm:8.0.0-beta.1" + checksum: 10/bd1119a305d15dabe6a10689113163cfbfcba7651f5bcf7e44d29ebec32d320c1512268d8011cbfc23c3d5d28084894bfc5a2aab67e29e096b3d7cb2f957f8f8 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-wrap-function@npm:7.27.1" @@ -611,7 +842,17 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": +"@babel/helpers@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/helpers@npm:8.0.0-beta.1" + dependencies: + "@babel/template": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/99d88bdb97a5dc8ab4aa8884b72afbbe1566d57bb0c09fb078013b509a5702e7cb112efd390e51834b03a4f1dee9389663e72c58c542f53fb6b0bd5775127904 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.27.1, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": version: 7.27.5 resolution: "@babel/parser@npm:7.27.5" dependencies: @@ -622,6 +863,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/parser@npm:8.0.0-beta.1" + dependencies: + "@babel/types": "npm:^8.0.0-beta.1" + bin: + parser: ./bin/babel-parser.js + checksum: 10/35863d2c3d2c2806bfce87c212299ff09ca72e96f445e69c49a9f6dc205ee3a61805e7a9a071b25d0fc1c26b7b3f63b45dc3080caee0b0847cce11695f1428f6 + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" @@ -681,18 +933,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.13.0": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/49a78a2773ec0db56e915d9797e44fd079ab8a9b2e1716e0df07c92532f2c65d76aeda9543883916b8e0ff13606afeffa67c5b93d05b607bc87653ad18a91422 - languageName: node - linkType: hard - "@babel/plugin-proposal-decorators@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-proposal-decorators@npm:7.27.1" @@ -717,31 +957,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.13.8": - version: 7.18.6 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/949c9ddcdecdaec766ee610ef98f965f928ccc0361dd87cf9f88cf4896a6ccd62fce063d4494778e50da99dea63d270a1be574a62d6ab81cbe9d85884bf55a7d - languageName: node - linkType: hard - -"@babel/plugin-proposal-optional-chaining@npm:^7.13.12": - version: 7.21.0 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.20.0" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/522cd133aff5c94c0ef36ff83c64f03deee183815da68b65b6950e81972ace3b514e032df07ea76d0f9ec8cc7a49578092907adfa17fccb4612117557c04a882 - languageName: node - linkType: hard - "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -894,6 +1109,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-syntax-jsx@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/208489f482b3420b8e1e39092fe4ee0f697cb7704c4602b2e95a507b7bb6fb02b205dc42c20b658a84221f33d50957fefa818cca2a7c096a124cf368ac77832d + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -993,6 +1219,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-syntax-typescript@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/038b3950561c71daf5eab6fa47c3cbf6e373dc587aadb7805290287141c138826ed166136cf646d2e11c2166b8d4eeefc04ee11fa13192db54dd435606f9011f + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -1288,7 +1525,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.13.8, @babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1": +"@babel/plugin-transform-modules-commonjs@npm:^7.24.8, @babel/plugin-transform-modules-commonjs@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" dependencies: @@ -1300,6 +1537,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-module-transforms": "npm:^8.0.0-beta.1" + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/1906ce306fd57047503a7dcb728cd55b465c71b2a383b2f0503073a5063673716ba415b7576cc5bf280b880149588b4ec91ed76910d6cd4194d3d3f2294a125c + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.27.1" @@ -1489,6 +1738,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-transform-react-display-name@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/43b3004a2a90d0d63f145e5f7d31d751c0208bb9eb75b16b611f53f6b2fe48f6ef343fd6787d1668147dda75224ad07e9d5e869b9d104ea1e8b805e5f2625a48 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-development@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" @@ -1500,6 +1760,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-development@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-transform-react-jsx-development@npm:8.0.0-beta.1" + dependencies: + "@babel/plugin-transform-react-jsx": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/09053e6319af5d3a1f231ff8705a590b26a70a3f57b516dc0fa6f2199f2bc220244218270a3ac43441d1a64e0d6bba1023f8fd57843e164780b5093a24b46f3c + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-self@npm:^7.24.7": version: 7.27.1 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.27.1" @@ -1537,6 +1808,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-transform-react-jsx@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^8.0.0-beta.1" + "@babel/helper-module-imports": "npm:^8.0.0-beta.1" + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + "@babel/plugin-syntax-jsx": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/8cca4a4d0f9cee7f30751fe125bf32e2d8c794d6a7c1f92dd209877757540ca03f99e604ec92731382afc04b0f50a6d9e763246d8822f07be746029d28aa7cff + languageName: node + linkType: hard + "@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" @@ -1549,6 +1835,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-pure-annotations@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^8.0.0-beta.1" + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/cfe1a8a1eeca765ab3f852b3d45753dea284657f45ad49115021b11200abdfcff915dd735f22e3e33907eda0e1dcb0b904c883d44525a669d68d4fed460a6dd5 + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.24.7, @babel/plugin-transform-regenerator@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-regenerator@npm:7.27.1" @@ -1670,6 +1968,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/plugin-transform-typescript@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^8.0.0-beta.1" + "@babel/helper-create-class-features-plugin": "npm:^8.0.0-beta.1" + "@babel/helper-plugin-utils": "npm:^8.0.0-beta.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^8.0.0-beta.1" + "@babel/plugin-syntax-typescript": "npm:^8.0.0-beta.1" + peerDependencies: + "@babel/core": ^8.0.0-beta.1 + checksum: 10/5d818fe5ee87bb00ef12d86dcf84cb8c05dc6051b0e4f416cc38e0a148e9b03fe64e35d8c67f107e12bf0906bf23b5e668b0b2f008ec66adb909bcea7278d41b + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" @@ -1796,7 +2109,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-flow@npm:^7.13.13, @babel/preset-flow@npm:^7.27.1": +"@babel/preset-flow@npm:^7.27.1": version: 7.27.1 resolution: "@babel/preset-flow@npm:7.27.1" dependencies: @@ -1838,7 +2151,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.13.0, @babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9, @babel/preset-typescript@npm:^7.27.1": +"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9, @babel/preset-typescript@npm:^7.27.1": version: 7.27.1 resolution: "@babel/preset-typescript@npm:7.27.1" dependencies: @@ -1853,7 +2166,7 @@ __metadata: languageName: node linkType: hard -"@babel/register@npm:^7.13.16, @babel/register@npm:^7.27.1": +"@babel/register@npm:^7.27.1": version: 7.27.1 resolution: "@babel/register@npm:7.27.1" dependencies: @@ -1895,6 +2208,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/template@npm:8.0.0-beta.1" + dependencies: + "@babel/code-frame": "npm:^8.0.0-beta.1" + "@babel/parser": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + checksum: 10/ac267409100661293088563fc5eb18a033acabc66babaa441b2e5c6d85db9b880d0ede8943ced3eddc4353b31dba2911f0c1cb15cd30fbf0d4b94fd1406825c9 + languageName: node + linkType: hard + "@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": version: 7.27.1 resolution: "@babel/traverse@npm:7.27.1" @@ -1925,6 +2249,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/traverse@npm:8.0.0-beta.1" + dependencies: + "@babel/code-frame": "npm:^8.0.0-beta.1" + "@babel/generator": "npm:^8.0.0-beta.1" + "@babel/helper-globals": "npm:^8.0.0-beta.1" + "@babel/parser": "npm:^8.0.0-beta.1" + "@babel/template": "npm:^8.0.0-beta.1" + "@babel/types": "npm:^8.0.0-beta.1" + debug: "npm:^4.3.1" + checksum: 10/8a2ba75ae46ab97a88ba54cf235c2c828cc165191cd680501ad378497d6d4fe93cd7d99dfdfea49cca6617fbc34dae8525392dbc2a42b1f4dcffb0f6602292d0 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.2, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.4.4": version: 7.27.3 resolution: "@babel/types@npm:7.27.3" @@ -1935,6 +2274,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^8.0.0-beta.1": + version: 8.0.0-beta.1 + resolution: "@babel/types@npm:8.0.0-beta.1" + dependencies: + "@babel/helper-string-parser": "npm:^8.0.0-beta.1" + "@babel/helper-validator-identifier": "npm:^8.0.0-beta.1" + checksum: 10/387992998c93cec8f89218af092ec54ea9efdc349b20f1b1b4a4c8f78411f26d307b899688e893a3c90ec8aec2bffe53aec2bf8ba90be75d75839c4856c71dcb + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -3744,20 +4093,6 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - chalk: "npm:^4.0.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - slash: "npm:^3.0.0" - checksum: 10/4a80c750e8a31f344233cb9951dee9b77bf6b89377cb131f8b3cde07ff218f504370133a5963f6a786af4d2ce7f85642db206ff7a15f99fe58df4c38ac04899e - languageName: node - linkType: hard - "@jest/console@workspace:*, @jest/console@workspace:packages/jest-console": version: 0.0.0-use.local resolution: "@jest/console@workspace:packages/jest-console" @@ -3816,7 +4151,7 @@ __metadata: languageName: unknown linkType: soft -"@jest/create-cache-key-function@npm:^29.6.3": +"@jest/create-cache-key-function@npm:^29.7.0": version: 29.7.0 resolution: "@jest/create-cache-key-function@npm:29.7.0" dependencies: @@ -3851,6 +4186,7 @@ __metadata: dependencies: "@jest/environment": "workspace:*" "@jest/fake-timers": "workspace:*" + "@jest/test-utils": "workspace:*" "@jest/types": "workspace:*" "@types/jsdom": "npm:^21.1.7" "@types/node": "npm:*" @@ -3988,7 +4324,7 @@ __metadata: jest-silent-reporter: "npm:^0.6.0" jest-snapshot: "workspace:*" jest-util: "workspace:*" - jest-watch-typeahead: "npm:^2.2.2" + jest-watch-typeahead: "npm:^3.0.1" jquery: "npm:^3.2.1" js-yaml: "npm:^4.1.0" micromatch: "npm:^4.0.8" @@ -4124,18 +4460,6 @@ __metadata: languageName: unknown linkType: soft -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" - dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - collect-v8-coverage: "npm:^1.0.0" - checksum: 10/c073ab7dfe3c562bff2b8fee6cc724ccc20aa96bcd8ab48ccb2aa309b4c0c1923a9e703cea386bd6ae9b71133e92810475bb9c7c22328fc63f797ad3324ed189 - languageName: node - linkType: hard - "@jest/test-result@workspace:*, @jest/test-result@workspace:packages/jest-test-result": version: 0.0.0-use.local resolution: "@jest/test-result@workspace:packages/jest-test-result" @@ -4191,7 +4515,7 @@ __metadata: "@types/graceful-fs": "npm:^4.1.9" "@types/micromatch": "npm:^4.0.9" "@types/write-file-atomic": "npm:^4.0.3" - babel-plugin-istanbul: "npm:^7.0.0" + babel-plugin-istanbul: "npm:^7.0.1" chalk: "npm:^4.1.2" convert-source-map: "npm:^2.0.0" dedent: "npm:^1.6.0" @@ -4248,14 +4572,13 @@ __metadata: languageName: unknown linkType: soft -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.12 + resolution: "@jridgewell/gen-mapping@npm:0.3.12" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/9d3a56ab3612ab9b85d38b2a93b87f3324f11c5130859957f6500e4ac8ce35f299d5ccc3ecd1ae87597601ecf83cee29e9afd04c18777c24011073992ff946df + checksum: 10/151667531566417a940d4dd0a319724979f7a90b9deb9f1617344e1183887d78c835bc1a9209c1ee10fc8a669cdd7ac8120a43a2b6bc8d0d5dd18a173059ff4b languageName: node linkType: hard @@ -4266,13 +4589,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": version: 0.3.6 resolution: "@jridgewell/source-map@npm:0.3.6" @@ -4283,10 +4599,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.4 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.4" + checksum: 10/f677787f52224c6c971a7a41b7a074243240a6917fa75eceb9f7a442866f374fb0522b505e0496ee10a650c5936727e76d11bf36a6d0ae9e6c3b726c9e284cc7 languageName: node linkType: hard @@ -4300,13 +4616,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.29 + resolution: "@jridgewell/trace-mapping@npm:0.3.29" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + checksum: 10/64e1ce0dc3a9e56b0118eaf1b2f50746fd59a36de37516cc6855b5370d5f367aa8229e1237536d738262e252c70ee229619cb04e3f3b822146ee3eb1b7ab297f languageName: node linkType: hard @@ -5022,35 +5338,26 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/assets-registry@npm:0.76.6" - checksum: 10/2eb3a7f9ad5de9b5f136cb123dbb9f31669cc39415d9cb42a1024fb9f7c73abcac82db12356d742ae14c6b053c852816460e68d8c32c2ffbe7e996d8bff1d66d - languageName: node - linkType: hard - -"@react-native/babel-plugin-codegen@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/babel-plugin-codegen@npm:0.76.6" - dependencies: - "@react-native/codegen": "npm:0.76.6" - checksum: 10/866a3036f3a801d71d5215b1f67eae464544cb7027c0ab7387c5cb9f1f335d1716183a39a36909323a27a9421f2ce19a4d6dc628b24ae9dee48c3974e472f6db +"@react-native/assets-registry@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/assets-registry@npm:0.81.4" + checksum: 10/d9e786df3ec2fb78bde627daab2f12f3f96a2d53f8f0f0bd315b6df4770ac5da5085999e8ca243ad52d0d4e316296c626c865d8675639003c8cdd6a22e9ea732 languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.79.2": - version: 0.79.2 - resolution: "@react-native/babel-plugin-codegen@npm:0.79.2" +"@react-native/babel-plugin-codegen@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/babel-plugin-codegen@npm:0.81.4" dependencies: "@babel/traverse": "npm:^7.25.3" - "@react-native/codegen": "npm:0.79.2" - checksum: 10/57fad0dbba59282b25a80a1e720c6e6a208b39913f76c2254d71b8615354ede55188772261d5d536f8534bd80d032ba5860cb2be91dcd4728c6977c081dea0c8 + "@react-native/codegen": "npm:0.81.4" + checksum: 10/4fd6d096e2c52059e9d163d1f60e3d4a3977ca37e20d7c50dbd3a3a25509319b243c1cb2f1f07074425559cb9532beca06cf3f8193524c065090e0665bbbe982 languageName: node linkType: hard -"@react-native/babel-preset@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/babel-preset@npm:0.76.6" +"@react-native/babel-preset@npm:^0.81.1": + version: 0.81.4 + resolution: "@react-native/babel-preset@npm:0.81.4" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" @@ -5093,203 +5400,117 @@ __metadata: "@babel/plugin-transform-typescript": "npm:^7.25.2" "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.76.6" - babel-plugin-syntax-hermes-parser: "npm:^0.25.1" + "@react-native/babel-plugin-codegen": "npm:0.81.4" + babel-plugin-syntax-hermes-parser: "npm:0.29.1" babel-plugin-transform-flow-enums: "npm:^0.0.2" react-refresh: "npm:^0.14.0" peerDependencies: "@babel/core": "*" - checksum: 10/fc320d9f02775c194c791b3602d2ff2b6f72387494fdd58d1c80fbfa9a2f9333af03273e9cf8b97856f892ba7cd47e9272a664207fc8e8accdfc82d695ad0578 + checksum: 10/8ccd8a8f4fc91cc088778448987045f23fb4c281247ed81da9b9d69de4344f2f643295c704c3c888bd603aec6dfc58c639c420f9fc375406c9758c49312d115d languageName: node linkType: hard -"@react-native/babel-preset@npm:^0.79.2": - version: 0.79.2 - resolution: "@react-native/babel-preset@npm:0.79.2" +"@react-native/codegen@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/codegen@npm:0.81.4" dependencies: "@babel/core": "npm:^7.25.2" - "@babel/plugin-proposal-export-default-from": "npm:^7.24.7" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-default-from": "npm:^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.25.0" - "@babel/plugin-transform-class-properties": "npm:^7.25.4" - "@babel/plugin-transform-classes": "npm:^7.25.4" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.8" - "@babel/plugin-transform-flow-strip-types": "npm:^7.25.2" - "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.25.1" - "@babel/plugin-transform-literals": "npm:^7.25.2" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.24.7" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-react-display-name": "npm:^7.24.7" - "@babel/plugin-transform-react-jsx": "npm:^7.25.2" - "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" - "@babel/plugin-transform-react-jsx-source": "npm:^7.24.7" - "@babel/plugin-transform-regenerator": "npm:^7.24.7" - "@babel/plugin-transform-runtime": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" - "@babel/plugin-transform-typescript": "npm:^7.25.2" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/template": "npm:^7.25.0" - "@react-native/babel-plugin-codegen": "npm:0.79.2" - babel-plugin-syntax-hermes-parser: "npm:0.25.1" - babel-plugin-transform-flow-enums: "npm:^0.0.2" - react-refresh: "npm:^0.14.0" - peerDependencies: - "@babel/core": "*" - checksum: 10/4cd8c2095489fe90a83e720f5c4e67f74b736d05d66ae9c5de73d6abb048fdab262eaea6416d99430601d8699bcaad68ff75890195af47298b427f29ad9f029b - languageName: node - linkType: hard - -"@react-native/codegen@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/codegen@npm:0.76.6" - dependencies: "@babel/parser": "npm:^7.25.3" glob: "npm:^7.1.1" - hermes-parser: "npm:0.23.1" - invariant: "npm:^2.2.4" - jscodeshift: "npm:^0.14.0" - mkdirp: "npm:^0.5.1" - nullthrows: "npm:^1.1.1" - yargs: "npm:^17.6.2" - peerDependencies: - "@babel/preset-env": ^7.1.6 - checksum: 10/d414ebe4e89af8309351ad9d077bb73d337aed39257b6b4c62cfd8ddb4251a182f53dbf93815cb52724e650832c26ca91db7c595a915fb4cc8d5971b8f01c8f3 - languageName: node - linkType: hard - -"@react-native/codegen@npm:0.79.2": - version: 0.79.2 - resolution: "@react-native/codegen@npm:0.79.2" - dependencies: - glob: "npm:^7.1.1" - hermes-parser: "npm:0.25.1" + hermes-parser: "npm:0.29.1" invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" yargs: "npm:^17.6.2" peerDependencies: "@babel/core": "*" - checksum: 10/1bb9f50f71fdc4cc32a19191715ed1bdd3e5c2c926da523e7850d79701c974c869bd6e3c815339f6a09e112d78c8a0c10ae2da7dfc5b4271775df160ff812ed7 + checksum: 10/a278aed7bcacacfe697b1341991cf3003ce4f1c10db3f4c91e23c3af1abfbfde558003f65d765e768dc5e8675e8f0c0328b8c1188a5ab3ad6975d0e98b7d335b languageName: node linkType: hard -"@react-native/community-cli-plugin@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/community-cli-plugin@npm:0.76.6" +"@react-native/community-cli-plugin@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/community-cli-plugin@npm:0.81.4" dependencies: - "@react-native/dev-middleware": "npm:0.76.6" - "@react-native/metro-babel-transformer": "npm:0.76.6" - chalk: "npm:^4.0.0" - execa: "npm:^5.1.1" + "@react-native/dev-middleware": "npm:0.81.4" + debug: "npm:^4.4.0" invariant: "npm:^2.2.4" - metro: "npm:^0.81.0" - metro-config: "npm:^0.81.0" - metro-core: "npm:^0.81.0" - node-fetch: "npm:^2.2.0" - readline: "npm:^1.3.0" + metro: "npm:^0.83.1" + metro-config: "npm:^0.83.1" + metro-core: "npm:^0.83.1" semver: "npm:^7.1.3" peerDependencies: - "@react-native-community/cli-server-api": "*" + "@react-native-community/cli": "*" + "@react-native/metro-config": "*" peerDependenciesMeta: - "@react-native-community/cli-server-api": + "@react-native-community/cli": + optional: true + "@react-native/metro-config": optional: true - checksum: 10/56e0729410712bd712daf55a72d23aeafa5ff465d1ba0d5935dac35c42fc472a23eba5a9545d506089dd6f7fe4937bf12f1b7fac5aa7350c43997d897124e3a9 + checksum: 10/0f7ab58002f7eea115b3397306d5f5005d7fc1b90b5e1e1adb0c5bc336c9334f82adfe795e97104bcfb7c8bfd20b1d886710b4a01f6b9a43af2e5f7a7324dc1a languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/debugger-frontend@npm:0.76.6" - checksum: 10/f57da89d0443850ac323bbed59987b227bec5b6b4b4509348f4d0c80d59c8d9399335edbaee3a7283273ff52896d2cede465d0d9882c1dadd2c5808ee392e588 +"@react-native/debugger-frontend@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/debugger-frontend@npm:0.81.4" + checksum: 10/07a1c8250ddb470a184aa3820f76d956df4d9f6300aae0b51b42bd4d539ffd8cdcda627f8b27e92a9956631cf9be11f9d773fdd8215784444536ee1a9a7178b1 languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/dev-middleware@npm:0.76.6" +"@react-native/dev-middleware@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/dev-middleware@npm:0.81.4" dependencies: "@isaacs/ttlcache": "npm:^1.4.1" - "@react-native/debugger-frontend": "npm:0.76.6" + "@react-native/debugger-frontend": "npm:0.81.4" chrome-launcher: "npm:^0.15.2" chromium-edge-launcher: "npm:^0.2.0" connect: "npm:^3.6.5" - debug: "npm:^2.2.0" + debug: "npm:^4.4.0" + invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" open: "npm:^7.0.3" - selfsigned: "npm:^2.4.1" - serve-static: "npm:^1.13.1" + serve-static: "npm:^1.16.2" ws: "npm:^6.2.3" - checksum: 10/a3788c0e2cc6938e44803162923b69ef9951efc9cc75b751d1823db07115731a4132ab70604da98821e34210f07d3adc7b42fa15b870a6ed08d04e88ebe107ad - languageName: node - linkType: hard - -"@react-native/gradle-plugin@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/gradle-plugin@npm:0.76.6" - checksum: 10/7d9bea6bd913c356cc40e03c8b3388a0dc86c87b3a60c0281ea10ef1451022165c783f25a523b4d199ca5ae259f25dd10f60eb462200c4ee93e692c3089833af + checksum: 10/255f87d75f08c666eda81e6c2f60444b120fc94f7b9623a981cce3c29f4dc7cbf6316001be1f85826ca4e0f30fe9c71e0977084c82c5c6dcb3d9434f4626249a languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/js-polyfills@npm:0.76.6" - checksum: 10/5c8029a43da9fc091f348235c1ee326f5c67f06d11ea70cb763d35c8692c361f47f2ec49bee605c844c79b218662686f22ef547d1a6393dd135ede44ea6e566d +"@react-native/gradle-plugin@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/gradle-plugin@npm:0.81.4" + checksum: 10/0fa41c1004dc5d0059c216754346a6ef4e90de3c57eddb63264b08dc38467f46f3ac95867c997d1ff72efe16af829ac23ee90e8395d90d3a91f1a3f0065be754 languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/metro-babel-transformer@npm:0.76.6" - dependencies: - "@babel/core": "npm:^7.25.2" - "@react-native/babel-preset": "npm:0.76.6" - hermes-parser: "npm:0.23.1" - nullthrows: "npm:^1.1.1" - peerDependencies: - "@babel/core": "*" - checksum: 10/f9323e745c01a4caf83b7f888784173fcecaecf7b2b6c253d70c349a7391ab7dd04bbdfc534c3e9bdfb2999730b84f209c6fc469b6301c1d4ce2cf1360e69602 +"@react-native/js-polyfills@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/js-polyfills@npm:0.81.4" + checksum: 10/32d98478a609fdd3fdf8264718fb1465b16b4337d6a22ff06b158bd7172f777950fb22669ff7f1c94da5f60100ed3ac9fcfc03fc9f1154acd4df092e858f8a39 languageName: node linkType: hard -"@react-native/normalize-colors@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/normalize-colors@npm:0.76.6" - checksum: 10/0e28cbdecbba96bd3e26a537623f68b77a77fda481b60dfa11d2a6e532aaae414d07e422d61465e40261d92a835d2f8342780cbe904a19c57e1fe223e4dc4a24 +"@react-native/normalize-colors@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/normalize-colors@npm:0.81.4" + checksum: 10/0c6255e094f019435a9a33af1727d8b5ce89332dd0b02d3096e0350a0f44c6669afe38a5d67900ea6f0e07745be8240bec6e9250b4beb2d8b780957fdb838eca languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.76.6": - version: 0.76.6 - resolution: "@react-native/virtualized-lists@npm:0.76.6" +"@react-native/virtualized-lists@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/virtualized-lists@npm:0.81.4" dependencies: invariant: "npm:^2.2.4" nullthrows: "npm:^1.1.1" peerDependencies: - "@types/react": ^18.2.6 + "@types/react": ^19.1.0 react: "*" react-native: "*" peerDependenciesMeta: "@types/react": optional: true - checksum: 10/2af9f55d7a1d1fc87f9f83c96b82aab8aafe920cd7afe808578893f33842c70a607c5d1ce35c81d20879017f8ebd50511ca4970b777c96f4456961befb29670a + checksum: 10/c28764433b18eceb6e1a5c651a5df354f592e04a867e9a0352c7addd9b4c7851a585e9bc01a8e7595d4a77d0992e88221b4d6363770e850889787ce5c6d41073 languageName: node linkType: hard @@ -5791,33 +6012,48 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^9.0.0": - version: 9.3.4 - resolution: "@testing-library/dom@npm:9.3.4" +"@testing-library/dom@npm:^10.4.1": + version: 10.4.1 + resolution: "@testing-library/dom@npm:10.4.1" dependencies: "@babel/code-frame": "npm:^7.10.4" "@babel/runtime": "npm:^7.12.5" "@types/aria-query": "npm:^5.0.1" - aria-query: "npm:5.1.3" - chalk: "npm:^4.1.0" + aria-query: "npm:5.3.0" dom-accessibility-api: "npm:^0.5.9" lz-string: "npm:^1.5.0" + picocolors: "npm:1.1.1" pretty-format: "npm:^27.0.2" - checksum: 10/510da752ea76f4a10a0a4e3a77917b0302cf03effe576cd3534cab7e796533ee2b0e9fb6fb11b911a1ebd7c70a0bb6f235bf4f816c9b82b95b8fe0cddfd10975 + checksum: 10/7f93e09ea015f151f8b8f42cbab0b2b858999b5445f15239a72a612ef7716e672b14c40c421218194cf191cbecbde0afa6f3dc2cc83dda93ff6a4fb0237df6e6 languageName: node linkType: hard -"@testing-library/react@npm:^14.0.0": - version: 14.3.1 - resolution: "@testing-library/react@npm:14.3.1" +"@testing-library/react@npm:^16.3.0": + version: 16.3.0 + resolution: "@testing-library/react@npm:16.3.0" dependencies: "@babel/runtime": "npm:^7.12.5" - "@testing-library/dom": "npm:^9.0.0" - "@types/react-dom": "npm:^18.0.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/83359dcdf9eaf067839f34604e1a181cbc14fc09f3a07672403700fcc6a900c4b8054ad1114fc24b4b9f89d84e2a09e1b7c9afce2306b1d4b4c9e30eb1cb12de + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 || ^19.0.0 + "@types/react-dom": ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/0ee9e31dd0d2396a924682d0e61a4ecc6bfab8eaff23dbf8a72c3c2ce22c116fa578148baeb4de75b968ef99d22e6e6aa0a00dba40286f71184918bb6bb5b06a + languageName: node + linkType: hard + +"@testing-library/user-event@npm:^14.6.1": + version: 14.6.1 + resolution: "@testing-library/user-event@npm:14.6.1" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 10/34b74fff56a0447731a94b40d4cf246deb8dbc1c1e3aec93acd1c3377a760bb062e979f1572bb34ec164ad28ee2a391744b42d0d6d6cc16c4ce527e5e09610e1 languageName: node linkType: hard @@ -6102,6 +6338,13 @@ __metadata: languageName: node linkType: hard +"@types/gensync@npm:^1.0.0": + version: 1.0.4 + resolution: "@types/gensync@npm:1.0.4" + checksum: 10/99c3aa0d3f1198973c7e51bea5947b815f3338ce89ce09a39ac8abb41cd844c5b95189da254ea45e50a395fe25fd215664d8ca76c5438814963597afb01f686e + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.9": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" @@ -6381,15 +6624,6 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.0.0": - version: 18.3.7 - resolution: "@types/react-dom@npm:18.3.7" - peerDependencies: - "@types/react": ^18.0.0 - checksum: 10/317569219366d487a3103ba1e5e47154e95a002915fdcf73a44162c48fe49c3a57fcf7f57fc6979e70d447112681e6b13c6c3c1df289db8b544df4aab2d318f3 - languageName: node - linkType: hard - "@types/react-is@npm:^18.3.1": version: 18.3.1 resolution: "@types/react-is@npm:18.3.1" @@ -6535,7 +6769,7 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0, @types/stack-utils@npm:^2.0.3": +"@types/stack-utils@npm:^2.0.3": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" checksum: 10/72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 @@ -7322,7 +7556,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": +"ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -7331,10 +7565,12 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^6.0.0": - version: 6.2.1 - resolution: "ansi-escapes@npm:6.2.1" - checksum: 10/3b064937dc8a0645ed8094bc8b09483ee718f3aa3139746280e6c2ea80e28c0a3ce66973d0f33e88e60021abbf67e5f877deabfc810e75edf8a19dfa128850be +"ansi-escapes@npm:^7.0.0": + version: 7.1.0 + resolution: "ansi-escapes@npm:7.1.0" + dependencies: + environment: "npm:^1.0.0" + checksum: 10/bf0d36c2b350f4fb5759742f83000fa1bae35b610f05aa528db65f626620b34100a048906308d98ea385e1447997417f3f594456c45c3aa30f52f3f450a30ed3 languageName: node linkType: hard @@ -7438,16 +7674,16 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.1.3": - version: 5.1.3 - resolution: "aria-query@npm:5.1.3" +"aria-query@npm:5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" dependencies: - deep-equal: "npm:^2.0.5" - checksum: 10/e5da608a7c4954bfece2d879342b6c218b6b207e2d9e5af270b5e38ef8418f02d122afdc948b68e32649b849a38377785252059090d66fa8081da95d1609c0d2 + dequal: "npm:^2.0.3" + checksum: 10/c3e1ed127cc6886fea4732e97dd6d3c3938e64180803acfb9df8955517c4943760746ffaf4020ce8f7ffaa7556a3b5f85c3769a1f5ca74a1288e02d042f9ae4e languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": version: 1.0.2 resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: @@ -7514,15 +7750,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:0.15.2": - version: 0.15.2 - resolution: "ast-types@npm:0.15.2" - dependencies: - tslib: "npm:^2.0.1" - checksum: 10/81680bd5829cdec33524e9aa3434e23f3919c0c388927068a0ff2e8466f55b0f34eae53e0007b3668742910c289481ab4e1d486a5318f618ae2fc93b5e7e863b - languageName: node - linkType: hard - "astring@npm:^1.8.0": version: 1.9.0 resolution: "astring@npm:1.9.0" @@ -7587,31 +7814,23 @@ __metadata: languageName: node linkType: hard -"babel-core@npm:^7.0.0-bridge.0": - version: 7.0.0-bridge.0 - resolution: "babel-core@npm:7.0.0-bridge.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/2a1cb879019dffb08d17bec36e13c3a6d74c94773f41c1fd8b14de13f149cc34b705b0a1e07b42fcf35917b49d78db6ff0c5c3b00b202a5235013d517b5c6bbb - languageName: node - linkType: hard - "babel-jest@workspace:*, babel-jest@workspace:packages/babel-jest": version: 0.0.0-use.local resolution: "babel-jest@workspace:packages/babel-jest" dependencies: + "@babel-8/core": "npm:@babel/core@8.0.0-beta.1" "@babel/core": "npm:^7.27.4" "@jest/test-utils": "workspace:*" "@jest/transform": "workspace:*" "@types/babel__core": "npm:^7.20.5" "@types/graceful-fs": "npm:^4.1.9" - babel-plugin-istanbul: "npm:^7.0.0" + babel-plugin-istanbul: "npm:^7.0.1" babel-preset-jest: "workspace:*" chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" slash: "npm:^3.0.0" peerDependencies: - "@babel/core": ^7.11.0 + "@babel/core": ^7.11.0 || ^8.0.0-0 languageName: unknown linkType: soft @@ -7637,16 +7856,16 @@ __metadata: languageName: node linkType: hard -"babel-plugin-istanbul@npm:^7.0.0": - version: 7.0.0 - resolution: "babel-plugin-istanbul@npm:7.0.0" +"babel-plugin-istanbul@npm:^7.0.1": + version: 7.0.1 + resolution: "babel-plugin-istanbul@npm:7.0.1" dependencies: "@babel/helper-plugin-utils": "npm:^7.0.0" "@istanbuljs/load-nyc-config": "npm:^1.0.0" "@istanbuljs/schema": "npm:^0.1.3" istanbul-lib-instrument: "npm:^6.0.2" test-exclude: "npm:^6.0.0" - checksum: 10/4df567f29161c7f50737ed1884c7f08203f4d0cb1684c499fca374fcf5059396eacb02f8f727bf7a82bbf3e50b9f4a24bcb026a1678f63940d8f0f78546e3774 + checksum: 10/fe9f865f975aaa7a033de9ccb2b63fdcca7817266c5e98d3e02ac7ffd774c695093d215302796cb3770a71ef4574e7a9b298504c3c0c104cf4b48c8eda67b2a6 languageName: node linkType: hard @@ -7654,10 +7873,12 @@ __metadata: version: 0.0.0-use.local resolution: "babel-plugin-jest-hoist@workspace:packages/babel-plugin-jest-hoist" dependencies: + "@babel-8/core": "npm:@babel/core@8.0.0-beta.1" + "@babel-8/preset-react": "npm:@babel/preset-react@8.0.0-beta.1" + "@babel-8/preset-typescript": "npm:@babel/preset-typescript@8.0.0-beta.1" "@babel/core": "npm:^7.27.4" "@babel/preset-react": "npm:^7.27.1" "@babel/preset-typescript": "npm:^7.27.1" - "@babel/template": "npm:^7.27.2" "@babel/types": "npm:^7.27.3" "@prettier/sync": "npm:^0.5.5" "@types/babel__core": "npm:^7.20.5" @@ -7705,21 +7926,12 @@ __metadata: languageName: node linkType: hard -"babel-plugin-syntax-hermes-parser@npm:0.25.1, babel-plugin-syntax-hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.25.1" - dependencies: - hermes-parser: "npm:0.25.1" - checksum: 10/dc80fafde1aed8e60cf86ecd2e9920e7f35ffe02b33bd4e772daaa786167bcf508aac3fc1aea425ff4c7a0be94d82528f3fe8619b7f41dac853264272d640c04 - languageName: node - linkType: hard - -"babel-plugin-syntax-hermes-parser@npm:^0.23.1": - version: 0.23.1 - resolution: "babel-plugin-syntax-hermes-parser@npm:0.23.1" +"babel-plugin-syntax-hermes-parser@npm:0.29.1": + version: 0.29.1 + resolution: "babel-plugin-syntax-hermes-parser@npm:0.29.1" dependencies: - hermes-parser: "npm:0.23.1" - checksum: 10/5412008e8e85b08cd0d78168f746ade68b8ed69c0068831ce5e3d028f01c644f546ca0e2b7c9a4a8c6b9d5f14aff84c2453ab44b19cbec55e4366b20bbba9040 + hermes-parser: "npm:0.29.1" + checksum: 10/bbb1eed253b4255f8c572e1cb2664868d9aa2238363e48a2d1e95e952b2c1d59e86a7051f44956407484df2c9bc6623608740eec10e2095946d241b795262cec languageName: node linkType: hard @@ -7756,9 +7968,9 @@ __metadata: languageName: node linkType: hard -"babel-preset-current-node-syntax@npm:^1.1.0": - version: 1.1.0 - resolution: "babel-preset-current-node-syntax@npm:1.1.0" +"babel-preset-current-node-syntax@npm:^1.2.0": + version: 1.2.0 + resolution: "babel-preset-current-node-syntax@npm:1.2.0" dependencies: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" @@ -7776,8 +7988,8 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/46331111ae72b7121172fd9e6a4a7830f651ad44bf26dbbf77b3c8a60a18009411a3eacb5e72274004290c110371230272109957d5224d155436b4794ead2f1b + "@babel/core": ^7.0.0 || ^8.0.0-0 + checksum: 10/3608fa671cfa46364ea6ec704b8fcdd7514b7b70e6ec09b1199e13ae73ed346c51d5ce2cb6d4d5b295f6a3f2cad1fdeec2308aa9e037002dd7c929194cc838ea languageName: node linkType: hard @@ -7786,9 +7998,9 @@ __metadata: resolution: "babel-preset-jest@workspace:packages/babel-preset-jest" dependencies: babel-plugin-jest-hoist: "workspace:*" - babel-preset-current-node-syntax: "npm:^1.1.0" + babel-preset-current-node-syntax: "npm:^1.2.0" peerDependencies: - "@babel/core": ^7.11.0 + "@babel/core": ^7.11.0 || ^8.0.0-beta.1 languageName: unknown linkType: soft @@ -8083,7 +8295,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" dependencies: @@ -8105,31 +8317,6 @@ __metadata: languageName: node linkType: hard -"caller-callsite@npm:^2.0.0": - version: 2.0.0 - resolution: "caller-callsite@npm:2.0.0" - dependencies: - callsites: "npm:^2.0.0" - checksum: 10/b685e9d126d9247b320cfdfeb3bc8da0c4be28d8fb98c471a96bc51aab3130099898a2fe3bf0308f0fe048d64c37d6d09f563958b9afce1a1e5e63d879c128a2 - languageName: node - linkType: hard - -"caller-path@npm:^2.0.0": - version: 2.0.0 - resolution: "caller-path@npm:2.0.0" - dependencies: - caller-callsite: "npm:^2.0.0" - checksum: 10/3e12ccd0c71ec10a057aac69e3ec175b721ca858c640df021ef0d25999e22f7c1d864934b596b7d47038e9b56b7ec315add042abbd15caac882998b50102fb12 - languageName: node - linkType: hard - -"callsites@npm:^2.0.0": - version: 2.0.0 - resolution: "callsites@npm:2.0.0" - checksum: 10/be2f67b247df913732b7dec1ec0bbfcdbaea263e5a95968b19ec7965affae9496b970e3024317e6d4baa8e28dc6ba0cec03f46fdddc2fdcc51396600e53c2623 - languageName: node - linkType: hard - "callsites@npm:^3.0.0, callsites@npm:^3.1.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -8218,13 +8405,6 @@ __metadata: languageName: node linkType: hard -"char-regex@npm:^2.0.0": - version: 2.0.2 - resolution: "char-regex@npm:2.0.2" - checksum: 10/7d6dc918d215761ab389e799b9b119778722f384c8265ccb3c3025c9b219aea942f497fc7922d3470fc270987927719c5fa78d6337a5ebe9a9dc4c5a49099eb2 - languageName: node - linkType: hard - "character-entities-html4@npm:^2.0.0": version: 2.1.0 resolution: "character-entities-html4@npm:2.1.0" @@ -8498,7 +8678,7 @@ __metadata: languageName: node linkType: hard -"collect-v8-coverage@npm:^1.0.0, collect-v8-coverage@npm:^1.0.2": +"collect-v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "collect-v8-coverage@npm:1.0.2" checksum: 10/30ea7d5c9ee51f2fdba4901d4186c5b7114a088ef98fd53eda3979da77eed96758a2cae81cc6d97e239aaea6065868cf908b24980663f7b7e96aa291b3e12fa4 @@ -8672,17 +8852,17 @@ __metadata: linkType: hard "compression@npm:^1.7.4": - version: 1.8.0 - resolution: "compression@npm:1.8.0" + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: bytes: "npm:3.1.2" compressible: "npm:~2.0.18" debug: "npm:2.6.9" negotiator: "npm:~0.6.4" - on-headers: "npm:~1.0.2" + on-headers: "npm:~1.1.0" safe-buffer: "npm:5.2.1" vary: "npm:~1.1.2" - checksum: 10/ca213b9bd03e56c7c3596399d846237b5f0b31ca4cdeaa76a9547cd3c1465fbcfcb0fe93a5d7ff64eff28383fc65b53f1ef8bb2720d11bb48ad8c0836c502506 + checksum: 10/e7552bfbd780f2003c6fe8decb44561f5cc6bc82f0c61e81122caff5ec656f37824084f52155b1e8ef31d7656cecbec9a2499b7a68e92e20780ffb39b479abb7 languageName: node linkType: hard @@ -8927,18 +9107,6 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^5.0.5": - version: 5.2.1 - resolution: "cosmiconfig@npm:5.2.1" - dependencies: - import-fresh: "npm:^2.0.0" - is-directory: "npm:^0.3.1" - js-yaml: "npm:^3.13.1" - parse-json: "npm:^4.0.0" - checksum: 10/1d617668e1367b8d66617fb8a1bd8c13e9598534959ac0cc86195b1b0cbe7afbba2b9faa300c60b9d9d35409cf4f064b0f6e377f4ea036434e5250c69c76932f - languageName: node - linkType: hard - "cosmiconfig@npm:^6.0.0": version: 6.0.0 resolution: "cosmiconfig@npm:6.0.0" @@ -9365,7 +9533,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.0, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.6.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -9374,15 +9542,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.1": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.1": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/8e2709b2144f03c7950f8804d01ccb3786373df01e406a0f66928e47001cf2d336cbed9ee137261d4f90d68d8679468c755e3548ed83ddacdc82b194d2468afe + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad languageName: node linkType: hard @@ -9423,32 +9591,6 @@ __metadata: languageName: node linkType: hard -"deep-equal@npm:^2.0.5": - version: 2.2.3 - resolution: "deep-equal@npm:2.2.3" - dependencies: - array-buffer-byte-length: "npm:^1.0.0" - call-bind: "npm:^1.0.5" - es-get-iterator: "npm:^1.1.3" - get-intrinsic: "npm:^1.2.2" - is-arguments: "npm:^1.1.1" - is-array-buffer: "npm:^3.0.2" - is-date-object: "npm:^1.0.5" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" - isarray: "npm:^2.0.5" - object-is: "npm:^1.1.5" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.5.1" - side-channel: "npm:^1.0.4" - which-boxed-primitive: "npm:^1.0.2" - which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.13" - checksum: 10/1ce49d0b71d0f14d8ef991a742665eccd488dfc9b3cada069d4d7a86291e591c92d2589c832811dea182b4015736b210acaaebce6184be356c1060d176f5a05f - languageName: node - linkType: hard - "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -9561,7 +9703,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0": +"dequal@npm:^2.0.0, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10/6ff05a7561f33603df87c45e389c9ac0a95e3c056be3da1a0c4702149e3a7f6fe5ffbb294478687ba51a9e95f3a60e8b6b9005993acd79c292c7d15f71964b6b @@ -9953,6 +10095,13 @@ __metadata: languageName: node linkType: hard +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: 10/dd3c1b9825e7f71f1e72b03c2344799ac73f2e9ef81b78ea8b373e55db021786c6b9f3858ea43a436a2c4611052670ec0afe85bc029c384cc71165feee2f4ba6 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -10062,23 +10211,6 @@ __metadata: languageName: node linkType: hard -"es-get-iterator@npm:^1.1.3": - version: 1.1.3 - resolution: "es-get-iterator@npm:1.1.3" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.3" - has-symbols: "npm:^1.0.3" - is-arguments: "npm:^1.1.1" - is-map: "npm:^2.0.2" - is-set: "npm:^2.0.2" - is-string: "npm:^1.0.7" - isarray: "npm:^2.0.5" - stop-iteration-iterator: "npm:^1.0.0" - checksum: 10/bc2194befbe55725f9489098626479deee3c801eda7e83ce0dff2eb266a28dc808edb9b623ff01d31ebc1328f09d661333d86b601036692c2e3c1a6942319433 - languageName: node - linkType: hard - "es-module-lexer@npm:^1.2.1": version: 1.7.0 resolution: "es-module-lexer@npm:1.7.0" @@ -10555,7 +10687,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0, esprima@npm:~4.0.0": +"esprima@npm:^4.0.0": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -10719,7 +10851,7 @@ __metadata: languageName: node linkType: hard -"event-target-shim@npm:^5.0.0, event-target-shim@npm:^5.0.1": +"event-target-shim@npm:^5.0.0": version: 5.0.1 resolution: "event-target-shim@npm:5.0.1" checksum: 10/49ff46c3a7facbad3decb31f597063e761785d7fdb3920d4989d7b08c97a61c2f51183e2f3a03130c9088df88d4b489b1b79ab632219901f184f85158508f4c8 @@ -10837,11 +10969,11 @@ __metadata: dependencies: "@babel/core": "npm:^7.27.4" "@babel/preset-env": "npm:^7.27.2" - "@react-native/babel-preset": "npm:^0.79.2" + "@react-native/babel-preset": "npm:^0.81.1" babel-jest: "workspace:*" jest: "workspace:*" react: "npm:18.3.1" - react-native: "npm:0.76.6" + react-native: "npm:0.81.4" react-test-renderer: "npm:18.3.1" languageName: unknown linkType: soft @@ -10853,7 +10985,7 @@ __metadata: "@babel/core": "npm:^7.27.4" "@babel/preset-env": "npm:^7.27.2" "@babel/preset-react": "npm:^7.27.1" - "@testing-library/react": "npm:^14.0.0" + "@testing-library/react": "npm:^16.3.0" babel-jest: "workspace:*" jest: "workspace:*" jest-environment-jsdom: "workspace:*" @@ -10884,10 +11016,12 @@ __metadata: "@babel/core": "npm:^7.27.4" "@babel/preset-env": "npm:^7.27.2" "@babel/preset-react": "npm:^7.27.1" + "@testing-library/dom": "npm:^10.4.1" + "@testing-library/react": "npm:^16.3.0" + "@testing-library/user-event": "npm:^14.6.1" babel-jest: "workspace:*" jest: "workspace:*" react: "npm:18.3.1" - react-test-renderer: "npm:18.3.1" languageName: unknown linkType: soft @@ -11373,13 +11507,6 @@ __metadata: languageName: node linkType: hard -"flow-parser@npm:0.*": - version: 0.272.1 - resolution: "flow-parser@npm:0.272.1" - checksum: 10/0bf6c92ab651d1a65af4a20801d602695c6b7f11550dbcee3f470f35572d56108091b558c8c1451055463e7ae3213c79b5a26a4028ef734958ecfd4733c9dfbd - languageName: node - linkType: hard - "follow-redirects@npm:^1.0.0": version: 1.15.9 resolution: "follow-redirects@npm:1.15.9" @@ -11598,7 +11725,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" dependencies: @@ -11885,7 +12012,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -12181,35 +12308,35 @@ __metadata: languageName: node linkType: hard -"hermes-estree@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-estree@npm:0.23.1" - checksum: 10/b7ad78f53044d53ec1c77e93036c16e34f6f0985c895540876301e4791d4db08da828870977140f5cf1ae34532bbb9d9d013a0a1a4a5a0da05177225648d5295 +"hermes-estree@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-estree@npm:0.29.1" + checksum: 10/8989fc224fcd2bb3356d7d330461c9f32303904824891ae4befafc08f13c871013b18d5d4cd4b20bf6f59e9d26afdbb10d33440c6e646de770db4b9543c39db4 languageName: node linkType: hard -"hermes-estree@npm:0.25.1": - version: 0.25.1 - resolution: "hermes-estree@npm:0.25.1" - checksum: 10/7b1eca98b264a25632064cffa5771360d30cf452e77db1e191f9913ee45cf78c292b2dbca707e92fb71b0870abb97e94b506a5ab80abd96ba237fee169b601fe +"hermes-estree@npm:0.32.0": + version: 0.32.0 + resolution: "hermes-estree@npm:0.32.0" + checksum: 10/65a30a86a5a560152a2de1842c7bc7ecdadebd62e9cdd7d1809a824de7bc19e8d6a42907d3caff91d9f823862405d4b200447aa0bc25ba16072937e93d0acbd5 languageName: node linkType: hard -"hermes-parser@npm:0.23.1": - version: 0.23.1 - resolution: "hermes-parser@npm:0.23.1" +"hermes-parser@npm:0.29.1": + version: 0.29.1 + resolution: "hermes-parser@npm:0.29.1" dependencies: - hermes-estree: "npm:0.23.1" - checksum: 10/de88df4f23bd8dc2ffa89c8a317445320af8c7705a2aeeb05c4dd171f037a747982be153a0a237b1c9c7337b79bceaeb5052934cb8a25fe2e2473294a5343334 + hermes-estree: "npm:0.29.1" + checksum: 10/2d1ada9d48817668bf12b31deef7c5a4a7d88419448c7e07ad67197a7992462dea3f5e536aea2c6f7e2222940f96bb7cd7a7dc5a101c9b4b2d7a84e1a1272670 languageName: node linkType: hard -"hermes-parser@npm:0.25.1": - version: 0.25.1 - resolution: "hermes-parser@npm:0.25.1" +"hermes-parser@npm:0.32.0": + version: 0.32.0 + resolution: "hermes-parser@npm:0.32.0" dependencies: - hermes-estree: "npm:0.25.1" - checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc + hermes-estree: "npm:0.32.0" + checksum: 10/496210490cb45e97df14796d94aec6c817c4cefa20f1dbe3ba1df323cc58c930033cfec93f3ecfad6b90e09166fc9ffc4f665843d25b4862523aa70dacbae81f languageName: node linkType: hard @@ -12491,7 +12618,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5, https-proxy-agent@npm:^7.0.6": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -12597,16 +12724,6 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^2.0.0": - version: 2.0.0 - resolution: "import-fresh@npm:2.0.0" - dependencies: - caller-path: "npm:^2.0.0" - resolve-from: "npm:^3.0.0" - checksum: 10/610255f9753cc6775df00be08e9f43691aa39f7703e3636c45afe22346b8b545e600ccfe100c554607546fc8e861fa149a0d1da078c8adedeea30fff326eef79 - languageName: node - linkType: hard - "import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.1 resolution: "import-fresh@npm:3.3.1" @@ -12791,17 +12908,7 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.1.1": - version: 1.2.0 - resolution: "is-arguments@npm:1.2.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10/471a8ef631b8ee8829c43a8ab05c081700c0e25180c73d19f3bf819c1a8448c426a9e8e601f278973eca68966384b16ceb78b8c63af795b099cd199ea5afc457 - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": version: 3.0.5 resolution: "is-array-buffer@npm:3.0.5" dependencies: @@ -12944,13 +13051,6 @@ __metadata: languageName: node linkType: hard -"is-directory@npm:^0.3.1": - version: 0.3.1 - resolution: "is-directory@npm:0.3.1" - checksum: 10/dce9a9d3981e38f2ded2a80848734824c50ee8680cd09aa477bef617949715cfc987197a2ca0176c58a9fb192a1a0d69b535c397140d241996a609d5906ae524 - languageName: node - linkType: hard - "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -13035,7 +13135,7 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.2, is-map@npm:^2.0.3": +"is-map@npm:^2.0.3": version: 2.0.3 resolution: "is-map@npm:2.0.3" checksum: 10/8de7b41715b08bcb0e5edb0fb9384b80d2d5bcd10e142188f33247d19ff078abaf8e9b6f858e2302d8d05376a26a55cd23a3c9f8ab93292b02fcd2cc9e4e92bb @@ -13131,7 +13231,7 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": +"is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" dependencies: @@ -13157,14 +13257,14 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.2, is-set@npm:^2.0.3": +"is-set@npm:^2.0.3": version: 2.0.3 resolution: "is-set@npm:2.0.3" checksum: 10/5685df33f0a4a6098a98c72d94d67cad81b2bc72f1fb2091f3d9283c4a1c582123cd709145b02a9745f0ce6b41e3e43f1c944496d1d74d4ea43358be61308669 languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.4": +"is-shared-array-buffer@npm:^1.0.4": version: 1.0.4 resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: @@ -13196,7 +13296,7 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.7, is-string@npm:^1.1.1": +"is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" dependencies: @@ -13488,6 +13588,7 @@ __metadata: "@jest/get-type": "workspace:*" "@jest/pattern": "workspace:*" "@jest/test-sequencer": "workspace:*" + "@jest/test-utils": "workspace:*" "@jest/types": "workspace:*" "@types/graceful-fs": "npm:^4.1.9" "@types/micromatch": "npm:^4.0.9" @@ -13689,23 +13790,6 @@ __metadata: languageName: unknown linkType: soft -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" - dependencies: - "@babel/code-frame": "npm:^7.12.13" - "@jest/types": "npm:^29.6.3" - "@types/stack-utils": "npm:^2.0.0" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10/31d53c6ed22095d86bab9d14c0fa70c4a92c749ea6ceece82cf30c22c9c0e26407acdfbdb0231435dc85a98d6d65ca0d9cbcd25cd1abb377fe945e843fb770b9 - languageName: node - linkType: hard - "jest-message-util@workspace:*, jest-message-util@workspace:packages/jest-message-util": version: 0.0.0-use.local resolution: "jest-message-util@workspace:packages/jest-message-util" @@ -13756,14 +13840,7 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.0.0": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 10/0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a - languageName: node - linkType: hard - -"jest-regex-util@workspace:*, jest-regex-util@workspace:packages/jest-regex-util": +"jest-regex-util@npm:^30.0.0, jest-regex-util@workspace:*, jest-regex-util@workspace:packages/jest-regex-util": version: 0.0.0-use.local resolution: "jest-regex-util@workspace:packages/jest-regex-util" dependencies: @@ -13909,7 +13986,7 @@ __metadata: "@types/semver": "npm:^7.7.0" ansi-regex: "npm:^5.0.1" ansi-styles: "npm:^5.2.0" - babel-preset-current-node-syntax: "npm:^1.1.0" + babel-preset-current-node-syntax: "npm:^1.2.0" chalk: "npm:^4.1.2" expect: "workspace:*" graceful-fs: "npm:^4.2.11" @@ -13997,40 +14074,24 @@ __metadata: languageName: unknown linkType: soft -"jest-watch-typeahead@npm:^2.2.2": - version: 2.2.2 - resolution: "jest-watch-typeahead@npm:2.2.2" +"jest-watch-typeahead@npm:^3.0.1": + version: 3.0.1 + resolution: "jest-watch-typeahead@npm:3.0.1" dependencies: - ansi-escapes: "npm:^6.0.0" + ansi-escapes: "npm:^7.0.0" chalk: "npm:^5.2.0" - jest-regex-util: "npm:^29.0.0" - jest-watcher: "npm:^29.0.0" + jest-regex-util: "npm:^30.0.0" + jest-watcher: "npm:^30.0.0" slash: "npm:^5.0.0" - string-length: "npm:^5.0.1" + string-length: "npm:^6.0.0" strip-ansi: "npm:^7.0.1" peerDependencies: - jest: ^27.0.0 || ^28.0.0 || ^29.0.0 - checksum: 10/8685277ce1b96ec775882111ec55ce90a862cc57acb21ce94f8ac44a25f6fb34c7a7ce119e07b2d8ff5353a8d9e4f981cf96fa35532f71ddba6ca8fedc05bd8e - languageName: node - linkType: hard - -"jest-watcher@npm:^29.0.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" - dependencies: - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - emittery: "npm:^0.13.1" - jest-util: "npm:^29.7.0" - string-length: "npm:^4.0.1" - checksum: 10/4f616e0345676631a7034b1d94971aaa719f0cd4a6041be2aa299be437ea047afd4fe05c48873b7963f5687a2f6c7cbf51244be8b14e313b97bfe32b1e127e55 + jest: ^30.0.0 + checksum: 10/dbaaa6d9929079482655c05af9f9c8491fa04aa5a24460b540b8383e78bb6bc6580cddbf8e2b15cfc34d68e610c19f5ccb8f0b0a5aea7f00affb3d976ec152ed languageName: node linkType: hard -"jest-watcher@workspace:*, jest-watcher@workspace:packages/jest-watcher": +"jest-watcher@npm:^30.0.0, jest-watcher@workspace:*, jest-watcher@workspace:packages/jest-watcher": version: 0.0.0-use.local resolution: "jest-watcher@workspace:packages/jest-watcher" dependencies: @@ -14186,6 +14247,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^8.0.0": + version: 8.0.3 + resolution: "js-tokens@npm:8.0.3" + checksum: 10/af5ed8ddbc446a868c026599214f4a482ab52461edb82e547949255f98910a14bd81ddab88a8d570d74bd7dc96c6d4df7f963794ec5aaf13c53918cc46b9caa6 + languageName: node + linkType: hard + "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -14216,13 +14284,6 @@ __metadata: languageName: node linkType: hard -"jsc-android@npm:^250231.0.0": - version: 250231.0.0 - resolution: "jsc-android@npm:250231.0.0" - checksum: 10/aa5cf773f5d6c4c6ecec42bfd9958b5bd5ec33db7ec87f66152fae96f142220b91b84e54b409ca643a9493dd1b0f273819d46aad8c0d7519c444280815ffb68e - languageName: node - linkType: hard - "jsc-safe-url@npm:^0.2.2": version: 0.2.4 resolution: "jsc-safe-url@npm:0.2.4" @@ -14230,37 +14291,6 @@ __metadata: languageName: node linkType: hard -"jscodeshift@npm:^0.14.0": - version: 0.14.0 - resolution: "jscodeshift@npm:0.14.0" - dependencies: - "@babel/core": "npm:^7.13.16" - "@babel/parser": "npm:^7.13.16" - "@babel/plugin-proposal-class-properties": "npm:^7.13.0" - "@babel/plugin-proposal-nullish-coalescing-operator": "npm:^7.13.8" - "@babel/plugin-proposal-optional-chaining": "npm:^7.13.12" - "@babel/plugin-transform-modules-commonjs": "npm:^7.13.8" - "@babel/preset-flow": "npm:^7.13.13" - "@babel/preset-typescript": "npm:^7.13.0" - "@babel/register": "npm:^7.13.16" - babel-core: "npm:^7.0.0-bridge.0" - chalk: "npm:^4.1.2" - flow-parser: "npm:0.*" - graceful-fs: "npm:^4.2.4" - micromatch: "npm:^4.0.4" - neo-async: "npm:^2.5.0" - node-dir: "npm:^0.1.17" - recast: "npm:^0.21.0" - temp: "npm:^0.8.4" - write-file-atomic: "npm:^2.3.0" - peerDependencies: - "@babel/preset-env": ^7.1.6 - bin: - jscodeshift: bin/jscodeshift.js - checksum: 10/fc355dde2287c026a682e8b38df5d8d1ff5c9ca044dfd558f2b6d17bb28f9257063bd0e47690814612e572804caa5383733c9d8ca8bc18e70bcee43e0458df59 - languageName: node - linkType: hard - "jsdoc-type-pratt-parser@npm:~4.1.0": version: 4.1.0 resolution: "jsdoc-type-pratt-parser@npm:4.1.0" @@ -14326,13 +14356,6 @@ __metadata: languageName: node linkType: hard -"json-parse-better-errors@npm:^1.0.1": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: 10/5553232045359b767b0f2039a6777fede1a8d7dca1a0ffb1f9ef73a7519489ae7f566b2e040f2b4c38edb8e35e37ae07af7f0a52420902f869ee0dbf5dc6c784 - languageName: node - linkType: hard - "json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -14732,6 +14755,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^7.14.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: 10/6029ca5aba3aacb554e919d7ef804fffd4adfc4c83db00fac8248c7c78811fb6d4b6f70f7fd9d55032b3823446546a007edaa66ad1f2377ae833bd983fac5d98 + languageName: node + linkType: hard + "lru-cache@patch:lru-cache@npm:10.4.3#./.yarn/patches/lru-cache-npm-10.4.3-30c10b861a.patch::locator=%40jest%2Fmonorepo%40workspace%3A.": version: 10.4.3 resolution: "lru-cache@patch:lru-cache@npm%3A10.4.3#./.yarn/patches/lru-cache-npm-10.4.3-30c10b861a.patch::version=10.4.3&hash=e5e8aa&locator=%40jest%2Fmonorepo%40workspace%3A." @@ -15181,70 +15211,71 @@ __metadata: languageName: node linkType: hard -"metro-babel-transformer@npm:0.81.5": - version: 0.81.5 - resolution: "metro-babel-transformer@npm:0.81.5" +"metro-babel-transformer@npm:0.83.2": + version: 0.83.2 + resolution: "metro-babel-transformer@npm:0.83.2" dependencies: "@babel/core": "npm:^7.25.2" flow-enums-runtime: "npm:^0.0.6" - hermes-parser: "npm:0.25.1" + hermes-parser: "npm:0.32.0" nullthrows: "npm:^1.1.1" - checksum: 10/331c079508418378294534e6a7da228dc6b271827c8622a148c1e0dfdd18729f16eeea84e96541e95e7eee126d49180f92540cd39b37a2f96bf5c015456f49a1 + checksum: 10/8ca98216c3fc32757cbb445d2e42042617b5a2399d3d409759b168fbd3d52aadf8bb2b8471e4b204ddf5c654b7b146397edb7693f48a0582e7e4e169cf3bbfbb languageName: node linkType: hard -"metro-cache-key@npm:0.81.5": - version: 0.81.5 - resolution: "metro-cache-key@npm:0.81.5" +"metro-cache-key@npm:0.83.2": + version: 0.83.2 + resolution: "metro-cache-key@npm:0.83.2" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/d5656bc8906ff4366d8093d19304d6ac386c59429e3e7e24050f4bc9f93ca4e04d8062af6bdd28874a5e4b9bcc84f248855933ffa80af56aeed8be5ff02c85bf + checksum: 10/ad60492b1db35b7d4eb1f9ed6f8aa79a051dcb1be3183fcd5b0a810e7c4ba5dba5e9f02e131ccd271d6db2efaa9893ef0e316ef26ebb3ab49cb074fada4de1b5 languageName: node linkType: hard -"metro-cache@npm:0.81.5": - version: 0.81.5 - resolution: "metro-cache@npm:0.81.5" +"metro-cache@npm:0.83.2": + version: 0.83.2 + resolution: "metro-cache@npm:0.83.2" dependencies: exponential-backoff: "npm:^3.1.1" flow-enums-runtime: "npm:^0.0.6" - metro-core: "npm:0.81.5" - checksum: 10/6ffc8283ca9002c2a99a9e787e59c764399218459f9db352b9cb7543bf0f38de973130dfc9587997b6fd206c0b87b7c33def754814505c282286f12938c606d0 + https-proxy-agent: "npm:^7.0.5" + metro-core: "npm:0.83.2" + checksum: 10/3183bcd8e0590ab4630f344f9dd4daa3b2371450e7f4546f2b1128b1386ecece204a74a7e3df49a8f3776b5a4a746fe4aa05f952a97e6f4f61deda80be5c55cf languageName: node linkType: hard -"metro-config@npm:0.81.5, metro-config@npm:^0.81.0": - version: 0.81.5 - resolution: "metro-config@npm:0.81.5" +"metro-config@npm:0.83.2, metro-config@npm:^0.83.1": + version: 0.83.2 + resolution: "metro-config@npm:0.83.2" dependencies: connect: "npm:^3.6.5" - cosmiconfig: "npm:^5.0.5" flow-enums-runtime: "npm:^0.0.6" jest-validate: "npm:^29.7.0" - metro: "npm:0.81.5" - metro-cache: "npm:0.81.5" - metro-core: "npm:0.81.5" - metro-runtime: "npm:0.81.5" - checksum: 10/181775bdb3676f9ecd81387a31ca5ceda42f982f7871029e3f606d21aa2d62416bbd61df5e2fd0f13a7242a0144bbf10c7fd4af65839058271a1f823f2970c9b + metro: "npm:0.83.2" + metro-cache: "npm:0.83.2" + metro-core: "npm:0.83.2" + metro-runtime: "npm:0.83.2" + yaml: "npm:^2.6.1" + checksum: 10/830696bb515ad421f1a25003d64c01bca580b2485c69266e03faf0c8f36f55283388fda5505f53ae400f8298502f712aab6c76655e45996907588288d2586c6b languageName: node linkType: hard -"metro-core@npm:0.81.5, metro-core@npm:^0.81.0": - version: 0.81.5 - resolution: "metro-core@npm:0.81.5" +"metro-core@npm:0.83.2, metro-core@npm:^0.83.1": + version: 0.83.2 + resolution: "metro-core@npm:0.83.2" dependencies: flow-enums-runtime: "npm:^0.0.6" lodash.throttle: "npm:^4.1.1" - metro-resolver: "npm:0.81.5" - checksum: 10/9ecf5b646ec7cc3d5de7d2ebd21e37713d7b86b68a6e94ec911b2c73a20d7abd972406e2ffa2084f2d156ed5f767fe5658c5c2cc3343f3ed10fc276fe385aa84 + metro-resolver: "npm:0.83.2" + checksum: 10/dbbef6b6d0cdb76ff808928cda59086aa4fc04a50ff76be8e19bd181d9cf270f4fe0a6b60883d0230aeeba2ba65a68875af549c83c2cfee5a1f0988ed1b4fccd languageName: node linkType: hard -"metro-file-map@npm:0.81.5": - version: 0.81.5 - resolution: "metro-file-map@npm:0.81.5" +"metro-file-map@npm:0.83.2": + version: 0.83.2 + resolution: "metro-file-map@npm:0.83.2" dependencies: - debug: "npm:^2.2.0" + debug: "npm:^4.4.0" fb-watchman: "npm:^2.0.0" flow-enums-runtime: "npm:^0.0.6" graceful-fs: "npm:^4.2.4" @@ -15253,76 +15284,76 @@ __metadata: micromatch: "npm:^4.0.4" nullthrows: "npm:^1.1.1" walker: "npm:^1.0.7" - checksum: 10/70ce4447c9eae21a7f06081e3999241f21476817f0dd242fcb9591696cf93b0aabbf30dd5542b9b3fd9bfbdf5a7c02d863e0e0a4206175fd621cd7e476f8b16d + checksum: 10/349a52c74cd02a1db75d0677c82e31750098e74a67bd1e10b2241e296897bfb20de2d8a2f27d7c292e2b3f492a36a191eb3c1bd5d09d5758b8febd36db86e58f languageName: node linkType: hard -"metro-minify-terser@npm:0.81.5": - version: 0.81.5 - resolution: "metro-minify-terser@npm:0.81.5" +"metro-minify-terser@npm:0.83.2": + version: 0.83.2 + resolution: "metro-minify-terser@npm:0.83.2" dependencies: flow-enums-runtime: "npm:^0.0.6" terser: "npm:^5.15.0" - checksum: 10/4623743676e2bb8bb74b99bd2b2c26feb2509a8db5596f265e21042b43e84611f9025977ae298b8271644cb27e8da8a60b8dff791f57517b4bd2f5ae366f2945 + checksum: 10/ee164bdd3ddf797e1b0f9fd71960b662b40fc3abead77521b1e1435291d38cc151442348362d6afee0596d52fcff48cc6a055a04a7928905e9557968e05293ac languageName: node linkType: hard -"metro-resolver@npm:0.81.5": - version: 0.81.5 - resolution: "metro-resolver@npm:0.81.5" +"metro-resolver@npm:0.83.2": + version: 0.83.2 + resolution: "metro-resolver@npm:0.83.2" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/3f20592755ac52db973a8c111adddad7430322b0b27c5d3d2cf2e2ff73e0693922f98b32a9a46941abc97b604cfb116b0e42c64f005e5c002460fe141a4e5847 + checksum: 10/2ba0cdda5c5a3ddac72fd486a310892638ba7d67a736246ec128674dfa6217d6169bdd0f811874435eae37f0201d72735fe7dddfc0c83a9e1439f05994bc293a languageName: node linkType: hard -"metro-runtime@npm:0.81.5, metro-runtime@npm:^0.81.0": - version: 0.81.5 - resolution: "metro-runtime@npm:0.81.5" +"metro-runtime@npm:0.83.2, metro-runtime@npm:^0.83.1": + version: 0.83.2 + resolution: "metro-runtime@npm:0.83.2" dependencies: "@babel/runtime": "npm:^7.25.0" flow-enums-runtime: "npm:^0.0.6" - checksum: 10/86523a8fb5e1016d886f13f470e2aa0c3cd8f69ccab7094fb07676c05a7115f6e9af1f5fa377e80f426023816afcbf31468fb6a483181b054868358a25e4e59c + checksum: 10/1666e0e5c51d39f916642ed3918cf1996f76e82366ba9ca3132d6c11c5c62a1ab1115e4aa325f0fc9b8cefbe62d6ca8d1948cfde2ee78963491deafcbc79adba languageName: node linkType: hard -"metro-source-map@npm:0.81.5, metro-source-map@npm:^0.81.0": - version: 0.81.5 - resolution: "metro-source-map@npm:0.81.5" +"metro-source-map@npm:0.83.2, metro-source-map@npm:^0.83.1": + version: 0.83.2 + resolution: "metro-source-map@npm:0.83.2" dependencies: "@babel/traverse": "npm:^7.25.3" "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3" "@babel/types": "npm:^7.25.2" flow-enums-runtime: "npm:^0.0.6" invariant: "npm:^2.2.4" - metro-symbolicate: "npm:0.81.5" + metro-symbolicate: "npm:0.83.2" nullthrows: "npm:^1.1.1" - ob1: "npm:0.81.5" + ob1: "npm:0.83.2" source-map: "npm:^0.5.6" vlq: "npm:^1.0.0" - checksum: 10/6c77706ac5720a18dc7e25fc8b209de6fa386fcd2b9f79e3d88dbf360f5a0f4d4684950ee2243b1418b8e048a0aeb33c257875d1502a5813c1b330331c5b0eba + checksum: 10/6253f6aa9a19ff35d70a08e1a434b9641874392e3cccec6abc8dcbac1c3e9289e348fa37960f16581c386e8f9ba743631ecc8ed5bf42817a5d5c54b6784c63b5 languageName: node linkType: hard -"metro-symbolicate@npm:0.81.5": - version: 0.81.5 - resolution: "metro-symbolicate@npm:0.81.5" +"metro-symbolicate@npm:0.83.2": + version: 0.83.2 + resolution: "metro-symbolicate@npm:0.83.2" dependencies: flow-enums-runtime: "npm:^0.0.6" invariant: "npm:^2.2.4" - metro-source-map: "npm:0.81.5" + metro-source-map: "npm:0.83.2" nullthrows: "npm:^1.1.1" source-map: "npm:^0.5.6" vlq: "npm:^1.0.0" bin: metro-symbolicate: src/index.js - checksum: 10/184290f49eaa605e84157bc5d3befef219806bd13d14c5bcd4eeaac4e360fc880331b6af5a500980e93db274be1bc550439734849c5d20f384f1e12f3ce4aa28 + checksum: 10/1ddd82d0f1e236f4eb69c49b319a5446f364aaa421b4301554898abe86d23a452a5fb5113bfef6b6c68c2a697ad3a68fb00919a2f7b9b73a040c92689002a8d4 languageName: node linkType: hard -"metro-transform-plugins@npm:0.81.5": - version: 0.81.5 - resolution: "metro-transform-plugins@npm:0.81.5" +"metro-transform-plugins@npm:0.83.2": + version: 0.83.2 + resolution: "metro-transform-plugins@npm:0.83.2" dependencies: "@babel/core": "npm:^7.25.2" "@babel/generator": "npm:^7.25.0" @@ -15330,34 +15361,34 @@ __metadata: "@babel/traverse": "npm:^7.25.3" flow-enums-runtime: "npm:^0.0.6" nullthrows: "npm:^1.1.1" - checksum: 10/e5108548b5b3cdffb775f929a26df0c6bb804565bda35d1c2221b3ebf4d857002af47969c9b0a08c085f494986832b9f4c8851ab4bce842e7ab99464a5dfa1ca + checksum: 10/e3ebef11d64e5e568fde3fe2edc5d7f1e9508b28c7607c14dd711bc29058cbfc97e53edbfee79bd60f58c189e4d74869d87a30488534024fe88503296a7d095a languageName: node linkType: hard -"metro-transform-worker@npm:0.81.5": - version: 0.81.5 - resolution: "metro-transform-worker@npm:0.81.5" +"metro-transform-worker@npm:0.83.2": + version: 0.83.2 + resolution: "metro-transform-worker@npm:0.83.2" dependencies: "@babel/core": "npm:^7.25.2" "@babel/generator": "npm:^7.25.0" "@babel/parser": "npm:^7.25.3" "@babel/types": "npm:^7.25.2" flow-enums-runtime: "npm:^0.0.6" - metro: "npm:0.81.5" - metro-babel-transformer: "npm:0.81.5" - metro-cache: "npm:0.81.5" - metro-cache-key: "npm:0.81.5" - metro-minify-terser: "npm:0.81.5" - metro-source-map: "npm:0.81.5" - metro-transform-plugins: "npm:0.81.5" + metro: "npm:0.83.2" + metro-babel-transformer: "npm:0.83.2" + metro-cache: "npm:0.83.2" + metro-cache-key: "npm:0.83.2" + metro-minify-terser: "npm:0.83.2" + metro-source-map: "npm:0.83.2" + metro-transform-plugins: "npm:0.83.2" nullthrows: "npm:^1.1.1" - checksum: 10/70159c833192afa0c458b566801991034a171c5bc4ce7a0e2aed7a73614689a1a76738597e64d777cb00c9dbb3b21b59ea09473762eaa7a524681698242e8805 + checksum: 10/b4286b1b0511e46e2ec265e24138d03d8a794687260beae297de3d378285cce0e06132280dac62d447dfaf55627432c28463939a63136f3a84c2cf6b880d3865 languageName: node linkType: hard -"metro@npm:0.81.5, metro@npm:^0.81.0": - version: 0.81.5 - resolution: "metro@npm:0.81.5" +"metro@npm:0.83.2, metro@npm:^0.83.1": + version: 0.83.2 + resolution: "metro@npm:0.83.2" dependencies: "@babel/code-frame": "npm:^7.24.7" "@babel/core": "npm:^7.25.2" @@ -15370,28 +15401,28 @@ __metadata: chalk: "npm:^4.0.0" ci-info: "npm:^2.0.0" connect: "npm:^3.6.5" - debug: "npm:^2.2.0" + debug: "npm:^4.4.0" error-stack-parser: "npm:^2.0.6" flow-enums-runtime: "npm:^0.0.6" graceful-fs: "npm:^4.2.4" - hermes-parser: "npm:0.25.1" + hermes-parser: "npm:0.32.0" image-size: "npm:^1.0.2" invariant: "npm:^2.2.4" jest-worker: "npm:^29.7.0" jsc-safe-url: "npm:^0.2.2" lodash.throttle: "npm:^4.1.1" - metro-babel-transformer: "npm:0.81.5" - metro-cache: "npm:0.81.5" - metro-cache-key: "npm:0.81.5" - metro-config: "npm:0.81.5" - metro-core: "npm:0.81.5" - metro-file-map: "npm:0.81.5" - metro-resolver: "npm:0.81.5" - metro-runtime: "npm:0.81.5" - metro-source-map: "npm:0.81.5" - metro-symbolicate: "npm:0.81.5" - metro-transform-plugins: "npm:0.81.5" - metro-transform-worker: "npm:0.81.5" + metro-babel-transformer: "npm:0.83.2" + metro-cache: "npm:0.83.2" + metro-cache-key: "npm:0.83.2" + metro-config: "npm:0.83.2" + metro-core: "npm:0.83.2" + metro-file-map: "npm:0.83.2" + metro-resolver: "npm:0.83.2" + metro-runtime: "npm:0.83.2" + metro-source-map: "npm:0.83.2" + metro-symbolicate: "npm:0.83.2" + metro-transform-plugins: "npm:0.83.2" + metro-transform-worker: "npm:0.83.2" mime-types: "npm:^2.1.27" nullthrows: "npm:^1.1.1" serialize-error: "npm:^2.1.0" @@ -15401,7 +15432,7 @@ __metadata: yargs: "npm:^17.6.2" bin: metro: src/cli.js - checksum: 10/c0f44bf151e1a9f7be7946047e638d03f9e42a67b6707a49ba4d737678c91fbca980732033ff0c6f0636e7fd7f127ad4bb22b62283c71ea6c2a3bb6f5d7545e9 + checksum: 10/524c0f98ce8be619a345f58c39d19e6d0e5745dfd156c9b0a06201e6d9ad59e4405922f09f56fe92a86df9e06b0e89b173a3136640f1ec69c395b9ca34c1b042 languageName: node linkType: hard @@ -16001,7 +16032,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -16046,7 +16077,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.5": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -16146,17 +16177,6 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10/0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -16279,7 +16299,7 @@ __metadata: languageName: node linkType: hard -"neo-async@npm:^2.5.0, neo-async@npm:^2.6.2": +"neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" checksum: 10/1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 @@ -16312,15 +16332,6 @@ __metadata: languageName: node linkType: hard -"node-dir@npm:^0.1.17": - version: 0.1.17 - resolution: "node-dir@npm:0.1.17" - dependencies: - minimatch: "npm:^3.0.2" - checksum: 10/281fdea12d9c080a7250e5b5afefa3ab39426d40753ec8126a2d1e67f189b8824723abfed74f5d8549c5d78352d8c489fe08d0b067d7684c87c07283d38374a5 - languageName: node - linkType: hard - "node-emoji@npm:^2.1.0": version: 2.2.0 resolution: "node-emoji@npm:2.2.0" @@ -16333,7 +16344,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2.7.0, node-fetch@npm:^2.2.0, node-fetch@npm:^2.7.0": +"node-fetch@npm:2.7.0, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -16610,12 +16621,12 @@ __metadata: languageName: node linkType: hard -"ob1@npm:0.81.5": - version: 0.81.5 - resolution: "ob1@npm:0.81.5" +"ob1@npm:0.83.2": + version: 0.83.2 + resolution: "ob1@npm:0.83.2" dependencies: flow-enums-runtime: "npm:^0.0.6" - checksum: 10/249ad576be69151a3099207b35b2f6da5c6bb39dfacb9295028ebdc182c2f61f6544d1f6f167af759a77174ab19d8997d1ae6aecdbd9bdc293b2826067e66c5b + checksum: 10/8eb482589b66cf46600d1231c2ea50a365f47ee5db0274795d1d3f5c43112e255b931a41ce1ef8a220f31b4fb985fb269c6a54bf7e9719f90dac3f4001a89a6c languageName: node linkType: hard @@ -16633,16 +16644,6 @@ __metadata: languageName: node linkType: hard -"object-is@npm:^1.1.5": - version: 1.1.6 - resolution: "object-is@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - checksum: 10/4f6f544773a595da21c69a7531e0e1d6250670f4e09c55f47eb02c516035cfcb1b46ceb744edfd3ecb362309dbccb6d7f88e43bf42e4d4595ac10a329061053a - languageName: node - linkType: hard - "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -16650,7 +16651,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": +"object.assign@npm:^4.1.0, object.assign@npm:^4.1.7": version: 4.1.7 resolution: "object.assign@npm:4.1.7" dependencies: @@ -16689,10 +16690,10 @@ __metadata: languageName: node linkType: hard -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10/870766c16345855e2012e9422ba1ab110c7e44ad5891a67790f84610bd70a72b67fdd71baf497295f1d1bf38dd4c92248f825d48729c53c0eae5262fb69fa171 +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10/98aa64629f986fb8cc4517dd8bede73c980e31208cba97f4442c330959f60ced3dc6214b83420491f5111fc7c4f4343abe2ea62c85f505cf041d67850f238776 languageName: node linkType: hard @@ -17012,16 +17013,6 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: "npm:^1.3.1" - json-parse-better-errors: "npm:^1.0.1" - checksum: 10/0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 - languageName: node - linkType: hard - "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -17224,7 +17215,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -18554,13 +18545,13 @@ __metadata: languageName: node linkType: hard -"react-devtools-core@npm:^5.3.1": - version: 5.3.2 - resolution: "react-devtools-core@npm:5.3.2" +"react-devtools-core@npm:^6.1.5": + version: 6.1.5 + resolution: "react-devtools-core@npm:6.1.5" dependencies: shell-quote: "npm:^1.6.1" ws: "npm:^7" - checksum: 10/640123f775daeb2176ebc9caf85b1cb9dbb147cbb607f221254ac4967530ddf96332a582d5b169c840984220596a23780ed6f9b37c37461160e9b623f5f4caee + checksum: 10/0323f1d006979374b79ac83fced5bb10c04f2817d7bd4338074ead815ff441b943290d563d7796233767dd973787116a4b3c62040de4d770e0ae5b207fc8d480 languageName: node linkType: hard @@ -18702,57 +18693,53 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.76.6": - version: 0.76.6 - resolution: "react-native@npm:0.76.6" +"react-native@npm:0.81.4": + version: 0.81.4 + resolution: "react-native@npm:0.81.4" dependencies: - "@jest/create-cache-key-function": "npm:^29.6.3" - "@react-native/assets-registry": "npm:0.76.6" - "@react-native/codegen": "npm:0.76.6" - "@react-native/community-cli-plugin": "npm:0.76.6" - "@react-native/gradle-plugin": "npm:0.76.6" - "@react-native/js-polyfills": "npm:0.76.6" - "@react-native/normalize-colors": "npm:0.76.6" - "@react-native/virtualized-lists": "npm:0.76.6" + "@jest/create-cache-key-function": "npm:^29.7.0" + "@react-native/assets-registry": "npm:0.81.4" + "@react-native/codegen": "npm:0.81.4" + "@react-native/community-cli-plugin": "npm:0.81.4" + "@react-native/gradle-plugin": "npm:0.81.4" + "@react-native/js-polyfills": "npm:0.81.4" + "@react-native/normalize-colors": "npm:0.81.4" + "@react-native/virtualized-lists": "npm:0.81.4" abort-controller: "npm:^3.0.0" anser: "npm:^1.4.9" ansi-regex: "npm:^5.0.0" babel-jest: "npm:^29.7.0" - babel-plugin-syntax-hermes-parser: "npm:^0.23.1" + babel-plugin-syntax-hermes-parser: "npm:0.29.1" base64-js: "npm:^1.5.1" - chalk: "npm:^4.0.0" commander: "npm:^12.0.0" - event-target-shim: "npm:^5.0.1" flow-enums-runtime: "npm:^0.0.6" glob: "npm:^7.1.1" invariant: "npm:^2.2.4" - jest-environment-node: "npm:^29.6.3" - jsc-android: "npm:^250231.0.0" + jest-environment-node: "npm:^29.7.0" memoize-one: "npm:^5.0.0" - metro-runtime: "npm:^0.81.0" - metro-source-map: "npm:^0.81.0" - mkdirp: "npm:^0.5.1" + metro-runtime: "npm:^0.83.1" + metro-source-map: "npm:^0.83.1" nullthrows: "npm:^1.1.1" pretty-format: "npm:^29.7.0" promise: "npm:^8.3.0" - react-devtools-core: "npm:^5.3.1" + react-devtools-core: "npm:^6.1.5" react-refresh: "npm:^0.14.0" regenerator-runtime: "npm:^0.13.2" - scheduler: "npm:0.24.0-canary-efb381bbf-20230505" + scheduler: "npm:0.26.0" semver: "npm:^7.1.3" stacktrace-parser: "npm:^0.1.10" whatwg-fetch: "npm:^3.0.0" ws: "npm:^6.2.3" yargs: "npm:^17.6.2" peerDependencies: - "@types/react": ^18.2.6 - react: ^18.2.0 + "@types/react": ^19.1.0 + react: ^19.1.0 peerDependenciesMeta: "@types/react": optional: true bin: react-native: cli.js - checksum: 10/81a613fb10e5277d1a780dc6dd6b43ebb1bb6a5e576b3334a844b57fa80f8cc45fec35b47e05d168786345def0a9f31b953a151bd79d0e9af1651beb9e7ab9ee + checksum: 10/a4e27ffecd7c8acd59ae957f79818173c02057e75352fc39ec5271a27c2a9301e55160bf01bbf87b312034a1427dd5e56d2fa2f3d38c0a7f605a8f1941e0456a languageName: node linkType: hard @@ -18929,25 +18916,6 @@ __metadata: languageName: node linkType: hard -"readline@npm:^1.3.0": - version: 1.3.0 - resolution: "readline@npm:1.3.0" - checksum: 10/2cb7c274333fe1ed55e1bd06c670a32bd9eae5324d8e1fafb9af5c128dfde85601d59defe47947788b0682d5e9efeae6b88ea5fe233d5236a02f382a0b0ad4c3 - languageName: node - linkType: hard - -"recast@npm:^0.21.0": - version: 0.21.5 - resolution: "recast@npm:0.21.5" - dependencies: - ast-types: "npm:0.15.2" - esprima: "npm:~4.0.0" - source-map: "npm:~0.6.1" - tslib: "npm:^2.0.1" - checksum: 10/b41da2bcf7e705511db2f27d17420ace027de8dd167de9f19190d4988a1f80d112f60c095101ac2f145c8657ddde0c5133eb71df20504efaf3fd9d76ad07e15d - languageName: node - linkType: hard - "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -19062,7 +19030,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": +"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -19316,13 +19284,6 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-from@npm:3.0.0" - checksum: 10/c4189f1592a777f7d51c1ff6153df18b5d062c831fb0c623b4b87736c8a73c08e4eaab19e807399287040791f3e7aa0877f05f9d86739d3ef1ef0c727e9fe06c - languageName: node - linkType: hard - "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -19429,17 +19390,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:~2.6.2": - version: 2.6.3 - resolution: "rimraf@npm:2.6.3" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10/756419f2fa99aa119c46a9fc03e09d84ecf5421a80a72d1944c5088c9e4671e77128527a900a313ed9d3fdbdd37e2ae05486cd7e9116d5812d8c31f2399d7c86 - languageName: node - linkType: hard - "rollup@npm:^2.43.1": version: 2.79.2 resolution: "rollup@npm:2.79.2" @@ -19564,12 +19514,10 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:0.24.0-canary-efb381bbf-20230505": - version: 0.24.0-canary-efb381bbf-20230505 - resolution: "scheduler@npm:0.24.0-canary-efb381bbf-20230505" - dependencies: - loose-envify: "npm:^1.1.0" - checksum: 10/862881c8d3ece854331516cc048e26a86af461e896ab412506a5b1ffcc82990a08445e0127545ab524df15f88c2a691d8505fc2226a9bddf99bf8a8425bdcc0e +"scheduler@npm:0.26.0": + version: 0.26.0 + resolution: "scheduler@npm:0.26.0" + checksum: 10/1ecf2e5d7de1a7a132796834afe14a2d589ba7e437615bd8c06f3e0786a3ac3434655e67aac8755d9b14e05754c177e49c064261de2673aaa3c926bc98caa002 languageName: node linkType: hard @@ -19633,7 +19581,7 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.1.1, selfsigned@npm:^2.4.1": +"selfsigned@npm:^2.1.1": version: 2.4.1 resolution: "selfsigned@npm:2.4.1" dependencies: @@ -19670,7 +19618,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2": +"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -19757,7 +19705,7 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.16.2, serve-static@npm:^1.13.1": +"serve-static@npm:1.16.2, serve-static@npm:^1.16.2": version: 1.16.2 resolution: "serve-static@npm:1.16.2" dependencies: @@ -19921,7 +19869,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": +"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": version: 1.1.0 resolution: "side-channel@npm:1.1.0" dependencies: @@ -20275,7 +20223,7 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3, stack-utils@npm:^2.0.6": +"stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" dependencies: @@ -20321,16 +20269,6 @@ __metadata: languageName: node linkType: hard -"stop-iteration-iterator@npm:^1.0.0": - version: 1.1.0 - resolution: "stop-iteration-iterator@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - internal-slot: "npm:^1.1.0" - checksum: 10/ff36c4db171ee76c936ccfe9541946b77017f12703d4c446652017356816862d3aa029a64e7d4c4ceb484e00ed4a81789333896390d808458638f3a216aa1f41 - languageName: node - linkType: hard - "string-argv@npm:~0.3.1": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -20338,7 +20276,7 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1, string-length@npm:^4.0.2": +"string-length@npm:^4.0.2": version: 4.0.2 resolution: "string-length@npm:4.0.2" dependencies: @@ -20348,13 +20286,12 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^5.0.1": - version: 5.0.1 - resolution: "string-length@npm:5.0.1" +"string-length@npm:^6.0.0": + version: 6.0.0 + resolution: "string-length@npm:6.0.0" dependencies: - char-regex: "npm:^2.0.0" - strip-ansi: "npm:^7.0.1" - checksum: 10/71f73b8c8a743e01dcd001bcf1b197db78d5e5e53b12bd898cddaf0961be09f947dfd8c429783db3694b55b05cb5a51de6406c5085ff1aaa10c4771440c8396d + strip-ansi: "npm:^7.1.0" + checksum: 10/b171e9e193ec292ad71f8b2a36e20478bf1bac8cd5beec062fb126942d627dfd9311959e271e9ab7b0a383d16b85b9e25a183d15786e30f22104d152e7627f99 languageName: node linkType: hard @@ -20722,15 +20659,6 @@ __metadata: languageName: node linkType: hard -"temp@npm:^0.8.4": - version: 0.8.4 - resolution: "temp@npm:0.8.4" - dependencies: - rimraf: "npm:~2.6.2" - checksum: 10/0a7f76b49637415bc391c3f6e69377cc4c38afac95132b4158fa711e77b70b082fe56fd886f9d11ffab9d148df181a105a93c8b618fb72266eeaa5e5ddbfe37f - languageName: node - linkType: hard - "tempy@npm:^0.6.0": version: 0.6.0 resolution: "tempy@npm:0.6.0" @@ -21050,7 +20978,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -22063,7 +21991,7 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2, which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" dependencies: @@ -22097,7 +22025,7 @@ __metadata: languageName: node linkType: hard -"which-collection@npm:^1.0.1, which-collection@npm:^1.0.2": +"which-collection@npm:^1.0.2": version: 1.0.2 resolution: "which-collection@npm:1.0.2" dependencies: @@ -22109,7 +22037,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": version: 1.1.19 resolution: "which-typed-array@npm:1.1.19" dependencies: @@ -22457,17 +22385,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^2.3.0": - version: 2.4.3 - resolution: "write-file-atomic@npm:2.4.3" - dependencies: - graceful-fs: "npm:^4.1.11" - imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^3.0.2" - checksum: 10/15ce863dce07075d0decedd7c9094f4461e46139d28a758c53162f24c0791c16cd2e7a76baa5b47b1a851fbb51e16f2fab739afb156929b22628f3225437135c - languageName: node - linkType: hard - "write-file-atomic@npm:^3.0.3": version: 3.0.3 resolution: "write-file-atomic@npm:3.0.3" @@ -22647,6 +22564,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.6.1": + version: 2.8.1 + resolution: "yaml@npm:2.8.1" + bin: + yaml: bin.mjs + checksum: 10/eae07b3947d405012672ec17ce27348aea7d1fa0534143355d24a43a58f5e05652157ea2182c4fe0604f0540be71f99f1173f9d61018379404507790dff17665 + languageName: node + linkType: hard + "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1"