From e8f8259adacf76096e30551360f65088f33bae3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Sun, 4 Jan 2026 18:44:51 +0100 Subject: [PATCH 1/2] feat: remove Flow types support Removed Flow configuration, type definitions, and dependencies. - Deleted .flowconfig - Deleted flow-typed/ and typings/ directories - Removed Flow-related scripts and dependencies from package.json - Removed Flow preset from babel.config.js - Removed Flow ignore from eslint.config.mjs --- .flowconfig | 63 - babel.config.js | 1 - eslint.config.mjs | 9 +- flow-typed/npm/jest_v26.x.x.js | 1218 ----------------- flow-typed/npm/react-test-renderer_v16.x.x.js | 81 -- package.json | 8 +- typings/index.flow.js | 391 ------ yarn.lock | 26 +- 8 files changed, 4 insertions(+), 1793 deletions(-) delete mode 100644 .flowconfig delete mode 100644 flow-typed/npm/jest_v26.x.x.js delete mode 100644 flow-typed/npm/react-test-renderer_v16.x.x.js delete mode 100644 typings/index.flow.js diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 642af9996..000000000 --- a/.flowconfig +++ /dev/null @@ -1,63 +0,0 @@ -[ignore] -; We fork some components by platform -.*/*[.]android.js -.*/node_modules/.*\.json$ - -; Ignore "BUCK" generated dirs -/\.buckd/ - -; Ignore polyfills -node_modules/react-native/Libraries/polyfills/.* - -; These should not be required directly -; require from fbjs/lib instead: require('fbjs/lib/warning') -node_modules/warning/.* - -; Flow doesn't support platforms -.*/Libraries/Utilities/LoadingView.js - -[untyped] -.*/node_modules/@react-native-community/cli/.*/.* - -[include] -.*/typings/ - -[libs] -node_modules/react-native/interface.js -node_modules/react-native/flow/ -flow-typed/ -.*/typings/index - -[options] -server.max_workers=4 -emoji=true - -module.file_ext=.js -module.file_ext=.json -module.file_ext=.ios.js - -munge_underscores=true - -module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' -module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' - -[lints] -sketchy-null-number=warn -sketchy-null-mixed=warn -sketchy-number=warn -untyped-type-import=warn -nonstrict-import=warn -deprecated-type=warn -unsafe-getters-setters=warn -unnecessary-invariant=warn -signature-verification-failure=warn -deprecated-utility=error - -[strict] -deprecated-type -nonstrict-import -sketchy-null -unclear-type -unsafe-getters-setters -untyped-import -untyped-type-import diff --git a/babel.config.js b/babel.config.js index f2c48ffa8..87c5bf471 100644 --- a/babel.config.js +++ b/babel.config.js @@ -12,7 +12,6 @@ module.exports = { ], '@babel/preset-react', '@babel/preset-typescript', - '@babel/preset-flow', ], plugins: ['@babel/plugin-transform-strict-mode'], env: { diff --git a/eslint.config.mjs b/eslint.config.mjs index 067b5607c..b55bbc78a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,14 +5,7 @@ import jest from 'eslint-plugin-jest'; export default [ { - ignores: [ - 'flow-typed/', - 'build/', - 'experiments-rtl/', - 'website/', - 'eslint.config.mjs', - 'jest-setup.ts', - ], + ignores: ['build/', 'experiments-rtl/', 'website/', 'eslint.config.mjs', 'jest-setup.ts'], }, ...callstackConfig, ...tseslint.configs.strict, diff --git a/flow-typed/npm/jest_v26.x.x.js b/flow-typed/npm/jest_v26.x.x.js deleted file mode 100644 index bb0a086df..000000000 --- a/flow-typed/npm/jest_v26.x.x.js +++ /dev/null @@ -1,1218 +0,0 @@ -// flow-typed signature: 9a1f9054d272cf6383233b8bfb639f84 -// flow-typed version: 4efeddffd8/jest_v26.x.x/flow_>=v0.104.x - -type JestMockFn, TReturn> = { - (...args: TArguments): TReturn, - /** - * An object for introspecting mock calls - */ - mock: { - /** - * An array that represents all calls that have been made into this mock - * function. Each call is represented by an array of arguments that were - * passed during the call. - */ - calls: Array, - /** - * An array that contains all the object instances that have been - * instantiated from this mock function. - */ - instances: Array, - /** - * An array that contains all the object results that have been - * returned by this mock function call - */ - results: Array<{ - isThrow: boolean, - value: TReturn, - ... - }>, - ... - }, - /** - * Resets all information stored in the mockFn.mock.calls and - * mockFn.mock.instances arrays. Often this is useful when you want to clean - * up a mock's usage data between two assertions. - */ - mockClear(): void, - /** - * Resets all information stored in the mock. This is useful when you want to - * completely restore a mock back to its initial state. - */ - mockReset(): void, - /** - * Removes the mock and restores the initial implementation. This is useful - * when you want to mock functions in certain test cases and restore the - * original implementation in others. Beware that mockFn.mockRestore only - * works when mock was created with jest.spyOn. Thus you have to take care of - * restoration yourself when manually assigning jest.fn(). - */ - mockRestore(): void, - /** - * Accepts a function that should be used as the implementation of the mock. - * The mock itself will still record all calls that go into and instances - * that come from itself -- the only difference is that the implementation - * will also be executed when the mock is called. - */ - mockImplementation( - fn: (...args: TArguments) => TReturn - ): JestMockFn, - /** - * Accepts a function that will be used as an implementation of the mock for - * one call to the mocked function. Can be chained so that multiple function - * calls produce different results. - */ - mockImplementationOnce( - fn: (...args: TArguments) => TReturn - ): JestMockFn, - /** - * Accepts a string to use in test result output in place of "jest.fn()" to - * indicate which mock function is being referenced. - */ - mockName(name: string): JestMockFn, - /** - * Just a simple sugar function for returning `this` - */ - mockReturnThis(): void, - /** - * Accepts a value that will be returned whenever the mock function is called. - */ - mockReturnValue(value: TReturn): JestMockFn, - /** - * Sugar for only returning a value once inside your mock - */ - mockReturnValueOnce(value: TReturn): JestMockFn, - /** - * Sugar for jest.fn().mockImplementation(() => Promise.resolve(value)) - */ - mockResolvedValue(value: TReturn): JestMockFn>, - /** - * Sugar for jest.fn().mockImplementationOnce(() => Promise.resolve(value)) - */ - mockResolvedValueOnce( - value: TReturn - ): JestMockFn>, - /** - * Sugar for jest.fn().mockImplementation(() => Promise.reject(value)) - */ - mockRejectedValue(value: TReturn): JestMockFn>, - /** - * Sugar for jest.fn().mockImplementationOnce(() => Promise.reject(value)) - */ - mockRejectedValueOnce(value: TReturn): JestMockFn>, - ... -}; - -type JestAsymmetricEqualityType = { - /** - * A custom Jasmine equality tester - */ - asymmetricMatch(value: mixed): boolean, - ... -}; - -type JestCallsType = { - allArgs(): mixed, - all(): mixed, - any(): boolean, - count(): number, - first(): mixed, - mostRecent(): mixed, - reset(): void, - ... -}; - -type JestClockType = { - install(): void, - mockDate(date: Date): void, - tick(milliseconds?: number): void, - uninstall(): void, - ... -}; - -type JestMatcherResult = { - message?: string | (() => string), - pass: boolean, - ... -}; - -type JestMatcher = ( - received: any, - ...actual: Array -) => JestMatcherResult | Promise; - -type JestPromiseType = { - /** - * Use rejects to unwrap the reason of a rejected promise so any other - * matcher can be chained. If the promise is fulfilled the assertion fails. - */ - rejects: JestExpectType, - /** - * Use resolves to unwrap the value of a fulfilled promise so any other - * matcher can be chained. If the promise is rejected the assertion fails. - */ - resolves: JestExpectType, - ... -}; - -/** - * Jest allows functions and classes to be used as test names in test() and - * describe() - */ -type JestTestName = string | Function; - -/** - * Plugin: jest-styled-components - */ - -type JestStyledComponentsMatcherValue = - | string - | JestAsymmetricEqualityType - | RegExp - | typeof undefined; - -type JestStyledComponentsMatcherOptions = { - media?: string, - modifier?: string, - supports?: string, - ... -}; - -type JestStyledComponentsMatchersType = { - toHaveStyleRule( - property: string, - value: JestStyledComponentsMatcherValue, - options?: JestStyledComponentsMatcherOptions - ): void, - ... -}; - -/** - * Plugin: jest-enzyme - */ -type EnzymeMatchersType = { - // 5.x - toBeEmpty(): void, - toBePresent(): void, - // 6.x - toBeChecked(): void, - toBeDisabled(): void, - toBeEmptyRender(): void, - toContainMatchingElement(selector: string): void, - toContainMatchingElements(n: number, selector: string): void, - toContainExactlyOneMatchingElement(selector: string): void, - toContainReact(element: React$Element): void, - toExist(): void, - toHaveClassName(className: string): void, - toHaveHTML(html: string): void, - toHaveProp: ((propKey: string, propValue?: any) => void) & - ((props: { ... }) => void), - toHaveRef(refName: string): void, - toHaveState: ((stateKey: string, stateValue?: any) => void) & - ((state: { ... }) => void), - toHaveStyle: ((styleKey: string, styleValue?: any) => void) & - ((style: { ... }) => void), - toHaveTagName(tagName: string): void, - toHaveText(text: string): void, - toHaveValue(value: any): void, - toIncludeText(text: string): void, - toMatchElement( - element: React$Element, - options?: {| ignoreProps?: boolean, verbose?: boolean |} - ): void, - toMatchSelector(selector: string): void, - // 7.x - toHaveDisplayName(name: string): void, - ... -}; - -// DOM testing library extensions (jest-dom) -// https://github.com/testing-library/jest-dom -type DomTestingLibraryType = { - /** - * @deprecated - */ - toBeInTheDOM(container?: HTMLElement): void, - - // 4.x - toBeInTheDocument(): void, - toBeVisible(): void, - toBeEmpty(): void, - toBeDisabled(): void, - toBeEnabled(): void, - toBeInvalid(): void, - toBeRequired(): void, - toBeValid(): void, - toContainElement(element: HTMLElement | null): void, - toContainHTML(htmlText: string): void, - toHaveAttribute(attr: string, value?: any): void, - toHaveClass(...classNames: string[]): void, - toHaveFocus(): void, - toHaveFormValues(expectedValues: { [name: string]: any, ... }): void, - toHaveStyle(css: string | { [name: string]: any, ... }): void, - toHaveTextContent( - text: string | RegExp, - options?: {| normalizeWhitespace: boolean |} - ): void, - toHaveValue(value?: string | string[] | number): void, - - // 5.x - toHaveDisplayValue(value: string | string[]): void, - toBeChecked(): void, - ... -}; - -// Jest JQuery Matchers: https://github.com/unindented/custom-jquery-matchers -type JestJQueryMatchersType = { - toExist(): void, - toHaveLength(len: number): void, - toHaveId(id: string): void, - toHaveClass(className: string): void, - toHaveTag(tag: string): void, - toHaveAttr(key: string, val?: any): void, - toHaveProp(key: string, val?: any): void, - toHaveText(text: string | RegExp): void, - toHaveData(key: string, val?: any): void, - toHaveValue(val: any): void, - toHaveCss(css: { [key: string]: any, ... }): void, - toBeChecked(): void, - toBeDisabled(): void, - toBeEmpty(): void, - toBeHidden(): void, - toBeSelected(): void, - toBeVisible(): void, - toBeFocused(): void, - toBeInDom(): void, - toBeMatchedBy(sel: string): void, - toHaveDescendant(sel: string): void, - toHaveDescendantWithText(sel: string, text: string | RegExp): void, - ... -}; - -// Jest Extended Matchers: https://github.com/jest-community/jest-extended -type JestExtendedMatchersType = { - /** - * Note: Currently unimplemented - * Passing assertion - * - * @param {String} message - */ - // pass(message: string): void; - - /** - * Note: Currently unimplemented - * Failing assertion - * - * @param {String} message - */ - // fail(message: string): void; - - /** - * Use .toBeEmpty when checking if a String '', Array [] or Object {} is empty. - */ - toBeEmpty(): void, - /** - * Use .toBeOneOf when checking if a value is a member of a given Array. - * @param {Array.<*>} members - */ - toBeOneOf(members: any[]): void, - /** - * Use `.toBeNil` when checking a value is `null` or `undefined`. - */ - toBeNil(): void, - /** - * Use `.toSatisfy` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean`. - * @param {Function} predicate - */ - toSatisfy(predicate: (n: any) => boolean): void, - /** - * Use `.toBeArray` when checking if a value is an `Array`. - */ - toBeArray(): void, - /** - * Use `.toBeArrayOfSize` when checking if a value is an `Array` of size x. - * @param {Number} x - */ - toBeArrayOfSize(x: number): void, - /** - * Use `.toIncludeAllMembers` when checking if an `Array` contains all of the same members of a given set. - * @param {Array.<*>} members - */ - toIncludeAllMembers(members: any[]): void, - /** - * Use `.toIncludeAnyMembers` when checking if an `Array` contains any of the members of a given set. - * @param {Array.<*>} members - */ - toIncludeAnyMembers(members: any[]): void, - /** - * Use `.toSatisfyAll` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean` for all values in an array. - * @param {Function} predicate - */ - toSatisfyAll(predicate: (n: any) => boolean): void, - /** - * Use `.toBeBoolean` when checking if a value is a `Boolean`. - */ - toBeBoolean(): void, - /** - * Use `.toBeTrue` when checking a value is equal (===) to `true`. - */ - toBeTrue(): void, - /** - * Use `.toBeFalse` when checking a value is equal (===) to `false`. - */ - toBeFalse(): void, - /** - * Use .toBeDate when checking if a value is a Date. - */ - toBeDate(): void, - /** - * Use `.toBeFunction` when checking if a value is a `Function`. - */ - toBeFunction(): void, - /** - * Use `.toHaveBeenCalledBefore` when checking if a `Mock` was called before another `Mock`. - * - * Note: Required Jest version >22 - * Note: Your mock functions will have to be asynchronous to cause the timestamps inside of Jest to occur in a differentJS event loop, otherwise the mock timestamps will all be the same - * - * @param {Mock} mock - */ - toHaveBeenCalledBefore(mock: JestMockFn): void, - /** - * Use `.toBeNumber` when checking if a value is a `Number`. - */ - toBeNumber(): void, - /** - * Use `.toBeNaN` when checking a value is `NaN`. - */ - toBeNaN(): void, - /** - * Use `.toBeFinite` when checking if a value is a `Number`, not `NaN` or `Infinity`. - */ - toBeFinite(): void, - /** - * Use `.toBePositive` when checking if a value is a positive `Number`. - */ - toBePositive(): void, - /** - * Use `.toBeNegative` when checking if a value is a negative `Number`. - */ - toBeNegative(): void, - /** - * Use `.toBeEven` when checking if a value is an even `Number`. - */ - toBeEven(): void, - /** - * Use `.toBeOdd` when checking if a value is an odd `Number`. - */ - toBeOdd(): void, - /** - * Use `.toBeWithin` when checking if a number is in between the given bounds of: start (inclusive) and end (exclusive). - * - * @param {Number} start - * @param {Number} end - */ - toBeWithin(start: number, end: number): void, - /** - * Use `.toBeObject` when checking if a value is an `Object`. - */ - toBeObject(): void, - /** - * Use `.toContainKey` when checking if an object contains the provided key. - * - * @param {String} key - */ - toContainKey(key: string): void, - /** - * Use `.toContainKeys` when checking if an object has all of the provided keys. - * - * @param {Array.} keys - */ - toContainKeys(keys: string[]): void, - /** - * Use `.toContainAllKeys` when checking if an object only contains all of the provided keys. - * - * @param {Array.} keys - */ - toContainAllKeys(keys: string[]): void, - /** - * Use `.toContainAnyKeys` when checking if an object contains at least one of the provided keys. - * - * @param {Array.} keys - */ - toContainAnyKeys(keys: string[]): void, - /** - * Use `.toContainValue` when checking if an object contains the provided value. - * - * @param {*} value - */ - toContainValue(value: any): void, - /** - * Use `.toContainValues` when checking if an object contains all of the provided values. - * - * @param {Array.<*>} values - */ - toContainValues(values: any[]): void, - /** - * Use `.toContainAllValues` when checking if an object only contains all of the provided values. - * - * @param {Array.<*>} values - */ - toContainAllValues(values: any[]): void, - /** - * Use `.toContainAnyValues` when checking if an object contains at least one of the provided values. - * - * @param {Array.<*>} values - */ - toContainAnyValues(values: any[]): void, - /** - * Use `.toContainEntry` when checking if an object contains the provided entry. - * - * @param {Array.} entry - */ - toContainEntry(entry: [string, string]): void, - /** - * Use `.toContainEntries` when checking if an object contains all of the provided entries. - * - * @param {Array.>} entries - */ - toContainEntries(entries: [string, string][]): void, - /** - * Use `.toContainAllEntries` when checking if an object only contains all of the provided entries. - * - * @param {Array.>} entries - */ - toContainAllEntries(entries: [string, string][]): void, - /** - * Use `.toContainAnyEntries` when checking if an object contains at least one of the provided entries. - * - * @param {Array.>} entries - */ - toContainAnyEntries(entries: [string, string][]): void, - /** - * Use `.toBeExtensible` when checking if an object is extensible. - */ - toBeExtensible(): void, - /** - * Use `.toBeFrozen` when checking if an object is frozen. - */ - toBeFrozen(): void, - /** - * Use `.toBeSealed` when checking if an object is sealed. - */ - toBeSealed(): void, - /** - * Use `.toBeString` when checking if a value is a `String`. - */ - toBeString(): void, - /** - * Use `.toEqualCaseInsensitive` when checking if a string is equal (===) to another ignoring the casing of both strings. - * - * @param {String} string - */ - toEqualCaseInsensitive(string: string): void, - /** - * Use `.toStartWith` when checking if a `String` starts with a given `String` prefix. - * - * @param {String} prefix - */ - toStartWith(prefix: string): void, - /** - * Use `.toEndWith` when checking if a `String` ends with a given `String` suffix. - * - * @param {String} suffix - */ - toEndWith(suffix: string): void, - /** - * Use `.toInclude` when checking if a `String` includes the given `String` substring. - * - * @param {String} substring - */ - toInclude(substring: string): void, - /** - * Use `.toIncludeRepeated` when checking if a `String` includes the given `String` substring the correct number of times. - * - * @param {String} substring - * @param {Number} times - */ - toIncludeRepeated(substring: string, times: number): void, - /** - * Use `.toIncludeMultiple` when checking if a `String` includes all of the given substrings. - * - * @param {Array.} substring - */ - toIncludeMultiple(substring: string[]): void, - ... -}; - -// Diffing snapshot utility for Jest (snapshot-diff) -// https://github.com/jest-community/snapshot-diff -type SnapshotDiffType = { - /** - * Compare the difference between the actual in the `expect()` - * vs the object inside `valueB` with some extra options. - */ - toMatchDiffSnapshot( - valueB: any, - options?: {| - expand?: boolean, - colors?: boolean, - contextLines?: number, - stablePatchmarks?: boolean, - aAnnotation?: string, - bAnnotation?: string, - |}, - testName?: string - ): void, - ... -}; - -interface JestExpectType { - not: JestExpectType & - EnzymeMatchersType & - DomTestingLibraryType & - JestJQueryMatchersType & - JestStyledComponentsMatchersType & - JestExtendedMatchersType & - SnapshotDiffType; - /** - * If you have a mock function, you can use .lastCalledWith to test what - * arguments it was last called with. - */ - lastCalledWith(...args: Array): void; - /** - * toBe just checks that a value is what you expect. It uses === to check - * strict equality. - */ - toBe(value: any): void; - /** - * Use .toBeCalledWith to ensure that a mock function was called with - * specific arguments. - */ - toBeCalledWith(...args: Array): void; - /** - * Using exact equality with floating point numbers is a bad idea. Rounding - * means that intuitive things fail. - */ - toBeCloseTo(num: number, delta: any): void; - /** - * Use .toBeDefined to check that a variable is not undefined. - */ - toBeDefined(): void; - /** - * Use .toBeFalsy when you don't care what a value is, you just want to - * ensure a value is false in a boolean context. - */ - toBeFalsy(): void; - /** - * To compare floating point numbers, you can use toBeGreaterThan. - */ - toBeGreaterThan(number: number): void; - /** - * To compare floating point numbers, you can use toBeGreaterThanOrEqual. - */ - toBeGreaterThanOrEqual(number: number): void; - /** - * To compare floating point numbers, you can use toBeLessThan. - */ - toBeLessThan(number: number): void; - /** - * To compare floating point numbers, you can use toBeLessThanOrEqual. - */ - toBeLessThanOrEqual(number: number): void; - /** - * Use .toBeInstanceOf(Class) to check that an object is an instance of a - * class. - */ - toBeInstanceOf(cls: Class<*>): void; - /** - * .toBeNull() is the same as .toBe(null) but the error messages are a bit - * nicer. - */ - toBeNull(): void; - /** - * Use .toBeTruthy when you don't care what a value is, you just want to - * ensure a value is true in a boolean context. - */ - toBeTruthy(): void; - /** - * Use .toBeUndefined to check that a variable is undefined. - */ - toBeUndefined(): void; - /** - * Use .toContain when you want to check that an item is in a list. For - * testing the items in the list, this uses ===, a strict equality check. - */ - toContain(item: any): void; - /** - * Use .toContainEqual when you want to check that an item is in a list. For - * testing the items in the list, this matcher recursively checks the - * equality of all fields, rather than checking for object identity. - */ - toContainEqual(item: any): void; - /** - * Use .toEqual when you want to check that two objects have the same value. - * This matcher recursively checks the equality of all fields, rather than - * checking for object identity. - */ - toEqual(value: any): void; - /** - * Use .toHaveBeenCalled to ensure that a mock function got called. - */ - toHaveBeenCalled(): void; - toBeCalled(): void; - /** - * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact - * number of times. - */ - toHaveBeenCalledTimes(number: number): void; - toBeCalledTimes(number: number): void; - /** - * - */ - toHaveBeenNthCalledWith(nthCall: number, ...args: Array): void; - nthCalledWith(nthCall: number, ...args: Array): void; - /** - * - */ - toHaveReturned(): void; - toReturn(): void; - /** - * - */ - toHaveReturnedTimes(number: number): void; - toReturnTimes(number: number): void; - /** - * - */ - toHaveReturnedWith(value: any): void; - toReturnWith(value: any): void; - /** - * - */ - toHaveLastReturnedWith(value: any): void; - lastReturnedWith(value: any): void; - /** - * - */ - toHaveNthReturnedWith(nthCall: number, value: any): void; - nthReturnedWith(nthCall: number, value: any): void; - /** - * Use .toHaveBeenCalledWith to ensure that a mock function was called with - * specific arguments. - */ - toHaveBeenCalledWith(...args: Array): void; - toBeCalledWith(...args: Array): void; - /** - * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called - * with specific arguments. - */ - toHaveBeenLastCalledWith(...args: Array): void; - lastCalledWith(...args: Array): void; - /** - * Check that an object has a .length property and it is set to a certain - * numeric value. - */ - toHaveLength(number: number): void; - /** - * - */ - toHaveProperty(propPath: string | $ReadOnlyArray, value?: any): void; - /** - * Use .toMatch to check that a string matches a regular expression or string. - */ - toMatch(regexpOrString: RegExp | string): void; - /** - * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. - */ - toMatchObject(object: Object | Array): void; - /** - * Use .toStrictEqual to check that a javascript object matches a subset of the properties of an object. - */ - toStrictEqual(value: any): void; - /** - * This ensures that an Object matches the most recent snapshot. - */ - toMatchSnapshot(propertyMatchers?: any, name?: string): void; - /** - * This ensures that an Object matches the most recent snapshot. - */ - toMatchSnapshot(name: string): void; - - toMatchInlineSnapshot(snapshot?: string): void; - toMatchInlineSnapshot(propertyMatchers?: any, snapshot?: string): void; - /** - * Use .toThrow to test that a function throws when it is called. - * If you want to test that a specific error gets thrown, you can provide an - * argument to toThrow. The argument can be a string for the error message, - * a class for the error, or a regex that should match the error. - * - * Alias: .toThrowError - */ - toThrow(message?: string | Error | Class | RegExp): void; - toThrowError(message?: string | Error | Class | RegExp): void; - /** - * Use .toThrowErrorMatchingSnapshot to test that a function throws a error - * matching the most recent snapshot when it is called. - */ - toThrowErrorMatchingSnapshot(): void; - toThrowErrorMatchingInlineSnapshot(snapshot?: string): void; -} - -type JestObjectType = { - /** - * Disables automatic mocking in the module loader. - * - * After this method is called, all `require()`s will return the real - * versions of each module (rather than a mocked version). - */ - disableAutomock(): JestObjectType, - /** - * An un-hoisted version of disableAutomock - */ - autoMockOff(): JestObjectType, - /** - * Enables automatic mocking in the module loader. - */ - enableAutomock(): JestObjectType, - /** - * An un-hoisted version of enableAutomock - */ - autoMockOn(): JestObjectType, - /** - * Clears the mock.calls and mock.instances properties of all mocks. - * Equivalent to calling .mockClear() on every mocked function. - */ - clearAllMocks(): JestObjectType, - /** - * Resets the state of all mocks. Equivalent to calling .mockReset() on every - * mocked function. - */ - resetAllMocks(): JestObjectType, - /** - * Restores all mocks back to their original value. - */ - restoreAllMocks(): JestObjectType, - /** - * Removes any pending timers from the timer system. - */ - clearAllTimers(): void, - /** - * Returns the number of fake timers still left to run. - */ - getTimerCount(): number, - /** - * The same as `mock` but not moved to the top of the expectation by - * babel-jest. - */ - doMock(moduleName: string, moduleFactory?: any): JestObjectType, - /** - * The same as `unmock` but not moved to the top of the expectation by - * babel-jest. - */ - dontMock(moduleName: string): JestObjectType, - /** - * Returns a new, unused mock function. Optionally takes a mock - * implementation. - */ - fn, TReturn>( - implementation?: (...args: TArguments) => TReturn - ): JestMockFn, - /** - * Determines if the given function is a mocked function. - */ - isMockFunction(fn: Function): boolean, - /** - * Given the name of a module, use the automatic mocking system to generate a - * mocked version of the module for you. - */ - genMockFromModule(moduleName: string): any, - /** - * Mocks a module with an auto-mocked version when it is being required. - * - * The second argument can be used to specify an explicit module factory that - * is being run instead of using Jest's automocking feature. - * - * The third argument can be used to create virtual mocks -- mocks of modules - * that don't exist anywhere in the system. - */ - mock( - moduleName: string, - moduleFactory?: any, - options?: Object - ): JestObjectType, - /** - * Returns the actual module instead of a mock, bypassing all checks on - * whether the module should receive a mock implementation or not. - */ - requireActual(moduleName: string): any, - /** - * Returns a mock module instead of the actual module, bypassing all checks - * on whether the module should be required normally or not. - */ - requireMock(moduleName: string): any, - /** - * Resets the module registry - the cache of all required modules. This is - * useful to isolate modules where local state might conflict between tests. - */ - resetModules(): JestObjectType, - /** - * Creates a sandbox registry for the modules that are loaded inside the - * callback function. This is useful to isolate specific modules for every - * test so that local module state doesn't conflict between tests. - */ - isolateModules(fn: () => void): JestObjectType, - /** - * Exhausts the micro-task queue (usually interfaced in node via - * process.nextTick). - */ - runAllTicks(): void, - /** - * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), - * setInterval(), and setImmediate()). - */ - runAllTimers(): void, - /** - * Exhausts all tasks queued by setImmediate(). - */ - runAllImmediates(): void, - /** - * Executes only the macro task queue (i.e. all tasks queued by setTimeout() - * or setInterval() and setImmediate()). - */ - advanceTimersByTime(msToRun: number): void, - /** - * Executes only the macro task queue (i.e. all tasks queued by setTimeout() - * or setInterval() and setImmediate()). - * - * Renamed to `advanceTimersByTime`. - */ - runTimersToTime(msToRun: number): void, - /** - * Executes only the macro-tasks that are currently pending (i.e., only the - * tasks that have been queued by setTimeout() or setInterval() up to this - * point) - */ - runOnlyPendingTimers(): void, - /** - * Explicitly supplies the mock object that the module system should return - * for the specified module. Note: It is recommended to use jest.mock() - * instead. - */ - setMock(moduleName: string, moduleExports: any): JestObjectType, - /** - * Indicates that the module system should never return a mocked version of - * the specified module from require() (e.g. that it should always return the - * real module). - */ - unmock(moduleName: string): JestObjectType, - /** - * Instructs Jest to use fake versions of the standard timer functions - * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, - * setImmediate and clearImmediate). - */ - useFakeTimers(mode?: 'modern' | 'legacy'): JestObjectType, - /** - * Instructs Jest to use the real versions of the standard timer functions. - */ - useRealTimers(): JestObjectType, - /** - * Creates a mock function similar to jest.fn but also tracks calls to - * object[methodName]. - */ - spyOn( - object: Object, - methodName: string, - accessType?: 'get' | 'set' - ): JestMockFn, - /** - * Set the default timeout interval for tests and before/after hooks in milliseconds. - * Note: The default timeout interval is 5 seconds if this method is not called. - */ - setTimeout(timeout: number): JestObjectType, - ... -}; - -type JestSpyType = { calls: JestCallsType, ... }; - -type JestDoneFn = {| - (error?: Error): void, - fail: (error: Error) => void, -|}; - -/** Runs this function after every test inside this context */ -declare function afterEach( - fn: (done: JestDoneFn) => ?Promise, - timeout?: number -): void; -/** Runs this function before every test inside this context */ -declare function beforeEach( - fn: (done: JestDoneFn) => ?Promise, - timeout?: number -): void; -/** Runs this function after all tests have finished inside this context */ -declare function afterAll( - fn: (done: JestDoneFn) => ?Promise, - timeout?: number -): void; -/** Runs this function before any tests have started inside this context */ -declare function beforeAll( - fn: (done: JestDoneFn) => ?Promise, - timeout?: number -): void; - -/** A context for grouping tests together */ -declare var describe: { - /** - * Creates a block that groups together several related tests in one "test suite" - */ - (name: JestTestName, fn: () => void): void, - /** - * Only run this describe block - */ - only(name: JestTestName, fn: () => void): void, - /** - * Skip running this describe block - */ - skip(name: JestTestName, fn: () => void): void, - /** - * each runs this test against array of argument arrays per each run - * - * @param {table} table of Test - */ - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number - ) => void, - ... -}; - -/** An individual test unit */ -declare var it: { - /** - * An individual test unit - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - ( - name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, - timeout?: number - ): void, - /** - * Only run this test - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - only: {| - ( - name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, - timeout?: number - ): void, - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number - ) => void, - |}, - /** - * Skip running this test - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - skip( - name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, - timeout?: number - ): void, - /** - * Highlight planned tests in the summary output - * - * @param {String} Name of Test to do - */ - todo(name: string): void, - /** - * Run the test concurrently - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - concurrent( - name: JestTestName, - fn?: (done: JestDoneFn) => ?Promise, - timeout?: number - ): void, - /** - * each runs this test against array of argument arrays per each run - * - * @param {table} table of Test - */ - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number - ) => void, - ... -}; - -declare function fit( - name: JestTestName, - fn: (done: JestDoneFn) => ?Promise, - timeout?: number -): void; -/** An individual test unit */ -declare var test: typeof it; -/** A disabled group of tests */ -declare var xdescribe: typeof describe; -/** A focused group of tests */ -declare var fdescribe: typeof describe; -/** A disabled individual test */ -declare var xit: typeof it; -/** A disabled individual test */ -declare var xtest: typeof it; - -type JestPrettyFormatColors = { - comment: { - close: string, - open: string, - ... - }, - content: { - close: string, - open: string, - ... - }, - prop: { - close: string, - open: string, - ... - }, - tag: { - close: string, - open: string, - ... - }, - value: { - close: string, - open: string, - ... - }, - ... -}; - -type JestPrettyFormatIndent = (string) => string; -type JestPrettyFormatRefs = Array; -type JestPrettyFormatPrint = (any) => string; -type JestPrettyFormatStringOrNull = string | null; - -type JestPrettyFormatOptions = {| - callToJSON: boolean, - edgeSpacing: string, - escapeRegex: boolean, - highlight: boolean, - indent: number, - maxDepth: number, - min: boolean, - plugins: JestPrettyFormatPlugins, - printFunctionName: boolean, - spacing: string, - theme: {| - comment: string, - content: string, - prop: string, - tag: string, - value: string, - |}, -|}; - -type JestPrettyFormatPlugin = { - print: ( - val: any, - serialize: JestPrettyFormatPrint, - indent: JestPrettyFormatIndent, - opts: JestPrettyFormatOptions, - colors: JestPrettyFormatColors - ) => string, - test: (any) => boolean, - ... -}; - -type JestPrettyFormatPlugins = Array; - -/** The expect function is used every time you want to test a value */ -declare var expect: { - /** The object that you want to make assertions against */ - ( - value: any - ): JestExpectType & - JestPromiseType & - EnzymeMatchersType & - DomTestingLibraryType & - JestJQueryMatchersType & - JestStyledComponentsMatchersType & - JestExtendedMatchersType & - SnapshotDiffType, - /** Add additional Jasmine matchers to Jest's roster */ - extend(matchers: { [name: string]: JestMatcher, ... }): void, - /** Add a module that formats application-specific data structures. */ - addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void, - assertions(expectedAssertions: number): void, - hasAssertions(): void, - any(value: mixed): JestAsymmetricEqualityType, - anything(): any, - arrayContaining(value: Array): Array, - objectContaining(value: Object): Object, - /** Matches any received string that contains the exact expected string. */ - stringContaining(value: string): string, - stringMatching(value: string | RegExp): string, - not: { - arrayContaining: (value: $ReadOnlyArray) => Array, - objectContaining: (value: { ... }) => Object, - stringContaining: (value: string) => string, - stringMatching: (value: string | RegExp) => string, - ... - }, - ... -}; - -// TODO handle return type -// http://jasmine.github.io/2.4/introduction.html#section-Spies -declare function spyOn(value: mixed, method: string): Object; - -/** Holds all functions related to manipulating test runner */ -declare var jest: JestObjectType; - -/** - * The global Jasmine object, this is generally not exposed as the public API, - * using features inside here could break in later versions of Jest. - */ -declare var jasmine: { - DEFAULT_TIMEOUT_INTERVAL: number, - any(value: mixed): JestAsymmetricEqualityType, - anything(): any, - arrayContaining(value: Array): Array, - clock(): JestClockType, - createSpy(name: string): JestSpyType, - createSpyObj( - baseName: string, - methodNames: Array - ): { [methodName: string]: JestSpyType, ... }, - objectContaining(value: Object): Object, - stringMatching(value: string): string, - ... -}; diff --git a/flow-typed/npm/react-test-renderer_v16.x.x.js b/flow-typed/npm/react-test-renderer_v16.x.x.js deleted file mode 100644 index 87a149a1d..000000000 --- a/flow-typed/npm/react-test-renderer_v16.x.x.js +++ /dev/null @@ -1,81 +0,0 @@ -// flow-typed signature: b6bb53397d83d2d821e258cc73818d1b -// flow-typed version: 9c71eca8ef/react-test-renderer_v16.x.x/flow_>=v0.47.x - -// Type definitions for react-test-renderer 16.x.x -// Ported from: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react-test-renderer - -type ReactComponentInstance = React$Component; - -type ReactTestRendererJSON = { - type: string, - props: { [propName: string]: any }, - children: null | ReactTestRendererJSON[], -}; - -type ReactTestRendererTree = ReactTestRendererJSON & { - nodeType: 'component' | 'host', - instance: ?ReactComponentInstance, - rendered: null | ReactTestRendererTree, -}; - -type ReactTestInstance = { - instance: ?ReactComponentInstance, - type: string, - props: { [propName: string]: any }, - parent: null | ReactTestInstance, - children: Array, - - find(predicate: (node: ReactTestInstance) => boolean): ReactTestInstance, - findByType(type: React$ElementType): ReactTestInstance, - findByProps(props: { [propName: string]: any }): ReactTestInstance, - - findAll( - predicate: (node: ReactTestInstance) => boolean, - options?: { deep: boolean } - ): ReactTestInstance[], - findAllByType( - type: React$ElementType, - options?: { deep: boolean } - ): ReactTestInstance[], - findAllByProps( - props: { [propName: string]: any }, - options?: { deep: boolean } - ): ReactTestInstance[], -}; - -type TestRendererOptions = { - createNodeMock(element: React$Element): any, -}; - -declare module 'react-test-renderer' { - declare export type ReactTestRenderer = { - toJSON(): null | ReactTestRendererJSON, - toTree(): null | ReactTestRendererTree, - unmount(nextElement?: React$Element): void, - update(nextElement: React$Element): void, - getInstance(): ?ReactComponentInstance, - root: ReactTestInstance, - }; - - declare type Thenable = { - then(resolve: () => mixed, reject?: () => mixed): mixed, - }; - - declare function create( - nextElement: React$Element, - options?: TestRendererOptions - ): ReactTestRenderer; - - declare function act(callback: () => void): Thenable; -} - -declare module 'react-test-renderer/shallow' { - declare export default class ShallowRenderer { - static createRenderer(): ShallowRenderer; - getMountedInstance(): ReactTestInstance; - getRenderOutput>(): E; - getRenderOutput(): React$Element; - render(element: React$Element, context?: any): void; - unmount(): void; - } -} diff --git a/package.json b/package.json index 9bf47bf2c..9e4b84bff 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,11 @@ "test:ci": "jest --maxWorkers=2", "test:ci:coverage": "jest --maxWorkers=2 --collectCoverage=true --coverage-provider=v8", "typecheck": "tsc", - "copy-flowtypes": "cp typings/index.flow.js build", "lint": "eslint src --cache", "validate": "yarn prettier && yarn lint && yarn typecheck && yarn test", "build:js": "babel src --out-dir build --extensions \".js,.ts,.jsx,.tsx\" --source-maps --ignore \"**/__tests__/**\"", "build:ts": "tsc --build tsconfig.release.json", - "build": "yarn clean && yarn build:js && yarn build:ts && yarn copy-flowtypes", + "build": "yarn clean && yarn build:js && yarn build:ts", "release": "release-it", "release:rc": "release-it --preRelease=rc", "release:alpha": "release-it --preRelease=alpha", @@ -46,8 +45,7 @@ "matchers.d.ts", "pure.js", "pure.d.ts", - "dont-cleanup-after-each.js", - "typings/index.flow.js" + "dont-cleanup-after-each.js" ], "dependencies": { "jest-matcher-utils": "^30.2.0", @@ -71,7 +69,6 @@ "@babel/core": "^7.28.5", "@babel/plugin-transform-strict-mode": "^7.27.1", "@babel/preset-env": "^7.28.5", - "@babel/preset-flow": "^7.27.1", "@babel/preset-react": "^7.28.5", "@babel/preset-typescript": "^7.28.5", "@callstack/eslint-config": "^15.0.0", @@ -86,7 +83,6 @@ "del-cli": "^7.0.0", "eslint": "^9.39.1", "eslint-plugin-simple-import-sort": "^12.1.1", - "flow-bin": "~0.170.0", "jest": "^30.2.0", "prettier": "^3.6.2", "react": "19.1.1", diff --git a/typings/index.flow.js b/typings/index.flow.js deleted file mode 100644 index e89c469f2..000000000 --- a/typings/index.flow.js +++ /dev/null @@ -1,391 +0,0 @@ -// @flow -import * as React from 'react'; - -type GetReturn = ReactTestInstance; -type GetAllReturn = Array; -type QueryReturn = ReactTestInstance | null; -type QueryAllReturn = Array | []; -type FindReturn = Promise; -type FindAllReturn = Promise; - -type CommonQueryOptions = { - includeHiddenElements?: boolean, - hidden?: boolean, -}; - -type TextMatch = string | RegExp; - -declare type NormalizerFn = (textToNormalize: string) => string; -declare type NormalizerConfig = { - trim?: boolean, - collapseWhitespace?: boolean, -}; -declare type TextMatchOptions = { - exact?: boolean, - normalizer?: NormalizerFn, -}; -declare type A11yRole = - | 'none' - | 'button' - | 'link' - | 'search' - | 'image' - | 'keyboardkey' - | 'text' - | 'adjustable' - | 'imagebutton' - | 'header' - | 'summary' - | 'alert' - | 'checkbox' - | 'combobox' - | 'menu' - | 'menubar' - | 'menuitem' - | 'progressbar' - | 'radio' - | 'radiogroup' - | 'scrollbar' - | 'spinbutton' - | 'switch' - | 'tab' - | 'tablist' - | 'timer' - | 'toolbar'; - -declare type A11yState = {| - disabled?: boolean, - selected?: boolean, - checked?: boolean | 'mixed', - busy?: boolean, - expanded?: boolean, -|}; - -declare type A11yValue = { - min?: number, - max?: number, - now?: number, - text?: TextMatch, -}; - -type WaitForOptions = { - timeout?: number, - interval?: number, - onTimeout?: (error: Error) => Error, -}; - -type WaitForFunction = (expectation: () => T, options?: WaitForOptions) => Promise; - -type ByTextOptions = CommonQueryOptions & TextMatchOptions; - -interface ByTextQueries { - getByText: (text: TextMatch, options?: ByTextOptions) => ReactTestInstance; - getAllByText: (text: TextMatch, options?: ByTextOptions) => Array; - queryByText: (name: TextMatch, options?: ByTextOptions) => ReactTestInstance | null; - queryAllByText: (text: TextMatch, options?: ByTextOptions) => Array | []; - findByText: ( - text: TextMatch, - queryOptions?: ByTextOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByText: ( - text: TextMatch, - queryOptions?: ByTextOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; -} - -type ByTestIdOptions = CommonQueryOptions & TextMatchOptions; - -interface ByTestIdQueries { - getByTestId: (testID: TextMatch, options?: ByTestIdOptions) => ReactTestInstance; - getAllByTestId: (testID: TextMatch, options?: ByTestIdOptions) => Array; - queryByTestId: (testID: TextMatch, options?: ByTestIdOptions) => ReactTestInstance | null; - queryAllByTestId: (testID: TextMatch, options?: ByTestIdOptions) => Array | []; - findByTestId: ( - testID: TextMatch, - queryOptions?: ByTestIdOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByTestId: ( - testID: TextMatch, - queryOptions?: ByTestIdOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; -} - -type ByDisplayValueOptions = CommonQueryOptions & TextMatchOptions; - -interface ByDisplayValueQueries { - getByDisplayValue: (value: TextMatch, options?: ByDisplayValueOptions) => ReactTestInstance; - getAllByDisplayValue: ( - value: TextMatch, - options?: ByDisplayValueOptions, - ) => Array; - queryByDisplayValue: ( - value: TextMatch, - options?: ByDisplayValueOptions, - ) => ReactTestInstance | null; - queryAllByDisplayValue: ( - value: TextMatch, - options?: ByDisplayValueOptions, - ) => Array | []; - findByDisplayValue: ( - value: TextMatch, - queryOptions?: ByDisplayValueOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByDisplayValue: ( - value: TextMatch, - queryOptions?: ByDisplayValueOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; -} - -type ByPlaceholderTextOptions = CommonQueryOptions & TextMatchOptions; - -interface ByPlaceholderTextQueries { - getByPlaceholderText: ( - placeholder: TextMatch, - options?: ByPlaceholderTextOptions, - ) => ReactTestInstance; - getAllByPlaceholderText: ( - placeholder: TextMatch, - options?: ByPlaceholderTextOptions, - ) => Array; - queryByPlaceholderText: ( - placeholder: TextMatch, - options?: ByPlaceholderTextOptions, - ) => ReactTestInstance | null; - queryAllByPlaceholderText: ( - placeholder: TextMatch, - options?: ByPlaceholderTextOptions, - ) => Array | []; - findByPlaceholderText: ( - placeholder: TextMatch, - queryOptions?: ByPlaceholderTextOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByPlaceholderText: ( - placeholder: TextMatch, - queryOptions?: ByPlaceholderTextOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; -} - -interface UnsafeByTypeQueries { - UNSAFE_getByType:

(type: React.ComponentType

) => ReactTestInstance; - UNSAFE_getAllByType:

(type: React.ComponentType

) => Array; - UNSAFE_queryByType:

(type: React.ComponentType

) => ReactTestInstance | null; - UNSAFE_queryAllByType:

(type: React.ComponentType

) => Array | []; -} - -interface UnsafeByPropsQueries { - UNSAFE_getByProps: (props: { [string]: any }) => ReactTestInstance; - UNSAFE_getAllByProps: (props: { [string]: any }) => Array; - UNSAFE_queryByProps: (props: { [string]: any }) => ReactTestInstance | null; - UNSAFE_queryAllByProps: (props: { [string]: any }) => Array | []; -} - -type ByRoleOptions = CommonQueryOptions & { - ...A11yState, - name?: string, - value?: A11yValue, -}; - -type ByLabelTextOptions = CommonQueryOptions & TextMatchOptions; -type ByHintTextOptions = CommonQueryOptions & TextMatchOptions; - -interface A11yAPI { - // Label - getByLabelText: (matcher: TextMatch, options?: ByLabelTextOptions) => GetReturn; - getAllByLabelText: (matcher: TextMatch, options?: ByLabelTextOptions) => GetAllReturn; - queryByLabelText: (matcher: TextMatch, options?: ByLabelTextOptions) => QueryReturn; - queryAllByLabelText: (matcher: TextMatch, options?: ByLabelTextOptions) => QueryAllReturn; - findByLabelText: ( - matcher: TextMatch, - queryOptions?: ByLabelTextOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByLabelText: ( - matcher: TextMatch, - queryOptions?: ByLabelTextOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; - - // Hint - getByA11yHint: (matcher: TextMatch, options?: ByHintTextOptions) => GetReturn; - getByHintText: (matcher: TextMatch, options?: ByHintTextOptions) => GetReturn; - getAllByA11yHint: (matcher: TextMatch, options?: ByHintTextOptions) => GetAllReturn; - getAllByHintText: (matcher: TextMatch, options?: ByHintTextOptions) => GetAllReturn; - queryByA11yHint: (matcher: TextMatch, options?: ByHintTextOptions) => QueryReturn; - queryByHintText: (matcher: TextMatch, options?: ByHintTextOptions) => QueryReturn; - queryAllByA11yHint: (matcher: TextMatch, options?: ByHintTextOptions) => QueryAllReturn; - queryAllByHintText: (matcher: TextMatch, options?: ByHintTextOptions) => QueryAllReturn; - findByA11yHint: ( - matcher: TextMatch, - queryOptions?: ByHintTextOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findByHintText: ( - matcher: TextMatch, - queryOptions?: ByHintTextOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByA11yHint: ( - matcher: TextMatch, - queryOptions?: ByHintTextOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; - findAllByHintText: ( - matcher: TextMatch, - queryOptions?: ByHintTextOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; - - // Role - getByRole: (matcher: A11yRole | RegExp, role?: ByRoleOptions) => GetReturn; - getAllByRole: (matcher: A11yRole | RegExp, options?: ByRoleOptions) => GetAllReturn; - queryByRole: (matcher: A11yRole | RegExp, options?: ByRoleOptions) => QueryReturn; - queryAllByRole: (matcher: A11yRole | RegExp, options?: ByRoleOptions) => QueryAllReturn; - findByRole: ( - matcher: A11yRole | RegExp, - queryOptions?: ByRoleOptions, - waitForOptions?: WaitForOptions, - ) => FindReturn; - findAllByRole: ( - matcher: A11yRole | RegExp, - queryOptions?: ByRoleOptions, - waitForOptions?: WaitForOptions, - ) => FindAllReturn; -} - -interface Thenable { - then: (resolve: () => any, reject?: () => any) => any; -} - -type MapPropsFunction = ( - props: { [string]: mixed }, - node: ReactTestRendererJSON, -) => { [string]: mixed }; - -type DebugOptions = { - message?: string, - mapProps?: MapPropsFunction, -}; - -type Queries = ByTextQueries & - ByTestIdQueries & - ByDisplayValueQueries & - ByPlaceholderTextQueries & - UnsafeByTypeQueries & - UnsafeByPropsQueries & - A11yAPI; - -type FireEventFunction = ( - element: ReactTestInstance, - eventName: string, - ...data: Array -) => Promise; - -type FireEventAPI = FireEventFunction & { - press: (element: ReactTestInstance, ...data: Array) => Promise, - changeText: (element: ReactTestInstance, ...data: Array) => Promise, - scroll: (element: ReactTestInstance, ...data: Array) => Promise, -}; - -type DeprecatedFireEventSyncFunction = ( - element: ReactTestInstance, - eventName: string, - ...data: Array -) => any; - -type DeprecatedFireEventSyncAPI = DeprecatedFireEventSyncFunction & { - press: (element: ReactTestInstance, ...data: Array) => any, - changeText: (element: ReactTestInstance, ...data: Array) => any, - scroll: (element: ReactTestInstance, ...data: Array) => any, -}; - -declare module '@testing-library/react-native' { - declare interface RenderResult extends Queries { - update(nextElement: React.Element): void; - rerender(nextElement: React.Element): void; - unmount(nextElement?: React.Element): void; - toJSON(): ReactTestRendererJSON[] | ReactTestRendererJSON | null; - debug(options?: DebugOptions): void; - root: ReactTestInstance; - UNSAFE_root: ReactTestInstance; - } - - declare type RenderAPI = RenderResult; - - declare interface RenderOptions { - wrapper?: React.ComponentType; - createNodeMock?: (element: React.Element) => any; - unstable_validateStringsRenderedWithinText?: boolean; - unstable_isConcurrent?: boolean; - unstable_strictMode?: boolean; - unstable_concurrentUpdatesByDefault?: boolean; - } - - declare export var render: ( - component: React.Element, - options?: RenderOptions, - ) => RenderResult; - - declare export var screen: RenderResult; - - declare export var cleanup: () => void; - declare export var fireEvent: FireEventAPI; - declare export var deprecated_fireEventSync: DeprecatedFireEventSyncAPI; - - declare export var waitFor: WaitForFunction; - - declare type WaitForElementToBeRemovedFunction = ( - expectation: () => T, - options?: WaitForOptions, - ) => Promise; - - declare export var waitForElementToBeRemoved: WaitForElementToBeRemovedFunction; - - declare interface Config { - asyncUtilTimeout: number; - defaultIncludeHiddenElements: boolean; - defaultDebugOptions?: $Shape; - } - - declare interface ConfigAliasOptions { - /** Alias to `defaultIncludeHiddenElements` for RTL compatibility */ - defaultHidden: boolean; - } - - declare export var configure: (options: $Shape) => void; - declare export var resetToDefaults: () => void; - - declare export var act: (callback: () => void) => Thenable; - declare export var within: (instance: ReactTestInstance) => Queries; - declare export var getQueriesForElement: (element: ReactTestInstance) => Queries; - - declare export var getDefaultNormalizer: (normalizerConfig?: NormalizerConfig) => NormalizerFn; - - declare export var isHiddenFromAccessibility: (element: ReactTestInstance | null) => boolean; - declare export var isInaccessible: (element: ReactTestInstance | null) => boolean; - - declare type RenderHookResult = { - rerender: (props: Props) => void, - result: { current: Result }, - unmount: () => void, - }; - - declare type RenderHookOptions = { - initialProps?: Props, - wrapper?: React.ComponentType, - }; - - declare type RenderHookFunction = ( - renderCallback: (props: Props) => Result, - options?: RenderHookOptions, - ) => RenderHookResult; - - declare export var renderHook: RenderHookFunction; -} diff --git a/yarn.lock b/yarn.lock index 9d9db9e00..45d4a6fcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -837,7 +837,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-flow-strip-types@npm:^7.25.2, @babel/plugin-transform-flow-strip-types@npm:^7.27.1": +"@babel/plugin-transform-flow-strip-types@npm:^7.25.2": version: 7.27.1 resolution: "@babel/plugin-transform-flow-strip-types@npm:7.27.1" dependencies: @@ -1440,19 +1440,6 @@ __metadata: languageName: node linkType: hard -"@babel/preset-flow@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/preset-flow@npm:7.27.1" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-transform-flow-strip-types": "npm:^7.27.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/252216c91ba3cc126f10c81c1df495ef2c622687d17373bc619354a7fb7280ea83f434ed1e7149dbddd712790d16ab60f5b864d007edd153931d780f834e52c1 - languageName: node - linkType: hard - "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -3027,7 +3014,6 @@ __metadata: "@babel/core": "npm:^7.28.5" "@babel/plugin-transform-strict-mode": "npm:^7.27.1" "@babel/preset-env": "npm:^7.28.5" - "@babel/preset-flow": "npm:^7.27.1" "@babel/preset-react": "npm:^7.28.5" "@babel/preset-typescript": "npm:^7.28.5" "@callstack/eslint-config": "npm:^15.0.0" @@ -3042,7 +3028,6 @@ __metadata: del-cli: "npm:^7.0.0" eslint: "npm:^9.39.1" eslint-plugin-simple-import-sort: "npm:^12.1.1" - flow-bin: "npm:~0.170.0" jest: "npm:^30.2.0" jest-matcher-utils: "npm:^30.2.0" picocolors: "npm:^1.1.1" @@ -5845,15 +5830,6 @@ __metadata: languageName: node linkType: hard -"flow-bin@npm:~0.170.0": - version: 0.170.0 - resolution: "flow-bin@npm:0.170.0" - bin: - flow: cli.js - checksum: 10c0/cdb54136cc334915ef788350f9b6c87024ddda2b676a70497fa38da05b373171d61f27f23796e625cdc3f96019dc05be9aadd629332335e8b1a9d40ba21605bd - languageName: node - linkType: hard - "flow-enums-runtime@npm:^0.0.6": version: 0.0.6 resolution: "flow-enums-runtime@npm:0.0.6" From aaabae1cbe6a446bc0b27c16f53b7618859189c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Sun, 4 Jan 2026 18:49:35 +0100 Subject: [PATCH 2/2] remove flow types --- .prettierignore | 2 - AGENTS.md | 2 +- CLAUDE.md | 137 ------------------------------------------------ 3 files changed, 1 insertion(+), 140 deletions(-) delete mode 100644 CLAUDE.md diff --git a/.prettierignore b/.prettierignore index 26e25e83b..63022880d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,2 @@ node_modules/ .yarn - -flow-typed/ diff --git a/AGENTS.md b/AGENTS.md index 34c265f26..858ba77dc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,7 +21,7 @@ The project uses `yarn` for dependency management and script execution. - **Type Check:** `yarn typecheck` (Runs TypeScript compiler) - **Format Check:** `yarn prettier` - **Validate All:** `yarn validate` (Runs Prettier, ESLint, Typecheck, and Tests in sequence) -- **Build Project:** `yarn build` (Cleans, builds JS with Babel, builds TS types, and copies Flow types) +- **Build Project:** `yarn build` (Cleans, builds JS with Babel, and builds TS types) ## Development Conventions diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index cfd0c1020..000000000 --- a/CLAUDE.md +++ /dev/null @@ -1,137 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Project Overview - -This is the **React Native Testing Library (RNTL)** - a comprehensive testing solution for React Native applications that provides React Native runtime simulation on top of `universal-test-renderer`. The library encourages better testing practices by focusing on testing behavior rather than implementation details. - -## Key Development Commands - -### Testing - -- `yarn test` - Run all tests -- `yarn test:ci` - Run tests with CI optimizations (maxWorkers=2) -- `yarn test:ci:coverage` - Run tests with coverage reporting - -### Building - -- `yarn build` - Full build process (clean, build JS, build types, copy flow types) -- `yarn build:js` - Build JavaScript using Babel -- `yarn build:ts` - Build TypeScript declarations -- `yarn clean` - Clean build directory - -### Code Quality - -- `yarn typecheck` - Run TypeScript compiler -- `yarn lint` - Run ESLint with caching -- `yarn validate` - Run lint + typecheck + test (pre-commit validation) - -### Testing Single Files - -To test a specific file: `yarn test path/to/test.test.tsx` - -## Architecture Overview - -### Core Components - -1. **`src/index.ts`** - Main entry point that sets up auto-cleanup and extends Jest matchers -2. **`src/pure.ts`** - Pure exports without auto-cleanup for advanced use cases -3. **`src/render.tsx`** - Core rendering functionality using `universal-test-renderer` -4. **`src/screen.ts`** - Global screen object providing access to rendered components - -### Key Modules - -- **`src/queries/`** - Query functions for finding elements (byText, byRole, byTestId, etc.) -- **`src/matchers/`** - Jest matchers for assertions (toBeVisible, toHaveTextContent, etc.) -- **`src/user-event/`** - User interaction simulation (press, type, scroll, etc.) -- **`src/helpers/`** - Utility functions for component tree traversal and debugging -- **`src/fire-event.ts`** - Low-level event firing utilities - -### Query System - -The library provides three query variants for each selector: - -- `get*` - Throws if not found (for assertions) -- `query*` - Returns null if not found (for conditional logic) -- `find*` - Returns Promise, waits for element (for async operations) - -### User Events vs Fire Events - -- **User Events** (`src/user-event/`) - High-level, realistic user interactions -- **Fire Events** (`src/fire-event.ts`) - Low-level, direct event dispatching - -## Configuration - -### Jest Setup - -- Main Jest config: `jest.config.js` -- Setup file: `jest-setup.ts` -- Uses React Native preset with custom transform ignore patterns - -### TypeScript - -- Main config: `tsconfig.json` (development) -- Release config: `tsconfig.release.json` (for builds) -- Strict mode enabled with ES2022 target - -### ESLint - -- Config: `eslint.config.mjs` -- Uses Callstack config + TypeScript strict rules -- Custom rules for import sorting and test files - -## Testing Patterns - -### Component Testing - -```jsx -import { render, screen, userEvent } from '@testing-library/react-native'; - -test('component behavior', async () => { - const user = userEvent.setup(); - render(); - - await user.press(screen.getByRole('button')); - expect(screen.getByText('Expected text')).toBeOnTheScreen(); -}); -``` - -### Async Testing - -Use `findBy*` queries or `waitFor` for async operations: - -```jsx -const element = await screen.findByText('Async content'); -await waitFor(() => expect(mockFn).toHaveBeenCalled()); -``` - -## Development Workflow - -1. **Working with Examples**: Test changes in `examples/` directory -2. **Commit Messages**: Follow conventional commits (feat:, fix:, docs:, test:, chore:, refactor:, BREAKING:) -3. **Pre-commit**: Hooks verify linting, type checking, and tests pass -4. **Pull Requests**: Run `yarn validate` before submitting - -## Build Process - -The build creates: - -- `build/` - Compiled JavaScript and TypeScript declarations -- `matchers.js` - Jest matchers for separate import -- `pure.js` - Pure version without auto-cleanup -- `dont-cleanup-after-each.js` - Version without auto-cleanup - -## Package Structure - -- **Main exports**: Full library with auto-cleanup -- **Pure exports**: Library without auto-cleanup (`/pure`) -- **Matcher exports**: Jest matchers only (`/matchers`) -- **No cleanup**: Disable auto-cleanup (`/dont-cleanup-after-each`) - -## Testing Environment - -- Uses `universal-test-renderer` for component rendering -- Fake timers recommended for user events -- String validation available for text rendering checks -- Supports both concurrent and legacy React rendering modes