From 873f71129964350333503c039d9fa5784ea102d1 Mon Sep 17 00:00:00 2001 From: Jan Kassens Date: Thu, 21 Aug 2025 11:15:34 -0400 Subject: [PATCH 1/5] Update Flow to 0.248 (#34248) This update remove support for `%checks`. Thanks @SamChou19815 for finding a close replacement that works. --- package.json | 5 ++-- .../react-devtools-shared/babel.config.js | 1 + .../react-devtools-timeline/src/utils/flow.js | 7 +++-- .../src/legacy-events/accumulate.js | 3 +- .../src/legacy-events/accumulateInto.js | 4 +-- packages/shared/isArray.js | 5 +++- yarn.lock | 29 +++++++++++++++---- 7 files changed, 40 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 6893a414420ed..b8fc85be6567b 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@typescript-eslint/parser": "^6.21.0", "abortcontroller-polyfill": "^1.7.5", "art": "0.10.1", + "babel-plugin-syntax-hermes-parser": "^0.32.0", "babel-plugin-syntax-trailing-function-commas": "^6.5.0", "chalk": "^3.0.0", "cli-table": "^0.3.1", @@ -72,8 +73,8 @@ "eslint-plugin-react-internal": "link:./scripts/eslint-rules", "fbjs-scripts": "^3.0.1", "filesize": "^6.0.1", - "flow-bin": "^0.247", - "flow-remove-types": "^2.247", + "flow-bin": "^0.248", + "flow-remove-types": "^2.248", "glob": "^7.1.6", "glob-stream": "^6.1.0", "google-closure-compiler": "^20230206.0.0", diff --git a/packages/react-devtools-shared/babel.config.js b/packages/react-devtools-shared/babel.config.js index 78af34817e0a9..dfd46013e944e 100644 --- a/packages/react-devtools-shared/babel.config.js +++ b/packages/react-devtools-shared/babel.config.js @@ -34,6 +34,7 @@ module.exports = api => { } } const plugins = [ + ['babel-plugin-syntax-hermes-parser'], ['@babel/plugin-transform-flow-strip-types'], ['@babel/plugin-proposal-class-properties', {loose: false}], ]; diff --git a/packages/react-devtools-timeline/src/utils/flow.js b/packages/react-devtools-timeline/src/utils/flow.js index 48d8cf8f02631..cfdd3688c9d55 100644 --- a/packages/react-devtools-timeline/src/utils/flow.js +++ b/packages/react-devtools-timeline/src/utils/flow.js @@ -6,8 +6,11 @@ * * @flow */ -import type {SchedulingEvent} from '../types'; +import type {ReactScheduleStateUpdateEvent, SchedulingEvent} from '../types'; -export function isStateUpdateEvent(event: SchedulingEvent): boolean %checks { +export function isStateUpdateEvent( + event: SchedulingEvent, + // eslint-disable-next-line +): event is ReactScheduleStateUpdateEvent { return event.type === 'schedule-state-update'; } diff --git a/packages/react-native-renderer/src/legacy-events/accumulate.js b/packages/react-native-renderer/src/legacy-events/accumulate.js index 2d954a7980fc8..94cc925671358 100644 --- a/packages/react-native-renderer/src/legacy-events/accumulate.js +++ b/packages/react-native-renderer/src/legacy-events/accumulate.js @@ -31,8 +31,7 @@ function accumulate( // Both are not empty. Warning: Never call x.concat(y) when you are not // certain that x is an Array (x could be a string with concat method). if (isArray(current)) { - /* $FlowFixMe[incompatible-return] if `current` is `T` and `T` an array, - * `isArray` might refine to the array element type of `T` */ + // $FlowFixMe[incompatible-use] `isArray` does not ensure array is mutable return current.concat(next); } diff --git a/packages/react-native-renderer/src/legacy-events/accumulateInto.js b/packages/react-native-renderer/src/legacy-events/accumulateInto.js index 419465bba0cea..3a36e69788c55 100644 --- a/packages/react-native-renderer/src/legacy-events/accumulateInto.js +++ b/packages/react-native-renderer/src/legacy-events/accumulateInto.js @@ -38,12 +38,12 @@ function accumulateInto( // certain that x is an Array (x could be a string with concat method). if (isArray(current)) { if (isArray(next)) { - // $FlowFixMe[prop-missing] `isArray` does not ensure array is mutable + // $FlowFixMe[incompatible-use] `isArray` does not ensure array is mutable // $FlowFixMe[method-unbinding] current.push.apply(current, next); return current; } - // $FlowFixMe[prop-missing] `isArray` does not ensure array is mutable + // $FlowFixMe[incompatible-use] `isArray` does not ensure array is mutable current.push(next); return current; } diff --git a/packages/shared/isArray.js b/packages/shared/isArray.js index e2d3f6b17eb32..da50301a720ec 100644 --- a/packages/shared/isArray.js +++ b/packages/shared/isArray.js @@ -7,7 +7,10 @@ * @flow */ -declare function isArray(a: mixed): boolean %checks(Array.isArray(a)); +declare function isArray( + v: T, + // eslint-disable-next-line +): v is T extends $ReadOnlyArray ? T : empty; const isArrayImpl = Array.isArray; diff --git a/yarn.lock b/yarn.lock index 43aa75844ca48..85409d483220c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5351,6 +5351,13 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.3" +babel-plugin-syntax-hermes-parser@^0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz#06f7452bf91adf6cafd7c98e7467404d4eb65cec" + integrity sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg== + dependencies: + hermes-parser "0.32.0" + babel-plugin-syntax-trailing-function-commas@^6.5.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -9101,12 +9108,12 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -flow-bin@^0.247: - version "0.247.1" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.247.1.tgz#8c8d08fcee11ca43cbb6059edb9933a29bdedc57" - integrity sha512-03wwQ5kPW4CYqhXvxTseMs2v6QuVwCtifVkON2UUyDg6Jp1+CaQpLAZK+sFNzQOExKp0Yvoug+fZOUb33ARwHQ== +flow-bin@^0.248: + version "0.248.1" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.248.1.tgz#1d1e78ac8a1b8024dda5582b4832b605a00c16bd" + integrity sha512-WnISMV7p4rRY2LIMGnryR7Pnml9wFs0bTdniI1Dj2dXIJigOGfV74FjhMG7BmZkuKztNxlTvK56zpuhpcne+sg== -flow-remove-types@^2.247: +flow-remove-types@^2.248: version "2.279.0" resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-2.279.0.tgz#3a3388d9158eba0f82c40d80d31d9640b883a3f5" integrity sha512-bPFloMR/A2b/r/sIsf7Ix0LaMicCJNjwhXc4xEEQVzJCIz5u7C7XDaEOXOiqveKlCYK7DcBNn6R01Cbbc9gsYA== @@ -9985,6 +9992,11 @@ hermes-estree@0.29.1: resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.29.1.tgz#043c7db076e0e8ef8c5f6ed23828d1ba463ebcc5" integrity sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ== +hermes-estree@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.32.0.tgz#bb7da6613ab8e67e334a1854ea1e209f487d307b" + integrity sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ== + hermes-parser@0.25.1, hermes-parser@^0.25.1: version "0.25.1" resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" @@ -9999,6 +10011,13 @@ hermes-parser@0.29.1: dependencies: hermes-estree "0.29.1" +hermes-parser@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.32.0.tgz#7916984ef6fdce62e7415d354cf35392061cd303" + integrity sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw== + dependencies: + hermes-estree "0.32.0" + homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" From 3770ff38536c84c8a456eb74bb771f2fdca5c1c9 Mon Sep 17 00:00:00 2001 From: Jan Kassens Date: Thu, 21 Aug 2025 12:33:56 -0400 Subject: [PATCH 2/5] Update Flow to 0.256 (#34252) Looks like these versions didn't require changes, so easy fast forward. --- package.json | 4 ++-- yarn.lock | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index b8fc85be6567b..36ea560771cff 100644 --- a/package.json +++ b/package.json @@ -73,8 +73,8 @@ "eslint-plugin-react-internal": "link:./scripts/eslint-rules", "fbjs-scripts": "^3.0.1", "filesize": "^6.0.1", - "flow-bin": "^0.248", - "flow-remove-types": "^2.248", + "flow-bin": "^0.256", + "flow-remove-types": "^2.256", "glob": "^7.1.6", "glob-stream": "^6.1.0", "google-closure-compiler": "^20230206.0.0", diff --git a/yarn.lock b/yarn.lock index 85409d483220c..ef57d989765e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9108,12 +9108,12 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -flow-bin@^0.248: - version "0.248.1" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.248.1.tgz#1d1e78ac8a1b8024dda5582b4832b605a00c16bd" - integrity sha512-WnISMV7p4rRY2LIMGnryR7Pnml9wFs0bTdniI1Dj2dXIJigOGfV74FjhMG7BmZkuKztNxlTvK56zpuhpcne+sg== +flow-bin@^0.256: + version "0.256.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.256.0.tgz#0cddc3b665b8e9cae34eb5896c8429d0f2961fdf" + integrity sha512-ujKn6fRfx9SujbqBLhT/lxFsXRsRDgrot2UuNhw4Z5W3QlVn4teV+7rBhs87FVHSnRvZeFAMKHHYYahWYw5W4w== -flow-remove-types@^2.248: +flow-remove-types@^2.256: version "2.279.0" resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-2.279.0.tgz#3a3388d9158eba0f82c40d80d31d9640b883a3f5" integrity sha512-bPFloMR/A2b/r/sIsf7Ix0LaMicCJNjwhXc4xEEQVzJCIz5u7C7XDaEOXOiqveKlCYK7DcBNn6R01Cbbc9gsYA== From 812075366552bb757aaa00ff55ecccd1e1e4c5fa Mon Sep 17 00:00:00 2001 From: Ruslan Lesiutin <28902667+hoxyq@users.noreply.github.com> Date: Thu, 21 Aug 2025 18:28:33 +0100 Subject: [PATCH 3/5] [DevTools] fix: always send a response to fetch-file request in the extension (#34235) This fixes the displaying of "rendered by" section if owner stacks contained any native frames. This regressed after https://github.com/facebook/react/pull/34185, where we added the Suspense boundary for the StackTraceView. This fails because the Promise that is responsible for symbolication of the source is never getting resolved or rejected. Previously, we would just throw an Error without sending a corresponding message to the `main` script, and it would just cache a Promise that is never resolved, hence the Suspense boundary for "rendered by" section is never resolved. In a separate change, I think we need to update StackTraceView component to display `native` as location, instead of `:0`: Screenshot 2025-08-20 at 00 20 42 --- .../src/background/messageHandlers.js | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/react-devtools-extensions/src/background/messageHandlers.js b/packages/react-devtools-extensions/src/background/messageHandlers.js index 5afcd6aadcc07..cd07f8afbc5df 100644 --- a/packages/react-devtools-extensions/src/background/messageHandlers.js +++ b/packages/react-devtools-extensions/src/background/messageHandlers.js @@ -46,22 +46,26 @@ export function handleDevToolsPageMessage(message) { payload: {tabId, url}, } = message; - if (!tabId) { - throw new Error("Couldn't fetch file sources: tabId not specified"); - } - - if (!url) { - throw new Error("Couldn't fetch file sources: url not specified"); + if (!tabId || !url) { + // Send a response straight away to get the Promise fulfilled. + chrome.runtime.sendMessage({ + source: 'react-devtools-background', + payload: { + type: 'fetch-file-with-cache-error', + url, + value: null, + }, + }); + } else { + chrome.tabs.sendMessage(tabId, { + source: 'devtools-page', + payload: { + type: 'fetch-file-with-cache', + url, + }, + }); } - chrome.tabs.sendMessage(tabId, { - source: 'devtools-page', - payload: { - type: 'fetch-file-with-cache', - url, - }, - }); - break; } From ec5dd0ab3acb206dd4aa46c6d5573c235c8eae98 Mon Sep 17 00:00:00 2001 From: Jan Kassens Date: Thu, 21 Aug 2025 13:30:01 -0400 Subject: [PATCH 4/5] Update Flow to 0.257 (#34253) After an easy couple version with #34252, this version is less flexible (and safer) on inferring exported types mainly. We require to annotate some exported types to differentiate between `boolean` and literal `true` types, etc. --- package.json | 4 +- .../setupNativeStyleEditor.js | 2 +- .../config/DevToolsFeatureFlags.core-fb.js | 6 +- .../config/DevToolsFeatureFlags.core-oss.js | 6 +- .../config/DevToolsFeatureFlags.default.js | 6 +- .../DevToolsFeatureFlags.extension-fb.js | 6 +- .../DevToolsFeatureFlags.extension-oss.js | 6 +- .../src/content-views/constants.js | 2 +- .../src/client/ReactFiberConfigDOM.js | 2 +- .../src/events/DOMPluginEventSystem.js | 2 +- .../src/ReactFiberConfigFabric.js | 2 +- .../src/ReactFiberConfigNative.js | 2 +- packages/react-reconciler/src/ReactFiber.js | 4 +- .../src/ReactFiberCommitWork.js | 3 +- .../src/ReactFiberCompleteWork.js | 3 +- .../src/ReactFiberConfigTestHost.js | 2 +- .../src/ReactTestRenderer.js | 3 +- packages/react/index.development.js | 1 - packages/react/index.js | 1 - packages/scheduler/src/forks/Scheduler.js | 4 +- packages/scheduler/src/forks/SchedulerMock.js | 2 +- .../scheduler/src/forks/SchedulerNative.js | 21 ++-- .../scheduler/src/forks/SchedulerPostTask.js | 2 +- packages/shared/ReactFeatureFlags.js | 66 +++++------ .../forks/ReactFeatureFlags.native-fb.js | 92 +++++++------- .../forks/ReactFeatureFlags.native-oss.js | 110 ++++++++--------- .../forks/ReactFeatureFlags.test-renderer.js | 112 +++++++++--------- .../ReactFeatureFlags.test-renderer.www.js | 112 +++++++++--------- .../forks/ReactFeatureFlags.www-dynamic.js | 34 +++--- .../shared/forks/ReactFeatureFlags.www.js | 66 +++++------ yarn.lock | 10 +- 31 files changed, 348 insertions(+), 346 deletions(-) diff --git a/package.json b/package.json index 36ea560771cff..df04893c51ade 100644 --- a/package.json +++ b/package.json @@ -73,8 +73,8 @@ "eslint-plugin-react-internal": "link:./scripts/eslint-rules", "fbjs-scripts": "^3.0.1", "filesize": "^6.0.1", - "flow-bin": "^0.256", - "flow-remove-types": "^2.256", + "flow-bin": "^0.257", + "flow-remove-types": "^2.257", "glob": "^7.1.6", "glob-stream": "^6.1.0", "google-closure-compiler": "^20230206.0.0", diff --git a/packages/react-devtools-shared/src/backend/NativeStyleEditor/setupNativeStyleEditor.js b/packages/react-devtools-shared/src/backend/NativeStyleEditor/setupNativeStyleEditor.js index 728f0e691c98b..7a8bfff43bf24 100644 --- a/packages/react-devtools-shared/src/backend/NativeStyleEditor/setupNativeStyleEditor.js +++ b/packages/react-devtools-shared/src/backend/NativeStyleEditor/setupNativeStyleEditor.js @@ -194,7 +194,7 @@ function renameStyle( const {instance, style} = data; const newStyle = newName - ? {[oldName]: undefined, [newName]: value} + ? {[oldName]: (undefined: string | void), [newName]: value} : {[oldName]: undefined}; let customStyle; diff --git a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-fb.js b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-fb.js index 47e15953c9780..9cec3ce338c76 100644 --- a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-fb.js +++ b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-fb.js @@ -13,9 +13,9 @@ * It should always be imported from "react-devtools-feature-flags". ************************************************************************/ -export const enableLogger = true; -export const enableStyleXFeatures = true; -export const isInternalFacebookBuild = true; +export const enableLogger: boolean = true; +export const enableStyleXFeatures: boolean = true; +export const isInternalFacebookBuild: boolean = true; /************************************************************************ * Do not edit the code below. diff --git a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-oss.js b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-oss.js index e7ec62243adef..326b0fd16ccad 100644 --- a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-oss.js +++ b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.core-oss.js @@ -13,9 +13,9 @@ * It should always be imported from "react-devtools-feature-flags". ************************************************************************/ -export const enableLogger = false; -export const enableStyleXFeatures = false; -export const isInternalFacebookBuild = false; +export const enableLogger: boolean = false; +export const enableStyleXFeatures: boolean = false; +export const isInternalFacebookBuild: boolean = false; /************************************************************************ * Do not edit the code below. diff --git a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.default.js b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.default.js index bba2c8fcbfb05..e7355f8a3475b 100644 --- a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.default.js +++ b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.default.js @@ -13,6 +13,6 @@ * It should always be imported from "react-devtools-feature-flags". ************************************************************************/ -export const enableLogger = false; -export const enableStyleXFeatures = false; -export const isInternalFacebookBuild = false; +export const enableLogger: boolean = false; +export const enableStyleXFeatures: boolean = false; +export const isInternalFacebookBuild: boolean = false; diff --git a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-fb.js b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-fb.js index 55ea045715013..dc4f05d16fb80 100644 --- a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-fb.js +++ b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-fb.js @@ -13,9 +13,9 @@ * It should always be imported from "react-devtools-feature-flags". ************************************************************************/ -export const enableLogger = true; -export const enableStyleXFeatures = true; -export const isInternalFacebookBuild = true; +export const enableLogger: boolean = true; +export const enableStyleXFeatures: boolean = true; +export const isInternalFacebookBuild: boolean = true; /************************************************************************ * Do not edit the code below. diff --git a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-oss.js b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-oss.js index 75c8f149b3814..71df63eef0518 100644 --- a/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-oss.js +++ b/packages/react-devtools-shared/src/config/DevToolsFeatureFlags.extension-oss.js @@ -13,9 +13,9 @@ * It should always be imported from "react-devtools-feature-flags". ************************************************************************/ -export const enableLogger = false; -export const enableStyleXFeatures = false; -export const isInternalFacebookBuild = false; +export const enableLogger: boolean = false; +export const enableStyleXFeatures: boolean = false; +export const isInternalFacebookBuild: boolean = false; /************************************************************************ * Do not edit the code below. diff --git a/packages/react-devtools-timeline/src/content-views/constants.js b/packages/react-devtools-timeline/src/content-views/constants.js index ec1156605c2f6..1d68ab6edfe63 100644 --- a/packages/react-devtools-timeline/src/content-views/constants.js +++ b/packages/react-devtools-timeline/src/content-views/constants.js @@ -16,7 +16,7 @@ export const MARKER_TEXT_PADDING = 8; export const COLOR_HOVER_DIM_DELTA = 5; export const TOP_ROW_PADDING = 4; export const NATIVE_EVENT_HEIGHT = 14; -export const SUSPENSE_EVENT_HEIGHT = 14; +export const SUSPENSE_EVENT_HEIGHT: number = 14; export const PENDING_SUSPENSE_EVENT_SIZE = 8; export const REACT_EVENT_DIAMETER = 6; export const USER_TIMING_MARK_SIZE = 8; diff --git a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js index 568e892ad81ab..4d1e60e53a647 100644 --- a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js +++ b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js @@ -746,7 +746,7 @@ export const scheduleTimeout: any = typeof setTimeout === 'function' ? setTimeout : (undefined: any); export const cancelTimeout: any = typeof clearTimeout === 'function' ? clearTimeout : (undefined: any); -export const noTimeout = -1; +export const noTimeout: -1 = -1; const localPromise = typeof Promise === 'function' ? Promise : undefined; const localRequestAnimationFrame = typeof requestAnimationFrame === 'function' diff --git a/packages/react-dom-bindings/src/events/DOMPluginEventSystem.js b/packages/react-dom-bindings/src/events/DOMPluginEventSystem.js index 916786128dee8..e30c4798371da 100644 --- a/packages/react-dom-bindings/src/events/DOMPluginEventSystem.js +++ b/packages/react-dom-bindings/src/events/DOMPluginEventSystem.js @@ -407,7 +407,7 @@ export function listenToNativeEventForNonManagedEventTarget( isCapturePhaseListener: boolean, target: EventTarget, ): void { - let eventSystemFlags = IS_EVENT_HANDLE_NON_MANAGED_NODE; + let eventSystemFlags: number = IS_EVENT_HANDLE_NON_MANAGED_NODE; const listenerSet = getEventListenerSet(target); const listenerSetKey = getListenerSetKey( domEventName, diff --git a/packages/react-native-renderer/src/ReactFiberConfigFabric.js b/packages/react-native-renderer/src/ReactFiberConfigFabric.js index 3f2f0d192a882..4766c59b245f9 100644 --- a/packages/react-native-renderer/src/ReactFiberConfigFabric.js +++ b/packages/react-native-renderer/src/ReactFiberConfigFabric.js @@ -431,7 +431,7 @@ export const warnsIfNotActing = false; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; -export const noTimeout = -1; +export const noTimeout: -1 = -1; // ------------------- // Persistence diff --git a/packages/react-native-renderer/src/ReactFiberConfigNative.js b/packages/react-native-renderer/src/ReactFiberConfigNative.js index a4eb203b40eae..18a346495f640 100644 --- a/packages/react-native-renderer/src/ReactFiberConfigNative.js +++ b/packages/react-native-renderer/src/ReactFiberConfigNative.js @@ -326,7 +326,7 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; -export const noTimeout = -1; +export const noTimeout: -1 = -1; export function shouldSetTextContent(type: string, props: Props): boolean { // TODO (bvaughn) Revisit this decision. diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index ac25828400aa6..0af7ffb767bfb 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -522,7 +522,7 @@ export function createHostRootFiber( tag: RootTag, isStrictMode: boolean, ): Fiber { - let mode; + let mode: number; if (disableLegacyMode || tag === ConcurrentRoot) { mode = ConcurrentMode; if (isStrictMode === true) { @@ -551,7 +551,7 @@ export function createFiberFromTypeAndProps( mode: TypeOfMode, lanes: Lanes, ): Fiber { - let fiberTag = FunctionComponent; + let fiberTag: WorkTag = FunctionComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy. let resolvedType = type; if (typeof type === 'function') { diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.js b/packages/react-reconciler/src/ReactFiberCommitWork.js index b6716506a041d..8689f2eacf24d 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.js @@ -283,6 +283,7 @@ import { untrackNamedViewTransition, } from './ReactFiberDuplicateViewTransitions'; import {markIndicatorHandled} from './ReactFiberRootScheduler'; +import type {Flags} from './ReactFiberFlags'; // Used during the commit phase to track the state of the Offscreen component stack. // Allows us to avoid traversing the return path to find the nearest Offscreen ancestor. @@ -4490,7 +4491,7 @@ export function commitPassiveUnmountEffects(finishedWork: Fiber): void { // Note that MaySuspendCommit and ShouldSuspendCommit also includes named // ViewTransitions so that we know to also visit those to collect appearing // pairs. -let suspenseyCommitFlag = ShouldSuspendCommit; +let suspenseyCommitFlag: Flags = ShouldSuspendCommit; export function accumulateSuspenseyCommit( finishedWork: Fiber, committedLanes: Lanes, diff --git a/packages/react-reconciler/src/ReactFiberCompleteWork.js b/packages/react-reconciler/src/ReactFiberCompleteWork.js index 645eaeb50a146..404fd86c9df54 100644 --- a/packages/react-reconciler/src/ReactFiberCompleteWork.js +++ b/packages/react-reconciler/src/ReactFiberCompleteWork.js @@ -190,6 +190,7 @@ import { popRootMarkerInstance, } from './ReactFiberTracingMarkerComponent'; import {suspendCommit} from './ReactFiberThenable'; +import type {Flags} from './ReactFiberFlags'; /** * Tag the fiber with an update effect. This turns a Placement into @@ -780,7 +781,7 @@ function bubbleProperties(completedWork: Fiber) { completedWork.alternate.child === completedWork.child; let newChildLanes: Lanes = NoLanes; - let subtreeFlags = NoFlags; + let subtreeFlags: Flags = NoFlags; if (!didBailout) { // Bubble up the earliest expiration time. diff --git a/packages/react-test-renderer/src/ReactFiberConfigTestHost.js b/packages/react-test-renderer/src/ReactFiberConfigTestHost.js index 05fa9dffa3608..c0fed8ca9bbb0 100644 --- a/packages/react-test-renderer/src/ReactFiberConfigTestHost.js +++ b/packages/react-test-renderer/src/ReactFiberConfigTestHost.js @@ -268,7 +268,7 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; -export const noTimeout = -1; +export const noTimeout: -1 = -1; // ------------------- // Mutation diff --git a/packages/react-test-renderer/src/ReactTestRenderer.js b/packages/react-test-renderer/src/ReactTestRenderer.js index dd5b4e8c97247..e843417e83b5b 100644 --- a/packages/react-test-renderer/src/ReactTestRenderer.js +++ b/packages/react-test-renderer/src/ReactTestRenderer.js @@ -61,6 +61,7 @@ import { } from 'shared/ReactFeatureFlags'; import noop from 'shared/noop'; +import type {WorkTag} from 'react-reconciler/src/ReactWorkTags'; const defaultOnDefaultTransitionIndicator: () => void | (() => void) = noop; @@ -244,7 +245,7 @@ function toTree(node: null | Fiber): $FlowFixMe { } } -const validWrapperTypes = new Set([ +const validWrapperTypes: Set = new Set([ FunctionComponent, ClassComponent, HostComponent, diff --git a/packages/react/index.development.js b/packages/react/index.development.js index 0f7703e5111d5..b4c0632b7fdc3 100644 --- a/packages/react/index.development.js +++ b/packages/react/index.development.js @@ -19,7 +19,6 @@ export type Portal = React$Portal; export type ElementProps = React$ElementProps; export type ElementConfig = React$ElementConfig; export type ElementRef = React$ElementRef; -export type Config = React$Config; export type ChildrenArray<+T> = $ReadOnlyArray> | T; // Export all exports so that they're available in tests. diff --git a/packages/react/index.js b/packages/react/index.js index 5228ae8868191..4eb8f2dfc240b 100644 --- a/packages/react/index.js +++ b/packages/react/index.js @@ -21,7 +21,6 @@ export type RefSetter<-I> = React$RefSetter; export type ElementProps = React$ElementProps; export type ElementConfig = React$ElementConfig; export type ElementRef = React$ElementRef; -export type Config = React$Config; export type ChildrenArray<+T> = $ReadOnlyArray> | T; export { diff --git a/packages/scheduler/src/forks/Scheduler.js b/packages/scheduler/src/forks/Scheduler.js index 8b34f26bd0551..dcbcc2cf528a2 100644 --- a/packages/scheduler/src/forks/Scheduler.js +++ b/packages/scheduler/src/forks/Scheduler.js @@ -83,7 +83,7 @@ var timerQueue: Array = []; var taskIdCounter = 1; var currentTask = null; -var currentPriorityLevel = NormalPriority; +var currentPriorityLevel: PriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrance. var isPerformingWork = false; @@ -441,7 +441,7 @@ let taskTimeoutID: TimeoutID = (-1: any); // thread, like user events. By default, it yields multiple times per frame. // It does not attempt to align with frame boundaries, since most tasks don't // need to be frame aligned; for those that do, use requestAnimationFrame. -let frameInterval = frameYieldMs; +let frameInterval: number = frameYieldMs; let startTime = -1; function shouldYieldToHost(): boolean { diff --git a/packages/scheduler/src/forks/SchedulerMock.js b/packages/scheduler/src/forks/SchedulerMock.js index b638bf1eaf519..a362b23e1b7ae 100644 --- a/packages/scheduler/src/forks/SchedulerMock.js +++ b/packages/scheduler/src/forks/SchedulerMock.js @@ -70,7 +70,7 @@ var timerQueue: Array = []; var taskIdCounter = 1; var currentTask = null; -var currentPriorityLevel = NormalPriority; +var currentPriorityLevel: PriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrance. var isPerformingWork = false; diff --git a/packages/scheduler/src/forks/SchedulerNative.js b/packages/scheduler/src/forks/SchedulerNative.js index 33f9ae3313534..1acee1f5f499d 100644 --- a/packages/scheduler/src/forks/SchedulerNative.js +++ b/packages/scheduler/src/forks/SchedulerNative.js @@ -10,17 +10,18 @@ import * as Scheduler from './Scheduler'; import type {Callback, Task} from './Scheduler'; import type {PriorityLevel} from '../SchedulerPriorities'; +import typeof * as PriorityLevels from '../SchedulerPriorities'; import typeof * as SchedulerExportsType from './Scheduler'; import typeof * as SchedulerNativeExportsType from './SchedulerNative'; // This type is supposed to reflect the actual methods and arguments currently supported by the C++ implementation: // https://github.com/facebook/react-native/blob/main/packages/react-native/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp type NativeSchedulerType = { - unstable_ImmediatePriority: PriorityLevel, - unstable_UserBlockingPriority: PriorityLevel, - unstable_NormalPriority: PriorityLevel, - unstable_IdlePriority: PriorityLevel, - unstable_LowPriority: PriorityLevel, + unstable_ImmediatePriority: PriorityLevels['ImmediatePriority'], + unstable_UserBlockingPriority: PriorityLevels['UserBlockingPriority'], + unstable_NormalPriority: PriorityLevels['NormalPriority'], + unstable_IdlePriority: PriorityLevels['IdlePriority'], + unstable_LowPriority: PriorityLevels['LowPriority'], unstable_scheduleCallback: ( priorityLevel: PriorityLevel, callback: Callback, @@ -34,27 +35,27 @@ type NativeSchedulerType = { declare const nativeRuntimeScheduler: void | NativeSchedulerType; -export const unstable_UserBlockingPriority: PriorityLevel = +export const unstable_UserBlockingPriority: PriorityLevels['UserBlockingPriority'] = typeof nativeRuntimeScheduler !== 'undefined' ? nativeRuntimeScheduler.unstable_UserBlockingPriority : Scheduler.unstable_UserBlockingPriority; -export const unstable_NormalPriority: PriorityLevel = +export const unstable_NormalPriority: PriorityLevels['NormalPriority'] = typeof nativeRuntimeScheduler !== 'undefined' ? nativeRuntimeScheduler.unstable_NormalPriority : Scheduler.unstable_NormalPriority; -export const unstable_IdlePriority: PriorityLevel = +export const unstable_IdlePriority: PriorityLevels['IdlePriority'] = typeof nativeRuntimeScheduler !== 'undefined' ? nativeRuntimeScheduler.unstable_IdlePriority : Scheduler.unstable_IdlePriority; -export const unstable_LowPriority: PriorityLevel = +export const unstable_LowPriority: PriorityLevels['LowPriority'] = typeof nativeRuntimeScheduler !== 'undefined' ? nativeRuntimeScheduler.unstable_LowPriority : Scheduler.unstable_LowPriority; -export const unstable_ImmediatePriority: PriorityLevel = +export const unstable_ImmediatePriority: PriorityLevels['ImmediatePriority'] = typeof nativeRuntimeScheduler !== 'undefined' ? nativeRuntimeScheduler.unstable_ImmediatePriority : Scheduler.unstable_ImmediatePriority; diff --git a/packages/scheduler/src/forks/SchedulerPostTask.js b/packages/scheduler/src/forks/SchedulerPostTask.js index 7465c38b92f8a..e72df5f36413c 100644 --- a/packages/scheduler/src/forks/SchedulerPostTask.js +++ b/packages/scheduler/src/forks/SchedulerPostTask.js @@ -55,7 +55,7 @@ export const unstable_now = getCurrentTime; const yieldInterval = 5; let deadline = 0; -let currentPriorityLevel_DEPRECATED = NormalPriority; +let currentPriorityLevel_DEPRECATED: PriorityLevel = NormalPriority; // Always yield at the end of the frame. export function unstable_shouldYield(): boolean { diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 5dd612837a6b9..fb997f239ab8d 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -22,7 +22,7 @@ // when it rolls out to prod. We should remove these as soon as possible. // ----------------------------------------------------------------------------- -export const enableHydrationLaneScheduling = true; +export const enableHydrationLaneScheduling: boolean = true; // ----------------------------------------------------------------------------- // Land or remove (moderate effort) @@ -32,7 +32,7 @@ export const enableHydrationLaneScheduling = true; // ----------------------------------------------------------------------------- // Need to remove didTimeout argument from Scheduler before landing -export const disableSchedulerTimeoutInWorkLoop = false; +export const disableSchedulerTimeoutInWorkLoop: boolean = false; // ----------------------------------------------------------------------------- // Slated for removal in the future (significant effort) @@ -49,16 +49,16 @@ export const disableSchedulerTimeoutInWorkLoop = false; // hydrated or deleted. // // This will eventually be replaced by the Transition Tracing proposal. -export const enableSuspenseCallback = false; +export const enableSuspenseCallback: boolean = false; // Experimental Scope support. -export const enableScopeAPI = false; +export const enableScopeAPI: boolean = false; // Experimental Create Event Handle API. -export const enableCreateEventHandleAPI = false; +export const enableCreateEventHandleAPI: boolean = false; // Support legacy Primer support on internal FB www -export const enableLegacyFBSupport = false; +export const enableLegacyFBSupport: boolean = false; // ----------------------------------------------------------------------------- // Ongoing experiments @@ -69,10 +69,10 @@ export const enableLegacyFBSupport = false; // Yield to the browser event loop and not just the scheduler event loop before passive effects. // Fix gated tests that fail with this flag enabled before turning it back on. -export const enableYieldingBeforePassive = false; +export const enableYieldingBeforePassive: boolean = false; // Experiment to intentionally yield less to block high framerate animations. -export const enableThrottledScheduling = false; +export const enableThrottledScheduling: boolean = false; export const enableLegacyCache = __EXPERIMENTAL__; @@ -90,7 +90,7 @@ export const enableGestureTransition = __EXPERIMENTAL__; export const enableScrollEndPolyfill = __EXPERIMENTAL__; -export const enableSuspenseyImages = false; +export const enableSuspenseyImages: boolean = false; export const enableFizzBlockingRender = __EXPERIMENTAL__; // rel="expect" @@ -103,20 +103,20 @@ export const enableDefaultTransitionIndicator = __EXPERIMENTAL__; /** * Switches Fiber creation to a simple object instead of a constructor. */ -export const enableObjectFiber = false; +export const enableObjectFiber: boolean = false; -export const enableTransitionTracing = false; +export const enableTransitionTracing: boolean = false; // FB-only usage. The new API has different semantics. -export const enableLegacyHidden = false; +export const enableLegacyHidden: boolean = false; // Enables unstable_avoidThisFallback feature in Fiber -export const enableSuspenseAvoidThisFallback = false; +export const enableSuspenseAvoidThisFallback: boolean = false; export const enableCPUSuspense = __EXPERIMENTAL__; // Test this at Meta before enabling. -export const enableNoCloningMemoCache = false; +export const enableNoCloningMemoCache: boolean = false; export const enableUseEffectEventHook = __EXPERIMENTAL__; @@ -125,22 +125,22 @@ export const enableUseEffectEventHook = __EXPERIMENTAL__; // (handled with an MutationObserver) instead of inline-scripts export const enableFizzExternalRuntime = __EXPERIMENTAL__; -export const alwaysThrottleRetries = true; +export const alwaysThrottleRetries: boolean = true; -export const passChildrenWhenCloningPersistedNodes = false; +export const passChildrenWhenCloningPersistedNodes: boolean = false; /** * Enables a new Fiber flag used in persisted mode to reduce the number * of cloned host components. */ -export const enablePersistedModeClonedFlag = false; +export const enablePersistedModeClonedFlag: boolean = false; -export const enableEagerAlternateStateNodeCleanup = true; +export const enableEagerAlternateStateNodeCleanup: boolean = true; /** * Enables an expiration time for retry lanes to avoid starvation. */ -export const enableRetryLaneExpiration = false; +export const enableRetryLaneExpiration: boolean = false; export const retryLaneExpirationMs = 5000; export const syncLaneExpirationMs = 250; export const transitionLaneExpirationMs = 5000; @@ -149,7 +149,7 @@ export const transitionLaneExpirationMs = 5000; * Enables a new error detection for infinite render loops from updates caused * by setState or similar outside of the component owning the state. */ -export const enableInfiniteRenderLoopDetection = false; +export const enableInfiniteRenderLoopDetection: boolean = false; export const enableFragmentRefs = __EXPERIMENTAL__; @@ -166,35 +166,35 @@ export const enableFragmentRefs = __EXPERIMENTAL__; // const __NEXT_MAJOR__ = __EXPERIMENTAL__; // Renames the internal symbol for elements since they have changed signature/constructor -export const renameElementSymbol = true; +export const renameElementSymbol: boolean = true; /** * Enables a fix to run insertion effect cleanup on hidden subtrees. */ -export const enableHiddenSubtreeInsertionEffectCleanup = false; +export const enableHiddenSubtreeInsertionEffectCleanup: boolean = false; /** * Removes legacy style context defined using static `contextTypes` and consumed with static `childContextTypes`. */ -export const disableLegacyContext = true; +export const disableLegacyContext: boolean = true; /** * Removes legacy style context just from function components. */ -export const disableLegacyContextForFunctionComponents = true; +export const disableLegacyContextForFunctionComponents: boolean = true; // Enable the moveBefore() alternative to insertBefore(). This preserves states of moves. -export const enableMoveBefore = false; +export const enableMoveBefore: boolean = false; // Disabled caching behavior of `react/cache` in client runtimes. -export const disableClientCache = true; +export const disableClientCache: boolean = true; // Warn on any usage of ReactTestRenderer -export const enableReactTestRendererWarning = true; +export const enableReactTestRendererWarning: boolean = true; // Disables legacy mode // This allows us to land breaking changes to remove legacy mode APIs in experimental builds // before removing them in stable in the next Major -export const disableLegacyMode = true; +export const disableLegacyMode: boolean = true; // ----------------------------------------------------------------------------- // Chopping Block @@ -212,16 +212,16 @@ export const disableLegacyMode = true; // Disable support for comment nodes as React DOM containers. Already disabled // in open source, but www codebase still relies on it. Need to remove. -export const disableCommentsAsDOMContainers = true; +export const disableCommentsAsDOMContainers: boolean = true; -export const enableTrustedTypesIntegration = false; +export const enableTrustedTypesIntegration: boolean = false; // Prevent the value and checked attributes from syncing with their related // DOM properties -export const disableInputAttributeSyncing = false; +export const disableInputAttributeSyncing: boolean = false; // Disables children for