From b113cf58648cc42f4875b13e6f4228d61cd533a3 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Mon, 7 Sep 2026 17:37:38 +0100 Subject: [PATCH 01/35] [LOCAL] Bump hermes-v1 to 260318099.0.1 --- packages/react-native/package.json | 2 +- packages/react-native/sdks/.hermesv1version | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 packages/react-native/sdks/.hermesv1version diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 6d0af84fc364..75acd4ab9f41 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -162,7 +162,7 @@ "flow-parser": "0.327.0", "base64-js": "^1.5.1", "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "0.0.0", + "hermes-compiler": "260318099.0.1", "invariant": "^2.2.4", "memoize-one": "^5.0.0", "metro-runtime": "^0.87.0", diff --git a/packages/react-native/sdks/.hermesv1version b/packages/react-native/sdks/.hermesv1version new file mode 100644 index 000000000000..73dfc36fa92b --- /dev/null +++ b/packages/react-native/sdks/.hermesv1version @@ -0,0 +1 @@ +hermes-v260318099.0.1 \ No newline at end of file From 981724d016f67daa4c90685318d9b75c6bfbfa0b Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Tue, 8 Sep 2026 13:36:43 +0100 Subject: [PATCH 02/35] Bump hermes version --- packages/eslint-config-react-native/package.json | 7 ++++++- packages/react-native/package.json | 2 +- packages/react-native/sdks/.hermesv1version | 2 +- .../react-native/sdks/hermes-engine/version.properties | 2 +- packages/typescript-config/package.json | 6 +++++- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 99fc3a8d2e9c..28740855fad0 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -23,7 +23,12 @@ ".": "./index.js", "./flat": "./flat.js" }, - "files": ["README.md", "flat.js", "index.js", "shared.js"], + "files": [ + "README.md", + "flat.js", + "index.js", + "shared.js" + ], "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 75acd4ab9f41..2e3158192cf2 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -162,7 +162,7 @@ "flow-parser": "0.327.0", "base64-js": "^1.5.1", "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "260318099.0.1", + "hermes-compiler": "260318099.0.2", "invariant": "^2.2.4", "memoize-one": "^5.0.0", "metro-runtime": "^0.87.0", diff --git a/packages/react-native/sdks/.hermesv1version b/packages/react-native/sdks/.hermesv1version index 73dfc36fa92b..a81c95a633b7 100644 --- a/packages/react-native/sdks/.hermesv1version +++ b/packages/react-native/sdks/.hermesv1version @@ -1 +1 @@ -hermes-v260318099.0.1 \ No newline at end of file +hermes-v260318099.0.2 \ No newline at end of file diff --git a/packages/react-native/sdks/hermes-engine/version.properties b/packages/react-native/sdks/hermes-engine/version.properties index 7cf17e014c28..0d44251f4c11 100644 --- a/packages/react-native/sdks/hermes-engine/version.properties +++ b/packages/react-native/sdks/hermes-engine/version.properties @@ -1 +1 @@ -HERMES_VERSION_NAME=260318099.0.1 +HERMES_VERSION_NAME=260318099.0.2 diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 8d938d94b0e1..6d71e32e2842 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -18,5 +18,9 @@ "exports": { ".": "./tsconfig.json" }, - "files": ["README.md", "tsconfig.json", "tsconfig.strict.json"] + "files": [ + "README.md", + "tsconfig.json", + "tsconfig.strict.json" + ] } From f065722abe7851175eeafebedc7b55d9dee78c7d Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Tue, 8 Sep 2026 13:53:53 +0000 Subject: [PATCH 03/35] Release 0.88.0-rc.0 #publish-packages-to-npm&next --- gradle.properties | 4 ++-- package.json | 4 ++-- packages/asset-utils/package.json | 2 +- packages/assets-registry/package.json | 2 +- packages/babel-plugin-codegen/package.json | 4 ++-- packages/community-cli-plugin/package.json | 8 ++++---- packages/debugger-frontend/package.json | 2 +- .../debugger-shell/bin/react-native-devtools | 17 ++++++++++++++++- packages/debugger-shell/package.json | 2 +- packages/dev-middleware/package.json | 8 ++++---- .../eslint-config-react-native/package.json | 4 ++-- .../eslint-plugin-react-native/package.json | 2 +- packages/eslint-plugin-specs/package.json | 4 ++-- packages/gradle-plugin/package.json | 2 +- packages/jest-preset/package.json | 4 ++-- packages/metro-config/package.json | 6 +++--- packages/new-app-screen/package.json | 4 ++-- packages/normalize-color/package.json | 2 +- packages/polyfills/package.json | 2 +- packages/react-native-babel-preset/package.json | 4 ++-- .../react-native-babel-transformer/package.json | 4 ++-- packages/react-native-codegen/package.json | 2 +- .../package.json | 4 ++-- .../package.json | 6 +++--- .../Libraries/Core/ReactNativeVersion.js | 6 +++--- packages/react-native/React/Base/RCTVersion.m | 6 +++--- .../react-native/ReactAndroid/gradle.properties | 2 +- .../modules/systeminfo/ReactNativeVersion.kt | 13 +++++++++---- .../ReactCommon/cxxreact/ReactNativeVersion.h | 10 +++++----- packages/react-native/package.json | 14 +++++++------- .../generate-artifacts-executor-test.js.snap | 10 +++++----- packages/rn-tester/package.json | 8 ++++---- packages/typescript-config/package.json | 2 +- packages/virtualized-lists/package.json | 4 ++-- private/helloworld/package.json | 12 ++++++------ .../package.json | 2 +- 36 files changed, 106 insertions(+), 86 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1028b5c5238e..0d5b4a717b54 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 # Controls whether to use Hermes from stable builds. This will force hermes version # set in the sdks/hermes-engine/version.properties file to be used. This has a higher # priority than react.internal.useHermesNightly. -react.internal.useHermesStable=false +react.internal.useHermesStable=true # Controls whether to use Hermes from nightly builds. This will speed up builds # but should NOT be turned on for CI or release builds. -react.internal.useHermesNightly=true +react.internal.useHermesNightly=false diff --git a/package.json b/package.json index 58a0de89937a..d24b3ad66076 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,8 @@ "@jest/create-cache-key-function": "^29.7.0", "@microsoft/api-extractor": "^7.52.2", "@octokit/rest": "^22.0.0", - "@react-native/metro-babel-transformer": "0.87.0-main", - "@react-native/metro-config": "0.87.0-main", + "@react-native/metro-babel-transformer": "0.88.0-rc.0", + "@react-native/metro-config": "0.88.0-rc.0", "@tsconfig/node22": "22.0.2", "@types/react": "^19.1.0", "@typescript-eslint/parser": "^8.59.2", diff --git a/packages/asset-utils/package.json b/packages/asset-utils/package.json index bec6ea4d6931..b73e1d33b436 100644 --- a/packages/asset-utils/package.json +++ b/packages/asset-utils/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/asset-utils", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Asset path utilities for React Native.", "license": "MIT", "repository": { diff --git a/packages/assets-registry/package.json b/packages/assets-registry/package.json index 645604cc9846..d7606485dd13 100644 --- a/packages/assets-registry/package.json +++ b/packages/assets-registry/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index d58d065315b8..a9f63b221f3d 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-plugin-codegen", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ ], "dependencies": { "@babel/traverse": "^7.29.0", - "@react-native/codegen": "0.87.0-main" + "@react-native/codegen": "0.88.0-rc.0" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index c780f698a964..8afc7ad3f473 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/community-cli-plugin", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -31,8 +31,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/asset-utils": "0.87.0-main", - "@react-native/dev-middleware": "0.87.0-main", + "@react-native/asset-utils": "0.88.0-rc.0", + "@react-native/dev-middleware": "0.88.0-rc.0", "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -44,7 +44,7 @@ }, "peerDependencies": { "@react-native-community/cli": "*", - "@react-native/metro-config": "0.87.0-main" + "@react-native/metro-config": "0.88.0-rc.0" }, "peerDependenciesMeta": { "@react-native-community/cli": { diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index e5860ab107d9..b211ee258030 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/debugger-frontend", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Debugger frontend for React Native based on Chrome DevTools", "keywords": [ "react-native", diff --git a/packages/debugger-shell/bin/react-native-devtools b/packages/debugger-shell/bin/react-native-devtools index 3c6f6a90b9fd..11c1cc3fa415 100755 --- a/packages/debugger-shell/bin/react-native-devtools +++ b/packages/debugger-shell/bin/react-native-devtools @@ -1,6 +1,6 @@ #!/usr/bin/env dotslash -// @generated SignedSource<<01dcf5246a0b3f95d617d1d52bc1998e>> +// @generated SignedSource<<50b06304b2f8b753aedc77961d123abc>> { @@ -11,6 +11,9 @@ "hash": "sha256", "digest": "020eea3cf10f77b8f4e1ae4a2aaa7d78a77c3802de6b00448866aa9c860509c4", "providers": [ + { + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-linux-aarch64.tar.gz" + }, { "type": "http", "url": "https://scontent.xx.fbcdn.net/mci_ab/uap/?ab_b=m&ab_page=react_native_devtools_binaries&ab_entry=AQPgk_PO-qLmLS1ZUyNtm9PZa0Z6XoCXar8Mo-ZDooUwm7-0tv-ga6cl1eB-9o0pVmKxH0-9xTS4NmFyyF1Qwn_x4J0olUnVH8AEHASw1VlnpkN5EPuTII29SmB_1Gis6_twDOo8CwWXFsa2p4XxRceIj-_IINp-fqrGuekCH-Kwd7BqsDsnBykigqY" @@ -24,6 +27,9 @@ "hash": "sha256", "digest": "933aa98eb68da7f8d1b6e83e611e51f66d026f3b410dc13577faa6adf1b0f75c", "providers": [ + { + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-linux-x86_64.tar.gz" + }, { "type": "http", "url": "https://scontent.xx.fbcdn.net/mci_ab/uap/?ab_b=m&ab_page=react_native_devtools_binaries&ab_entry=AQM0YWmFH-pEdvrIlqLqZfCcRl1DxhzvJDOHJnFrBIVxrxjq6LqnqU9fwc7qXsS3JHcg7miVifXIM4cZTAsjVeusaVbQTYj2SevDy-9ajAnzjZj92m_WAwfmcp9gb7s9axqohmC1E_LCiC1BTdV-KEIyEcJWvZNJpFu3f44f8vpctlucJgm79I5n" @@ -37,6 +43,9 @@ "hash": "sha256", "digest": "4a1c234b1cf27f1ff006fafce6628b8ef6993d7d3298c6ed2127e3055c93dcc6", "providers": [ + { + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-macos-aarch64.tar.gz" + }, { "type": "http", "url": "https://scontent.xx.fbcdn.net/mci_ab/uap/?ab_b=m&ab_page=react_native_devtools_binaries&ab_entry=AQNRWwxQIl4mkFPfIFJaGmmhuPTZXHz3uDISd0w_ptFazAGOLvONiln4ntQBt2iaBaNomMlXRuqAkdCXjHMu2lDarvjjZUfgtFpt8NEeEgILgWxbdB1j2rSiJrFZQoRb-VC0gGq3ALskrTQrLof9QJ_MSz_by779saXHEa_Wcd6-rk-D3PZyY6iwXYvy" @@ -50,6 +59,9 @@ "hash": "sha256", "digest": "9f1de3cb78688befaea4d9e5f640a66833dd44ad58b05590a7e07bce279bf532", "providers": [ + { + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-macos-x86_64.tar.gz" + }, { "type": "http", "url": "https://scontent.xx.fbcdn.net/mci_ab/uap/?ab_b=m&ab_page=react_native_devtools_binaries&ab_entry=AQMTN_mkHiVIEbUrA3teX7PDWCRTwVW9ffBc9X2rMjQOkZCzShBebMG1Zchl39m1P09Wxm0E_3r_Vg-ahgNsUzd1UzNiGmJ-4-T_xU_sEegXkheLn5Vi1_y5e0KVBQs0caeP5jUaUqn1JqrRRxwqwEPhV4YE8MCutcd3VXwluA4yI3ReI36c4BtgLg" @@ -63,6 +75,9 @@ "hash": "sha256", "digest": "5b56e22828549f12be49f0431fd74c54dcebfbfb4277e4b87573ec1ab084c288", "providers": [ + { + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-windows-x86_64.tar.gz" + }, { "type": "http", "url": "https://scontent.xx.fbcdn.net/mci_ab/uap/?ab_b=m&ab_page=react_native_devtools_binaries&ab_entry=AQNoewIvekFkYIhisR8u_iD720Mh6OCyo-JLIwW3AE0RZlWKUVtiMpi95a4kEX2mUSkVwcImnvEgpiKH7Oxz0ZlTGwxXyoUN4QrDQtfF5V4ng2rbBvdovpfev0qdxA3WGF9qcWmgE2qA5vfiHQ_dhOpogBxu3ZYaUkrQ3oZS3MrT9NU7HmRDWPpu" diff --git a/packages/debugger-shell/package.json b/packages/debugger-shell/package.json index 23a04ba7f99a..3ddf5f6994da 100644 --- a/packages/debugger-shell/package.json +++ b/packages/debugger-shell/package.json @@ -1,7 +1,7 @@ { "name": "@react-native/debugger-shell", "productName": "React Native DevTools", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Experimental debugger shell for React Native for use with @react-native/debugger-frontend", "keywords": [ "react-native", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index 814097db9e2c..70e790fcf0b5 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/dev-middleware", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Dev server middleware for React Native", "keywords": [ "react-native", @@ -32,8 +32,8 @@ }, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.87.0-main", - "@react-native/debugger-shell": "0.87.0-main", + "@react-native/debugger-frontend": "0.88.0-rc.0", + "@react-native/debugger-shell": "0.88.0-rc.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -43,7 +43,7 @@ "ws": "^7.5.10" }, "devDependencies": { - "@react-native/debugger-shell": "0.87.0-main", + "@react-native/debugger-shell": "0.88.0-rc.0", "selfsigned": "^5.5.0", "undici": "^6.23.0", "wait-for-expect": "^3.0.2" diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 28740855fad0..80a1b711f43e 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-config", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "ESLint config for React Native", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", - "@react-native/eslint-plugin": "0.87.0-main", + "@react-native/eslint-plugin": "0.88.0-rc.0", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", "eslint-config-prettier": "^8.5.0", diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index 30699b45b20c..174b32eb01cd 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "ESLint rules for @react-native/eslint-config", "license": "MIT", "repository": { diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index 9536701e628e..535409eaeec8 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin-specs", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "ESLint rules to validate NativeModule and Component Specs", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@react-native/codegen": "0.87.0-main", + "@react-native/codegen": "0.88.0-rc.0", "make-dir": "^2.1.0", "pirates": "^4.0.1", "flow-parser": "0.327.0", diff --git a/packages/gradle-plugin/package.json b/packages/gradle-plugin/package.json index 356a94383e90..57199430d0aa 100644 --- a/packages/gradle-plugin/package.json +++ b/packages/gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/gradle-plugin", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Gradle Plugin for React Native", "license": "MIT", "repository": { diff --git a/packages/jest-preset/package.json b/packages/jest-preset/package.json index bc3f36a83450..83d7eeb0d6ab 100644 --- a/packages/jest-preset/package.json +++ b/packages/jest-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/jest-preset", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Jest preset for React Native apps", "keywords": [ "jest", @@ -29,7 +29,7 @@ ], "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.87.0-main", + "@react-native/js-polyfills": "0.88.0-rc.0", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index b8703bd178db..3ec7506d609e 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-config", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Metro configuration for React Native.", "license": "MIT", "repository": { @@ -35,8 +35,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/js-polyfills": "0.87.0-main", - "@react-native/metro-babel-transformer": "0.87.0-main", + "@react-native/js-polyfills": "0.88.0-rc.0", + "@react-native/metro-babel-transformer": "0.88.0-rc.0", "metro-config": "^0.87.0", "metro-runtime": "^0.87.0" } diff --git a/packages/new-app-screen/package.json b/packages/new-app-screen/package.json index 4ebbf4c995c9..c81340ff4fd1 100644 --- a/packages/new-app-screen/package.json +++ b/packages/new-app-screen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/new-app-screen", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "NewAppScreen component for React Native", "keywords": [ "react-native" @@ -22,7 +22,7 @@ "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "1000.0.0" + "react-native": "0.88.0-rc.0" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index 028fdce725c4..a352562b24d0 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/normalize-colors", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Color normalization for React Native.", "license": "MIT", "repository": { diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index 7ede0f183981..2abd908b6e81 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/js-polyfills", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Polyfills for React Native.", "license": "MIT", "repository": { diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 98c09a57f234..75d3c5af9d3b 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-preset", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Babel preset for React Native applications", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@react-native/babel-plugin-codegen": "0.87.0-main", + "@react-native/babel-plugin-codegen": "0.88.0-rc.0", "flow-parser": "0.327.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index e061ad661702..40a7c46529b0 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-babel-transformer", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Babel transformer for React Native applications.", "repository": { "type": "git", @@ -27,7 +27,7 @@ ], "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.87.0-main", + "@react-native/babel-preset": "0.88.0-rc.0", "flow-parser": "0.327.0", "nullthrows": "^1.1.1" }, diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index 7429b718c2f4..20b0f1a9da83 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/codegen", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Code generation tools for React Native", "license": "MIT", "repository": { diff --git a/packages/react-native-compatibility-check/package.json b/packages/react-native-compatibility-check/package.json index 174f09aef012..3f120e140866 100644 --- a/packages/react-native-compatibility-check/package.json +++ b/packages/react-native-compatibility-check/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/compatibility-check", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Check a React Native app's boundary between JS and Native for incompatibilities", "license": "MIT", "repository": { @@ -38,7 +38,7 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/codegen": "0.87.0-main" + "@react-native/codegen": "0.88.0-rc.0" }, "devDependencies": { "flow-remove-types": "^2.237.2", diff --git a/packages/react-native-popup-menu-android/package.json b/packages/react-native-popup-menu-android/package.json index 9962d4d115f3..e0fd71e056c7 100644 --- a/packages/react-native-popup-menu-android/package.json +++ b/packages/react-native-popup-menu-android/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/popup-menu-android", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "PopupMenu for the Android platform", "repository": { "type": "git", @@ -26,12 +26,12 @@ }, "license": "MIT", "devDependencies": { - "@react-native/codegen": "0.87.0-main" + "@react-native/codegen": "0.88.0-rc.0" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "1000.0.0" + "react-native": "0.88.0-rc.0" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/react-native/Libraries/Core/ReactNativeVersion.js b/packages/react-native/Libraries/Core/ReactNativeVersion.js index 1ff12f563e62..11fa97500475 100644 --- a/packages/react-native/Libraries/Core/ReactNativeVersion.js +++ b/packages/react-native/Libraries/Core/ReactNativeVersion.js @@ -26,10 +26,10 @@ * ``` */ export default class ReactNativeVersion { - static major: number = 1000; - static minor: number = 0; + static major: number = 0; + static minor: number = 88; static patch: number = 0; - static prerelease: string | null = null; + static prerelease: string | null = 'rc.0'; static getVersionString(): string { return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`; diff --git a/packages/react-native/React/Base/RCTVersion.m b/packages/react-native/React/Base/RCTVersion.m index 69ce4f75320e..7c020c998a8a 100644 --- a/packages/react-native/React/Base/RCTVersion.m +++ b/packages/react-native/React/Base/RCTVersion.m @@ -21,10 +21,10 @@ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^(void){ __rnVersion = @{ - RCTVersionMajor: @(1000), - RCTVersionMinor: @(0), + RCTVersionMajor: @(0), + RCTVersionMinor: @(88), RCTVersionPatch: @(0), - RCTVersionPrerelease: [NSNull null], + RCTVersionPrerelease: @"rc.0", }; }); return __rnVersion; diff --git a/packages/react-native/ReactAndroid/gradle.properties b/packages/react-native/ReactAndroid/gradle.properties index 71b1bf4cf759..6b499e1f14e1 100644 --- a/packages/react-native/ReactAndroid/gradle.properties +++ b/packages/react-native/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=1000.0.0 +VERSION_NAME=0.88.0-rc.0 react.internal.publishingGroup=com.facebook.react react.internal.hermesPublishingGroup=com.facebook.hermes diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt index 889fa4d728c4..7c4881deaefb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt @@ -1,15 +1,20 @@ /** * Copyright (c) Meta Platforms, Inc. and affiliates. * - * This source code is licensed under the MIT license found in the LICENSE file in the root - * directory of this source tree. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. * * @generated by scripts/releases/set-version.js */ + package com.facebook.react.modules.systeminfo public object ReactNativeVersion { @JvmField - public val VERSION: Map = - mapOf("major" to 1000, "minor" to 0, "patch" to 0, "prerelease" to null) + public val VERSION: Map = mapOf( + "major" to 0, + "minor" to 88, + "patch" to 0, + "prerelease" to "rc.0" + ) } diff --git a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h index 25468f63f050..4c3257f9661a 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h @@ -12,17 +12,17 @@ #include #include -#define REACT_NATIVE_VERSION_MAJOR 1000 -#define REACT_NATIVE_VERSION_MINOR 0 +#define REACT_NATIVE_VERSION_MAJOR 0 +#define REACT_NATIVE_VERSION_MINOR 88 #define REACT_NATIVE_VERSION_PATCH 0 namespace facebook::react { struct ReactNativeVersionType { - int32_t Major = 1000; - int32_t Minor = 0; + int32_t Major = 0; + int32_t Minor = 88; int32_t Patch = 0; - std::string_view Prerelease = ""; + std::string_view Prerelease = "rc.0"; }; constexpr ReactNativeVersionType ReactNativeVersion; diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 2e3158192cf2..161dd02d4172 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "1000.0.0", + "version": "0.88.0-rc.0", "description": "A framework for building native apps using React", "license": "MIT", "repository": { @@ -151,12 +151,12 @@ } }, "dependencies": { - "@react-native/asset-utils": "0.87.0-main", - "@react-native/codegen": "0.87.0-main", - "@react-native/community-cli-plugin": "0.87.0-main", - "@react-native/gradle-plugin": "0.87.0-main", - "@react-native/normalize-colors": "0.87.0-main", - "@react-native/virtualized-lists": "0.87.0-main", + "@react-native/asset-utils": "0.88.0-rc.0", + "@react-native/codegen": "0.88.0-rc.0", + "@react-native/community-cli-plugin": "0.88.0-rc.0", + "@react-native/gradle-plugin": "0.88.0-rc.0", + "@react-native/normalize-colors": "0.88.0-rc.0", + "@react-native/virtualized-lists": "0.88.0-rc.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "flow-parser": "0.327.0", diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index 9ce1c901040e..51cd012e9b91 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -79,7 +79,7 @@ exports[`execute test-app "ReactAppDependencyProvider/ReactAppDependencyProvider # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"1000.0.0\\" +version = \\"0.88.0-rc.0\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -399,7 +399,7 @@ exports[`execute test-app "ReactCodegen/ReactCodegen.podspec" should match snaps # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"1000.0.0\\" +version = \\"0.88.0-rc.0\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -590,7 +590,7 @@ exports[`execute test-app-legacy "ReactAppDependencyProvider/ReactAppDependencyP # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"1000.0.0\\" +version = \\"0.88.0-rc.0\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -882,7 +882,7 @@ exports[`execute test-app-legacy "ReactCodegen/ReactCodegen.podspec" should matc # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"1000.0.0\\" +version = \\"0.88.0-rc.0\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -992,4 +992,4 @@ SCRIPT end " -`; +`; \ No newline at end of file diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index 16c3e22529f5..569ceaffe327 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/tester", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "private": true, "description": "React Native tester app.", "license": "MIT", @@ -26,8 +26,8 @@ "e2e-test-ios": "./scripts/maestro-test-ios.sh" }, "dependencies": { - "@react-native/new-app-screen": "0.87.0-main", - "@react-native/popup-menu-android": "0.87.0-main", + "@react-native/new-app-screen": "0.88.0-rc.0", + "@react-native/popup-menu-android": "0.88.0-rc.0", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", @@ -36,7 +36,7 @@ }, "peerDependencies": { "react": "19.2.3", - "react-native": "1000.0.0" + "react-native": "0.88.0-rc.0" }, "codegenConfig": { "name": "AppSpecs", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 6d71e32e2842..182bf4c23ddf 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/typescript-config", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Default TypeScript configuration for React Native apps", "license": "MIT", "repository": { diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index b08b6df9dec6..2db2390c32a2 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/virtualized-lists", - "version": "0.87.0-main", + "version": "0.88.0-rc.0", "description": "Virtualized lists for React Native.", "license": "MIT", "repository": { @@ -53,7 +53,7 @@ "peerDependencies": { "@types/react": "^19.2.0", "react": "*", - "react-native": "1000.0.0" + "react-native": "0.88.0-rc.0" }, "peerDependenciesMeta": { "@types/react": { diff --git a/private/helloworld/package.json b/private/helloworld/package.json index d75b1f9e56ae..b9e7845c2145 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -13,18 +13,18 @@ }, "dependencies": { "react": "19.2.3", - "react-native": "1000.0.0" + "react-native": "0.88.0-rc.0" }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", - "@react-native/babel-preset": "0.87.0-main", + "@react-native/babel-preset": "0.88.0-rc.0", "@react-native/core-cli-utils": "*", - "@react-native/eslint-config": "0.87.0-main", - "@react-native/jest-preset": "0.87.0-main", - "@react-native/metro-config": "0.87.0-main", - "@react-native/typescript-config": "0.87.0-main", + "@react-native/eslint-config": "0.88.0-rc.0", + "@react-native/jest-preset": "0.88.0-rc.0", + "@react-native/metro-config": "0.88.0-rc.0", + "@react-native/typescript-config": "0.88.0-rc.0", "@types/jest": "^29.5.14", "commander": "^12.0.0", "eslint": "^8.19.0", diff --git a/private/react-native-codegen-typescript-test/package.json b/private/react-native-codegen-typescript-test/package.json index 6c6722626766..efe726a7224a 100644 --- a/private/react-native-codegen-typescript-test/package.json +++ b/private/react-native-codegen-typescript-test/package.json @@ -13,7 +13,7 @@ "prepare": "yarn run build" }, "dependencies": { - "@react-native/codegen": "0.87.0-main" + "@react-native/codegen": "0.88.0-rc.0" }, "devDependencies": { "@babel/core": "^7.25.2", From ab7dde8242abc4a7c736529e0db379db71439791 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Tue, 8 Sep 2026 15:46:26 +0000 Subject: [PATCH 04/35] [LOCAL] Bump Podfile.lock --- packages/rn-tester/Podfile.lock | 856 ++++++++++++++++++++------------ 1 file changed, 526 insertions(+), 330 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index 030d0acba633..b0a7d43b0726 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -2,13 +2,13 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - fast_float (8.0.0) - - FBLazyVector (1000.0.0) + - FBLazyVector (0.88.0-rc.0) - fmt (12.1.0) - glog (0.3.5) - - hermes-engine (260318099.0.1): - - hermes-engine/Pre-built (= 260318099.0.1) - - hermes-engine/Pre-built (260318099.0.1) - - MyNativeView (0.87.0-main): + - hermes-engine (260318099.0.2): + - hermes-engine/Pre-built (= 260318099.0.2) + - hermes-engine/Pre-built (260318099.0.2) + - MyNativeView (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -21,6 +21,7 @@ PODS: - RCTTypeSafety - React-bridging - React-Core + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -36,7 +37,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - NativeCxxModuleExample (0.87.0-main): + - NativeCxxModuleExample (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -49,6 +50,7 @@ PODS: - RCTTypeSafety - React-bridging - React-Core + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -84,29 +86,29 @@ PODS: - fast_float (= 8.0.0) - fmt (= 12.1.0) - glog - - RCTDeprecation (1000.0.0) - - RCTRequired (1000.0.0) - - RCTSwiftUI (1000.0.0) - - RCTSwiftUIWrapper (1000.0.0): + - RCTDeprecation (0.88.0-rc.0) + - RCTRequired (0.88.0-rc.0) + - RCTSwiftUI (0.88.0-rc.0) + - RCTSwiftUIWrapper (0.88.0-rc.0): - RCTSwiftUI - - RCTTypeSafety (1000.0.0): - - FBLazyVector (= 1000.0.0) - - RCTRequired (= 1000.0.0) - - React-Core (= 1000.0.0) - - React (1000.0.0): - - React-Core (= 1000.0.0) - - React-Core/DevSupport (= 1000.0.0) - - React-Core/RCTWebSocket (= 1000.0.0) - - React-RCTActionSheet (= 1000.0.0) - - React-RCTAnimation (= 1000.0.0) - - React-RCTBlob (= 1000.0.0) - - React-RCTImage (= 1000.0.0) - - React-RCTLinking (= 1000.0.0) - - React-RCTNetwork (= 1000.0.0) - - React-RCTSettings (= 1000.0.0) - - React-RCTText (= 1000.0.0) - - React-RCTVibration (= 1000.0.0) - - React-bridging (1000.0.0): + - RCTTypeSafety (0.88.0-rc.0): + - FBLazyVector (= 0.88.0-rc.0) + - RCTRequired (= 0.88.0-rc.0) + - React-Core (= 0.88.0-rc.0) + - React (0.88.0-rc.0): + - React-Core (= 0.88.0-rc.0) + - React-Core/DevSupport (= 0.88.0-rc.0) + - React-Core/RCTWebSocket (= 0.88.0-rc.0) + - React-RCTActionSheet (= 0.88.0-rc.0) + - React-RCTAnimation (= 0.88.0-rc.0) + - React-RCTBlob (= 0.88.0-rc.0) + - React-RCTImage (= 0.88.0-rc.0) + - React-RCTLinking (= 0.88.0-rc.0) + - React-RCTNetwork (= 0.88.0-rc.0) + - React-RCTSettings (= 0.88.0-rc.0) + - React-RCTText (= 0.88.0-rc.0) + - React-RCTVibration (= 0.88.0-rc.0) + - React-bridging (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -118,8 +120,12 @@ PODS: - React-jsi - React-timing - SocketRocket - - React-callinvoker (1000.0.0) - - React-Core (1000.0.0): + - React-callinvoker (0.88.0-rc.0): + - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.0) + - React-cxxstableapi + - React-callinvoker/callinvokerUmbrella (0.88.0-rc.0): + - React-cxxstableapi + - React-Core (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -129,7 +135,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 1000.0.0) + - React-Core/Default (= 0.88.0-rc.0) - React-cxxreact - React-featureflags - React-hermes @@ -144,7 +150,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (1000.0.0): + - React-Core/CoreModulesHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -169,7 +175,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (1000.0.0): + - React-Core/Default (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -193,7 +199,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (1000.0.0): + - React-Core/DevSupport (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -203,8 +209,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 1000.0.0) - - React-Core/RCTWebSocket (= 1000.0.0) + - React-Core/Default (= 0.88.0-rc.0) + - React-Core/RCTWebSocket (= 0.88.0-rc.0) - React-cxxreact - React-featureflags - React-hermes @@ -219,7 +225,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (1000.0.0): + - React-Core/RCTActionSheetHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -244,7 +250,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (1000.0.0): + - React-Core/RCTAnimationHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -269,7 +275,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (1000.0.0): + - React-Core/RCTBlobHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -294,7 +300,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (1000.0.0): + - React-Core/RCTImageHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -319,7 +325,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (1000.0.0): + - React-Core/RCTLinkingHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -344,7 +350,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (1000.0.0): + - React-Core/RCTNetworkHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -369,7 +375,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTPushNotificationHeaders (1000.0.0): + - React-Core/RCTPushNotificationHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -394,7 +400,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (1000.0.0): + - React-Core/RCTSettingsHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -419,7 +425,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (1000.0.0): + - React-Core/RCTTextHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -444,7 +450,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (1000.0.0): + - React-Core/RCTVibrationHeaders (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -469,7 +475,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (1000.0.0): + - React-Core/RCTWebSocket (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -479,7 +485,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 1000.0.0) + - React-Core/Default (= 0.88.0-rc.0) - React-cxxreact - React-featureflags - React-hermes @@ -494,7 +500,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (1000.0.0): + - React-CoreModules (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -502,11 +508,11 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 1000.0.0) - - React-Core/CoreModulesHeaders (= 1000.0.0) + - RCTTypeSafety (= 0.88.0-rc.0) + - React-Core/CoreModulesHeaders (= 0.88.0-rc.0) - React-debug - React-featureflags - - React-jsi (= 1000.0.0) + - React-jsi (= 0.88.0-rc.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing @@ -514,12 +520,12 @@ PODS: - React-networking - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 1000.0.0) + - React-RCTImage (= 0.88.0-rc.0) - React-runtimeexecutor - React-utils - ReactCommon - SocketRocket - - React-cxxreact (1000.0.0): + - React-cxxreact (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -528,24 +534,29 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 1000.0.0) - - React-debug (= 1000.0.0) - - React-jserrorhandler (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-callinvoker (= 0.88.0-rc.0) + - React-debug (= 0.88.0-rc.0) + - React-jserrorhandler (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 1000.0.0) - - React-perflogger (= 1000.0.0) + - React-logger (= 0.88.0-rc.0) + - React-perflogger (= 0.88.0-rc.0) - React-runtimeexecutor - - React-timing (= 1000.0.0) + - React-timing (= 0.88.0-rc.0) - React-utils - SocketRocket - - React-cxxstableapi (1000.0.0) - - React-debug (1000.0.0): - - React-debug/redbox (= 1000.0.0) - - React-debug/redbox (1000.0.0) - - React-defaultsnativemodule (1000.0.0): + - React-cxxstableapi (0.88.0-rc.0) + - React-debug (0.88.0-rc.0): + - React-cxxstableapi + - React-debug/debugUmbrella (= 0.88.0-rc.0) + - React-debug/redbox (= 0.88.0-rc.0) + - React-debug/debugUmbrella (0.88.0-rc.0): + - React-cxxstableapi + - React-debug/redbox (0.88.0-rc.0): + - React-cxxstableapi + - React-defaultsnativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -554,6 +565,7 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-domnativemodule - React-Fabric/animated - React-featureflags @@ -565,11 +577,12 @@ PODS: - React-microtasksnativemodule - React-mutationobservernativemodule - React-RCTFBReactNativeSpec + - React-resizeobservernativemodule - React-viewtransitionnativemodule - React-webperformancenativemodule - SocketRocket - Yoga - - React-domnativemodule (1000.0.0): + - React-domnativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -579,6 +592,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging + - React-cxxstableapi - React-Fabric - React-Fabric/bridging - React-FabricComponents @@ -590,7 +604,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (1000.0.0): + - React-Fabric (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -604,26 +618,27 @@ PODS: - React-bridging - React-Core - React-cxxreact - - React-debug - - React-Fabric/animated (= 1000.0.0) - - React-Fabric/animationbackend (= 1000.0.0) - - React-Fabric/animations (= 1000.0.0) - - React-Fabric/attributedstring (= 1000.0.0) - - React-Fabric/bridging (= 1000.0.0) - - React-Fabric/componentregistry (= 1000.0.0) - - React-Fabric/componentregistrynative (= 1000.0.0) - - React-Fabric/components (= 1000.0.0) - - React-Fabric/consistency (= 1000.0.0) - - React-Fabric/core (= 1000.0.0) - - React-Fabric/dom (= 1000.0.0) - - React-Fabric/imagemanager (= 1000.0.0) - - React-Fabric/leakchecker (= 1000.0.0) - - React-Fabric/mounting (= 1000.0.0) - - React-Fabric/observers (= 1000.0.0) - - React-Fabric/scheduler (= 1000.0.0) - - React-Fabric/telemetry (= 1000.0.0) - - React-Fabric/uimanager (= 1000.0.0) - - React-Fabric/viewtransition (= 1000.0.0) + - React-cxxstableapi + - React-debug + - React-Fabric/animated (= 0.88.0-rc.0) + - React-Fabric/animationbackend (= 0.88.0-rc.0) + - React-Fabric/animations (= 0.88.0-rc.0) + - React-Fabric/attributedstring (= 0.88.0-rc.0) + - React-Fabric/bridging (= 0.88.0-rc.0) + - React-Fabric/componentregistry (= 0.88.0-rc.0) + - React-Fabric/componentregistrynative (= 0.88.0-rc.0) + - React-Fabric/components (= 0.88.0-rc.0) + - React-Fabric/consistency (= 0.88.0-rc.0) + - React-Fabric/core (= 0.88.0-rc.0) + - React-Fabric/dom (= 0.88.0-rc.0) + - React-Fabric/imagemanager (= 0.88.0-rc.0) + - React-Fabric/leakchecker (= 0.88.0-rc.0) + - React-Fabric/mounting (= 0.88.0-rc.0) + - React-Fabric/observers (= 0.88.0-rc.0) + - React-Fabric/scheduler (= 0.88.0-rc.0) + - React-Fabric/telemetry (= 0.88.0-rc.0) + - React-Fabric/uimanager (= 0.88.0-rc.0) + - React-Fabric/viewtransition (= 0.88.0-rc.0) - React-featureflags - React-graphics - React-jsi @@ -635,7 +650,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animated (1000.0.0): + - React-Fabric/animated (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -649,6 +664,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric/animationbackend - React-featureflags @@ -662,7 +678,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animationbackend (1000.0.0): + - React-Fabric/animationbackend (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -676,6 +692,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -688,7 +705,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (1000.0.0): + - React-Fabric/animations (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -702,6 +719,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -714,7 +732,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (1000.0.0): + - React-Fabric/attributedstring (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -728,6 +746,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -740,7 +759,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/bridging (1000.0.0): + - React-Fabric/bridging (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -754,6 +773,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -766,7 +786,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (1000.0.0): + - React-Fabric/componentregistry (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -780,6 +800,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -792,7 +813,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (1000.0.0): + - React-Fabric/componentregistrynative (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -806,6 +827,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -818,7 +840,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (1000.0.0): + - React-Fabric/components (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -832,11 +854,13 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 1000.0.0) - - React-Fabric/components/root (= 1000.0.0) - - React-Fabric/components/scrollview (= 1000.0.0) - - React-Fabric/components/view (= 1000.0.0) + - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.0) + - React-Fabric/components/root (= 0.88.0-rc.0) + - React-Fabric/components/scrollview (= 0.88.0-rc.0) + - React-Fabric/components/view (= 0.88.0-rc.0) + - React-Fabric/components/viewUmbrella (= 0.88.0-rc.0) - React-featureflags - React-graphics - React-jsi @@ -848,7 +872,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (1000.0.0): + - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -862,6 +886,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -874,7 +899,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (1000.0.0): + - React-Fabric/components/root (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -888,6 +913,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -900,7 +926,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (1000.0.0): + - React-Fabric/components/scrollview (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -914,6 +940,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -926,7 +953,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (1000.0.0): + - React-Fabric/components/view (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -940,6 +967,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -954,7 +982,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/consistency (1000.0.0): + - React-Fabric/components/viewUmbrella (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -968,6 +996,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -980,7 +1009,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (1000.0.0): + - React-Fabric/consistency (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -994,6 +1023,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1006,7 +1036,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (1000.0.0): + - React-Fabric/core (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1020,6 +1050,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1032,7 +1063,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (1000.0.0): + - React-Fabric/dom (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1046,6 +1077,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1058,7 +1090,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (1000.0.0): + - React-Fabric/imagemanager (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1072,6 +1104,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1084,7 +1117,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (1000.0.0): + - React-Fabric/leakchecker (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1098,6 +1131,34 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/mounting (0.88.0-rc.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1111,7 +1172,38 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (1000.0.0): + - React-Fabric/observers (0.88.0-rc.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-bridging + - React-Core + - React-cxxreact + - React-cxxstableapi + - React-debug + - React-Fabric/observers/events (= 0.88.0-rc.0) + - React-Fabric/observers/intersection (= 0.88.0-rc.0) + - React-Fabric/observers/mutation (= 0.88.0-rc.0) + - React-Fabric/observers/resize (= 0.88.0-rc.0) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/events (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1125,10 +1217,8 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/observers/events (= 1000.0.0) - - React-Fabric/observers/intersection (= 1000.0.0) - - React-Fabric/observers/mutation (= 1000.0.0) - React-featureflags - React-graphics - React-jsi @@ -1140,7 +1230,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (1000.0.0): + - React-Fabric/observers/intersection (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1154,6 +1244,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1166,7 +1257,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/intersection (1000.0.0): + - React-Fabric/observers/mutation (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1180,6 +1271,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1192,7 +1284,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/mutation (1000.0.0): + - React-Fabric/observers/resize (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1206,6 +1298,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1218,7 +1311,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (1000.0.0): + - React-Fabric/scheduler (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1232,6 +1325,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric/animationbackend - React-Fabric/observers/events @@ -1249,7 +1343,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (1000.0.0): + - React-Fabric/telemetry (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1263,6 +1357,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1275,7 +1370,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (1000.0.0): + - React-Fabric/uimanager (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1289,8 +1384,9 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - - React-Fabric/uimanager/consistency (= 1000.0.0) + - React-Fabric/uimanager/consistency (= 0.88.0-rc.0) - React-featureflags - React-graphics - React-jsi @@ -1303,7 +1399,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (1000.0.0): + - React-Fabric/uimanager/consistency (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1317,6 +1413,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1330,7 +1427,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/viewtransition (1000.0.0): + - React-Fabric/viewtransition (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1344,6 +1441,7 @@ PODS: - React-bridging - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-graphics @@ -1356,7 +1454,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (1000.0.0): + - React-FabricComponents (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1369,10 +1467,11 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components (= 1000.0.0) - - React-FabricComponents/textlayoutmanager (= 1000.0.0) + - React-FabricComponents/components (= 0.88.0-rc.0) + - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.0) - React-featureflags - React-graphics - React-jsi @@ -1385,7 +1484,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (1000.0.0): + - React-FabricComponents/components (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1398,18 +1497,19 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 1000.0.0) - - React-FabricComponents/components/iostextinput (= 1000.0.0) - - React-FabricComponents/components/modal (= 1000.0.0) - - React-FabricComponents/components/rncore (= 1000.0.0) - - React-FabricComponents/components/safeareaview (= 1000.0.0) - - React-FabricComponents/components/switch (= 1000.0.0) - - React-FabricComponents/components/text (= 1000.0.0) - - React-FabricComponents/components/textinput (= 1000.0.0) - - React-FabricComponents/components/unimplementedview (= 1000.0.0) - - React-FabricComponents/components/virtualview (= 1000.0.0) + - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.0) + - React-FabricComponents/components/iostextinput (= 0.88.0-rc.0) + - React-FabricComponents/components/modal (= 0.88.0-rc.0) + - React-FabricComponents/components/rncore (= 0.88.0-rc.0) + - React-FabricComponents/components/safeareaview (= 0.88.0-rc.0) + - React-FabricComponents/components/switch (= 0.88.0-rc.0) + - React-FabricComponents/components/text (= 0.88.0-rc.0) + - React-FabricComponents/components/textinput (= 0.88.0-rc.0) + - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.0) + - React-FabricComponents/components/virtualview (= 0.88.0-rc.0) - React-featureflags - React-graphics - React-jsi @@ -1422,7 +1522,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (1000.0.0): + - React-FabricComponents/components/inputaccessory (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1435,6 +1535,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1449,7 +1550,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (1000.0.0): + - React-FabricComponents/components/iostextinput (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1462,6 +1563,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1476,7 +1578,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (1000.0.0): + - React-FabricComponents/components/modal (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1489,6 +1591,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1503,7 +1606,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (1000.0.0): + - React-FabricComponents/components/rncore (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1516,6 +1619,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1530,7 +1634,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (1000.0.0): + - React-FabricComponents/components/safeareaview (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1543,6 +1647,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1557,7 +1662,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/switch (1000.0.0): + - React-FabricComponents/components/switch (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1570,6 +1675,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1584,7 +1690,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (1000.0.0): + - React-FabricComponents/components/text (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1597,6 +1703,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1611,7 +1718,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (1000.0.0): + - React-FabricComponents/components/textinput (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1624,6 +1731,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1638,7 +1746,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (1000.0.0): + - React-FabricComponents/components/unimplementedview (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1651,6 +1759,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1665,7 +1774,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (1000.0.0): + - React-FabricComponents/components/virtualview (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1678,6 +1787,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1692,7 +1802,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (1000.0.0): + - React-FabricComponents/textlayoutmanager (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1705,6 +1815,7 @@ PODS: - RCTTypeSafety - React-Core - React-cxxreact + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -1719,7 +1830,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (1000.0.0): + - React-FabricImage (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1728,21 +1839,22 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 1000.0.0) - - RCTTypeSafety (= 1000.0.0) + - RCTRequired (= 0.88.0-rc.0) + - RCTTypeSafety (= 0.88.0-rc.0) + - React-cxxstableapi - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 1000.0.0) + - React-jsiexecutor (= 0.88.0-rc.0) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (1000.0.0): + - React-featureflags (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1750,8 +1862,20 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi + - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.0) - SocketRocket - - React-featureflagsnativemodule (1000.0.0): + - React-featureflags/featureflagsUmbrella (0.88.0-rc.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi + - SocketRocket + - React-featureflagsnativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1760,13 +1884,14 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-featureflags - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (1000.0.0): + - React-graphics (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1781,7 +1906,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-hermes (1000.0.0): + - React-hermes (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1790,18 +1915,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 1000.0.0) + - React-cxxreact (= 0.88.0-rc.0) + - React-cxxstableapi - React-jsi - - React-jsiexecutor (= 1000.0.0) + - React-jsiexecutor (= 0.88.0-rc.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 1000.0.0) + - React-perflogger (= 0.88.0-rc.0) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (1000.0.0): + - React-idlecallbacksnativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1811,6 +1937,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging + - React-cxxstableapi - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec @@ -1818,7 +1945,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (1000.0.0): + - React-ImageManager (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1827,13 +1954,14 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-Core/Default + - React-cxxstableapi - React-debug - React-Fabric - React-graphics - React-rendererdebug - React-utils - SocketRocket - - React-intersectionobservernativemodule (1000.0.0): + - React-intersectionobservernativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1844,6 +1972,7 @@ PODS: - RCT-Folly/Fabric - React-bridging - React-cxxreact + - React-cxxstableapi - React-Fabric - React-Fabric/bridging - React-graphics @@ -1855,7 +1984,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-jserrorhandler (1000.0.0): + - React-jserrorhandler (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1865,11 +1994,12 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging + - React-cxxstableapi - React-debug - React-featureflags - React-jsi - SocketRocket - - React-jsi (1000.0.0): + - React-jsi (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1879,7 +2009,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (1000.0.0): + - React-jsiexecutor (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1889,6 +2019,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxreact + - React-cxxstableapi - React-debug - React-jserrorhandler - React-jsi @@ -1900,7 +2031,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspector (1000.0.0): + - React-jsinspector (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1915,11 +2046,11 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 1000.0.0) + - React-perflogger (= 0.88.0-rc.0) - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspectorcdp (1000.0.0): + - React-jsinspectorcdp (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1927,8 +2058,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - SocketRocket - - React-jsinspectornetwork (1000.0.0): + - React-jsinspectornetwork (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1936,9 +2068,10 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-jsinspectorcdp - SocketRocket - - React-jsinspectortracing (1000.0.0): + - React-jsinspectortracing (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1947,13 +2080,14 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-jsi - React-jsinspectornetwork - React-oscompat - React-timing - React-utils - SocketRocket - - React-jsitooling (1000.0.0): + - React-jsitooling (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1962,18 +2096,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 1000.0.0) + - React-cxxreact (= 0.88.0-rc.0) + - React-cxxstableapi - React-debug - - React-jsi (= 1000.0.0) + - React-jsi (= 0.88.0-rc.0) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - SocketRocket - - React-jsitracing (1000.0.0): + - React-jsitracing (0.88.0-rc.0): - React-jsi - - React-logger (1000.0.0): + - React-logger (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1982,7 +2117,19 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (1000.0.0): + - React-Mapbuffer (0.88.0-rc.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxstableapi + - React-debug + - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.0) + - SocketRocket + - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -1990,9 +2137,10 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-debug - SocketRocket - - React-microtasksnativemodule (1000.0.0): + - React-microtasksnativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2001,12 +2149,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-mutationobservernativemodule (1000.0.0): + - React-mutationobservernativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2017,6 +2166,7 @@ PODS: - RCT-Folly/Fabric - React-bridging - React-cxxreact + - React-cxxstableapi - React-Fabric - React-Fabric/bridging - React-Fabric/observers/mutation @@ -2028,7 +2178,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-NativeModulesApple (1000.0.0): + - React-NativeModulesApple (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2049,7 +2199,7 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - React-networking (1000.0.0): + - React-networking (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2057,13 +2207,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-jsinspectornetwork - React-jsinspectortracing - React-performancetimeline - React-timing - SocketRocket - - React-oscompat (1000.0.0) - - React-perflogger (1000.0.0): + - React-oscompat (0.88.0-rc.0): + - React-cxxstableapi + - React-perflogger (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2072,7 +2224,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancecdpmetrics (1000.0.0): + - React-performancecdpmetrics (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2081,12 +2233,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-jsi - React-performancetimeline - React-runtimeexecutor - React-timing - SocketRocket - - React-performancetimeline (1000.0.0): + - React-performancetimeline (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2094,15 +2247,16 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-featureflags - React-jsinspector - React-jsinspectortracing - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (1000.0.0): - - React-Core/RCTActionSheetHeaders (= 1000.0.0) - - React-RCTAnimatedModuleProvider (1000.0.0): + - React-RCTActionSheet (0.88.0-rc.0): + - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.0) + - React-RCTAnimatedModuleProvider (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2117,7 +2271,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTAnimation (1000.0.0): + - React-RCTAnimation (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2134,7 +2288,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (1000.0.0): + - React-RCTAppDelegate (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2159,6 +2313,7 @@ PODS: - React-RCTFabric - React-RCTFBReactNativeSpec - React-RCTImage + - React-RCTLinking - React-RCTNetwork - React-RCTRuntime - React-rendererdebug @@ -2169,7 +2324,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (1000.0.0): + - React-RCTBlob (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2188,7 +2343,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (1000.0.0): + - React-RCTFabric (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2199,6 +2354,7 @@ PODS: - RCT-Folly/Fabric - RCTSwiftUIWrapper - React-Core + - React-cxxstableapi - React-debug - React-Fabric - React-FabricComponents @@ -2225,7 +2381,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (1000.0.0): + - React-RCTFBReactNativeSpec (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2240,10 +2396,10 @@ PODS: - React-Core - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 1000.0.0) + - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.0) - ReactCommon - SocketRocket - - React-RCTFBReactNativeSpec/components (1000.0.0): + - React-RCTFBReactNativeSpec/components (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2256,6 +2412,7 @@ PODS: - RCTTypeSafety - React-bridging - React-Core + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2267,7 +2424,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTImage (1000.0.0): + - React-RCTImage (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2283,14 +2440,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (1000.0.0): - - React-Core/RCTLinkingHeaders (= 1000.0.0) - - React-jsi (= 1000.0.0) + - React-RCTLinking (0.88.0-rc.0): + - React-Core/RCTLinkingHeaders (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.0) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 1000.0.0) - - React-RCTNetwork (1000.0.0): + - ReactCommon/turbomodule/core (= 0.88.0-rc.0) + - React-RCTNetwork (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2310,14 +2467,14 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTPushNotification (1000.0.0): + - React-RCTPushNotification (0.88.0-rc.0): - RCTTypeSafety - React-Core/RCTPushNotificationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (1000.0.0): + - React-RCTRuntime (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2339,7 +2496,7 @@ PODS: - React-RuntimeHermes - React-utils - SocketRocket - - React-RCTSettings (1000.0.0): + - React-RCTSettings (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2354,7 +2511,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTTest (1000.0.0): + - React-RCTTest (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2362,15 +2519,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-Core (= 1000.0.0) - - React-CoreModules (= 1000.0.0) - - React-jsi (= 1000.0.0) - - ReactCommon/turbomodule/core (= 1000.0.0) + - React-Core (= 0.88.0-rc.0) + - React-CoreModules (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.0) + - ReactCommon/turbomodule/core (= 0.88.0-rc.0) - SocketRocket - - React-RCTText (1000.0.0): - - React-Core/RCTTextHeaders (= 1000.0.0) + - React-RCTText (0.88.0-rc.0): + - React-Core/RCTTextHeaders (= 0.88.0-rc.0) - Yoga - - React-RCTVibration (1000.0.0): + - React-RCTVibration (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2384,11 +2541,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (1000.0.0) - - React-renderercss (1000.0.0): + - React-rendererconsistency (0.88.0-rc.0) + - React-renderercss (0.88.0-rc.0): - React-debug - React-utils - - React-rendererdebug (1000.0.0): + - React-rendererdebug (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2398,7 +2555,31 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-RuntimeApple (1000.0.0): + - React-resizeobservernativemodule (0.88.0-rc.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-bridging + - React-cxxreact + - React-cxxstableapi + - React-Fabric + - React-Fabric/bridging + - React-Fabric/observers/resize + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-RuntimeApple (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2411,6 +2592,7 @@ PODS: - React-Core/Default - React-CoreModules - React-cxxreact + - React-cxxstableapi - React-featureflags - React-jserrorhandler - React-jsi @@ -2427,7 +2609,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (1000.0.0): + - React-RuntimeCore (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2437,6 +2619,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxreact + - React-cxxstableapi - React-Fabric - React-featureflags - React-jserrorhandler @@ -2449,7 +2632,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (1000.0.0): + - React-runtimeexecutor (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2459,10 +2642,10 @@ PODS: - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 1000.0.0) + - React-jsi (= 0.88.0-rc.0) - React-utils - SocketRocket - - React-RuntimeHermes (1000.0.0): + - React-RuntimeHermes (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2471,6 +2654,7 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric + - React-cxxstableapi - React-featureflags - React-hermes - React-jsi @@ -2483,7 +2667,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-runtimescheduler (1000.0.0): + - React-runtimescheduler (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2494,6 +2678,7 @@ PODS: - RCT-Folly/Fabric - React-callinvoker - React-cxxreact + - React-cxxstableapi - React-debug - React-featureflags - React-jserrorhandler @@ -2506,9 +2691,14 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (1000.0.0): + - React-timing (0.88.0-rc.0): + - React-cxxstableapi + - React-debug + - React-timing/timingUmbrella (= 0.88.0-rc.0) + - React-timing/timingUmbrella (0.88.0-rc.0): + - React-cxxstableapi - React-debug - - React-utils (1000.0.0): + - React-utils (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2518,9 +2708,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-debug - - React-jsi (= 1000.0.0) + - React-jsi (= 0.88.0-rc.0) - SocketRocket - - React-viewtransitionnativemodule (1000.0.0): + - React-viewtransitionnativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2538,7 +2728,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-webperformancenativemodule (1000.0.0): + - React-webperformancenativemodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2549,6 +2739,7 @@ PODS: - RCT-Folly/Fabric - React-bridging - React-cxxreact + - React-cxxstableapi - React-jsi - React-jsiexecutor - React-performancetimeline @@ -2556,9 +2747,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - ReactAppDependencyProvider (1000.0.0): + - ReactAppDependencyProvider (0.88.0-rc.0): - ReactCodegen - - ReactCodegen (1000.0.0): + - ReactCodegen (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2584,7 +2775,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (1000.0.0): + - ReactCommon (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2592,9 +2783,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 1000.0.0) + - ReactCommon/turbomodule (= 0.88.0-rc.0) - SocketRocket - - ReactCommon-Samples (1000.0.0): + - ReactCommon-Samples (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2611,7 +2802,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - ReactCommon/turbomodule (1000.0.0): + - ReactCommon/turbomodule (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2620,13 +2811,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 1000.0.0) - - React-jsi (= 1000.0.0) - - React-logger (= 1000.0.0) - - React-perflogger (= 1000.0.0) - - ReactCommon/turbomodule/core (= 1000.0.0) + - React-callinvoker (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.0) + - React-logger (= 0.88.0-rc.0) + - React-perflogger (= 0.88.0-rc.0) + - ReactCommon/turbomodule/core (= 0.88.0-rc.0) - SocketRocket - - ReactCommon/turbomodule/core (1000.0.0): + - ReactCommon/turbomodule/core (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2636,16 +2827,16 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging - - React-callinvoker (= 1000.0.0) - - React-cxxreact (= 1000.0.0) - - React-debug (= 1000.0.0) - - React-featureflags (= 1000.0.0) - - React-jsi (= 1000.0.0) - - React-logger (= 1000.0.0) - - React-perflogger (= 1000.0.0) - - React-utils (= 1000.0.0) + - React-callinvoker (= 0.88.0-rc.0) + - React-cxxreact (= 0.88.0-rc.0) + - React-debug (= 0.88.0-rc.0) + - React-featureflags (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.0) + - React-logger (= 0.88.0-rc.0) + - React-perflogger (= 0.88.0-rc.0) + - React-utils (= 0.88.0-rc.0) - SocketRocket - - ScreenshotManager (0.87.0-main): + - ScreenshotManager (0.88.0-rc.0): - boost - DoubleConversion - fast_float @@ -2658,6 +2849,7 @@ PODS: - RCTTypeSafety - React-bridging - React-Core + - React-cxxstableapi - React-debug - React-Fabric - React-featureflags @@ -2752,6 +2944,7 @@ DEPENDENCIES: - React-rendererconsistency (from `../react-native/ReactCommon/react/renderer/consistency`) - React-renderercss (from `../react-native/ReactCommon/react/renderer/css`) - React-rendererdebug (from `../react-native/ReactCommon/react/renderer/debug`) + - React-resizeobservernativemodule (from `../react-native/ReactCommon/react/nativemodule/resizeobserver`) - React-RuntimeApple (from `../react-native/ReactCommon/react/runtime/platform/ios`) - React-RuntimeCore (from `../react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../react-native/ReactCommon/runtimeexecutor`) @@ -2789,7 +2982,7 @@ EXTERNAL SOURCES: :podspec: "../react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: '' + :tag: hermes-v260318099.0.2 MyNativeView: :path: NativeComponentExample NativeCxxModuleExample: @@ -2922,6 +3115,8 @@ EXTERNAL SOURCES: :path: "../react-native/ReactCommon/react/renderer/css" React-rendererdebug: :path: "../react-native/ReactCommon/react/renderer/debug" + React-resizeobservernativemodule: + :path: "../react-native/ReactCommon/react/nativemodule/resizeobserver" React-RuntimeApple: :path: "../react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: @@ -2957,94 +3152,95 @@ SPEC CHECKSUMS: boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: af92c6d1747ebb2387d117d9dd73d7e4903841a8 + FBLazyVector: 3bfb058a0984bc787b7be62860fbaf9a6c11dd5b fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 - hermes-engine: c80355e32d44390d09935e3e31d569b19ff4b205 - MyNativeView: 02b46285748cdd4731b86f6d91840d6ba2e5741f - NativeCxxModuleExample: 3dee4ec2dece1caf6a820efde7f01efc5a034880 + hermes-engine: de60f3b807b4b2d235f43de6d8a160090e56e2a7 + MyNativeView: 43d523206679b3008c716ba493e1a3129e343ca3 + NativeCxxModuleExample: 8af298f840f0ca089185ba733d65aef39aeaff3b OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b - RCTDeprecation: 3808e36294137f9ee5668f4df2e73dc079cd1dcf - RCTRequired: 25edbba9d281a349b2c6ea96164b24ddbaab9682 - RCTSwiftUI: ddb3e80be1d459ffbf69250f96ac110ba16936a1 - RCTSwiftUIWrapper: 80ba3daf3dce113d442e53822e32c14e290eb6a7 - RCTTypeSafety: 656f2b1b5978bedc692d17c142117cf77e27a965 - React: 9fcf4514ef577f653607ef701030619c4d446b8a - React-bridging: e5ca72ed0c4c42237c89d47395caae032324a85d - React-callinvoker: 9dbc5bf0c1770b852c286f27a8ff3ac2c41d2bae - React-Core: 07dd2589d382d42ebea21c94b63ae9b2b9d1c0db - React-CoreModules: 3fff481436a5bf1fe2107c77306b1b22060e6d86 - React-cxxreact: f73e41399049552c9008973772a8a9e71af4ca57 - React-cxxstableapi: 717808de4bba60c59802263e36a93da2167a7a79 - React-debug: c136ab6a9df808ec43092cf683d27035ebb48a26 - React-defaultsnativemodule: ddd0b272cf22ca179066f737c41af2b91f826271 - React-domnativemodule: 91aa634005208e9e068871b5161548faddb76d35 - React-Fabric: f94d3624837f799c26b15b4b014c667fc641e8ad - React-FabricComponents: aca79528e806729b41c4020b722febdd63385194 - React-FabricImage: 803f4a7988bbdad297bff982684cea9aeea3c901 - React-featureflags: 1cd13109ac3f2bdda0145f7c9bce6e70e237b661 - React-featureflagsnativemodule: a8591c1cece2cb28efd7a98632a035f52c344bb9 - React-graphics: bfe5977ad2800e2169a82a0afdea595bb04dd9ba - React-hermes: 52e0641c625bcdd88591dcad239515e7da86170d - React-idlecallbacksnativemodule: a76ec7bbeabde1b997eee3082a8986477effb352 - React-ImageManager: dbb3cba90eb68cd3f406354fcbc9d1a974d12346 - React-intersectionobservernativemodule: 1486d1730e131e8004a70d68bf1a725b79ef5c45 - React-jserrorhandler: 2178b775435a2d46765c1a95cff896f51d6ae297 - React-jsi: eab4393bbf978faa0d9d93ae5d13c20937fab320 - React-jsiexecutor: d07aaba9188314c08751a4f60ee863ef8bee1ecb - React-jsinspector: 085d6437ce83b5f0ad095909ee26d03da661e127 - React-jsinspectorcdp: 17244d8639ca280967956ca1c7da0dd1a4fc6454 - React-jsinspectornetwork: abcd141858a9228dd9fb5b7c2e5395c23ee9bbb4 - React-jsinspectortracing: ce38fda4fed441cc148ba7777bf357261a813ba3 - React-jsitooling: 54447648b4229d55f65dabba53518e56c8bf1a06 - React-jsitracing: c270fb95d74e14e264d33b3a2cf8ca78901cc66b - React-logger: d20ed7b124ed68131054d598cd1ea0bca74e68ee - React-Mapbuffer: 1bda74e2bfd17505fcd7ce21c95842f5d5cdfc78 - React-microtasksnativemodule: cec2334ddab49a8e38dcfb6967860b6002629233 - React-mutationobservernativemodule: dbbdf506d21c3c69653d837498e9d068147054e1 - React-NativeModulesApple: 15fbbad6cff9bef2da812843ba31b743b0f8f8bf - React-networking: 65716f04019b6a5f6ca8013307c3eefea47b6463 - React-oscompat: d4c113e294eaa6bedf7c18d03df8ea503a98129d - React-perflogger: c12ba5379b631513afe6ad4a87c7d64549668c76 - React-performancecdpmetrics: b150de1bd90ca5d536ec187ef9df340a88b9e2be - React-performancetimeline: 4ef48781f3fcafa44bdecab7c119e454bffdae3c - React-RCTActionSheet: 413cbb93858a32b5c18405e792262caec6cf158e - React-RCTAnimatedModuleProvider: dcbb65d677cf6ac1cda7912650ad33c4253916e6 - React-RCTAnimation: 164e50bb4cc07bbc5a5ec1f19b8bc9392268b39f - React-RCTAppDelegate: 3981a52f920a199573a1450764417236043a6717 - React-RCTBlob: 11c79b6e5447c2c1cc1b7633d7ee4d712a465cce - React-RCTFabric: 691f78aeca063781ac816cdd50594a02715f2bc0 - React-RCTFBReactNativeSpec: 329d23f7222c216da3b07dd02ff00b3b98fda1cd - React-RCTImage: bb0eb46db1e24ad906cb31c21e21b514db5b8a55 - React-RCTLinking: 6fb1ec3188dbf07f87b29afe172064a46d331446 - React-RCTNetwork: f424e280b3f9edd4d6692296c69d3dd5de92f78a - React-RCTPushNotification: 49c1acca24d107235c15a61af9ed856ef9e4c956 - React-RCTRuntime: feb1d8054fd1128af1622a6ec477ed5585dd01cc - React-RCTSettings: a932ad87f8dc6601deb45220a9bfa7da4a44df03 - React-RCTTest: 35876bf3e89cbbb357d52292f0e525996e5ce60c - React-RCTText: 16b0e933027bd04a5fc594461cb7691cd7eaaa56 - React-RCTVibration: fa7447c8f2435d18eb07e507e088c77cc6dbf61c - React-rendererconsistency: 7953edf876fa2626cfe7513f8a96dcb87e4be3ae - React-renderercss: 2ff59d46f74a73403fc90b7f70c24031b79173b4 - React-rendererdebug: f18285ef1772f907eb15f83134d33ef98916c261 - React-RuntimeApple: 412d7771e11d3ee5ad48e3d73ad4ab184e14f31b - React-RuntimeCore: c424d1a4f7354dfe5c9a06997865ccf78f22c244 - React-runtimeexecutor: 47ac7048f643a0bef6a0a86a5e136867d66a0768 - React-RuntimeHermes: 17ab25d968387190328b1e337024cf46fa3e5eb4 - React-runtimescheduler: 57f201dffa80893b709accd1722ab5efbedf7699 - React-timing: 208133eb7843c1b4292ab9b3c0c55ad2eedc709c - React-utils: 702979802d8aa217752fd73e95b96bad2646f5d9 - React-viewtransitionnativemodule: 2e1b09e22fe19f3e4286a5768d75570086d46baf - React-webperformancenativemodule: 86b068ca5c8c69583974ab63853b7acc7b5af653 - ReactAppDependencyProvider: 56ca45ab1d086e3093f7ab9c19a8dc8eac5c099b - ReactCodegen: 19447115b4e0b8eec131ae256e7000a9a0910dc4 - ReactCommon: 1376b66d6ef10d128c76c2d59fef49e706832ca6 - ReactCommon-Samples: b74ec150a8210d62be6cc899d28a24e7b795edd3 - ScreenshotManager: c005d764f11c09fb4a5640a3157024dddce859e9 + RCTDeprecation: 8d49dedf0800fbe6e127334ca4ea62c3fa39359e + RCTRequired: d0f85c4fbf2e762af6f25b943ad65198aaeb852f + RCTSwiftUI: a0d6c65b3da0decf21808a79dc0e1271f2653452 + RCTSwiftUIWrapper: 9c5a0ce6e3a562573a0f877e30306a83a953ee62 + RCTTypeSafety: 4a05f6bd4c57f141ac06b5a7850b2be3597cc306 + React: 0b93f1aed1e7f5e67857b4867fb33ecf013d5848 + React-bridging: 32dad710673d47740690ade2f6fdc73d32f7c3aa + React-callinvoker: a747804091c845cf997834fbf967291fecec32be + React-Core: db5581440be1d8824bfdf7e183600a9a0814a743 + React-CoreModules: 09bb76a32b3042369c68af108bc349db53336a37 + React-cxxreact: 6093056fdc1b245c10f4e39f08321a4e65ae7e30 + React-cxxstableapi: 70ae951e80a26756f72a688ac9fe946bab3abaf9 + React-debug: 991aa832e6351674e84d08038a213d03f4fd9245 + React-defaultsnativemodule: a62fe7e4d778ce5c1a066cb9506f25ef1cf6ee58 + React-domnativemodule: b97b4cf1d3d0865b19bb639952185d0d73d5e19c + React-Fabric: 1d2950740c3eb33938c1f328eadcd5518c410bfb + React-FabricComponents: 266c5f502400f2c24ed00814b801901c790ff2b4 + React-FabricImage: 720da45137eaa6c4f82b9c5da8e7055177cb1884 + React-featureflags: 1737c7734c506ab1bf2d68db946d5fb2b0c41fbe + React-featureflagsnativemodule: 801e12dcbddd3efede4a4416d1d0b6126c2a3c18 + React-graphics: 73fa384743afccdb83b90e800d514604d7063c8c + React-hermes: 3f5b1caff5a7e3ff21fcfb9d3bf54db31125c91b + React-idlecallbacksnativemodule: 985947f4d0f8daf532e53c5fe045b26131a9d59e + React-ImageManager: 3f5f7a700fcabb4e651e6825b6465db5e6731ea3 + React-intersectionobservernativemodule: f488a77978938cb1468cc57fc86dd867e8f9217c + React-jserrorhandler: 6d82ba0b79f0266d36c1546aa78998a9e3861449 + React-jsi: 8d5b8d37722bb63cba6040e33673ba22c0d12d5a + React-jsiexecutor: 8263ea05910bd75ca7e0121f713defac37fe4ee3 + React-jsinspector: 14f2a768e1a25c4fad02737df6bf13f373070f82 + React-jsinspectorcdp: 0dbbca735fb4a4ec82820eaa87f49f70c8eeefaf + React-jsinspectornetwork: b4198517ed2ad217942715e6f6bb5ae4759bf504 + React-jsinspectortracing: 45200b640ab803236c2272ed800cf3cd6138a06a + React-jsitooling: 48733becb95bf1668c26460e67afb7072f1cb967 + React-jsitracing: ad56a8f1b8fe13590aa30d75583a57a02723d610 + React-logger: 8d645b8a6d65f078c5d4ba164e74bdaf071fbd72 + React-Mapbuffer: 48eeef876470e330de42fd49aa387cbe6941f05d + React-microtasksnativemodule: b2651537413b751ec34632488a160ab2316903fe + React-mutationobservernativemodule: a6bf91d66aabe2c137e852ea648372350698102e + React-NativeModulesApple: 6399a4dd765a725a9fdba2673101b71634d7efb9 + React-networking: 5c3dd60edb2766749875a298d460ae899afd009f + React-oscompat: 1346cde36e1d0d009b49449a67a111c3e7583de8 + React-perflogger: 0d5e56b4d6126ad806c80a0da5a742c648332357 + React-performancecdpmetrics: 4fa397bd2d96d0b4c5cb831affadbd3fce561ad8 + React-performancetimeline: 4c98658f82d83881b8db5dc34658bed9bb1d4e20 + React-RCTActionSheet: 339a417639be325f38231d0008faed959fb1c7d6 + React-RCTAnimatedModuleProvider: 1dc4b618edf81f154d04a693d8e5272267097700 + React-RCTAnimation: ea22e973c87e7c4482084b66ae0585139601df50 + React-RCTAppDelegate: 1bbb1f8a1849e4c69c431fdc1d1622f6e45dd8a7 + React-RCTBlob: bbb3041aa6c5f8f8b64d460c621e3fd5f2832c56 + React-RCTFabric: a483ff9f127dd1dbe04786f615bf5544e8b6d657 + React-RCTFBReactNativeSpec: 8efa8546844e96f506d18642e2cd07d97e59fa24 + React-RCTImage: 902bcde00fff12c616a8c0386c99e072c15501a7 + React-RCTLinking: 4b726d66cf68dc27913753315284cc9b9e898bca + React-RCTNetwork: c01e6c19d024c79506c7744a500f03f0b2e35c12 + React-RCTPushNotification: 9d1a33ac33934d1f0a7b113d161e88213dead797 + React-RCTRuntime: 2524bde956d1abb23417e4ccad2e131489142987 + React-RCTSettings: a5ca27e5017d181ed9e9ddfd6dc7ddde2aea22cd + React-RCTTest: 0544ca13fafd425ea8b3036145dfb256ef97a6c1 + React-RCTText: fa1b884171f6a39067f76406ed691ba7ec43c6bb + React-RCTVibration: a7c10c8f228b0fd33c4a2205e963e2cd758ba86b + React-rendererconsistency: 9951d4518c1119fb1cacaa726d99209f28005488 + React-renderercss: fb913350e1b5ad9674f3fcc0528c0848695d6e13 + React-rendererdebug: f6c59faaaa3b6e973606d0caf3b49440faa626ab + React-resizeobservernativemodule: bb78c7f19173aeda91ab64ec620c410195040637 + React-RuntimeApple: 101728e68e48d2bc368b75b11af16487a29a3169 + React-RuntimeCore: 3a79a2cfabcaa96adf9b3427c69a42e6a22e377e + React-runtimeexecutor: d6f016527b25232c5d67e481b5adb0dedabb18d2 + React-RuntimeHermes: 498e776fc4256f89a5fe943a317c76c121104ece + React-runtimescheduler: 64fa54648b5e98d53b065ed2a4f273cf3f050785 + React-timing: d05f490866ea9ecd4a006940cc7c9202e8f95c8c + React-utils: 62b6647db0c18a4e4b1996d569eb9ec73c4cc582 + React-viewtransitionnativemodule: 2184b1e87705428f1ccca98852f87a7045889f00 + React-webperformancenativemodule: d1015b6f14db99fd70e05f813368523131fbdb0c + ReactAppDependencyProvider: 227e7f2d3c01ad3cfadc024347f94ac92d5aac96 + ReactCodegen: 27596f320e7f3d6f27ec1ee20e179135bc45aa71 + ReactCommon: 1781fb0054234c76a4af393b9bb8b40acfd259fb + ReactCommon-Samples: 6e2c90eaeba4feefda6f15d71f23f504ea3c8e25 + ScreenshotManager: 1d29871265a83ff722f6cc4ed7a815cdb3d185e5 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: a9afa834491f5b80bc3b10d2d91e8bfb15ab1100 + Yoga: 8d06fb4b6e06edd49bd0a19b7c4486fc72db0842 PODFILE CHECKSUM: 59f1e7d58cffbfafbeb3df31151743dd4c9a52e8 -COCOAPODS: 1.16.2 +COCOAPODS: 1.15.2 From b4e7d025c0dee9e81db392a7daa63e3f55b35f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Wed, 9 Sep 2026 04:48:55 -0700 Subject: [PATCH 05/35] Export the native Fabric UI manager for React (#58398) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58398 Expose the native Fabric UI manager through `react-native/react-private-interface` so the React renderer can consume it without reading the global directly. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D119165837 fbshipit-source-id: a41860ef4962c9a71b8052db29f7ff86529db18e (cherry picked from commit 73a76ddced2088d925809432fd6b0503f239dbfe) --- packages/react-native/src/react-private-interface.js | 4 ++++ packages/react-native/src/react-private-interface.js.flow | 2 ++ 2 files changed, 6 insertions(+) diff --git a/packages/react-native/src/react-private-interface.js b/packages/react-native/src/react-private-interface.js index 6e965490ebc9..d2cf244b1d85 100644 --- a/packages/react-native/src/react-private-interface.js +++ b/packages/react-native/src/react-private-interface.js @@ -29,6 +29,7 @@ import typeof ExceptionsManager from '../Libraries/Core/ExceptionsManager'; import typeof RawEventEmitter from '../Libraries/Core/RawEventEmitter'; import typeof ReactFiberErrorDialog from '../Libraries/Core/ReactFiberErrorDialog'; import typeof RCTEventEmitter from '../Libraries/EventEmitter/RCTEventEmitter'; +import type {Spec as FabricUIManager} from '../Libraries/ReactNative/FabricUIManager'; import typeof { createPublicInstance, createPublicRootInstance, @@ -78,6 +79,9 @@ module.exports = { get UIManager(): UIManager { return require('../Libraries/ReactNative/UIManager').default; }, + get fabricUIManager(): ?FabricUIManager { + return require('../Libraries/ReactNative/FabricUIManager').getFabricUIManager(); + }, // TODO: Remove when React has migrated to `createAttributePayload` and `diffAttributePayloads` get deepDiffer(): deepDiffer { return require('../Libraries/Utilities/differ/deepDiffer').default; diff --git a/packages/react-native/src/react-private-interface.js.flow b/packages/react-native/src/react-private-interface.js.flow index b30331d119f8..e3295e6cc47d 100644 --- a/packages/react-native/src/react-private-interface.js.flow +++ b/packages/react-native/src/react-private-interface.js.flow @@ -14,6 +14,7 @@ // IMPORTANT: Keep this file in sync with react-private-interface.js. // ---------------------------------------------------------------------------- +import type {Spec as FabricUIManager} from '../Libraries/ReactNative/FabricUIManager'; import typeof {createPublicTextInstance as createPublicTextInstanceT} from '../Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance'; export type {PublicRootInstance} from '../Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance'; @@ -26,6 +27,7 @@ export {default as RCTEventEmitter} from '../Libraries/EventEmitter/RCTEventEmit export * as ReactNativeViewConfigRegistry from '../Libraries/Renderer/shims/ReactNativeViewConfigRegistry'; export {default as TextInputState} from '../Libraries/Components/TextInput/TextInputState'; export {default as UIManager} from '../Libraries/ReactNative/UIManager'; +declare export const fabricUIManager: ?FabricUIManager; export {default as deepDiffer} from '../Libraries/Utilities/differ/deepDiffer'; export {default as deepFreezeAndThrowOnMutationInDev} from '../Libraries/Utilities/deepFreezeAndThrowOnMutationInDev'; export {default as flattenStyle} from '../Libraries/StyleSheet/flattenStyle'; From 0b0ce740cb3c86815f28ad02084c879131d74ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Thu, 10 Sep 2026 17:03:25 -0700 Subject: [PATCH 06/35] React 19.3.0 sync int React Native OSS (#58446) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58446 Sync of React 19.3.0 into React Native Changelog: [General][Changed] - Sync React 19.3.0 into React Native jest_e2e[run_all_tests] bypass-github-export-checks Reviewed By: fabriziocucci Differential Revision: D119490598 fbshipit-source-id: 4a00bd01fd1a4b1c48ffcae182f1b88cd0cf9e06 (cherry picked from commit b0b71421c1964e046ba2ad156669c7d32e4c538f) --- package.json | 6 +- .../implementations/ReactFabric-dev.js | 4587 +++++++++++------ .../implementations/ReactFabric-prod.js | 3250 ++++++++---- .../implementations/ReactFabric-profiling.js | 3575 +++++++++---- packages/react-native/package.json | 4 +- packages/rn-tester/package.json | 2 +- packages/virtualized-lists/package.json | 2 +- private/helloworld/package.json | 4 +- yarn.lock | 36 +- 9 files changed, 7773 insertions(+), 3693 deletions(-) diff --git a/package.json b/package.json index d24b3ad66076..a0517a401903 100644 --- a/package.json +++ b/package.json @@ -108,8 +108,8 @@ "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", "prettier": "3.9.4", - "react": "19.2.3", - "react-test-renderer": "19.2.3", + "react": "19.3.0", + "react-test-renderer": "19.3.0", "rimraf": "^3.0.2", "shelljs": "^0.8.5", "signedsource": "^2.0.0", @@ -121,7 +121,7 @@ "ws": "^7.5.10" }, "resolutions": { - "react-is": "19.2.3", + "react-is": "19.3.0", "on-headers": "1.1.0", "compression": "1.8.1", "@microsoft/api-extractor/minimatch": "3.1.4", diff --git a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js index daab0e35a8e5..615eb9178009 100644 --- a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js +++ b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<<12e935271cee5bbb34114c56f570f060>> * * This file was sync'd from the facebook/react repository. */ @@ -33,43 +33,22 @@ __DEV__ && : emptyObject; } function createHierarchy(fiberHierarchy) { - return fiberHierarchy.map(function (fiber$jscomp$0) { + return fiberHierarchy.map(function (fiber) { return { - name: getComponentNameFromType(fiber$jscomp$0.type), + name: getComponentNameFromType(fiber.type), getInspectorData: function () { return { - props: getHostProps(fiber$jscomp$0), + props: getHostProps(fiber), measure: function (callback) { - var hostFiber = findCurrentHostFiber(fiber$jscomp$0); - if ( - (hostFiber = - null != hostFiber && - null !== hostFiber.stateNode && - hostFiber.stateNode.node) - ) - nativeFabricUIManager.measure(hostFiber, callback); - else { - hostFiber = ReactNativePrivateInterface.UIManager; - var JSCompiler_temp_const = hostFiber.measure, - JSCompiler_inline_result; - a: { - for (var fiber = fiber$jscomp$0; fiber; ) { - null !== fiber.stateNode && - 5 === fiber.tag && - (JSCompiler_inline_result = findNodeHandle( - fiber.stateNode - )); - if (JSCompiler_inline_result) break a; - fiber = fiber.child; - } - JSCompiler_inline_result = null; - } - return JSCompiler_temp_const.call( + var hostFiber = findCurrentHostFiber(fiber); + (hostFiber = + null != hostFiber && + null !== hostFiber.stateNode && + hostFiber.stateNode.node) && + reactPrivateInterface.fabricUIManager.measure( hostFiber, - JSCompiler_inline_result, callback ); - } } }; } @@ -181,6 +160,19 @@ __DEV__ && function batchedUpdatesImpl(fn, bookkeeping) { return fn(bookkeeping); } + function currentTimeStamp() { + currentTimeStamp = + "object" === typeof performance && + null !== performance && + "function" === typeof performance.now + ? function () { + return performance.now(); + } + : function () { + return Date.now(); + }; + return currentTimeStamp(); + } function disabledLog() {} function disableLogs() { if (0 === disabledDepth) { @@ -302,7 +294,30 @@ __DEV__ && } catch (x$1) { control = x$1; } - fn.call(Fake.prototype); + Fake = !1; + try { + var prevProps = Object.getOwnPropertyDescriptor( + fn.prototype, + "props" + ); + Object.defineProperty(fn.prototype, "props", { + configurable: !0, + set: function () { + throw Error(); + } + }); + Fake = !0; + new fn(); + } finally { + Fake && + (void 0 !== prevProps + ? Object.defineProperty( + fn.prototype, + "props", + prevProps + ) + : delete fn.prototype.props); + } } } else { try { @@ -444,6 +459,8 @@ __DEV__ && return describeNativeComponentFrame(fiber.type, !0); case 31: return describeBuiltInComponentFrame("Activity"); + case 30: + return describeBuiltInComponentFrame("ViewTransition"); default: return ""; } @@ -522,6 +539,8 @@ __DEV__ && return "SuspenseList"; case REACT_ACTIVITY_TYPE: return "Activity"; + case REACT_VIEW_TRANSITION_TYPE: + return "ViewTransition"; } if ("object" === typeof type) switch ( @@ -597,7 +616,9 @@ __DEV__ && case 8: return type === REACT_STRICT_MODE_TYPE ? "StrictMode" : "Mode"; case 22: - return "Offscreen"; + if (null !== fiber.return) + return getComponentNameFromFiber(fiber.return); + break; case 12: return "Profiler"; case 21: @@ -609,6 +630,7 @@ __DEV__ && case 25: return "TracingMarker"; case 30: + return "ViewTransition"; case 17: case 28: case 1: @@ -651,6 +673,8 @@ __DEV__ && info += describeBuiltInComponentFrame("Activity"); break; case 30: + info += describeBuiltInComponentFrame("ViewTransition"); + break; case 0: case 15: case 1: @@ -730,11 +754,14 @@ __DEV__ && } function executeDispatch(event, listener, inst) { event.currentTarget = getNodeFromInstance$1(inst); + inst = global.event; + global.event = event; try { listener(event); } catch (error) { hasError || ((hasError = !0), (caughtError = error)); } + global.event = inst; event.currentTarget = null; } function executeDirectDispatch(event) { @@ -1257,49 +1284,70 @@ __DEV__ && e.isPersistent() || e.constructor.release(e); } } - function dispatchEvent(target, topLevelType, nativeEvent) { - var eventTarget = null; - if (null != target) { - var stateNode = target.stateNode; - null != stateNode && (eventTarget = getPublicInstance(stateNode)); - } + function dispatchEvent(target, topLevelType, nativeEventParam) { + var nativeEvent = + null != nativeEventParam && "object" === typeof nativeEventParam + ? nativeEventParam + : {}, + eventTarget = null; + null != target && + ((nativeEventParam = target.stateNode), + null != nativeEventParam && + (eventTarget = getPublicInstance(nativeEventParam))); batchedUpdates$1(function () { var event = { eventName: topLevelType, nativeEvent: nativeEvent }; - ReactNativePrivateInterface.RawEventEmitter.emit(topLevelType, event); - ReactNativePrivateInterface.RawEventEmitter.emit("*", event); - event = eventTarget; - for ( - var events = null, legacyPlugins = plugins, i = 0; - i < legacyPlugins.length; - i++ - ) { - var possiblePlugin = legacyPlugins[i]; - possiblePlugin && - (possiblePlugin = possiblePlugin.extractEvents( + reactPrivateInterface.RawEventEmitter.emit(topLevelType, event); + reactPrivateInterface.RawEventEmitter.emit("*", event); + null == _enableNativeEventTargetEventDispatching && + ((event = + null != reactPrivateInterface.ReactNativeFeatureFlags + ? reactPrivateInterface.ReactNativeFeatureFlags + .enableNativeEventTargetEventDispatching + : null), + (_enableNativeEventTargetEventDispatching = + "function" === typeof event && event())); + if (_enableNativeEventTargetEventDispatching) + null != eventTarget && + reactPrivateInterface.dispatchNativeEvent( + eventTarget, topLevelType, - target, - nativeEvent, - event - )) && - (events = accumulateInto(events, possiblePlugin)); - } - event = events; - null !== event && (eventQueue = accumulateInto(eventQueue, event)); - event = eventQueue; - eventQueue = null; - if (event) { - forEachAccumulated(event, executeDispatchesAndReleaseTopLevel); - if (eventQueue) - throw Error( - "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." - ); - if (hasError) - throw ( - ((event = caughtError), - (hasError = !1), - (caughtError = null), - event) + nativeEvent ); + else { + event = eventTarget; + for ( + var events = null, legacyPlugins = plugins, i = 0; + i < legacyPlugins.length; + i++ + ) { + var possiblePlugin = legacyPlugins[i]; + possiblePlugin && + (possiblePlugin = possiblePlugin.extractEvents( + topLevelType, + target, + nativeEvent, + event + )) && + (events = accumulateInto(events, possiblePlugin)); + } + event = events; + null !== event && (eventQueue = accumulateInto(eventQueue, event)); + event = eventQueue; + eventQueue = null; + if (event) { + forEachAccumulated(event, executeDispatchesAndReleaseTopLevel); + if (eventQueue) + throw Error( + "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." + ); + if (hasError) + throw ( + ((event = caughtError), + (hasError = !1), + (caughtError = null), + event) + ); + } } }); } @@ -1370,7 +1418,7 @@ __DEV__ && case 32768: case 65536: case 131072: - return lanes & 261888; + return lanes & -lanes; case 262144: case 524288: case 1048576: @@ -1449,6 +1497,22 @@ __DEV__ && renderLanes) ); } + function getEntangledLanes(root, renderLanes) { + 0 !== (renderLanes & 8) && (renderLanes |= renderLanes & 32); + var allEntangledLanes = root.entangledLanes; + if (0 !== allEntangledLanes) + for ( + root = root.entanglements, allEntangledLanes &= renderLanes; + 0 < allEntangledLanes; + + ) { + var index = 31 - clz32(allEntangledLanes), + lane = 1 << index; + renderLanes |= root[index]; + allEntangledLanes &= ~lane; + } + return renderLanes; + } function computeExpirationTime(lane, currentTime) { switch (lane) { case 1: @@ -1664,18 +1728,12 @@ __DEV__ && : DiscreteEventPriority; } function getNearestMountedFiber(fiber) { - var node = fiber, - nearestMounted = fiber; - if (fiber.alternate) for (; node.return; ) node = node.return; - else { - fiber = node; - do - (node = fiber), - 0 !== (node.flags & 4098) && (nearestMounted = node.return), - (fiber = node.return); - while (fiber); - } - return 3 === node.tag ? nearestMounted : null; + for (var node = fiber, nextNode = node; nextNode && !nextNode.alternate; ) + (node = nextNode), + 0 !== (node.flags & 4098) && (fiber = node.return), + (nextNode = node.return); + for (; node.return; ) node = node.return; + return 3 === node.tag ? fiber : null; } function assertIsMounted(fiber) { if (getNearestMountedFiber(fiber) !== fiber) @@ -1771,15 +1829,64 @@ __DEV__ && } return null; } - function doesFiberContain(parentFiber, childFiber) { - for ( - var parentFiberAlternate = parentFiber.alternate; - null !== childFiber; - - ) { - if (childFiber === parentFiber || childFiber === parentFiberAlternate) + function traverseVisibleInstancesAndTextInstances( + child, + searchWithinHosts, + fn, + a, + b, + c + ) { + for (; null !== child; ) { + if ( + ((5 === child.tag || 27 === child.tag || 6 === child.tag) && + fn(child, a, b, c)) || + ((22 !== child.tag || null === child.memoizedState) && + (searchWithinHosts || (5 !== child.tag && 27 !== child.tag)) && + traverseVisibleInstancesAndTextInstances( + child.child, + searchWithinHosts, + fn, + a, + b, + c + )) + ) + return !0; + child = child.sibling; + } + return !1; + } + function getFragmentParentInstanceOrContainerFiber(fiber) { + for (fiber = fiber.return; null !== fiber; ) { + if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) + return fiber; + fiber = fiber.return; + } + return null; + } + function findFragmentInstanceOrTextInstanceSiblings( + result, + self, + child, + state + ) { + for (; null !== child; ) { + if (child === self) state.foundSelf = !0; + else if (5 === child.tag || 27 === child.tag || 6 === child.tag) { + if (state.foundSelf) return (result[1] = child), !0; + result[0] = child; + } else if ( + (22 !== child.tag || null === child.memoizedState) && + findFragmentInstanceOrTextInstanceSiblings( + result, + self, + child.child, + state + ) + ) return !0; - childFiber = childFiber.return; + child = child.sibling; } return !1; } @@ -1802,11 +1909,45 @@ __DEV__ && fiberStack[index$jscomp$0] = fiber; cursor.current = value; } + function getViewTransitionName(props, instance) { + if (null != props.name && "auto" !== props.name) return props.name; + if (null !== instance.autoName) return instance.autoName; + props = pendingEffectsRoot.identifierPrefix; + var globalClientId = globalClientIdCounter$1++; + props = "_" + props + "t_" + globalClientId.toString(32) + "_"; + return (instance.autoName = props); + } + function getClassNameByType(classByType) { + if (null == classByType || "string" === typeof classByType) + return classByType; + var className = null, + activeTypes = pendingTransitionTypes; + if (null !== activeTypes) + for (var i = 0; i < activeTypes.length; i++) { + var match = classByType[activeTypes[i]]; + if (null != match) { + if ("none" === match) return "none"; + className = null == className ? match : className + (" " + match); + } + } + return null == className ? classByType.default : className; + } + function getViewTransitionClassName(defaultClass, eventClass) { + defaultClass = getClassNameByType(defaultClass); + eventClass = getClassNameByType(eventClass); + return null == eventClass + ? "auto" === defaultClass + ? null + : defaultClass + : "auto" === eventClass + ? null + : eventClass; + } function is(x, y) { return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y); } function getArrayKind(array) { - for (var kind = 0, i = 0; i < array.length; i++) { + for (var kind = 0, i = 0; i < array.length && 100 > i; i++) { var value = array[i]; if ("object" === typeof value && null !== value) if ( @@ -1821,7 +1962,8 @@ __DEV__ && if ( "function" === typeof value || ("string" === typeof value && 50 < value.length) || - (0 !== kind && 2 !== kind) + (0 !== kind && 2 !== kind) || + "bigint" === typeof value ) return 1; kind = 2; @@ -1830,10 +1972,31 @@ __DEV__ && return kind; } function addObjectToProperties(object, properties, indent, prefix) { - for (var key in object) - hasOwnProperty.call(object, key) && - "_" !== key[0] && - addValueToProperties(key, object[key], properties, indent, prefix); + if (!ArrayBuffer.isView(object)) { + var addedProperties = 0, + key; + for (key in object) + if ( + hasOwnProperty.call(object, key) && + "_" !== key[0] && + (addedProperties++, + addValueToProperties(key, object[key], properties, indent, prefix), + 100 <= addedProperties) + ) { + properties.push([ + prefix + + "\u00a0\u00a0".repeat(indent) + + "Only 100 properties are shown. React will not log more properties of this object.", + "" + ]); + break; + } + } + } + function readReactElementTypeof(value) { + return "$$typeof" in value && hasOwnProperty.call(value, "$$typeof") + ? value.$$typeof + : void 0; } function addValueToProperties( propertyName, @@ -1848,7 +2011,7 @@ __DEV__ && value = "null"; break; } else { - if (value.$$typeof === REACT_ELEMENT_TYPE) { + if (readReactElementTypeof(value) === REACT_ELEMENT_TYPE) { var typeName = getComponentNameFromType(value.type) || "\u2026", key = value.key; value = value.props; @@ -1880,21 +2043,27 @@ __DEV__ && prefix ); propertyName = !1; + key = 0; for (var propKey in value) - "children" === propKey - ? null != value.children && - (!isArrayImpl(value.children) || - 0 < value.children.length) && - (propertyName = !0) - : hasOwnProperty.call(value, propKey) && - "_" !== propKey[0] && - addValueToProperties( - propKey, - value[propKey], - properties, - indent + 1, - prefix - ); + if ( + (key++, + "children" === propKey + ? null != value.children && + (!isArrayImpl(value.children) || + 0 < value.children.length) && + (propertyName = !0) + : hasOwnProperty.call(value, propKey) && + "_" !== propKey[0] && + addValueToProperties( + propKey, + value[propKey], + properties, + indent + 1, + prefix + ), + 100 <= key) + ) + break; properties.push([ "", propertyName ? ">\u2026" : "/>" @@ -1903,21 +2072,32 @@ __DEV__ && } typeName = Object.prototype.toString.call(value); typeName = typeName.slice(8, typeName.length - 1); + if (ArrayBuffer.isView(value)) { + value = value.length; + value = + "number" === typeof value + ? typeName + "(" + value + ")" + : typeName; + break; + } if ("Array" === typeName) if ( - ((propKey = getArrayKind(value)), - 2 === propKey || 0 === propKey) + ((propKey = 100 < value.length), + (key = getArrayKind(value)), + 2 === key || 0 === key) ) { - value = JSON.stringify(value); + value = JSON.stringify( + propKey ? value.slice(0, 100).concat("\u2026") : value + ); break; - } else if (3 === propKey) { + } else if (3 === key) { properties.push([ prefix + "\u00a0\u00a0".repeat(indent) + propertyName, "" ]); for ( propertyName = 0; - propertyName < value.length; + propertyName < value.length && 100 > propertyName; propertyName++ ) (typeName = value[propertyName]), @@ -1928,6 +2108,14 @@ __DEV__ && indent + 1, prefix ); + propKey && + addValueToProperties( + (100).toString(), + "\u2026", + properties, + indent + 1, + prefix + ); return; } if ("Promise" === typeName) { @@ -1983,14 +2171,20 @@ __DEV__ && return; } case "function": - value = "" === value.name ? "() => {}" : value.name + "() {}"; + value = value.name; + value = + "" === value || "string" !== typeof value + ? "() => {}" + : value + "() {}"; break; case "string": value = "This object has been omitted by React in the console log to avoid sending too much data from the server. Try logging smaller or more specific objects." === value ? "\u2026" - : JSON.stringify(value); + : JSON.stringify( + 1024 <= value.length ? value.slice(0, 1023) + "\u2026" : value + ); break; case "undefined": value = "undefined"; @@ -2007,112 +2201,125 @@ __DEV__ && ]); } function addObjectDiffToProperties(prev, next, properties, indent) { - var isDeeplyEqual = !0; - for (key in prev) + var isDeeplyEqual = !0, + prevPropertiesChecked = 0; + for (key in prev) { + if (100 < prevPropertiesChecked) { + properties.push([ + "Previous object has more than 100 properties. React will not attempt to diff objects with too many properties.", + "" + ]); + isDeeplyEqual = !1; + break; + } key in next || (properties.push([ - "\u2013\u00a0" + "\u00a0\u00a0".repeat(indent) + key, + "-\u00a0" + "\u00a0\u00a0".repeat(indent) + key, "\u2026" ]), (isDeeplyEqual = !1)); - for (var _key in next) + prevPropertiesChecked++; + } + prevPropertiesChecked = 0; + for (var _key in next) { + if (100 < prevPropertiesChecked) { + properties.push([ + "Next object has more than 100 properties. React will not attempt to diff objects with too many properties.", + "" + ]); + isDeeplyEqual = !1; + break; + } if (_key in prev) { var key = prev[_key]; var nextValue = next[_key]; if (key !== nextValue) { - if (0 === indent && "children" === _key) - (isDeeplyEqual = "\u00a0\u00a0".repeat(indent) + _key), - properties.push( - ["\u2013\u00a0" + isDeeplyEqual, "\u2026"], - ["+\u00a0" + isDeeplyEqual, "\u2026"] - ); - else { - if (!(3 <= indent)) - if ( - "object" === typeof key && - "object" === typeof nextValue && - null !== key && - null !== nextValue && - key.$$typeof === nextValue.$$typeof - ) - if (nextValue.$$typeof === REACT_ELEMENT_TYPE) { - if ( - key.type === nextValue.type && - key.key === nextValue.key - ) { - key = - getComponentNameFromType(nextValue.type) || "\u2026"; - isDeeplyEqual = "\u00a0\u00a0".repeat(indent) + _key; - key = "<" + key + " \u2026 />"; - properties.push( - ["\u2013\u00a0" + isDeeplyEqual, key], - ["+\u00a0" + isDeeplyEqual, key] - ); - isDeeplyEqual = !1; - continue; - } - } else { - var prevKind = Object.prototype.toString.call(key), - nextKind = Object.prototype.toString.call(nextValue); - if ( - prevKind === nextKind && - ("[object Object]" === nextKind || - "[object Array]" === nextKind) - ) { - prevKind = [ - "\u2007\u00a0" + "\u00a0\u00a0".repeat(indent) + _key, - "[object Array]" === nextKind ? "Array" : "" - ]; - properties.push(prevKind); - nextKind = properties.length; - addObjectDiffToProperties( - key, - nextValue, - properties, - indent + 1 - ) - ? nextKind === properties.length && - (prevKind[1] = - "Referentially unequal but deeply equal objects. Consider memoization.") - : (isDeeplyEqual = !1); - continue; - } - } - else if ( - "function" === typeof key && - "function" === typeof nextValue && - key.name === nextValue.name && - key.length === nextValue.length && - ((prevKind = Function.prototype.toString.call(key)), - (nextKind = Function.prototype.toString.call(nextValue)), - prevKind === nextKind) - ) { - key = - "" === nextValue.name - ? "() => {}" - : nextValue.name + "() {}"; - properties.push([ - "\u2007\u00a0" + "\u00a0\u00a0".repeat(indent) + _key, - key + - " Referentially unequal function closure. Consider memoization." - ]); - continue; - } - addValueToProperties( - _key, - key, - properties, - indent, - "\u2013\u00a0" - ); - addValueToProperties( - _key, - nextValue, - properties, - indent, - "+\u00a0" + if (0 === indent && "children" === _key) { + isDeeplyEqual = "\u00a0\u00a0".repeat(indent) + _key; + properties.push( + ["-\u00a0" + isDeeplyEqual, "\u2026"], + ["+\u00a0" + isDeeplyEqual, "\u2026"] ); + isDeeplyEqual = !1; + continue; } + if (!(3 <= indent)) + if ( + "object" === typeof key && + "object" === typeof nextValue && + null !== key && + null !== nextValue && + readReactElementTypeof(key) === + readReactElementTypeof(nextValue) + ) + if (readReactElementTypeof(nextValue) === REACT_ELEMENT_TYPE) { + if ( + key.type === nextValue.type && + key.key === nextValue.key + ) { + key = getComponentNameFromType(nextValue.type) || "\u2026"; + isDeeplyEqual = "\u00a0\u00a0".repeat(indent) + _key; + key = "<" + key + " \u2026 />"; + properties.push( + ["-\u00a0" + isDeeplyEqual, key], + ["+\u00a0" + isDeeplyEqual, key] + ); + isDeeplyEqual = !1; + continue; + } + } else { + var prevKind = Object.prototype.toString.call(key), + nextKind = Object.prototype.toString.call(nextValue); + if ( + prevKind === nextKind && + ("[object Object]" === nextKind || + "[object Array]" === nextKind) + ) { + prevKind = [ + "\u2007\u00a0" + "\u00a0\u00a0".repeat(indent) + _key, + "[object Array]" === nextKind ? "Array" : "" + ]; + properties.push(prevKind); + nextKind = properties.length; + addObjectDiffToProperties( + key, + nextValue, + properties, + indent + 1 + ) + ? nextKind === properties.length && + (prevKind[1] = + "Referentially unequal but deeply equal objects. Consider memoization.") + : (isDeeplyEqual = !1); + continue; + } + } + else if ( + "function" === typeof key && + "function" === typeof nextValue && + key.name === nextValue.name && + key.length === nextValue.length && + ((prevKind = Function.prototype.toString.call(key)), + (nextKind = Function.prototype.toString.call(nextValue)), + prevKind === nextKind) + ) { + key = + "" === nextValue.name ? "() => {}" : nextValue.name + "() {}"; + properties.push([ + "\u2007\u00a0" + "\u00a0\u00a0".repeat(indent) + _key, + key + + " Referentially unequal function closure. Consider memoization." + ]); + continue; + } + addValueToProperties(_key, key, properties, indent, "-\u00a0"); + addValueToProperties( + _key, + nextValue, + properties, + indent, + "+\u00a0" + ); isDeeplyEqual = !1; } } else @@ -2121,6 +2328,8 @@ __DEV__ && "\u2026" ]), (isDeeplyEqual = !1); + prevPropertiesChecked++; + } return isDeeplyEqual; } function setCurrentTrackFromLanes(lanes) { @@ -2152,7 +2361,8 @@ __DEV__ && reusableComponentOptions ) ) - : performance.measure(trigger, reusableComponentOptions)); + : performance.measure(trigger, reusableComponentOptions), + performance.clearMeasures(trigger)); } function logComponentReappeared(fiber, startTime, endTime) { logComponentTrigger(fiber, startTime, endTime, "Reconnect"); @@ -2171,7 +2381,7 @@ __DEV__ && if (null === alternate || alternate.child !== fiber.child) for (var child = fiber.child; null !== child; child = child.sibling) selfTime -= child.actualDuration; - wasHydrated = + selfTime = 0.5 > selfTime ? wasHydrated ? "tertiary-light" @@ -2186,46 +2396,65 @@ __DEV__ && : "primary-dark" : "error"; var props = fiber.memoizedProps; - selfTime = fiber._debugTask; + wasHydrated = fiber._debugTask; null !== props && null !== alternate && alternate.memoizedProps !== props - ? ((child = [resuableChangedPropsEntry]), + ? ((child = [reusableChangedPropsEntry]), (props = addObjectDiffToProperties( alternate.memoizedProps, props, child, 0 )), - 1 < child.length && - (props && - !alreadyWarnedForDeepEquality && - 0 === (alternate.lanes & committedLanes) && - 100 < fiber.actualDuration - ? ((alreadyWarnedForDeepEquality = !0), - (child[0] = reusableDeeplyEqualPropsEntry), - (reusableComponentDevToolDetails.color = "warning"), - (reusableComponentDevToolDetails.tooltipText = - "This component received deeply equal props. It might benefit from useMemo or the React Compiler in its owner.")) - : ((reusableComponentDevToolDetails.color = wasHydrated), - (reusableComponentDevToolDetails.tooltipText = name)), - (reusableComponentDevToolDetails.properties = child), - (reusableComponentOptions.start = startTime), - (reusableComponentOptions.end = endTime), - null != selfTime - ? selfTime.run( - performance.measure.bind( - performance, - "\u200b" + name, - reusableComponentOptions + 1 < child.length + ? (props && + !alreadyWarnedForDeepEquality && + 0 === (alternate.lanes & committedLanes) && + 100 < fiber.actualDuration + ? ((alreadyWarnedForDeepEquality = !0), + (child[0] = reusableDeeplyEqualPropsEntry), + (reusableComponentDevToolDetails.color = "warning"), + (reusableComponentDevToolDetails.tooltipText = + "This component received deeply equal props. It might benefit from useMemo or the React Compiler in its owner.")) + : ((reusableComponentDevToolDetails.color = selfTime), + (reusableComponentDevToolDetails.tooltipText = name)), + (reusableComponentDevToolDetails.properties = child), + (reusableComponentOptions.start = startTime), + (reusableComponentOptions.end = endTime), + (fiber = "\u200b" + name), + null != wasHydrated + ? wasHydrated.run( + performance.measure.bind( + performance, + fiber, + reusableComponentOptions + ) + ) + : performance.measure(fiber, reusableComponentOptions), + performance.clearMeasures(fiber)) + : null != wasHydrated + ? wasHydrated.run( + console.timeStamp.bind( + console, + name, + startTime, + endTime, + "Components \u269b", + void 0, + selfTime ) ) - : performance.measure( - "\u200b" + name, - reusableComponentOptions - ))) - : null != selfTime - ? selfTime.run( + : console.timeStamp( + name, + startTime, + endTime, + "Components \u269b", + void 0, + selfTime + )) + : null != wasHydrated + ? wasHydrated.run( console.timeStamp.bind( console, name, @@ -2233,7 +2462,7 @@ __DEV__ && endTime, "Components \u269b", void 0, - wasHydrated + selfTime ) ) : console.timeStamp( @@ -2242,7 +2471,7 @@ __DEV__ && endTime, "Components \u269b", void 0, - wasHydrated + selfTime ); } } @@ -2289,11 +2518,11 @@ __DEV__ && } } }; + name = "\u200b" + name; debugTask - ? debugTask.run( - performance.measure.bind(performance, "\u200b" + name, fiber) - ) - : performance.measure("\u200b" + name, fiber); + ? debugTask.run(performance.measure.bind(performance, name, fiber)) + : performance.measure(name, fiber); + performance.clearMeasures(name); } } } @@ -2330,15 +2559,14 @@ __DEV__ && } } }; - (fiber = fiber._debugTask) + fiber = fiber._debugTask; + endTime = "\u200b" + name; + fiber ? fiber.run( - performance.measure.bind( - performance, - "\u200b" + name, - startTime - ) + performance.measure.bind(performance, endTime, startTime) ) - : performance.measure("\u200b" + name, startTime); + : performance.measure(endTime, startTime); + performance.clearMeasures(endTime); } } } else @@ -2374,38 +2602,6 @@ __DEV__ && errors )); } - function logRenderPhase(startTime, endTime, lanes, debugTask) { - if (supportsUserTiming && !(endTime <= startTime)) { - var color = - (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark"; - lanes = - (lanes & 536870912) === lanes - ? "Prepared" - : (lanes & 201326741) === lanes - ? "Hydrated" - : "Render"; - debugTask - ? debugTask.run( - console.timeStamp.bind( - console, - lanes, - startTime, - endTime, - currentTrack, - "Scheduler \u269b", - color - ) - ) - : console.timeStamp( - lanes, - startTime, - endTime, - currentTrack, - "Scheduler \u269b", - color - ); - } - } function logSuspendedRenderPhase(startTime, endTime, lanes, debugTask) { !supportsUserTiming || endTime <= startTime || @@ -2458,49 +2654,6 @@ __DEV__ && lanes )); } - function logRecoveredRenderPhase( - startTime, - endTime, - lanes, - recoverableErrors, - hydrationFailed, - debugTask - ) { - if (supportsUserTiming && !(endTime <= startTime)) { - lanes = []; - for (var i = 0; i < recoverableErrors.length; i++) { - var error = recoverableErrors[i].value; - lanes.push([ - "Recoverable Error", - "object" === typeof error && - null !== error && - "string" === typeof error.message - ? String(error.message) - : String(error) - ]); - } - startTime = { - start: startTime, - end: endTime, - detail: { - devtools: { - color: "primary-dark", - track: currentTrack, - trackGroup: "Scheduler \u269b", - tooltipText: hydrationFailed - ? "Hydration Failed" - : "Recovered after Error", - properties: lanes - } - } - }; - debugTask - ? debugTask.run( - performance.measure.bind(performance, "Recovered", startTime) - ) - : performance.measure("Recovered", startTime); - } - } function logErroredRenderPhase(startTime, endTime, lanes, debugTask) { !supportsUserTiming || endTime <= startTime || @@ -2582,8 +2735,69 @@ __DEV__ && performance.measure.bind(performance, "Errored", startTime) ) : performance.measure("Errored", startTime); + performance.clearMeasures("Errored"); } } + function logCommitPhase( + startTime, + endTime, + errors, + abortedViewTransition, + debugTask + ) { + null !== errors + ? logCommitErrored(startTime, endTime, errors, !1, debugTask) + : !supportsUserTiming || + endTime <= startTime || + (debugTask + ? debugTask.run( + console.timeStamp.bind( + console, + abortedViewTransition + ? "Commit Interrupted View Transition" + : "Commit", + startTime, + endTime, + currentTrack, + "Scheduler \u269b", + abortedViewTransition ? "error" : "secondary-dark" + ) + ) + : console.timeStamp( + abortedViewTransition + ? "Commit Interrupted View Transition" + : "Commit", + startTime, + endTime, + currentTrack, + "Scheduler \u269b", + abortedViewTransition ? "error" : "secondary-dark" + )); + } + function logAnimatingPhase(startTime, endTime, debugTask) { + !supportsUserTiming || + endTime <= startTime || + (debugTask + ? debugTask.run( + console.timeStamp.bind( + console, + "Animating", + startTime, + endTime, + currentTrack, + "Scheduler \u269b", + "secondary-dark" + ) + ) + : console.timeStamp( + "Animating", + startTime, + endTime, + currentTrack, + "Scheduler \u269b", + "secondary-dark" + )); + } function createCapturedValueAtFiber(value, source) { if ("object" === typeof value && null !== value) { var existing = CapturedStacks.get(value); @@ -2623,21 +2837,24 @@ __DEV__ && pop(rootInstanceStackCursor, fiber); } function pushHostContext(fiber) { - null !== fiber.memoizedState && - push(hostTransitionProviderCursor, fiber, fiber); - var context = requiredContext(contextStackCursor.current); + var stateHook = fiber.memoizedState; + null !== stateHook && + ((HostTransitionContext._currentValue2 = stateHook.memoizedState), + push(hostTransitionProviderCursor, fiber, fiber)); + stateHook = requiredContext(contextStackCursor.current); var nextContext = fiber.type; nextContext = "AndroidTextInput" === nextContext || "RCTMultilineTextInputView" === nextContext || + "RCTSelectableText" === nextContext || "RCTSinglelineTextInputView" === nextContext || "RCTText" === nextContext || "RCTVirtualText" === nextContext; nextContext = - context.isInAParentText !== nextContext + stateHook.isInAParentText !== nextContext ? { isInAParentText: nextContext } - : context; - context !== nextContext && + : stateHook; + stateHook !== nextContext && (push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor, nextContext, fiber)); } @@ -3218,7 +3435,21 @@ __DEV__ && workInProgress ); nextFiber = null; - } else nextFiber = fiber.child; + } else + 13 === fiber.tag && + null !== fiber.memoizedState && + null === fiber.memoizedState.dehydrated + ? ((fiber.lanes |= renderLanes), + (nextFiber = fiber.alternate), + null !== nextFiber && (nextFiber.lanes |= renderLanes), + scheduleContextWorkOnParentPath( + fiber.return, + renderLanes, + workInProgress + ), + (nextFiber = fiber.child), + (nextFiber = null !== nextFiber ? nextFiber.sibling : null)) + : (nextFiber = fiber.child); if (null !== nextFiber) nextFiber.return = fiber; else for (nextFiber = fiber; null !== nextFiber; ) { @@ -3284,6 +3515,7 @@ __DEV__ && forcePropagateEntireTree ); workInProgress.flags |= 262144; + return null !== current; } function checkIfContextChanged(currentDependencies) { for ( @@ -3362,22 +3594,39 @@ __DEV__ && cache.controller.abort(); }); } + function queueTransitionTypes(root, transitionTypes) { + if (0 !== (root.pendingLanes & 4194048)) { + var queued = root.transitionTypes; + null === queued && (queued = root.transitionTypes = []); + for (root = 0; root < transitionTypes.length; root++) { + var transitionType = transitionTypes[root]; + -1 === queued.indexOf(transitionType) && queued.push(transitionType); + } + } + } + function claimQueuedTransitionTypes(root) { + var claimed = root.transitionTypes; + root.transitionTypes = null; + return claimed; + } function startUpdateTimerByLane(lane, method, fiber) { - if (0 !== (lane & 127)) { - if (0 > blockingUpdateTime) { - blockingUpdateTime = now(); - blockingUpdateTask = createTask(method); - blockingUpdateMethodName = method; + if (0 !== (lane & 127)) + 0 > blockingUpdateTime && + ((blockingUpdateTime = now()), + (blockingUpdateTask = createTask(method)), + (blockingUpdateMethodName = method), null != fiber && - (blockingUpdateComponentName = getComponentNameFromFiber(fiber)); + (blockingUpdateComponentName = getComponentNameFromFiber(fiber)), (executionContext & (RenderContext | CommitContext)) !== NoContext && - ((componentEffectSpawnedUpdate = !0), (blockingUpdateType = 1)); - if (-1.1 !== blockingEventRepeatTime || null !== blockingEventType) - blockingEventRepeatTime = -1.1; - blockingEventTime = -1.1; - blockingEventType = null; - } - } else if ( + ((componentEffectSpawnedUpdate = !0), (blockingUpdateType = 1)), + (lane = resolveEventTimeStamp()), + (method = resolveEventType()), + lane !== blockingEventRepeatTime || method !== blockingEventType + ? (blockingEventRepeatTime = -1.1) + : null !== method && (blockingUpdateType = 1), + (blockingEventTime = lane), + (blockingEventType = method)); + else if ( 0 !== (lane & 4194048) && 0 > transitionUpdateTime && ((transitionUpdateTime = now()), @@ -3387,10 +3636,15 @@ __DEV__ && (transitionUpdateComponentName = getComponentNameFromFiber(fiber)), 0 > transitionStartTime) ) { - if (-1.1 !== transitionEventRepeatTime || null !== transitionEventType) + lane = resolveEventTimeStamp(); + method = resolveEventType(); + if ( + lane !== transitionEventRepeatTime || + method !== transitionEventType + ) transitionEventRepeatTime = -1.1; - transitionEventTime = -1.1; - transitionEventType = null; + transitionEventTime = lane; + transitionEventType = method; } } function pushNestedEffectDurations() { @@ -3543,6 +3797,7 @@ __DEV__ && } } function processRootScheduleInImmediateTask() { + schedulerEvent = global.event; processRootScheduleInMicrotask(); } function processRootScheduleInMicrotask() { @@ -3650,6 +3905,7 @@ __DEV__ && } function performWorkOnRootViaSchedulerTask(root, didTimeout) { nestedUpdateScheduled = currentUpdateIsNested = !1; + schedulerEvent = global.event; if ( pendingEffectsStatus !== NO_PENDING_EFFECTS && pendingEffectsStatus !== PENDING_PASSIVE_PHASE @@ -3698,19 +3954,14 @@ __DEV__ && processRootScheduleInMicrotask(); return null; }); - supportsMicrotasks - ? scheduleMicrotask(function () { - (executionContext & (RenderContext | CommitContext)) !== NoContext - ? scheduleCallback$3( - ImmediatePriority, - processRootScheduleInImmediateTask - ) - : processRootScheduleInMicrotask(); - }) - : scheduleCallback$3( - ImmediatePriority, - processRootScheduleInImmediateTask - ); + scheduleMicrotask(function () { + (executionContext & (RenderContext | CommitContext)) !== NoContext + ? scheduleCallback$3( + ImmediatePriority, + processRootScheduleInImmediateTask + ) + : processRootScheduleInMicrotask(); + }); } function requestTransitionLane() { if (0 === currentEventTransitionLane) { @@ -3745,6 +3996,7 @@ __DEV__ && if ( 0 === --currentEntangledPendingCount && (-1 < transitionUpdateTime || (transitionStartTime = -1.1), + (entangledTransitionTypes = null), null !== currentEntangledListeners) ) { null !== currentEntangledActionThenable && @@ -3842,15 +4094,35 @@ __DEV__ && )), thenable.then(noop, noop), (thenable = index)); + if (void 0 === thenable._debugInfo) { + thenableState = performance.now(); + trackedThenables = thenable.displayName; + var ioInfo = { + name: + "string" === typeof trackedThenables ? trackedThenables : "Promise", + start: thenableState, + end: thenableState, + value: thenable + }; + thenable._debugInfo = [{ awaited: ioInfo }]; + "fulfilled" !== thenable.status && + "rejected" !== thenable.status && + ((thenableState = function () { + ioInfo.end = performance.now(); + }), + thenable.then(thenableState, thenableState)); + } switch (thenable.status) { case "fulfilled": return thenable.value; case "rejected": - throw ( - ((thenableState = thenable.reason), - checkIfUseWrappedInAsyncCatch(thenableState), - thenableState) - ); + thenableState = thenable.reason; + checkIfUseWrappedInAsyncCatch(thenableState); + if (void 0 === thenableState && !("reason" in thenable)) + throw Error( + "A rejected Promise was passed to React without a `reason` property. React threw a generic error from where the Promise was used to assist in identifying the problematic Promise. Make sure that instrumented Promises correctly set the `reason` property when setting `status` to `'rejected'`." + ); + throw thenableState; default: if ("string" === typeof thenable.status) thenable.then(noop, noop); else { @@ -3950,7 +4222,7 @@ __DEV__ && function validateFragmentProps(element, fiber, returnFiber) { for (var keys = Object.keys(element.props), i = 0; i < keys.length; i++) { var key = keys[i]; - if ("children" !== key && "key" !== key) { + if ("children" !== key && "key" !== key && "ref" !== key) { null === fiber && ((fiber = createFiberFromElement(element, returnFiber.mode, 0)), (fiber._debugInfo = currentDebugInfo), @@ -3959,7 +4231,7 @@ __DEV__ && fiber, function (erroredKey) { console.error( - "Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", + "Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key`, `ref`, and `children` props.", erroredKey ); }, @@ -4075,9 +4347,9 @@ __DEV__ && } function mapRemainingChildren(currentFirstChild) { for (var existingChildren = new Map(); null !== currentFirstChild; ) - null !== currentFirstChild.key - ? existingChildren.set(currentFirstChild.key, currentFirstChild) - : existingChildren.set(currentFirstChild.index, currentFirstChild), + null === currentFirstChild.key + ? existingChildren.set(currentFirstChild.index, currentFirstChild) + : existingChildren.set(currentFirstChild.key, currentFirstChild), (currentFirstChild = currentFirstChild.sibling); return existingChildren; } @@ -4096,16 +4368,16 @@ __DEV__ && return ( (newIndex = newIndex.index), newIndex < lastPlacedIndex - ? ((newFiber.flags |= 67108866), lastPlacedIndex) + ? ((newFiber.flags |= 2), lastPlacedIndex) : newIndex ); - newFiber.flags |= 67108866; + newFiber.flags |= 134217730; return lastPlacedIndex; } function placeSingleChild(newFiber) { shouldTrackSideEffects && null === newFiber.alternate && - (newFiber.flags |= 67108866); + (newFiber.flags |= 134217730); return newFiber; } function updateTextNode(returnFiber, current, textContent, lanes) { @@ -4138,6 +4410,7 @@ __DEV__ && lanes, element.key )), + coerceRef(current, element), validateFragmentProps(element, current, returnFiber), current ); @@ -4593,10 +4866,11 @@ __DEV__ && knownKeys )), shouldTrackSideEffects && - null !== nextOldFiber.alternate && - oldFiber.delete( - null === nextOldFiber.key ? newIdx : nextOldFiber.key - ), + ((newFiber = nextOldFiber.alternate), + null !== newFiber && + oldFiber.delete( + null === newFiber.key ? newIdx : newFiber.key + )), (currentFirstChild = placeChild( nextOldFiber, currentFirstChild, @@ -4701,10 +4975,9 @@ __DEV__ && knownKeys )), shouldTrackSideEffects && - null !== nextOldFiber.alternate && - oldFiber.delete( - null === nextOldFiber.key ? newIdx : nextOldFiber.key - ), + ((step = nextOldFiber.alternate), + null !== step && + oldFiber.delete(null === step.key ? newIdx : step.key)), (currentFirstChild = placeChild( nextOldFiber, currentFirstChild, @@ -4730,6 +5003,7 @@ __DEV__ && null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && + void 0 === newChild.props.ref && (validateFragmentProps(newChild, null, returnFiber), (newChild = newChild.props.children)); if ("object" === typeof newChild && null !== newChild) { @@ -4750,6 +5024,7 @@ __DEV__ && currentFirstChild, newChild.props.children ); + coerceRef(lanes, newChild); lanes.return = returnFiber; lanes._debugOwner = newChild._owner; lanes._debugInfo = currentDebugInfo; @@ -4792,6 +5067,7 @@ __DEV__ && lanes, newChild.key )), + coerceRef(lanes, newChild), (lanes.return = returnFiber), (lanes._debugOwner = returnFiber), (lanes._debugTask = returnFiber._debugTask), @@ -4869,32 +5145,26 @@ __DEV__ && ); } if (isArrayImpl(newChild)) - return ( - (prevDebugInfo = pushDebugInfo(newChild._debugInfo)), - (returnFiber = reconcileChildrenArray( - returnFiber, - currentFirstChild, - newChild, - lanes - )), - (currentDebugInfo = prevDebugInfo), - returnFiber + return reconcileChildrenArray( + returnFiber, + currentFirstChild, + newChild, + lanes ); if (getIteratorFn(newChild)) { - prevDebugInfo = pushDebugInfo(newChild._debugInfo); - key = getIteratorFn(newChild); - if ("function" !== typeof key) + prevDebugInfo = newChild; + newChild = getIteratorFn(prevDebugInfo); + if ("function" !== typeof newChild) throw Error( "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue." ); - var newChildren = key.call(newChild); - if (newChildren === newChild) { + key = newChild.call(prevDebugInfo); + if (key === prevDebugInfo) { if ( 0 !== returnFiber.tag || "[object GeneratorFunction]" !== Object.prototype.toString.call(returnFiber.type) || - "[object Generator]" !== - Object.prototype.toString.call(newChildren) + "[object Generator]" !== Object.prototype.toString.call(key) ) didWarnAboutGenerators || console.error( @@ -4902,20 +5172,18 @@ __DEV__ && ), (didWarnAboutGenerators = !0); } else - newChild.entries !== key || + prevDebugInfo.entries !== newChild || didWarnAboutMaps || (console.error( "Using Maps as children is not supported. Use an array of keyed ReactElements instead." ), (didWarnAboutMaps = !0)); - returnFiber = reconcileChildrenIterator( + return reconcileChildrenIterator( returnFiber, currentFirstChild, - newChildren, + key, lanes ); - currentDebugInfo = prevDebugInfo; - return returnFiber; } if ("function" === typeof newChild.then) return ( @@ -5486,6 +5754,19 @@ __DEV__ && shellBoundary === fiber && (shellBoundary = null); pop(suspenseStackCursor, fiber); } + function pushSuspenseListContext(fiber, newContext) { + push( + suspenseHandlerStackCursor, + suspenseHandlerStackCursor.current, + fiber + ); + push(suspenseStackCursor, newContext, fiber); + } + function popSuspenseListContext(fiber) { + pop(suspenseStackCursor, fiber); + pop(suspenseHandlerStackCursor, fiber); + shellBoundary === fiber && (shellBoundary = null); + } function findFirstSuspended(row) { for (var node = row; null !== node; ) { if (13 === node.tag) { @@ -5499,10 +5780,7 @@ __DEV__ && return node; } else if ( 19 === node.tag && - ("forwards" === node.memoizedProps.revealOrder || - "backwards" === node.memoizedProps.revealOrder || - "unstable_legacy-backwards" === node.memoizedProps.revealOrder || - "together" === node.memoizedProps.revealOrder) + "independent" !== node.memoizedProps.revealOrder ) { if (0 !== (node.flags & 128)) return node; } else if (null !== node.child) { @@ -5692,7 +5970,7 @@ __DEV__ && null; hookTypesUpdateIndexDev = -1; null !== current && - (current.flags & 65011712) !== (workInProgress.flags & 65011712) && + (current.flags & 1206910976) !== (workInProgress.flags & 1206910976) && 0 !== (current.mode & 1) && console.error( "Internal React error: Expected static flag was missing. Please notify the React team." @@ -5766,7 +6044,7 @@ __DEV__ && workInProgress.updateQueue = current.updateQueue; workInProgress.flags = 0 !== (workInProgress.mode & 16) - ? workInProgress.flags & -402655237 + ? workInProgress.flags & -805308421 : workInProgress.flags & -2053; current.lanes &= ~lanes; } @@ -5867,6 +6145,7 @@ __DEV__ && function use(usable) { if (null !== usable && "object" === typeof usable) { if ("function" === typeof usable.then) return useThenable(usable); + if (usable.$$typeof === REACT_RECOVERABLE_TYPE) return; if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable); } throw Error("An unsupported type was passed to use(): " + String(usable)); @@ -6150,25 +6429,19 @@ __DEV__ && hook = hook.queue; var create = subscribeToStore.bind(null, fiber, hook, subscribe); updateEffectImpl(2048, Passive, create, [subscribe]); - if ( + subscribe = hook.getSnapshot !== getSnapshot || cachedSnapshot || (null !== workInProgressHook && - workInProgressHook.memoizedState.tag & HasEffect) - ) { + (workInProgressHook.memoizedState.tag & HasEffect) !== NoFlags); + pushSimpleEffect( + subscribe ? HasEffect | Passive : Passive, + { destroy: void 0 }, + updateStoreInstance.bind(null, fiber, hook, nextSnapshot, getSnapshot), + null + ); + if (subscribe) { fiber.flags |= 2048; - pushSimpleEffect( - HasEffect | Passive, - { destroy: void 0 }, - updateStoreInstance.bind( - null, - fiber, - hook, - nextSnapshot, - getSnapshot - ), - null - ); if (null === workInProgressRoot) throw Error( "Expected a work-in-progress root. This is a bug in React. Please file an issue." @@ -6295,7 +6568,7 @@ __DEV__ && payload ) { if (isRenderPhaseUpdate(fiber)) - throw Error("Cannot update form state while rendering."); + throw Error("Cannot update action state while rendering."); fiber = actionQueue.action; if (null !== fiber) { var actionNode = { @@ -6330,6 +6603,8 @@ __DEV__ && if (node.isTransition) { var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition.types = + null !== prevTransition ? prevTransition.types : null; currentTransition._updatedFibers = new Set(); ReactSharedInternals.T = currentTransition; try { @@ -6564,7 +6839,7 @@ __DEV__ && } function mountEffect(create, deps) { 0 !== (currentlyRenderingFiber.mode & 16) - ? mountEffectImpl(276826112, Passive, create, deps) + ? mountEffectImpl(545261568, Passive, create, deps) : mountEffectImpl(8390656, Passive, create, deps); } function useEffectEventImpl(payload) { @@ -6606,7 +6881,7 @@ __DEV__ && } function mountLayoutEffect(create, deps) { var fiberFlags = 4194308; - 0 !== (currentlyRenderingFiber.mode & 16) && (fiberFlags |= 134217728); + 0 !== (currentlyRenderingFiber.mode & 16) && (fiberFlags |= 268435456); return mountEffectImpl(fiberFlags, Layout, create, deps); } function imperativeHandleEffect(create, ref) { @@ -6639,7 +6914,7 @@ __DEV__ && ); deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null; var fiberFlags = 4194308; - 0 !== (currentlyRenderingFiber.mode & 16) && (fiberFlags |= 134217728); + 0 !== (currentlyRenderingFiber.mode & 16) && (fiberFlags |= 268435456); mountEffectImpl( fiberFlags, Layout, @@ -6756,7 +7031,7 @@ __DEV__ && hook ); if ( - 0 === (renderLanes & 42) || + 0 === (renderLanes & 106) || (0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) ) @@ -6783,6 +7058,8 @@ __DEV__ && : ContinuousEventPriority; var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition.types = + null !== prevTransition ? prevTransition.types : null; currentTransition._updatedFibers = new Set(); ReactSharedInternals.T = currentTransition; dispatchOptimisticSetState(fiber, !1, queue, pendingState); @@ -7444,7 +7721,7 @@ __DEV__ && (instance.state = workInProgress.memoizedState)); "function" === typeof instance.componentDidMount && (workInProgress.flags |= 4194308); - 0 !== (workInProgress.mode & 16) && (workInProgress.flags |= 134217728); + 0 !== (workInProgress.mode & 16) && (workInProgress.flags |= 268435456); } function resolveClassComponentProps(Component, baseProps) { var newProps = baseProps; @@ -7595,6 +7872,7 @@ __DEV__ && switch (currentSourceFiber.tag) { case 31: case 13: + case 19: return ( sourceFiber.mode & 1 && (null === shellBoundary @@ -7699,18 +7977,17 @@ __DEV__ && !1 ); case 1: + sourceFiber = returnFiber.type; + currentSourceFiber = returnFiber.stateNode; if ( - ((sourceFiber = returnFiber.type), - (currentSourceFiber = returnFiber.stateNode), 0 === (returnFiber.flags & 128) && - ("function" === typeof sourceFiber.getDerivedStateFromError || - (null !== currentSourceFiber && - "function" === - typeof currentSourceFiber.componentDidCatch && - (null === legacyErrorBoundariesThatAlreadyFailed || - !legacyErrorBoundariesThatAlreadyFailed.has( - currentSourceFiber - ))))) + ("function" === typeof sourceFiber.getDerivedStateFromError || + (null !== currentSourceFiber && + "function" === typeof currentSourceFiber.componentDidCatch && + (null === legacyErrorBoundariesThatAlreadyFailed || + !legacyErrorBoundariesThatAlreadyFailed.has( + currentSourceFiber + )))) ) return ( (returnFiber.flags |= 65536), @@ -7726,6 +8003,10 @@ __DEV__ && enqueueCapturedUpdate(returnFiber, rootRenderLanes), !1 ); + break; + case 22: + if (null !== returnFiber.memoizedState) + return (returnFiber.flags |= 65536), !1; } returnFiber = returnFiber.return; } while (null !== returnFiber); @@ -7755,7 +8036,11 @@ __DEV__ && renderLanes ) { Component = Component.render; - var ref = workInProgress.ref; + var resolvedRender = resolveTypeForHotReloading(Component); + resolvedRender !== Component && + ((Component = resolvedRender), + null !== current && (didReceiveUpdate = !0)); + resolvedRender = workInProgress.ref; if ("ref" in nextProps) { var propsWithoutRef = {}; for (var key in nextProps) @@ -7767,7 +8052,7 @@ __DEV__ && workInProgress, Component, propsWithoutRef, - ref, + resolvedRender, renderLanes ); if (null !== current && !didReceiveUpdate) @@ -7795,7 +8080,7 @@ __DEV__ && null === Component.compare ) return ( - (Component = resolveFunctionForHotReloading(type)), + (Component = resolveTypeForHotReloading(type)), (workInProgress.tag = 15), (workInProgress.type = Component), validateFunctionComponentInDev(workInProgress, type), @@ -8228,11 +8513,11 @@ __DEV__ && "function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), 0 !== (workInProgress.mode & 16) && - (workInProgress.flags |= 134217728)) + (workInProgress.flags |= 268435456)) : ("function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), 0 !== (workInProgress.mode & 16) && - (workInProgress.flags |= 134217728), + (workInProgress.flags |= 268435456), (workInProgress.memoizedProps = nextProps), (workInProgress.memoizedState = oldContext)), (_instance.props = nextProps), @@ -8242,7 +8527,7 @@ __DEV__ && : ("function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), 0 !== (workInProgress.mode & 16) && - (workInProgress.flags |= 134217728), + (workInProgress.flags |= 268435456), (_instance = !1)); } else { _instance = workInProgress.stateNode; @@ -8466,216 +8751,97 @@ __DEV__ && JSCompiler_temp = 0 !== (workInProgress.flags & 32); workInProgress.flags &= -33; if (null === current) { - var nextPrimaryChildren = nextProps.children; + didSuspend = nextProps.children; nextProps = nextProps.fallback; - if (showFallback) - return ( - reuseSuspenseHandlerOnStack(workInProgress), - (showFallback = workInProgress.mode), - (didSuspend = workInProgress.child), - (nextPrimaryChildren = { - mode: "hidden", - children: nextPrimaryChildren - }), - 0 === (showFallback & 1) && null !== didSuspend - ? ((didSuspend.childLanes = 0), - (didSuspend.pendingProps = nextPrimaryChildren), - workInProgress.mode & 2 && - ((didSuspend.actualDuration = -0), - (didSuspend.actualStartTime = -1.1), - (didSuspend.selfBaseDuration = -0), - (didSuspend.treeBaseDuration = -0))) - : (didSuspend = mountWorkInProgressOffscreenFiber( - nextPrimaryChildren, - showFallback - )), - (nextProps = createFiberFromFragment( - nextProps, - showFallback, - renderLanes, - null - )), - (didSuspend.return = workInProgress), - (nextProps.return = workInProgress), - (didSuspend.sibling = nextProps), - (workInProgress.child = didSuspend), - (nextProps = workInProgress.child), - (nextProps.memoizedState = - mountSuspenseOffscreenState(renderLanes)), - (nextProps.childLanes = getRemainingWorkInPrimaryTree( - current, - JSCompiler_temp, - renderLanes - )), - (workInProgress.memoizedState = SUSPENDED_MARKER), - bailoutOffscreenComponent(null, nextProps) + if (showFallback) { + reuseSuspenseHandlerOnStack(workInProgress); + showFallback = workInProgress.mode; + var progressedPrimaryFragment = workInProgress.child; + didSuspend = { mode: "hidden", children: didSuspend }; + 0 === (showFallback & 1) && null !== progressedPrimaryFragment + ? ((progressedPrimaryFragment.childLanes = 0), + (progressedPrimaryFragment.pendingProps = didSuspend), + workInProgress.mode & 2 && + ((progressedPrimaryFragment.actualDuration = -0), + (progressedPrimaryFragment.actualStartTime = -1.1), + (progressedPrimaryFragment.selfBaseDuration = -0), + (progressedPrimaryFragment.treeBaseDuration = -0))) + : (progressedPrimaryFragment = mountWorkInProgressOffscreenFiber( + didSuspend, + showFallback + )); + nextProps = createFiberFromFragment( + nextProps, + showFallback, + renderLanes, + null ); + progressedPrimaryFragment.return = workInProgress; + nextProps.return = workInProgress; + progressedPrimaryFragment.sibling = nextProps; + workInProgress.child = progressedPrimaryFragment; + nextProps = workInProgress.child; + nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes); + nextProps.childLanes = getRemainingWorkInPrimaryTree( + current, + JSCompiler_temp, + renderLanes + ); + workInProgress.memoizedState = SUSPENDED_MARKER; + return bailoutOffscreenComponent(null, nextProps); + } pushPrimaryTreeSuspenseHandler(workInProgress); - return mountSuspensePrimaryChildren( - workInProgress, - nextPrimaryChildren - ); + return mountSuspensePrimaryChildren(workInProgress, didSuspend); } - nextPrimaryChildren = current.memoizedState; - if ( - null !== nextPrimaryChildren && - null !== nextPrimaryChildren.dehydrated - ) { - if (didSuspend) - workInProgress.flags & 256 - ? (pushPrimaryTreeSuspenseHandler(workInProgress), - (workInProgress.flags &= -257), - (workInProgress = retrySuspenseComponentWithoutHydrating( - current, - workInProgress, - renderLanes - ))) - : null !== workInProgress.memoizedState - ? (reuseSuspenseHandlerOnStack(workInProgress), - (workInProgress.child = current.child), - (workInProgress.flags |= 128), - (workInProgress = null)) - : (reuseSuspenseHandlerOnStack(workInProgress), - (showFallback = nextProps.fallback), - (nextPrimaryChildren = workInProgress.mode), - (nextProps = mountWorkInProgressOffscreenFiber( - { mode: "visible", children: nextProps.children }, - nextPrimaryChildren - )), - (showFallback = createFiberFromFragment( - showFallback, - nextPrimaryChildren, - renderLanes, - null - )), - (showFallback.flags |= 2), - (nextProps.return = workInProgress), - (showFallback.return = workInProgress), - (nextProps.sibling = showFallback), - (workInProgress.child = nextProps), - 0 !== (workInProgress.mode & 1) && - reconcileChildFibers( - workInProgress, - current.child, - null, - renderLanes - ), - (nextProps = workInProgress.child), - (nextProps.memoizedState = - mountSuspenseOffscreenState(renderLanes)), - (nextProps.childLanes = getRemainingWorkInPrimaryTree( - current, - JSCompiler_temp, - renderLanes - )), - (workInProgress.memoizedState = SUSPENDED_MARKER), - (workInProgress = bailoutOffscreenComponent(null, nextProps))); - else if ( - (pushPrimaryTreeSuspenseHandler(workInProgress), - 0 !== (renderLanes & 536870912) && - markRenderDerivedCause(workInProgress), - isSuspenseInstanceFallback()) - ) - (nextPrimaryChildren = getSuspenseInstanceFallbackErrorDetails()), - (JSCompiler_temp = nextPrimaryChildren.digest), - (showFallback = nextPrimaryChildren.message), - (nextProps = nextPrimaryChildren.stack), - (nextPrimaryChildren = nextPrimaryChildren.componentStack), - (showFallback = showFallback - ? Error(showFallback) - : Error( - "The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering." - )), - (showFallback.stack = nextProps || ""), - (showFallback.digest = JSCompiler_temp), - (JSCompiler_temp = - void 0 === nextPrimaryChildren ? null : nextPrimaryChildren), - (nextProps = { - value: showFallback, - source: null, - stack: JSCompiler_temp - }), - "string" === typeof JSCompiler_temp && - CapturedStacks.set(showFallback, nextProps), - null === hydrationErrors - ? (hydrationErrors = [nextProps]) - : hydrationErrors.push(nextProps), - (workInProgress = retrySuspenseComponentWithoutHydrating( - current, - workInProgress, - renderLanes - )); - else if ( - (didReceiveUpdate || - propagateParentContextChanges( - current, - workInProgress, - renderLanes, - !1 - ), - (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)), - didReceiveUpdate || JSCompiler_temp) - ) { - JSCompiler_temp = workInProgressRoot; - if ( - null !== JSCompiler_temp && - ((nextProps = getBumpedLaneForHydration( - JSCompiler_temp, - renderLanes - )), - 0 !== nextProps && nextProps !== nextPrimaryChildren.retryLane) - ) - throw ( - ((nextPrimaryChildren.retryLane = nextProps), - enqueueConcurrentRenderForLane(current, nextProps), - scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps), - SelectiveHydrationException) - ); - isSuspenseInstancePending() || renderDidSuspendDelayIfPossible(); - workInProgress = retrySuspenseComponentWithoutHydrating( + progressedPrimaryFragment = current.memoizedState; + if (null !== progressedPrimaryFragment) { + var _dehydrated2 = progressedPrimaryFragment.dehydrated; + if (null !== _dehydrated2) + return updateDehydratedSuspenseComponent( current, workInProgress, + didSuspend, + JSCompiler_temp, + nextProps, + _dehydrated2, + progressedPrimaryFragment, renderLanes ); - } else - isSuspenseInstancePending() - ? ((workInProgress.flags |= 192), - (workInProgress.child = current.child), - (workInProgress = null)) - : ((workInProgress = mountSuspensePrimaryChildren( - workInProgress, - nextProps.children - )), - (workInProgress.flags |= 4096)); - return workInProgress; } if (showFallback) { reuseSuspenseHandlerOnStack(workInProgress); showFallback = nextProps.fallback; - nextPrimaryChildren = workInProgress.mode; - didSuspend = current.child; - var currentFallbackChildFragment = didSuspend.sibling, - primaryChildProps = { mode: "hidden", children: nextProps.children }; - 0 === (nextPrimaryChildren & 1) && workInProgress.child !== didSuspend + didSuspend = workInProgress.mode; + progressedPrimaryFragment = current.child; + _dehydrated2 = progressedPrimaryFragment.sibling; + var primaryChildProps = { + mode: "hidden", + children: nextProps.children + }; + 0 === (didSuspend & 1) && + workInProgress.child !== progressedPrimaryFragment ? ((nextProps = workInProgress.child), (nextProps.childLanes = 0), (nextProps.pendingProps = primaryChildProps), workInProgress.mode & 2 && ((nextProps.actualDuration = -0), (nextProps.actualStartTime = -1.1), - (nextProps.selfBaseDuration = didSuspend.selfBaseDuration), - (nextProps.treeBaseDuration = didSuspend.treeBaseDuration)), + (nextProps.selfBaseDuration = + progressedPrimaryFragment.selfBaseDuration), + (nextProps.treeBaseDuration = + progressedPrimaryFragment.treeBaseDuration)), (workInProgress.deletions = null)) - : ((nextProps = createWorkInProgress(didSuspend, primaryChildProps)), - (nextProps.subtreeFlags = didSuspend.subtreeFlags & 65011712)); - null !== currentFallbackChildFragment - ? (showFallback = createWorkInProgress( - currentFallbackChildFragment, - showFallback - )) + : ((nextProps = createWorkInProgress( + progressedPrimaryFragment, + primaryChildProps + )), + (nextProps.subtreeFlags = + progressedPrimaryFragment.subtreeFlags & 1206910976)); + null !== _dehydrated2 + ? (showFallback = createWorkInProgress(_dehydrated2, showFallback)) : ((showFallback = createFiberFromFragment( showFallback, - nextPrimaryChildren, + didSuspend, renderLanes, null )), @@ -8689,17 +8855,20 @@ __DEV__ && showFallback = current.child.memoizedState; null === showFallback ? (showFallback = mountSuspenseOffscreenState(renderLanes)) - : ((nextPrimaryChildren = showFallback.cachePool), - null !== nextPrimaryChildren - ? ((didSuspend = CacheContext._currentValue2), - (nextPrimaryChildren = - nextPrimaryChildren.parent !== didSuspend - ? { parent: didSuspend, pool: didSuspend } - : nextPrimaryChildren)) - : (nextPrimaryChildren = getSuspendedCache()), + : ((didSuspend = showFallback.cachePool), + null !== didSuspend + ? ((progressedPrimaryFragment = CacheContext._currentValue2), + (didSuspend = + didSuspend.parent !== progressedPrimaryFragment + ? { + parent: progressedPrimaryFragment, + pool: progressedPrimaryFragment + } + : didSuspend)) + : (didSuspend = getSuspendedCache()), (showFallback = { baseLanes: showFallback.baseLanes | renderLanes, - cachePool: nextPrimaryChildren + cachePool: didSuspend })); nextProps.memoizedState = showFallback; nextProps.childLanes = getRemainingWorkInPrimaryTree( @@ -8710,7 +8879,7 @@ __DEV__ && workInProgress.memoizedState = SUSPENDED_MARKER; return bailoutOffscreenComponent(current.child, nextProps); } - null !== nextPrimaryChildren && + null !== progressedPrimaryFragment && (renderLanes & 62914560) === renderLanes && 0 !== (renderLanes & current.lanes) && markRenderDerivedCause(workInProgress); @@ -8761,6 +8930,149 @@ __DEV__ && workInProgress.memoizedState = null; return current; } + function updateDehydratedSuspenseComponent( + current, + workInProgress, + didSuspend, + didPrimaryChildrenDefer, + nextProps, + suspenseInstance, + suspenseState, + renderLanes + ) { + if (didSuspend) { + if (workInProgress.flags & 256) + return ( + pushPrimaryTreeSuspenseHandler(workInProgress), + (workInProgress.flags &= -257), + retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ) + ); + if (null !== workInProgress.memoizedState) + return ( + reuseSuspenseHandlerOnStack(workInProgress), + (workInProgress.child = current.child), + (workInProgress.flags |= 128), + null + ); + reuseSuspenseHandlerOnStack(workInProgress); + suspenseState = nextProps.fallback; + didSuspend = workInProgress.mode; + nextProps = mountWorkInProgressOffscreenFiber( + { mode: "visible", children: nextProps.children }, + didSuspend + ); + suspenseState = createFiberFromFragment( + suspenseState, + didSuspend, + renderLanes, + null + ); + suspenseState.flags |= 2; + nextProps.return = workInProgress; + suspenseState.return = workInProgress; + nextProps.sibling = suspenseState; + workInProgress.child = nextProps; + 0 !== (workInProgress.mode & 1) && + reconcileChildFibers( + workInProgress, + current.child, + null, + renderLanes + ); + nextProps = workInProgress.child; + nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes); + nextProps.childLanes = getRemainingWorkInPrimaryTree( + current, + didPrimaryChildrenDefer, + renderLanes + ); + workInProgress.memoizedState = SUSPENDED_MARKER; + return bailoutOffscreenComponent(null, nextProps); + } + pushPrimaryTreeSuspenseHandler(workInProgress); + 0 !== (renderLanes & 536870912) && markRenderDerivedCause(workInProgress); + if (isSuspenseInstanceFallback()) + return ( + (didSuspend = getSuspenseInstanceFallbackErrorDetails()), + (didPrimaryChildrenDefer = didSuspend.digest), + (suspenseState = didSuspend.message), + (nextProps = didSuspend.stack), + (didSuspend = didSuspend.componentStack), + didPrimaryChildrenDefer !== REACT_RECOVERABLE_DIGEST && + ((suspenseState = suspenseState + ? Error(suspenseState) + : Error( + "The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering." + )), + (suspenseState.stack = nextProps || ""), + (suspenseState.digest = didPrimaryChildrenDefer), + (didPrimaryChildrenDefer = + void 0 === didSuspend ? null : didSuspend), + (nextProps = { + value: suspenseState, + source: null, + stack: didPrimaryChildrenDefer + }), + "string" === typeof didPrimaryChildrenDefer && + CapturedStacks.set(suspenseState, nextProps), + null === hydrationErrors + ? (hydrationErrors = [nextProps]) + : hydrationErrors.push(nextProps)), + retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ) + ); + didReceiveUpdate || + propagateParentContextChanges(current, workInProgress, renderLanes, !1); + didPrimaryChildrenDefer = 0 !== (renderLanes & current.childLanes); + if (didReceiveUpdate || didPrimaryChildrenDefer) { + if (null !== currentTreeHiddenStackCursor.current) + return retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ); + didPrimaryChildrenDefer = workInProgressRoot; + if ( + null !== didPrimaryChildrenDefer && + ((nextProps = getBumpedLaneForHydration( + didPrimaryChildrenDefer, + renderLanes + )), + 0 !== nextProps && nextProps !== suspenseState.retryLane) + ) + throw ( + ((suspenseState.retryLane = nextProps), + enqueueConcurrentRenderForLane(current, nextProps), + scheduleUpdateOnFiber(didPrimaryChildrenDefer, current, nextProps), + SelectiveHydrationException) + ); + isSuspenseInstancePending() || renderDidSuspendDelayIfPossible(); + return retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ); + } + if (isSuspenseInstancePending()) + return ( + (workInProgress.flags |= 192), + (workInProgress.child = current.child), + null + ); + current = mountSuspensePrimaryChildren( + workInProgress, + nextProps.children + ); + current.flags |= 134221824; + return current; + } function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) { fiber.lanes |= renderLanes; var alternate = fiber.alternate; @@ -8771,6 +9083,16 @@ __DEV__ && propagationRoot ); } + function findLastContentRow(firstChild) { + for (var lastContentRow = null; null !== firstChild; ) { + var currentRow = firstChild.alternate; + null !== currentRow && + null === findFirstSuspended(currentRow) && + (lastContentRow = firstChild); + firstChild = firstChild.sibling; + } + return lastContentRow; + } function initSuspenseListRenderState( workInProgress, isBackwards, @@ -8798,39 +9120,45 @@ __DEV__ && (renderState.tailMode = tailMode), (renderState.treeForkCount = treeForkCount)); } + function reverseChildren(fiber) { + var row = fiber.child; + for (fiber.child = null; null !== row; ) { + var nextRow = row.sibling; + row.sibling = fiber.child; + fiber.child = row; + row = nextRow; + } + } function updateSuspenseListComponent(current, workInProgress, renderLanes) { var nextProps = workInProgress.pendingProps, revealOrder = nextProps.revealOrder, tailMode = nextProps.tail; nextProps = nextProps.children; - var suspenseContext = suspenseStackCursor.current, - shouldForceFallback = 0 !== (suspenseContext & ForceSuspenseFallback); + var suspenseContext = suspenseStackCursor.current; + if (workInProgress.flags & 128) + return pushSuspenseListContext(workInProgress, suspenseContext), null; + var shouldForceFallback = 0 !== (suspenseContext & ForceSuspenseFallback); shouldForceFallback ? ((suspenseContext = (suspenseContext & SubtreeSuspenseContextMask) | ForceSuspenseFallback), (workInProgress.flags |= 128)) : (suspenseContext &= SubtreeSuspenseContextMask); - push(suspenseStackCursor, suspenseContext, workInProgress); + pushSuspenseListContext(workInProgress, suspenseContext); suspenseContext = null == revealOrder ? "null" : revealOrder; if ( + null != revealOrder && "forwards" !== revealOrder && + "backwards" !== revealOrder && "unstable_legacy-backwards" !== revealOrder && "together" !== revealOrder && "independent" !== revealOrder && !didWarnAboutRevealOrder[suspenseContext] ) if ( - ((didWarnAboutRevealOrder[suspenseContext] = !0), null == revealOrder) + ((didWarnAboutRevealOrder[suspenseContext] = !0), + "string" === typeof revealOrder) ) - console.error( - 'The default for the prop is changing. To be future compatible you must explictly specify either "independent" (the current default), "together", "forwards" or "legacy_unstable-backwards".' - ); - else if ("backwards" === revealOrder) - console.error( - 'The rendering order of is changing. To be future compatible you must specify revealOrder="legacy_unstable-backwards" instead.' - ); - else if ("string" === typeof revealOrder) switch (revealOrder.toLowerCase()) { case "together": case "forwards": @@ -8862,36 +9190,28 @@ __DEV__ && revealOrder ); suspenseContext = null == tailMode ? "null" : tailMode; - if (!didWarnAboutTailOptions[suspenseContext]) - if (null == tailMode) { - if ( - "forwards" === revealOrder || - "backwards" === revealOrder || - "unstable_legacy-backwards" === revealOrder - ) - (didWarnAboutTailOptions[suspenseContext] = !0), - console.error( - 'The default for the prop is changing. To be future compatible you must explictly specify either "visible" (the current default), "collapsed" or "hidden".' - ); - } else - "visible" !== tailMode && - "collapsed" !== tailMode && - "hidden" !== tailMode - ? ((didWarnAboutTailOptions[suspenseContext] = !0), - console.error( - '"%s" is not a supported value for tail on . Did you mean "visible", "collapsed" or "hidden"?', - tailMode - )) - : "forwards" !== revealOrder && - "backwards" !== revealOrder && - "unstable_legacy-backwards" !== revealOrder && - ((didWarnAboutTailOptions[suspenseContext] = !0), - console.error( - ' is only valid if revealOrder is "forwards" or "backwards". Did you mean to specify revealOrder="forwards"?', - tailMode - )); + didWarnAboutTailOptions[suspenseContext] || + null == tailMode || + ("visible" !== tailMode && + "collapsed" !== tailMode && + "hidden" !== tailMode + ? ((didWarnAboutTailOptions[suspenseContext] = !0), + console.error( + '"%s" is not a supported value for tail on . Did you mean "visible", "collapsed" or "hidden"?', + tailMode + )) + : null != revealOrder && + "forwards" !== revealOrder && + "backwards" !== revealOrder && + "unstable_legacy-backwards" !== revealOrder && + ((didWarnAboutTailOptions[suspenseContext] = !0), + console.error( + ' is only valid if revealOrder is "forwards" (default) or "backwards". Did you mean to specify revealOrder="forwards"?', + tailMode + ))); a: if ( - ("forwards" === revealOrder || + (null == revealOrder || + "forwards" === revealOrder || "backwards" === revealOrder || "unstable_legacy-backwards" === revealOrder) && void 0 !== nextProps && @@ -8930,7 +9250,11 @@ __DEV__ && 'A single row was passed to a . This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?', revealOrder ); - reconcileChildren(current, workInProgress, nextProps, renderLanes); + "backwards" === revealOrder && null !== current + ? (reverseChildren(current), + reconcileChildren(current, workInProgress, nextProps, renderLanes), + reverseChildren(current)) + : reconcileChildren(current, workInProgress, nextProps, renderLanes); if ( !shouldForceFallback && null !== current && @@ -8959,30 +9283,23 @@ __DEV__ && if (0 === (workInProgress.mode & 1)) workInProgress.memoizedState = null; else switch (revealOrder) { - case "forwards": - renderLanes = workInProgress.child; - for (revealOrder = null; null !== renderLanes; ) - (current = renderLanes.alternate), - null !== current && - null === findFirstSuspended(current) && - (revealOrder = renderLanes), - (renderLanes = renderLanes.sibling); - renderLanes = revealOrder; + case "backwards": + renderLanes = findLastContentRow(workInProgress.child); null === renderLanes ? ((revealOrder = workInProgress.child), (workInProgress.child = null)) : ((revealOrder = renderLanes.sibling), - (renderLanes.sibling = null)); + (renderLanes.sibling = null), + reverseChildren(workInProgress)); initSuspenseListRenderState( workInProgress, - !1, + !0, revealOrder, - renderLanes, + null, tailMode, 0 ); break; - case "backwards": case "unstable_legacy-backwards": renderLanes = null; revealOrder = workInProgress.child; @@ -9016,13 +9333,48 @@ __DEV__ && 0 ); break; - default: + case "independent": workInProgress.memoizedState = null; + break; + default: + (renderLanes = findLastContentRow(workInProgress.child)), + null === renderLanes + ? ((revealOrder = workInProgress.child), + (workInProgress.child = null)) + : ((revealOrder = renderLanes.sibling), + (renderLanes.sibling = null)), + initSuspenseListRenderState( + workInProgress, + !1, + revealOrder, + renderLanes, + tailMode, + 0 + ); } return workInProgress.child; } - function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) { - 0 === (workInProgress.mode & 1) && + function updateContextProvider(current, workInProgress, renderLanes) { + var context = workInProgress.type, + newProps = workInProgress.pendingProps, + newValue = newProps.value; + "value" in newProps || + hasWarnedAboutUsingNoValuePropOnContextProvider || + ((hasWarnedAboutUsingNoValuePropOnContextProvider = !0), + console.error( + "The `value` prop is required for the ``. Did you misspell it or forget to pass it?" + )); + pushProvider(workInProgress, context, newValue); + reconcileChildren( + current, + workInProgress, + newProps.children, + renderLanes + ); + return workInProgress.child; + } + function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) { + 0 === (workInProgress.mode & 1) && null !== current && ((current.alternate = null), (workInProgress.alternate = null), @@ -9128,7 +9480,14 @@ __DEV__ && (workInProgress.flags |= 128), null ); - if (0 !== (renderLanes & workInProgress.child.childLanes)) + stateNode = propagateParentContextChanges( + current, + workInProgress, + renderLanes, + !1 + ); + var primaryChildLanes = workInProgress.child.childLanes; + if (stateNode || 0 !== (renderLanes & primaryChildLanes)) return updateSuspenseComponent( current, workInProgress, @@ -9145,7 +9504,13 @@ __DEV__ && pushPrimaryTreeSuspenseHandler(workInProgress); break; case 19: - var didSuspendBefore = 0 !== (current.flags & 128); + if (workInProgress.flags & 128) + return updateSuspenseListComponent( + current, + workInProgress, + renderLanes + ); + primaryChildLanes = 0 !== (current.flags & 128); stateNode = 0 !== (renderLanes & workInProgress.childLanes); stateNode || (propagateParentContextChanges( @@ -9155,7 +9520,7 @@ __DEV__ && !1 ), (stateNode = 0 !== (renderLanes & workInProgress.childLanes))); - if (didSuspendBefore) { + if (primaryChildLanes) { if (stateNode) return updateSuspenseListComponent( current, @@ -9164,16 +9529,12 @@ __DEV__ && ); workInProgress.flags |= 128; } - didSuspendBefore = workInProgress.memoizedState; - null !== didSuspendBefore && - ((didSuspendBefore.rendering = null), - (didSuspendBefore.tail = null), - (didSuspendBefore.lastEffect = null)); - push( - suspenseStackCursor, - suspenseStackCursor.current, - workInProgress - ); + primaryChildLanes = workInProgress.memoizedState; + null !== primaryChildLanes && + ((primaryChildLanes.rendering = null), + (primaryChildLanes.tail = null), + (primaryChildLanes.lastEffect = null)); + pushSuspenseListContext(workInProgress, suspenseStackCursor.current); if (stateNode) break; else return null; case 22: @@ -9198,7 +9559,7 @@ __DEV__ && function beginWork(current, workInProgress, renderLanes) { if (workInProgress._debugNeedsRemount && null !== current) { renderLanes = createFiberFromTypeAndProps( - workInProgress.type, + resolveTypeForHotReloading(workInProgress.elementType), workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, @@ -9231,7 +9592,7 @@ __DEV__ && null === workInProgress ? ((returnFiber.deletions = [current]), (returnFiber.flags |= 16)) : workInProgress.push(current); - renderLanes.flags |= 2; + renderLanes.flags |= 134217730; return renderLanes; } if (null !== current) @@ -9264,6 +9625,7 @@ __DEV__ && resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress), (returnFiber = workInProgress.pendingProps), (current = resolveLazy(prevSibling)), + (current = resolveTypeForHotReloading(current)), (workInProgress.type = current), "function" === typeof current) ) @@ -9273,8 +9635,6 @@ __DEV__ && returnFiber )), (workInProgress.tag = 1), - (workInProgress.type = current = - resolveFunctionForHotReloading(current)), (workInProgress = updateClassComponent( null, workInProgress, @@ -9284,8 +9644,6 @@ __DEV__ && ))) : ((workInProgress.tag = 0), validateFunctionComponentInDev(workInProgress, current), - (workInProgress.type = current = - resolveFunctionForHotReloading(current)), (workInProgress = updateFunctionComponent( null, workInProgress, @@ -9300,8 +9658,6 @@ __DEV__ && prevSibling === REACT_FORWARD_REF_TYPE) ) { workInProgress.tag = 11; - workInProgress.type = current = - resolveForwardRefForHotReloading(current); workInProgress = updateForwardRef( null, workInProgress, @@ -9320,6 +9676,15 @@ __DEV__ && renderLanes ); break a; + } else if (prevSibling === REACT_CONTEXT_TYPE) { + workInProgress.tag = 10; + workInProgress.type = current; + workInProgress = updateContextProvider( + null, + workInProgress, + renderLanes + ); + break a; } workInProgress = ""; null !== current && @@ -9458,10 +9823,12 @@ __DEV__ && ); case 7: return ( + (returnFiber = workInProgress.pendingProps), + markRef(current, workInProgress), reconcileChildren( current, workInProgress, - workInProgress.pendingProps, + returnFiber, renderLanes ), workInProgress.child @@ -9492,25 +9859,7 @@ __DEV__ && workInProgress.child ); case 10: - return ( - (returnFiber = workInProgress.type), - (prevSibling = workInProgress.pendingProps), - (nextProps = prevSibling.value), - "value" in prevSibling || - hasWarnedAboutUsingNoValuePropOnContextProvider || - ((hasWarnedAboutUsingNoValuePropOnContextProvider = !0), - console.error( - "The `value` prop is required for the ``. Did you misspell it or forget to pass it?" - )), - pushProvider(workInProgress, returnFiber, nextProps), - reconcileChildren( - current, - workInProgress, - prevSibling.children, - renderLanes - ), - workInProgress.child - ); + return updateContextProvider(current, workInProgress, renderLanes); case 9: return ( (prevSibling = workInProgress.type._context), @@ -9642,22 +9991,24 @@ __DEV__ && ); nextProps = 0 !== (renderLanes & current.childLanes); if (didReceiveUpdate || nextProps) { - prevSibling = workInProgressRoot; - if ( - null !== prevSibling && - ((nextProps = getBumpedLaneForHydration( - prevSibling, - renderLanes - )), - 0 !== nextProps && nextProps !== returnFiber.retryLane) - ) - throw ( - ((returnFiber.retryLane = nextProps), - enqueueConcurrentRenderForLane(current, nextProps), - scheduleUpdateOnFiber(prevSibling, current, nextProps), - SelectiveHydrationException) - ); - renderDidSuspendDelayIfPossible(); + if (null === currentTreeHiddenStackCursor.current) { + prevSibling = workInProgressRoot; + if ( + null !== prevSibling && + ((nextProps = getBumpedLaneForHydration( + prevSibling, + renderLanes + )), + 0 !== nextProps && nextProps !== returnFiber.retryLane) + ) + throw ( + ((returnFiber.retryLane = nextProps), + enqueueConcurrentRenderForLane(current, nextProps), + scheduleUpdateOnFiber(prevSibling, current, nextProps), + SelectiveHydrationException) + ); + renderDidSuspendDelayIfPossible(); + } workInProgress = retryActivityComponentWithoutHydrating( current, workInProgress, @@ -9668,7 +10019,7 @@ __DEV__ && workInProgress, prevSibling )), - (workInProgress.flags |= 4096); + (workInProgress.flags |= 134221824); } else (returnFiber = current.child), @@ -9746,6 +10097,42 @@ __DEV__ && ), workInProgress.child ); + case 30: + return ( + null === workInProgress.stateNode && + (workInProgress.stateNode = { + autoName: null, + paired: null, + clones: null, + ref: null + }), + (returnFiber = workInProgress.pendingProps), + null != returnFiber.name && + "auto" !== returnFiber.name && + (workInProgress.flags |= null === current ? 18882560 : 18874368), + void 0 !== returnFiber.className && + ((prevSibling = + "string" === typeof returnFiber.className + ? JSON.stringify(returnFiber.className) + : "{...}"), + didWarnAboutClassNameOnViewTransition[prevSibling] || + ((didWarnAboutClassNameOnViewTransition[prevSibling] = !0), + console.error( + ' doesn\'t accept a "className" prop. It has been renamed to "default".\n- \n+ ', + prevSibling, + prevSibling + ))), + null !== current && current.memoizedProps.name !== returnFiber.name + ? (workInProgress.flags |= 4194816) + : markRef(current, workInProgress), + reconcileChildren( + current, + workInProgress, + returnFiber.children, + renderLanes + ), + workInProgress.child + ); case 29: throw workInProgress.pendingProps; } @@ -9866,26 +10253,31 @@ __DEV__ && } function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { switch (renderState.tailMode) { - case "hidden": - hasRenderedATailFallback = renderState.tail; - for (var lastTailNode = null; null !== hasRenderedATailFallback; ) - null !== hasRenderedATailFallback.alternate && - (lastTailNode = hasRenderedATailFallback), - (hasRenderedATailFallback = hasRenderedATailFallback.sibling); - null === lastTailNode - ? (renderState.tail = null) - : (lastTailNode.sibling = null); + case "visible": break; case "collapsed": - lastTailNode = renderState.tail; - for (var _lastTailNode = null; null !== lastTailNode; ) - null !== lastTailNode.alternate && (_lastTailNode = lastTailNode), - (lastTailNode = lastTailNode.sibling); - null === _lastTailNode + for ( + var tailNode = renderState.tail, lastTailNode = null; + null !== tailNode; + + ) + null !== tailNode.alternate && (lastTailNode = tailNode), + (tailNode = tailNode.sibling); + null === lastTailNode ? hasRenderedATailFallback || null === renderState.tail ? (renderState.tail = null) : (renderState.tail.sibling = null) - : (_lastTailNode.sibling = null); + : (lastTailNode.sibling = null); + break; + default: + hasRenderedATailFallback = renderState.tail; + for (tailNode = null; null !== hasRenderedATailFallback; ) + null !== hasRenderedATailFallback.alternate && + (tailNode = hasRenderedATailFallback), + (hasRenderedATailFallback = hasRenderedATailFallback.sibling); + null === tailNode + ? (renderState.tail = null) + : (tailNode.sibling = null); } } function bubbleProperties(completedWork) { @@ -9903,8 +10295,8 @@ __DEV__ && ) (newChildLanes |= _child2.lanes | _child2.childLanes), - (subtreeFlags |= _child2.subtreeFlags & 65011712), - (subtreeFlags |= _child2.flags & 65011712), + (subtreeFlags |= _child2.subtreeFlags & 1206910976), + (subtreeFlags |= _child2.flags & 1206910976), (_treeBaseDuration += _child2.treeBaseDuration), (_child2 = _child2.sibling); completedWork.treeBaseDuration = _treeBaseDuration; @@ -9916,8 +10308,8 @@ __DEV__ && ) (newChildLanes |= _treeBaseDuration.lanes | _treeBaseDuration.childLanes), - (subtreeFlags |= _treeBaseDuration.subtreeFlags & 65011712), - (subtreeFlags |= _treeBaseDuration.flags & 65011712), + (subtreeFlags |= _treeBaseDuration.subtreeFlags & 1206910976), + (subtreeFlags |= _treeBaseDuration.flags & 1206910976), (_treeBaseDuration.return = completedWork), (_treeBaseDuration = _treeBaseDuration.sibling); else if (0 !== (completedWork.mode & 2)) { @@ -10001,7 +10393,7 @@ __DEV__ && requiredContext(contextStackCursor.current); b: { var keepChildren = !current; - _type2 = ReactNativePrivateInterface.diffAttributePayloads( + _type2 = reactPrivateInterface.diffAttributePayloads( _type2, newProps, renderLanes.canonical.viewConfig.validAttributes @@ -10036,19 +10428,19 @@ __DEV__ && "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); bubbleProperties(workInProgress); + workInProgress.subtreeFlags &= -33554433; return null; } requiredContext(contextStackCursor.current); current = requiredContext(rootInstanceStackCursor.current); - renderLanes = nextReactTag; - nextReactTag += 2; + renderLanes = allocateTag(); _type2 = getViewConfigForType(_type2); for (keepChildren in _type2.validAttributes) newProps.hasOwnProperty(keepChildren) && - ReactNativePrivateInterface.deepFreezeAndThrowOnMutationInDev( + reactPrivateInterface.deepFreezeAndThrowOnMutationInDev( newProps[keepChildren] ); - keepChildren = ReactNativePrivateInterface.createAttributePayload( + keepChildren = reactPrivateInterface.createAttributePayload( newProps, _type2.validAttributes ); @@ -10074,6 +10466,7 @@ __DEV__ && workInProgress.stateNode = current; } bubbleProperties(workInProgress); + workInProgress.subtreeFlags &= -33554433; workInProgress.flags &= -16777217; return null; case 6: @@ -10232,6 +10625,7 @@ __DEV__ && return ( popHostContainer(workInProgress), updateHostContainer(current, workInProgress), + (workInProgress.flags |= 67108864), bubbleProperties(workInProgress), null ); @@ -10244,14 +10638,13 @@ __DEV__ && case 17: return bubbleProperties(workInProgress), null; case 19: - pop(suspenseStackCursor, workInProgress); - keepChildren = workInProgress.memoizedState; - if (null === keepChildren) - return bubbleProperties(workInProgress), null; - newProps = 0 !== (workInProgress.flags & 128); - _type2 = keepChildren.rendering; + popSuspenseListContext(workInProgress); + newProps = workInProgress.memoizedState; + if (null === newProps) return bubbleProperties(workInProgress), null; + keepChildren = 0 !== (workInProgress.flags & 128); + _type2 = newProps.rendering; if (null === _type2) - if (newProps) cutOffTailIfNeeded(keepChildren, !1); + if (keepChildren) cutOffTailIfNeeded(newProps, !1); else { if ( workInProgressRootExitStatus !== RootInProgress || @@ -10261,7 +10654,7 @@ __DEV__ && _type2 = findFirstSuspended(current); if (null !== _type2) { workInProgress.flags |= 128; - cutOffTailIfNeeded(keepChildren, !1); + cutOffTailIfNeeded(newProps, !1); current = _type2.updateQueue; workInProgress.updateQueue = current; scheduleRetryEffect(workInProgress, current); @@ -10270,71 +10663,90 @@ __DEV__ && for (newProps = workInProgress.child; null !== newProps; ) resetWorkInProgress(newProps, current), (newProps = newProps.sibling); - push( - suspenseStackCursor, + pushSuspenseListContext( + workInProgress, (suspenseStackCursor.current & SubtreeSuspenseContextMask) | - ForceSuspenseFallback, - workInProgress + ForceSuspenseFallback ); return workInProgress.child; } current = current.sibling; } - null !== keepChildren.tail && + null !== newProps.tail && now$1() > workInProgressRootRenderTargetTime && ((workInProgress.flags |= 128), - (newProps = !0), - cutOffTailIfNeeded(keepChildren, !1), + (keepChildren = !0), + cutOffTailIfNeeded(newProps, !1), (workInProgress.lanes = 4194304)); } else { - if (!newProps) + if (!keepChildren) if (((current = findFirstSuspended(_type2)), null !== current)) { if ( ((workInProgress.flags |= 128), - (newProps = !0), + (keepChildren = !0), (current = current.updateQueue), (workInProgress.updateQueue = current), scheduleRetryEffect(workInProgress, current), - cutOffTailIfNeeded(keepChildren, !0), - null === keepChildren.tail && - "hidden" === keepChildren.tailMode && + cutOffTailIfNeeded(newProps, !0), + null === newProps.tail && + "collapsed" !== newProps.tailMode && + "visible" !== newProps.tailMode && !_type2.alternate) ) return bubbleProperties(workInProgress), null; } else - 2 * now$1() - keepChildren.renderingStartTime > + 2 * now$1() - newProps.renderingStartTime > workInProgressRootRenderTargetTime && 536870912 !== renderLanes && ((workInProgress.flags |= 128), - (newProps = !0), - cutOffTailIfNeeded(keepChildren, !1), + (keepChildren = !0), + cutOffTailIfNeeded(newProps, !1), (workInProgress.lanes = 4194304)); - keepChildren.isBackwards + newProps.isBackwards ? ((_type2.sibling = workInProgress.child), (workInProgress.child = _type2)) - : ((current = keepChildren.last), + : ((current = newProps.last), null !== current ? (current.sibling = _type2) : (workInProgress.child = _type2), - (keepChildren.last = _type2)); + (newProps.last = _type2)); + } + if (null !== newProps.tail) { + current = newProps.tail; + a: { + for (renderLanes = current; null !== renderLanes; ) { + if (null !== renderLanes.alternate) { + renderLanes = !1; + break a; + } + renderLanes = renderLanes.sibling; + } + renderLanes = !0; + } + newProps.rendering = current; + newProps.tail = current.sibling; + newProps.renderingStartTime = now$1(); + current.sibling = null; + _type2 = suspenseStackCursor.current; + _type2 = keepChildren + ? (_type2 & SubtreeSuspenseContextMask) | ForceSuspenseFallback + : _type2 & SubtreeSuspenseContextMask; + "visible" !== newProps.tailMode && + "collapsed" !== newProps.tailMode && + renderLanes + ? ((newProps = _type2), + push( + suspenseHandlerStackCursor, + workInProgress, + workInProgress + ), + push(suspenseStackCursor, newProps, workInProgress), + null === shellBoundary && (shellBoundary = workInProgress)) + : pushSuspenseListContext(workInProgress, _type2); + return current; } - if (null !== keepChildren.tail) - return ( - (current = keepChildren.tail), - (keepChildren.rendering = current), - (keepChildren.tail = current.sibling), - (keepChildren.renderingStartTime = now$1()), - (current.sibling = null), - (renderLanes = suspenseStackCursor.current), - (renderLanes = newProps - ? (renderLanes & SubtreeSuspenseContextMask) | - ForceSuspenseFallback - : renderLanes & SubtreeSuspenseContextMask), - push(suspenseStackCursor, renderLanes, workInProgress), - current - ); bubbleProperties(workInProgress); return null; case 22: @@ -10383,7 +10795,11 @@ __DEV__ && case 25: return null; case 30: - return null; + return ( + (workInProgress.flags |= 33554432), + bubbleProperties(workInProgress), + null + ); case 29: return null; } @@ -10454,7 +10870,18 @@ __DEV__ && workInProgress) : null; case 19: - return pop(suspenseStackCursor, workInProgress), null; + return ( + popSuspenseListContext(workInProgress), + (current = workInProgress.flags), + current & 65536 + ? ((workInProgress.flags = (current & -65537) | 128), + (current = workInProgress.memoizedState), + null !== current && + ((current.rendering = null), (current.tail = null)), + (workInProgress.flags |= 4), + workInProgress) + : null + ); case 4: return popHostContainer(workInProgress), null; case 10: @@ -10503,7 +10930,7 @@ __DEV__ && popSuspenseHandler(interruptedWork); break; case 19: - pop(suspenseStackCursor, interruptedWork); + popSuspenseListContext(interruptedWork); break; case 10: popProvider(interruptedWork.type, interruptedWork); @@ -10795,6 +11222,27 @@ __DEV__ && break; case 30: instanceToUse = finishedWork.stateNode; + var name = getViewTransitionName( + finishedWork.memoizedProps, + instanceToUse + ); + if (null === instanceToUse.ref || instanceToUse.ref.name !== name) + instanceToUse.ref = createViewTransitionInstance(name); + instanceToUse = instanceToUse.ref; + break; + case 7: + null === finishedWork.stateNode && + ((instanceToUse = new FragmentInstance(finishedWork)), + traverseVisibleInstancesAndTextInstances( + finishedWork.child, + !1, + addFragmentHandleToFiber, + instanceToUse, + void 0, + void 0 + ), + (finishedWork.stateNode = instanceToUse)); + instanceToUse = finishedWork.stateNode; break; default: instanceToUse = finishedWork.stateNode; @@ -10903,6 +11351,39 @@ __DEV__ && commitStartTime ); } + function pushMutationContext() { + var prev = viewTransitionMutationContext; + viewTransitionMutationContext = !1; + return prev; + } + function commitFragmentInstanceInsertionEffects(fiber) { + for (var parent = fiber.return; null !== parent; ) { + isFragmentInstanceParent(parent) && + commitNewChildToFragmentInstance(fiber.stateNode, parent.stateNode); + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } + } + function commitFragmentInstanceDeletionEffects(fiber) { + for (var parent = fiber.return; null !== parent; ) { + if (isFragmentInstanceParent(parent)) { + var childInstance = fiber.stateNode, + fragmentInstance = parent.stateNode; + null != childInstance.canonical && + ((childInstance = getPublicInstance(childInstance)), + null != childInstance.reactFragments && + childInstance.reactFragments.delete(fragmentInstance)); + } + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } + } + function isFragmentInstanceHostBoundary(fiber) { + return 5 === fiber.tag || 3 === fiber.tag || !1; + } + function isFragmentInstanceParent(fiber) { + return fiber && 7 === fiber.tag && null !== fiber.stateNode; + } function commitHostMount(finishedWork) { var type = finishedWork.type, props = finishedWork.memoizedProps, @@ -10920,7 +11401,62 @@ __DEV__ && captureCommitPhaseError(finishedWork, finishedWork.return, error); } } - function commitPlacement() {} + function commitPlacement(finishedWork) { + for ( + var parentFragmentInstances = null, parent = finishedWork.return; + null !== parent; + + ) { + if (isFragmentInstanceParent(parent)) { + var fragmentInstance = parent.stateNode; + null === parentFragmentInstances + ? (parentFragmentInstances = [fragmentInstance]) + : parentFragmentInstances.push(fragmentInstance); + } + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ); + } + function commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ) { + if (5 === finishedWork.tag) { + if ( + (5 === finishedWork.tag || + 27 === finishedWork.tag || + 6 === finishedWork.tag) && + null === finishedWork.alternate && + null !== parentFragmentInstances + ) + for (var i = 0; i < parentFragmentInstances.length; i++) + commitNewChildToFragmentInstance( + finishedWork.stateNode, + parentFragmentInstances[i] + ); + } else if ( + 4 !== finishedWork.tag && + ((finishedWork = finishedWork.child), null !== finishedWork) + ) + for ( + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ), + finishedWork = finishedWork.sibling; + null !== finishedWork; + + ) + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ), + (finishedWork = finishedWork.sibling); + } function commitHostPortalContainerChildren( portal, finishedWork, @@ -10938,6 +11474,230 @@ __DEV__ && captureCommitPhaseError(finishedWork, finishedWork.return, error); } } + function trackEnterViewTransitions(placement) { + if (30 === placement.tag || 0 !== (placement.subtreeFlags & 33554432)) + shouldStartViewTransition = !0; + } + function pushViewTransitionCancelableScope() { + var prevChildren = viewTransitionCancelableChildren; + viewTransitionCancelableChildren = null; + return prevChildren; + } + function applyViewTransitionToHostInstances() { + viewTransitionHostInstanceIdx = 0; + return !1; + } + function commitAppearingPairViewTransitions(placement) { + if (0 !== (placement.subtreeFlags & 18874368)) + for (placement = placement.child; null !== placement; ) { + if (22 !== placement.tag || null === placement.memoizedState) + if ( + (commitAppearingPairViewTransitions(placement), + 30 === placement.tag && + 0 !== (placement.flags & 18874368) && + placement.stateNode.paired) + ) { + var props = placement.memoizedProps; + if (null == props.name || "auto" === props.name) + throw Error( + "Found a pair with an auto name. This is a bug in React." + ); + "none" !== + getViewTransitionClassName(props.default, props.share) && + applyViewTransitionToHostInstances(placement); + } + placement = placement.sibling; + } + } + function commitEnterViewTransitions(placement, gesture) { + if (30 === placement.tag) { + var state = placement.stateNode, + props = placement.memoizedProps; + getViewTransitionName(props, state); + "none" !== + getViewTransitionClassName( + props.default, + state.paired ? props.share : props.enter + ) + ? applyViewTransitionToHostInstances(placement) && + (commitAppearingPairViewTransitions(placement), + state.paired || + gesture || + scheduleViewTransitionEvent(placement, props.onEnter)) + : commitAppearingPairViewTransitions(placement); + } else if (0 !== (placement.subtreeFlags & 33554432)) + for (placement = placement.child; null !== placement; ) + commitEnterViewTransitions(placement, gesture), + (placement = placement.sibling); + else commitAppearingPairViewTransitions(placement); + } + function commitDeletedPairViewTransitions(deletion) { + if ( + null !== appearingViewTransitions && + 0 !== appearingViewTransitions.size + ) { + var pairs = appearingViewTransitions; + if (0 !== (deletion.subtreeFlags & 18874368)) + for (deletion = deletion.child; null !== deletion; ) { + if (22 !== deletion.tag || null === deletion.memoizedState) { + if (30 === deletion.tag && 0 !== (deletion.flags & 18874368)) { + var props = deletion.memoizedProps, + name = props.name; + if (null != name && "auto" !== name) { + var pair = pairs.get(name); + if (void 0 !== pair) { + if ( + "none" !== + getViewTransitionClassName( + props.default, + props.share + ) && + applyViewTransitionToHostInstances(deletion) + ) { + var oldInstance = deletion.stateNode; + pair.paired = oldInstance; + oldInstance.paired = pair; + scheduleViewTransitionEvent(deletion, props.onShare); + } + pairs.delete(name); + if (0 === pairs.size) break; + } + } + } + commitDeletedPairViewTransitions(deletion); + } + deletion = deletion.sibling; + } + } + } + function commitExitViewTransitions(deletion) { + if (30 === deletion.tag) { + var props = deletion.memoizedProps, + name = getViewTransitionName(props, deletion.stateNode), + pair = + null !== appearingViewTransitions + ? appearingViewTransitions.get(name) + : void 0; + if ( + "none" !== + getViewTransitionClassName( + props.default, + void 0 !== pair ? props.share : props.exit + ) && + applyViewTransitionToHostInstances(deletion) + ) + if (void 0 !== pair) { + var oldInstance = deletion.stateNode; + pair.paired = oldInstance; + oldInstance.paired = pair; + appearingViewTransitions.delete(name); + scheduleViewTransitionEvent(deletion, props.onShare); + } else scheduleViewTransitionEvent(deletion, props.onExit); + null !== appearingViewTransitions && + commitDeletedPairViewTransitions(deletion); + } else if (0 !== (deletion.subtreeFlags & 33554432)) + for (deletion = deletion.child; null !== deletion; ) + commitExitViewTransitions(deletion), (deletion = deletion.sibling); + else + null !== appearingViewTransitions && + commitDeletedPairViewTransitions(deletion); + } + function commitNestedViewTransitions(changedParent) { + for (changedParent = changedParent.child; null !== changedParent; ) { + if (30 === changedParent.tag) { + var props = changedParent.memoizedProps, + name = getViewTransitionName(props, changedParent.stateNode); + props = getViewTransitionClassName(props.default, props.update); + changedParent.flags &= -5; + "none" !== props && + applyViewTransitionToHostInstances( + changedParent, + name, + props, + (changedParent.memoizedState = []) + ); + } else + 0 !== (changedParent.subtreeFlags & 33554432) && + commitNestedViewTransitions(changedParent); + changedParent = changedParent.sibling; + } + } + function restorePairedViewTransitions(parent) { + if (0 !== (parent.subtreeFlags & 18874368)) + for (parent = parent.child; null !== parent; ) { + if (22 !== parent.tag || null === parent.memoizedState) { + if (30 === parent.tag && 0 !== (parent.flags & 18874368)) { + var instance = parent.stateNode; + null !== instance.paired && (instance.paired = null); + } + restorePairedViewTransitions(parent); + } + parent = parent.sibling; + } + } + function restoreEnterOrExitViewTransitions(fiber) { + if (30 === fiber.tag) + (fiber.stateNode.paired = null), restorePairedViewTransitions(fiber); + else if (0 !== (fiber.subtreeFlags & 33554432)) + for (fiber = fiber.child; null !== fiber; ) + restoreEnterOrExitViewTransitions(fiber), (fiber = fiber.sibling); + else restorePairedViewTransitions(fiber); + } + function measureNestedViewTransitions(changedParent, gesture) { + for (changedParent = changedParent.child; null !== changedParent; ) { + if (30 === changedParent.tag) { + var props = changedParent.memoizedProps, + state = changedParent.stateNode; + getViewTransitionName(props, state); + getViewTransitionClassName(props.default, props.update); + gesture + ? ((props = state.clones), + null !== props && props.map(measureClonedInstance)) + : (changedParent.memoizedState = null); + viewTransitionHostInstanceIdx = 0; + } else + 0 !== (changedParent.subtreeFlags & 33554432) && + measureNestedViewTransitions(changedParent, gesture); + changedParent = changedParent.sibling; + } + } + function trackNamedViewTransition(fiber) { + var name = fiber.memoizedProps.name; + if (null != name && "auto" !== name) { + var existing = mountedNamedViewTransitions.get(name); + if (void 0 !== existing) { + if ( + existing !== fiber && + existing !== fiber.alternate && + !didWarnAboutName[name] + ) { + didWarnAboutName[name] = !0; + var stringifiedName = JSON.stringify(name); + runWithFiberInDEV(fiber, function () { + console.error( + "There are two components with the same name mounted at the same time. This is not supported and will cause View Transitions to error. Try to use a more unique name e.g. by using a namespace prefix and adding the id of an item to the name.", + stringifiedName + ); + }); + runWithFiberInDEV(existing, function () { + console.error( + "The existing duplicate has this stack trace.", + stringifiedName + ); + }); + } + } else mountedNamedViewTransitions.set(name, fiber); + } + } + function untrackNamedViewTransition(fiber) { + var name = fiber.memoizedProps.name; + if (null != name && "auto" !== name) { + var existing = mountedNamedViewTransitions.get(name); + void 0 === existing || + (existing !== fiber && existing !== fiber.alternate) || + mountedNamedViewTransitions.delete(name); + } + } function isHydratingParent(current, finishedWork) { return 31 === finishedWork.tag ? ((finishedWork = finishedWork.memoizedState), @@ -10953,62 +11713,113 @@ __DEV__ && 0 === (finishedWork.flags & 256) : !1; } - function commitBeforeMutationEffects(root, firstChild) { - for (nextEffect = firstChild; null !== nextEffect; ) + function commitBeforeMutationEffects(root, firstChild, committedLanes) { + root = (committedLanes & 335544064) === committedLanes; + nextEffect = firstChild; + for (firstChild = root ? 9270 : 1024; null !== nextEffect; ) { + committedLanes = nextEffect; + if (root) { + var deletions = committedLanes.deletions; + if (null !== deletions) + for (var i = 0; i < deletions.length; i++) + root && commitExitViewTransitions(deletions[i]); + } if ( - ((root = nextEffect), - (firstChild = root.child), - 0 !== (root.subtreeFlags & 1028) && null !== firstChild) + null === committedLanes.alternate && + 0 !== (committedLanes.flags & 2) ) - (firstChild.return = root), (nextEffect = firstChild); - else - for (; null !== nextEffect; ) { - firstChild = root = nextEffect; - var current = firstChild.alternate, - flags = firstChild.flags; - switch (firstChild.tag) { - case 0: - if ( - 0 !== (flags & 4) && - ((firstChild = firstChild.updateQueue), - (firstChild = null !== firstChild ? firstChild.events : null), - null !== firstChild) - ) - for (current = 0; current < firstChild.length; current++) - (flags = firstChild[current]), - (flags.ref.impl = flags.nextImpl); - break; - case 11: - case 15: - break; - case 1: - 0 !== (flags & 1024) && - null !== current && - commitClassSnapshot(firstChild, current); - break; - case 3: - break; - case 5: - case 26: - case 27: - case 6: - case 4: - case 17: - break; - default: - if (0 !== (flags & 1024)) - throw Error( - "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." - ); - } - firstChild = root.sibling; - if (null !== firstChild) { - firstChild.return = root.return; - nextEffect = firstChild; - break; + root && trackEnterViewTransitions(committedLanes), + commitBeforeMutationEffects_complete(root); + else { + if (22 === committedLanes.tag && 0 !== (committedLanes.mode & 1)) + if ( + ((deletions = committedLanes.alternate), + null !== committedLanes.memoizedState) + ) { + null !== deletions && + null === deletions.memoizedState && + root && + commitExitViewTransitions(deletions); + commitBeforeMutationEffects_complete(root); + continue; + } else if (null !== deletions && null !== deletions.memoizedState) { + root && trackEnterViewTransitions(committedLanes); + commitBeforeMutationEffects_complete(root); + continue; } - nextEffect = root.return; - } + deletions = committedLanes.child; + 0 !== (committedLanes.subtreeFlags & firstChild) && null !== deletions + ? ((deletions.return = committedLanes), (nextEffect = deletions)) + : (root && commitNestedViewTransitions(committedLanes), + commitBeforeMutationEffects_complete(root)); + } + } + appearingViewTransitions = null; + } + function commitBeforeMutationEffects_complete( + isViewTransitionEligible$jscomp$0 + ) { + for (; null !== nextEffect; ) { + var fiber = nextEffect, + finishedWork = fiber, + isViewTransitionEligible = isViewTransitionEligible$jscomp$0, + current = finishedWork.alternate, + flags = finishedWork.flags; + switch (finishedWork.tag) { + case 0: + case 11: + case 15: + break; + case 1: + 0 !== (flags & 1024) && + null !== current && + commitClassSnapshot(finishedWork, current); + break; + case 3: + break; + case 5: + case 26: + case 27: + case 6: + case 4: + case 17: + break; + case 30: + isViewTransitionEligible && + null !== current && + ((isViewTransitionEligible = current), + (current = finishedWork), + (finishedWork = getViewTransitionName( + isViewTransitionEligible.memoizedProps, + isViewTransitionEligible.stateNode + )), + (current = current.memoizedProps), + (current = getViewTransitionClassName( + current.default, + current.update + )), + "none" !== current && + applyViewTransitionToHostInstances( + isViewTransitionEligible, + finishedWork, + current, + (isViewTransitionEligible.memoizedState = []) + )); + break; + default: + if (0 !== (flags & 1024)) + throw Error( + "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." + ); + } + isViewTransitionEligible = fiber.sibling; + if (null !== isViewTransitionEligible) { + isViewTransitionEligible.return = fiber.return; + nextEffect = isViewTransitionEligible; + break; + } + nextEffect = fiber.return; + } } function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { var prevEffectStart = pushComponentEffectStart(), @@ -11199,18 +12010,21 @@ __DEV__ && offscreenSubtreeIsHidden), !flags) ) { - current = + var newOffscreenSubtreeWasHidden = (null !== current && null !== current.memoizedState) || offscreenSubtreeWasHidden; - prevProps = offscreenSubtreeIsHidden; - var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; + current = offscreenSubtreeIsHidden; + prevProps = offscreenSubtreeWasHidden; offscreenSubtreeIsHidden = flags; - (offscreenSubtreeWasHidden = current) && - !prevOffscreenSubtreeWasHidden - ? (recursivelyTraverseReappearLayoutEffects( + (offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden) && + !prevProps + ? ((flags = NoLayoutEffectTraversalFlags), + 0 !== (finishedWork.subtreeFlags & 8772) && + (flags |= IncludeWorkInProgressEffects), + recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - 0 !== (finishedWork.subtreeFlags & 8772) + flags ), 0 !== (finishedWork.mode & 2) && 0 <= componentEffectStartTime && @@ -11222,13 +12036,18 @@ __DEV__ && componentEffectEndTime )) : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); - offscreenSubtreeIsHidden = prevProps; - offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; + offscreenSubtreeIsHidden = current; + offscreenSubtreeWasHidden = prevProps; } } else recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); break; case 30: + flags & 18874368 && trackNamedViewTransition(finishedWork); + recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); + flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); break; + case 7: + flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); default: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); } @@ -11320,8 +12139,11 @@ __DEV__ && case 27: case 5: offscreenSubtreeWasHidden || - safelyDetachRef(deletedFiber, nearestMountedAncestor); + safelyDetachRef(deletedFiber, nearestMountedAncestor), + commitFragmentInstanceDeletionEffects(deletedFiber); case 6: + 6 === deletedFiber.tag && + commitFragmentInstanceDeletionEffects(deletedFiber); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, @@ -11346,12 +12168,11 @@ __DEV__ && case 11: case 14: case 15: - offscreenSubtreeWasHidden || - commitHookEffectListUnmount( - Insertion, - deletedFiber, - nearestMountedAncestor - ); + commitHookEffectListUnmount( + Insertion, + deletedFiber, + nearestMountedAncestor + ); offscreenSubtreeWasHidden || commitHookLayoutUnmountEffects( deletedFiber, @@ -11405,6 +12226,25 @@ __DEV__ && deletedFiber ); break; + case 30: + deletedFiber.flags & 18874368 && + untrackNamedViewTransition(deletedFiber); + safelyDetachRef(deletedFiber, nearestMountedAncestor); + recursivelyTraverseDeletionEffects( + finishedRoot, + nearestMountedAncestor, + deletedFiber + ); + break; + case 7: + offscreenSubtreeWasHidden || + safelyDetachRef(deletedFiber, nearestMountedAncestor); + recursivelyTraverseDeletionEffects( + finishedRoot, + nearestMountedAncestor, + deletedFiber + ); + break; default: recursivelyTraverseDeletionEffects( finishedRoot, @@ -11470,7 +12310,11 @@ __DEV__ && } }); } - function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) { + function recursivelyTraverseMutationEffects( + root$jscomp$0, + parentFiber, + lanes + ) { var deletions = parentFiber.deletions; if (null !== deletions) for (var i = 0; i < deletions.length; i++) { @@ -11497,10 +12341,10 @@ __DEV__ && } if (parentFiber.subtreeFlags & 13886) for (parentFiber = parentFiber.child; null !== parentFiber; ) - commitMutationEffectsOnFiber(parentFiber, root$jscomp$0), + commitMutationEffectsOnFiber(parentFiber, root$jscomp$0, lanes), (parentFiber = parentFiber.sibling); } - function commitMutationEffectsOnFiber(finishedWork, root) { + function commitMutationEffectsOnFiber(finishedWork, root, lanes) { var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), @@ -11512,7 +12356,17 @@ __DEV__ && case 11: case 14: case 15: - recursivelyTraverseMutationEffects(root, finishedWork); + if ( + flags & 4 && + ((current = finishedWork.updateQueue), + (current = null !== current ? current.events : null), + null !== current) + ) + for (var ii = 0; ii < current.length; ii++) { + var _eventPayloads$ii2 = current[ii]; + _eventPayloads$ii2.ref.impl = _eventPayloads$ii2.nextImpl; + } + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && (commitHookEffectListUnmount( @@ -11528,7 +12382,7 @@ __DEV__ && )); break; case 1: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || @@ -11538,16 +12392,16 @@ __DEV__ && offscreenSubtreeIsHidden && ((root = finishedWork.updateQueue), null !== root && - ((flags = root.callbacks), - null !== flags && - ((current = root.shared.hiddenCallbacks), + ((lanes = root.callbacks), + null !== lanes && + ((flags = root.shared.hiddenCallbacks), (root.shared.hiddenCallbacks = - null === current ? flags : current.concat(flags))))); + null === flags ? lanes : flags.concat(lanes))))); break; case 26: case 27: case 5: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || @@ -11557,32 +12411,40 @@ __DEV__ && (finishedWork.alternate.stateNode = finishedWork.stateNode); break; case 6: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); break; case 3: current = pushNestedEffectDurations(); - recursivelyTraverseMutationEffects(root, finishedWork); + viewTransitionMutationContext = !1; + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); if (flags & 4) { - flags = root.containerInfo; - var pendingChildren = root.pendingChildren; + lanes = root.containerInfo; + flags = root.pendingChildren; try { runWithFiberInDEV( finishedWork, replaceContainerChildren, - flags, - pendingChildren - ); + lanes, + flags + ), + (viewTransitionMutationContext = !0); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } root.effectDuration += popNestedEffectDurations(current); + viewTransitionMutationContext = !1; break; case 4: - recursivelyTraverseMutationEffects(root, finishedWork); + current = pushMutationContext(); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); + viewTransitionMutationContext && + inUpdateViewTransition && + (rootViewTransitionAffected = !0); + viewTransitionMutationContext = current; flags & 4 && commitHostPortalContainerChildren( finishedWork.stateNode, @@ -11592,13 +12454,13 @@ __DEV__ && break; case 12: flags = pushNestedEffectDurations(); - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); finishedWork.stateNode.effectDuration += bubbleNestedEffectDurations(flags); break; case 31: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && ((root = finishedWork.updateQueue), @@ -11607,7 +12469,7 @@ __DEV__ && attachSuspenseRetryListeners(finishedWork, root))); break; case 13: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); finishedWork.child.flags & 8192 && ((root = null !== current && null !== current.memoizedState), @@ -11621,20 +12483,20 @@ __DEV__ && attachSuspenseRetryListeners(finishedWork, root))); break; case 22: - pendingChildren = null !== finishedWork.memoizedState; - var wasHidden = null !== current && null !== current.memoizedState; + ii = null !== finishedWork.memoizedState; + _eventPayloads$ii2 = + null !== current && null !== current.memoizedState; if (finishedWork.mode & 1) { var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden, prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; - offscreenSubtreeIsHidden = - prevOffscreenSubtreeIsHidden || pendingChildren; + offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || ii; offscreenSubtreeWasHidden = - prevOffscreenSubtreeWasHidden || wasHidden; - recursivelyTraverseMutationEffects(root, finishedWork); + prevOffscreenSubtreeWasHidden || _eventPayloads$ii2; + recursivelyTraverseMutationEffects(root, finishedWork, lanes); offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden; - wasHidden && - !pendingChildren && + _eventPayloads$ii2 && + !ii && !prevOffscreenSubtreeIsHidden && !prevOffscreenSubtreeWasHidden && 0 !== (finishedWork.mode & 2) && @@ -11646,20 +12508,25 @@ __DEV__ && componentEffectStartTime, componentEffectEndTime ); - } else recursivelyTraverseMutationEffects(root, finishedWork); + } else recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 8192 && ((root = finishedWork.stateNode), - (root._visibility = pendingChildren + (root._visibility = ii ? root._visibility & ~OffscreenVisible : root._visibility | OffscreenVisible), - !pendingChildren || + !ii || null === current || - wasHidden || + _eventPayloads$ii2 || offscreenSubtreeIsHidden || offscreenSubtreeWasHidden || 0 === (finishedWork.mode & 1) || - (recursivelyTraverseDisappearLayoutEffects(finishedWork), + ((root = _eventPayloads$ii2 || offscreenSubtreeWasHidden), + (lanes = offscreenSubtreeIsHidden), + (current = offscreenSubtreeWasHidden), + (offscreenSubtreeIsHidden = ii || offscreenSubtreeIsHidden), + (offscreenSubtreeWasHidden = root), + recursivelyTraverseDisappearLayoutEffects(finishedWork), 0 !== (finishedWork.mode & 2) && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && @@ -11669,17 +12536,19 @@ __DEV__ && componentEffectStartTime, componentEffectEndTime, "Disconnect" - ))); + ), + (offscreenSubtreeIsHidden = lanes), + (offscreenSubtreeWasHidden = current))); flags & 4 && ((root = finishedWork.updateQueue), null !== root && - ((flags = root.retryQueue), - null !== flags && + ((lanes = root.retryQueue), + null !== lanes && ((root.retryQueue = null), - attachSuspenseRetryListeners(finishedWork, flags)))); + attachSuspenseRetryListeners(finishedWork, lanes)))); break; case 19: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && ((root = finishedWork.updateQueue), @@ -11688,11 +12557,42 @@ __DEV__ && attachSuspenseRetryListeners(finishedWork, root))); break; case 30: + flags & 512 && + (offscreenSubtreeWasHidden || + null === current || + safelyDetachRef(current, current.return)); + flags = pushMutationContext(); + ii = inUpdateViewTransition; + _eventPayloads$ii2 = (lanes & 335544064) === lanes; + prevOffscreenSubtreeIsHidden = finishedWork.memoizedProps; + inUpdateViewTransition = + _eventPayloads$ii2 && + "none" !== + getViewTransitionClassName( + prevOffscreenSubtreeIsHidden.default, + prevOffscreenSubtreeIsHidden.update + ); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); + commitReconciliationEffects(finishedWork); + _eventPayloads$ii2 && + null !== current && + viewTransitionMutationContext && + (finishedWork.flags |= 4); + inUpdateViewTransition = ii; + viewTransitionMutationContext = flags; break; case 21: break; + case 7: + flags & 512 && + (offscreenSubtreeWasHidden || + null === current || + safelyDetachRef(current, current.return)), + current && + null !== current.stateNode && + (current.stateNode._fragmentFiber = finishedWork); default: - recursivelyTraverseMutationEffects(root, finishedWork), + recursivelyTraverseMutationEffects(root, finishedWork, lanes), commitReconciliationEffects(finishedWork); } 0 !== (finishedWork.mode & 2) && @@ -11737,6 +12637,80 @@ __DEV__ && } flags & 4096 && (finishedWork.flags &= -4097); } + function recursivelyTraverseAfterMutationEffects(root, parentFiber) { + if (parentFiber.subtreeFlags & 9270) + for (parentFiber = parentFiber.child; null !== parentFiber; ) + commitAfterMutationEffectsOnFiber(parentFiber, root), + (parentFiber = parentFiber.sibling); + else measureNestedViewTransitions(parentFiber, !1); + } + function commitAfterMutationEffectsOnFiber(finishedWork, root) { + var current = finishedWork.alternate; + if (null === current) commitEnterViewTransitions(finishedWork, !1); + else + switch (finishedWork.tag) { + case 3: + viewTransitionContextChanged = !1; + pushViewTransitionCancelableScope(); + recursivelyTraverseAfterMutationEffects(root, finishedWork); + if ( + !viewTransitionContextChanged && + !rootViewTransitionAffected && + ((finishedWork = viewTransitionCancelableChildren), + null !== finishedWork) + ) + for (current = 0; current < finishedWork.length; current += 3) + console.warn("cancelViewTransitionName is not implemented"); + viewTransitionCancelableChildren = null; + break; + case 5: + recursivelyTraverseAfterMutationEffects(root, finishedWork); + break; + case 4: + current = viewTransitionContextChanged; + viewTransitionContextChanged = !1; + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionContextChanged && (rootViewTransitionAffected = !0); + viewTransitionContextChanged = current; + break; + case 22: + 0 !== (finishedWork.mode & 1) + ? null === finishedWork.memoizedState && + (null !== current.memoizedState + ? commitEnterViewTransitions(finishedWork, !1) + : recursivelyTraverseAfterMutationEffects(root, finishedWork)) + : recursivelyTraverseAfterMutationEffects(root, finishedWork); + break; + case 30: + var _prevContextChanged = viewTransitionContextChanged, + prevCancelableChildren = pushViewTransitionCancelableScope(); + viewTransitionContextChanged = !1; + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionContextChanged && (finishedWork.flags |= 4); + root = finishedWork.memoizedProps; + var state = finishedWork.stateNode; + getViewTransitionName(root, state); + getViewTransitionName(current.memoizedProps, state); + "none" !== getViewTransitionClassName(root.default, root.update) && + ((root = current.memoizedState), + (current.memoizedState = null), + (viewTransitionHostInstanceIdx = 0), + viewTransitionHostInstanceIdx !== + (null === root ? 0 : root.length) && + (finishedWork.flags |= 32)); + null !== prevCancelableChildren && + (prevCancelableChildren.push.apply( + prevCancelableChildren, + viewTransitionCancelableChildren + ), + (viewTransitionCancelableChildren = prevCancelableChildren)); + viewTransitionContextChanged = + 0 !== (finishedWork.flags & 32) ? !0 : _prevContextChanged; + break; + default: + recursivelyTraverseAfterMutationEffects(root, finishedWork); + } + } function recursivelyTraverseLayoutEffects(root, parentFiber) { if (parentFiber.subtreeFlags & 8772) for (parentFiber = parentFiber.child; null !== parentFiber; ) @@ -11772,8 +12746,16 @@ __DEV__ && recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 27: - case 26: case 5: + safelyDetachRef(finishedWork, finishedWork.return); + (5 !== finishedWork.tag && 27 !== finishedWork.tag) || + commitFragmentInstanceDeletionEffects(finishedWork); + recursivelyTraverseDisappearLayoutEffects(finishedWork); + break; + case 6: + commitFragmentInstanceDeletionEffects(finishedWork); + break; + case 26: safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; @@ -11782,8 +12764,13 @@ __DEV__ && recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 30: + finishedWork.flags & 18874368 && + untrackNamedViewTransition(finishedWork); + safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; + case 7: + safelyDetachRef(finishedWork, finishedWork.return); default: recursivelyTraverseDisappearLayoutEffects(finishedWork); } @@ -11812,13 +12799,16 @@ __DEV__ && finishedRoot, current, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ) { var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), - flags = finishedWork.flags; + flags = finishedWork.flags, + includeWorkInProgressEffects = + (layoutEffectTraversalFlags & IncludeWorkInProgressEffects) !== + NoLayoutEffectTraversalFlags; switch (finishedWork.tag) { case 0: case 11: @@ -11826,7 +12816,7 @@ __DEV__ && recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); commitHookLayoutEffects(finishedWork, Layout); break; @@ -11834,7 +12824,7 @@ __DEV__ && recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); commitClassDidMount(finishedWork); current = finishedWork.updateQueue; @@ -11857,12 +12847,28 @@ __DEV__ && safelyAttachRef(finishedWork, finishedWork.return); break; case 27: - case 26: case 5: + (5 !== finishedWork.tag && 27 !== finishedWork.tag) || + commitFragmentInstanceInsertionEffects(finishedWork); + recursivelyTraverseReappearLayoutEffects( + finishedRoot, + finishedWork, + layoutEffectTraversalFlags + ); + includeWorkInProgressEffects && + null === current && + flags & 4 && + commitHostMount(finishedWork); + safelyAttachRef(finishedWork, finishedWork.return); + break; + case 6: + commitFragmentInstanceInsertionEffects(finishedWork); + break; + case 26: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); includeWorkInProgressEffects && null === current && @@ -11876,7 +12882,7 @@ __DEV__ && recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); includeWorkInProgressEffects = finishedWork.stateNode; includeWorkInProgressEffects.effectDuration += @@ -11897,21 +12903,21 @@ __DEV__ && recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 31: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 13: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 22: @@ -11919,17 +12925,26 @@ __DEV__ && recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); safelyAttachRef(finishedWork, finishedWork.return); break; case 30: + recursivelyTraverseReappearLayoutEffects( + finishedRoot, + finishedWork, + layoutEffectTraversalFlags + ); + flags & 18874368 && trackNamedViewTransition(finishedWork); + safelyAttachRef(finishedWork, finishedWork.return); break; + case 7: + safelyAttachRef(finishedWork, finishedWork.return); default: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); } 0 !== (finishedWork.mode & 2) && @@ -11951,16 +12966,18 @@ __DEV__ && function recursivelyTraverseReappearLayoutEffects( finishedRoot, parentFiber, - includeWorkInProgressEffects + layoutEffectTraversalFlags ) { - includeWorkInProgressEffects = - includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772); + layoutEffectTraversalFlags = + 0 !== (parentFiber.subtreeFlags & 8772) + ? layoutEffectTraversalFlags + : layoutEffectTraversalFlags & ~IncludeWorkInProgressEffects; for (parentFiber = parentFiber.child; null !== parentFiber; ) reappearLayoutEffects( finishedRoot, parentFiber.alternate, parentFiber, - includeWorkInProgressEffects + layoutEffectTraversalFlags ), (parentFiber = parentFiber.sibling); } @@ -11994,7 +13011,8 @@ __DEV__ && endTime ) { if ( - parentFiber.subtreeFlags & 10256 || + parentFiber.subtreeFlags & + ((committedLanes & 335544064) === committedLanes ? 10262 : 10256) || (0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)) @@ -12023,7 +13041,14 @@ __DEV__ && prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), prevDeepEquality = alreadyWarnedForDeepEquality, - flags = finishedWork.flags; + isViewTransitionEligible = + (committedLanes & 335544064) === committedLanes; + isViewTransitionEligible && + null === finishedWork.alternate && + null !== finishedWork.return && + null !== finishedWork.return.alternate && + restoreEnterOrExitViewTransitions(finishedWork); + var flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: @@ -12075,8 +13100,8 @@ __DEV__ && ); break; case 3: - var prevProfilerEffectDuration = pushNestedEffectDurations(), - wasInHydratedSubtree = inHydratedSubtree; + var prevProfilerEffectDuration = pushNestedEffectDurations(); + isViewTransitionEligible = inHydratedSubtree; inHydratedSubtree = null !== finishedWork.alternate && finishedWork.alternate.memoizedState.isDehydrated && @@ -12088,7 +13113,7 @@ __DEV__ && committedTransitions, endTime ); - inHydratedSubtree = wasInHydratedSubtree; + inHydratedSubtree = isViewTransitionEligible; flags & 2048 && ((committedLanes = null), null !== finishedWork.alternate && @@ -12141,12 +13166,13 @@ __DEV__ && null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null; - wasInHydratedSubtree = finishedWork.memoizedState; - null !== prevProfilerEffectDuration && null === wasInHydratedSubtree - ? ((wasInHydratedSubtree = finishedWork.deletions), - null !== wasInHydratedSubtree && - 0 < wasInHydratedSubtree.length && - 18 === wasInHydratedSubtree[0].tag + isViewTransitionEligible = finishedWork.memoizedState; + null !== prevProfilerEffectDuration && + null === isViewTransitionEligible + ? ((isViewTransitionEligible = finishedWork.deletions), + null !== isViewTransitionEligible && + 0 < isViewTransitionEligible.length && + 18 === isViewTransitionEligible[0].tag ? ((inHydratedSubtree = !1), (prevProfilerEffectDuration = prevProfilerEffectDuration.hydrationErrors), @@ -12174,16 +13200,16 @@ __DEV__ && null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null; - wasInHydratedSubtree = finishedWork.memoizedState; + isViewTransitionEligible = finishedWork.memoizedState; null === prevProfilerEffectDuration || null === prevProfilerEffectDuration.dehydrated || - (null !== wasInHydratedSubtree && - null !== wasInHydratedSubtree.dehydrated) + (null !== isViewTransitionEligible && + null !== isViewTransitionEligible.dehydrated) ? (inHydratedSubtree = !1) - : ((wasInHydratedSubtree = finishedWork.deletions), - null !== wasInHydratedSubtree && - 0 < wasInHydratedSubtree.length && - 18 === wasInHydratedSubtree[0].tag + : ((isViewTransitionEligible = finishedWork.deletions), + null !== isViewTransitionEligible && + 0 < isViewTransitionEligible.length && + 18 === isViewTransitionEligible[0].tag ? ((inHydratedSubtree = !1), (prevProfilerEffectDuration = prevProfilerEffectDuration.hydrationErrors), @@ -12207,71 +13233,81 @@ __DEV__ && case 23: break; case 22: - wasInHydratedSubtree = finishedWork.stateNode; + var _instance3 = finishedWork.stateNode; prevProfilerEffectDuration = finishedWork.alternate; null !== finishedWork.memoizedState - ? wasInHydratedSubtree._visibility & - OffscreenPassiveEffectsConnected - ? recursivelyTraversePassiveMountEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - endTime - ) - : finishedWork.mode & 1 - ? recursivelyTraverseAtomicPassiveEffects( + ? (isViewTransitionEligible && + null !== prevProfilerEffectDuration && + null === prevProfilerEffectDuration.memoizedState && + restoreEnterOrExitViewTransitions(prevProfilerEffectDuration), + _instance3._visibility & OffscreenPassiveEffectsConnected + ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, endTime ) - : ((wasInHydratedSubtree._visibility |= - OffscreenPassiveEffectsConnected), - recursivelyTraversePassiveMountEffects( + : finishedWork.mode & 1 + ? recursivelyTraverseAtomicPassiveEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + endTime + ) + : ((_instance3._visibility |= + OffscreenPassiveEffectsConnected), + recursivelyTraversePassiveMountEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + endTime + ))) + : (isViewTransitionEligible && + null !== prevProfilerEffectDuration && + null !== prevProfilerEffectDuration.memoizedState && + restoreEnterOrExitViewTransitions(finishedWork), + _instance3._visibility & OffscreenPassiveEffectsConnected + ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, endTime - )) - : wasInHydratedSubtree._visibility & - OffscreenPassiveEffectsConnected - ? recursivelyTraversePassiveMountEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - endTime - ) - : ((wasInHydratedSubtree._visibility |= - OffscreenPassiveEffectsConnected), - recursivelyTraverseReconnectPassiveEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - 0 !== (finishedWork.subtreeFlags & 10256) || - (0 !== finishedWork.actualDuration && - (null === finishedWork.alternate || - finishedWork.alternate.child !== finishedWork.child)), - endTime - ), - 0 === (finishedWork.mode & 2) || - inHydratedSubtree || - ((finishedRoot = finishedWork.actualStartTime), - 0 <= finishedRoot && - 0.05 < endTime - finishedRoot && - logComponentReappeared(finishedWork, finishedRoot, endTime), - 0 <= componentEffectStartTime && - 0 <= componentEffectEndTime && - 0.05 < componentEffectEndTime - componentEffectStartTime && - logComponentReappeared( - finishedWork, - componentEffectStartTime, - componentEffectEndTime - ))); + ) + : ((_instance3._visibility |= OffscreenPassiveEffectsConnected), + recursivelyTraverseReconnectPassiveEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + 0 !== (finishedWork.subtreeFlags & 10256) || + (0 !== finishedWork.actualDuration && + (null === finishedWork.alternate || + finishedWork.alternate.child !== finishedWork.child)), + endTime + ), + 0 === (finishedWork.mode & 2) || + inHydratedSubtree || + ((finishedRoot = finishedWork.actualStartTime), + 0 <= finishedRoot && + 0.05 < endTime - finishedRoot && + logComponentReappeared( + finishedWork, + finishedRoot, + endTime + ), + 0 <= componentEffectStartTime && + 0 <= componentEffectEndTime && + 0.05 < + componentEffectEndTime - componentEffectStartTime && + logComponentReappeared( + finishedWork, + componentEffectStartTime, + componentEffectEndTime + )))); flags & 2048 && commitOffscreenPassiveMountEffects( prevProfilerEffectDuration, @@ -12289,6 +13325,15 @@ __DEV__ && flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); break; + case 30: + recursivelyTraversePassiveMountEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + endTime + ); + break; default: recursivelyTraversePassiveMountEffects( finishedRoot, @@ -12409,9 +13454,9 @@ __DEV__ && case 23: break; case 22: - var _instance2 = finishedWork.stateNode; + var _instance4 = finishedWork.stateNode; null !== finishedWork.memoizedState - ? _instance2._visibility & OffscreenPassiveEffectsConnected + ? _instance4._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, @@ -12428,7 +13473,7 @@ __DEV__ && committedTransitions, endTime ) - : ((_instance2._visibility |= OffscreenPassiveEffectsConnected), + : ((_instance4._visibility |= OffscreenPassiveEffectsConnected), recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, @@ -12437,7 +13482,7 @@ __DEV__ && includeWorkInProgressEffects, endTime )) - : ((_instance2._visibility |= OffscreenPassiveEffectsConnected), + : ((_instance4._visibility |= OffscreenPassiveEffectsConnected), recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, @@ -12595,6 +13640,20 @@ __DEV__ && : recursivelyAccumulateSuspenseyCommit(fiber); } break; + case 30: + if ( + 0 !== (fiber.flags & suspenseyCommitFlag) && + ((current = fiber.memoizedProps.name), + null != current && "auto" !== current) + ) { + var state = fiber.stateNode; + state.paired = null; + null === appearingViewTransitions && + (appearingViewTransitions = new Map()); + appearingViewTransitions.set(current, state); + } + recursivelyAccumulateSuspenseyCommit(fiber); + break; default: recursivelyAccumulateSuspenseyCommit(fiber); } @@ -12934,6 +13993,20 @@ __DEV__ && null !== lane && (lane.flags |= 32); return workInProgressDeferredLane; } + function scheduleViewTransitionEvent(fiber, callback) { + if (null != callback) { + var state = fiber.stateNode, + instance = state.ref; + null === instance && + (instance = state.ref = + createViewTransitionInstance( + getViewTransitionName(fiber.memoizedProps, state) + )); + null === pendingViewTransitionEvents && + (pendingViewTransitionEvents = []); + pendingViewTransitionEvents.push(callback.bind(null, instance)); + } + } function scheduleUpdateOnFiber(root, fiber, lane) { isRunningInsertionEffect && console.error("useInsertionEffect must not schedule updates."); @@ -13158,7 +14231,10 @@ __DEV__ && exitStatus = workInProgressRootConcurrentErrors; var wasRootDehydrated = supportsHydration; startTime = renderRootSync(yieldedFiber, startTime, !1); - if (startTime !== RootErrored) { + if ( + startTime !== RootErrored && + startTime !== RootSuspendedAtTheShell + ) { if ( workInProgressRootDidAttachPingListener && !wasRootDehydrated @@ -13208,7 +14284,8 @@ __DEV__ && case RootFatalErrored: throw Error("Root did not complete. This is a bug in React."); case RootSuspendedWithDelay: - if ((lanes & 4194048) !== lanes) break; + if ((lanes & 4194048) !== lanes && (lanes & 62914560) !== lanes) + break; case RootSuspendedAtTheShell: setCurrentTrackFromLanes(lanes); logSuspendedRenderPhase( @@ -13240,7 +14317,7 @@ __DEV__ && throw Error("Unknown root exit status."); } if (null !== ReactSharedInternals.actQueue) - commitRoot( + completeRoot$1( forceSync, yieldEndTime, lanes, @@ -13250,6 +14327,7 @@ __DEV__ && workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, + workInProgressRootDidSkipSuspendedSiblings, startTime, null, null, @@ -13275,7 +14353,7 @@ __DEV__ && if (0 !== getNextLanes(forceSync, 0, !0)) break a; pendingEffectsLanes = lanes; forceSync.timeoutHandle = scheduleTimeout( - commitRootWhenReady.bind( + completeRootWhenReady.bind( null, forceSync, yieldEndTime, @@ -13296,7 +14374,7 @@ __DEV__ && ); break a; } - commitRootWhenReady( + completeRootWhenReady( forceSync, yieldEndTime, workInProgressRootRecoverableErrors, @@ -13319,7 +14397,7 @@ __DEV__ && } while (1); ensureRootIsScheduled(root); } - function commitRootWhenReady( + function completeRootWhenReady( root, finishedWork, recoverableErrors, @@ -13336,20 +14414,25 @@ __DEV__ && completedRenderEndTime ) { root.timeoutHandle = noTimeout; - didSkipSuspendedSiblings = finishedWork.subtreeFlags; - var suspendedState = null; + var subtreeFlags = finishedWork.subtreeFlags, + isViewTransitionEligible = (lanes & 335544064) === lanes, + suspendedState = null; if ( - didSkipSuspendedSiblings & 8192 || - 16785408 === (didSkipSuspendedSiblings & 16785408) + isViewTransitionEligible || + subtreeFlags & 8192 || + 16785408 === (subtreeFlags & 16785408) ) - (suspendedState = null), + (appearingViewTransitions = suspendedState = null), accumulateSuspenseyCommitOnFiber(finishedWork), + isViewTransitionEligible && + null != fabricSuspendOnActiveViewTransition && + fabricSuspendOnActiveViewTransition(), (lanes & 62914560) === lanes ? globalMostRecentFallbackTime - now$1() : (lanes & 4194048) === lanes ? globalMostRecentTransitionTime - now$1() : 0; - commitRoot( + completeRoot$1( root, finishedWork, lanes, @@ -13359,6 +14442,7 @@ __DEV__ && spawnedLane, updatedLanes, suspendedRetryLanes, + didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedCommitReason, @@ -13406,6 +14490,7 @@ __DEV__ && spawnedLane, didAttemptEntireTree ) { + suspendedLanes = getEntangledLanes(root, suspendedLanes); suspendedLanes &= ~workInProgressRootPingedLanes; suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; @@ -13446,6 +14531,8 @@ __DEV__ && function finalizeRender(lanes, finalizationTime) { 0 !== (lanes & 127) && (blockingClampTime = finalizationTime); 0 !== (lanes & 4194048) && (transitionClampTime = finalizationTime); + 0 !== (lanes & 62914560) && (retryClampTime = finalizationTime); + 0 !== (lanes & 2080374784) && (idleClampTime = finalizationTime); } function prepareFreshStack(root, lanes) { supportsUserTiming && @@ -13547,14 +14634,17 @@ __DEV__ && : blockingEventTime; color = 0 <= endTime ? endTime : 0 <= debugTask ? debugTask : renderStartTime; - 0 <= blockingSuspendedTime && - (setCurrentTrackFromLanes(2), - logSuspendedWithDelayPhase( - blockingSuspendedTime, - color, - lanes, - previousRenderStartTime - )); + 0 <= blockingSuspendedTime + ? (setCurrentTrackFromLanes(2), + logSuspendedWithDelayPhase( + blockingSuspendedTime, + color, + lanes, + previousRenderStartTime + )) + : 0 !== (animatingLanes & 127) && + (setCurrentTrackFromLanes(2), + logAnimatingPhase(blockingClampTime, color, animatingTask)); previousRenderStartTime = debugTask; var eventTime = endTime, eventType = blockingEventType, @@ -13634,7 +14724,8 @@ __DEV__ && previousRenderStartTime ) ) - : performance.measure(isSpawnedUpdate, previousRenderStartTime)); + : performance.measure(isSpawnedUpdate, previousRenderStartTime), + performance.clearMeasures(isSpawnedUpdate)); } blockingUpdateTime = -1.1; blockingUpdateType = 0; @@ -13665,14 +14756,17 @@ __DEV__ && : 0 <= previousRenderStartTime ? previousRenderStartTime : renderStartTime), - 0 <= transitionSuspendedTime && - (setCurrentTrackFromLanes(256), - logSuspendedWithDelayPhase( - transitionSuspendedTime, - color, - lanes, - workInProgressUpdateTask - )), + 0 <= transitionSuspendedTime + ? (setCurrentTrackFromLanes(256), + logSuspendedWithDelayPhase( + transitionSuspendedTime, + color, + lanes, + workInProgressUpdateTask + )) + : 0 !== (animatingLanes & 4194048) && + (setCurrentTrackFromLanes(256), + logAnimatingPhase(transitionClampTime, color, animatingTask)), (isPingedUpdate = endTime), (eventTime = transitionEventType), (eventType = 0 < transitionEventRepeatTime), @@ -13768,13 +14862,22 @@ __DEV__ && previousRenderStartTime ) ) - : performance.measure(debugTask, previousRenderStartTime))), + : performance.measure(debugTask, previousRenderStartTime), + performance.clearMeasures(debugTask))), (transitionUpdateTime = transitionStartTime = -1.1), (transitionUpdateType = 0), (transitionSuspendedTime = -1.1), (transitionEventRepeatTime = transitionEventTime), (transitionEventTime = -1.1), (transitionClampTime = now())); + 0 !== (lanes & 62914560) && + 0 !== (animatingLanes & 62914560) && + (setCurrentTrackFromLanes(4194304), + logAnimatingPhase(retryClampTime, renderStartTime, animatingTask)); + 0 !== (lanes & 2080374784) && + 0 !== (animatingLanes & 2080374784) && + (setCurrentTrackFromLanes(268435456), + logAnimatingPhase(idleClampTime, renderStartTime, animatingTask)); previousRenderStartTime = root.timeoutHandle; previousRenderStartTime !== noTimeout && ((root.timeoutHandle = noTimeout), @@ -13805,15 +14908,7 @@ __DEV__ && workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors = null; workInProgressRootDidIncludeRecursiveRenderUpdate = !1; - 0 !== (lanes & 8) && (lanes |= lanes & 32); - endTime = root.entangledLanes; - if (0 !== endTime) - for (root = root.entanglements, endTime &= lanes; 0 < endTime; ) - (debugTask = 31 - clz32(endTime)), - (color = 1 << debugTask), - (lanes |= root[debugTask]), - (endTime &= ~color); - entangledRenderLanes = lanes; + entangledRenderLanes = getEntangledLanes(root, lanes); finishQueueingConcurrentUpdates(); root = getCurrentTime(); 1e3 < root - lastResetTime && @@ -14322,7 +15417,7 @@ __DEV__ && workInProgressRootExitStatus = RootSuspendedAtTheShell; workInProgress = null; } - function commitRoot( + function completeRoot$1( root, finishedWork, lanes, @@ -14332,6 +15427,7 @@ __DEV__ && spawnedLane, updatedLanes, suspendedRetryLanes, + didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedCommitReason, @@ -14346,31 +15442,94 @@ __DEV__ && if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Should not already be working."); setCurrentTrackFromLanes(lanes); - exitStatus === RootErrored - ? logErroredRenderPhase( - completedRenderStartTime, - completedRenderEndTime, - lanes, - workInProgressUpdateTask - ) - : null !== recoverableErrors - ? logRecoveredRenderPhase( - completedRenderStartTime, - completedRenderEndTime, - lanes, - recoverableErrors, - null !== finishedWork && - null !== finishedWork.alternate && - finishedWork.alternate.memoizedState.isDehydrated && - 0 !== (finishedWork.flags & 256), - workInProgressUpdateTask - ) - : logRenderPhase( - completedRenderStartTime, - completedRenderEndTime, - lanes, - workInProgressUpdateTask - ); + if (exitStatus === RootErrored) + logErroredRenderPhase( + completedRenderStartTime, + completedRenderEndTime, + lanes, + workInProgressUpdateTask + ); + else if (null !== recoverableErrors) { + if ( + ((didSkipSuspendedSiblings = + null !== finishedWork && + null !== finishedWork.alternate && + finishedWork.alternate.memoizedState.isDehydrated && + 0 !== (finishedWork.flags & 256)), + (didIncludeRenderPhaseUpdate = workInProgressUpdateTask), + supportsUserTiming && + !(completedRenderEndTime <= completedRenderStartTime)) + ) { + exitStatus = []; + for (var i = 0; i < recoverableErrors.length; i++) { + var error = recoverableErrors[i].value; + exitStatus.push([ + "Recoverable Error", + "object" === typeof error && + null !== error && + "string" === typeof error.message + ? String(error.message) + : String(error) + ]); + } + completedRenderStartTime = { + start: completedRenderStartTime, + end: completedRenderEndTime, + detail: { + devtools: { + color: "primary-dark", + track: currentTrack, + trackGroup: "Scheduler \u269b", + tooltipText: didSkipSuspendedSiblings + ? "Hydration Failed" + : "Recovered after Error", + properties: exitStatus + } + } + }; + didIncludeRenderPhaseUpdate + ? didIncludeRenderPhaseUpdate.run( + performance.measure.bind( + performance, + "Recovered", + completedRenderStartTime + ) + ) + : performance.measure("Recovered", completedRenderStartTime); + performance.clearMeasures("Recovered"); + } + } else + (didIncludeRenderPhaseUpdate = workInProgressUpdateTask), + !supportsUserTiming || + completedRenderEndTime <= completedRenderStartTime || + ((didSkipSuspendedSiblings = + (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark"), + (exitStatus = + (lanes & 536870912) === lanes + ? "Prepared" + : (lanes & 201326741) === lanes + ? "Hydrated" + : "Render"), + didIncludeRenderPhaseUpdate + ? didIncludeRenderPhaseUpdate.run( + console.timeStamp.bind( + console, + exitStatus, + completedRenderStartTime, + completedRenderEndTime, + currentTrack, + "Scheduler \u269b", + didSkipSuspendedSiblings + ) + ) + : console.timeStamp( + exitStatus, + completedRenderStartTime, + completedRenderEndTime, + currentTrack, + "Scheduler \u269b", + didSkipSuspendedSiblings + )); if (null !== finishedWork) { 0 === lanes && console.error( @@ -14380,73 +15539,167 @@ __DEV__ && throw Error( "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." ); - didIncludeRenderPhaseUpdate = - finishedWork.lanes | finishedWork.childLanes; - didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes; - markRootFinished( - root, - lanes, - didIncludeRenderPhaseUpdate, - spawnedLane, - updatedLanes, - suspendedRetryLanes - ); root === workInProgressRoot && ((workInProgress = workInProgressRoot = null), (workInProgressRootRenderLanes = 0)); pendingFinishedWork = finishedWork; pendingEffectsRoot = root; pendingEffectsLanes = lanes; - pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate; pendingPassiveTransitions = transitions; pendingRecoverableErrors = recoverableErrors; pendingEffectsRenderEndTime = completedRenderEndTime; pendingSuspendedCommitReason = suspendedCommitReason; pendingDelayedCommitReason = IMMEDIATE_COMMIT; pendingSuspendedViewTransitionReason = null; - 0 !== finishedWork.actualDuration || - 0 !== (finishedWork.subtreeFlags & 10256) || - 0 !== (finishedWork.flags & 10256) - ? ((root.callbackNode = null), - (root.callbackPriority = 0), - scheduleCallback(NormalPriority$1, function () { - pendingDelayedCommitReason === IMMEDIATE_COMMIT && - (pendingDelayedCommitReason = DELAYED_PASSIVE_COMMIT); - flushPassiveEffects(); - return null; - })) - : ((root.callbackNode = null), (root.callbackPriority = 0)); - commitErrors = null; - commitStartTime = now(); - null !== suspendedCommitReason && - logSuspendedCommitPhase( - completedRenderEndTime, - commitStartTime, - suspendedCommitReason, - workInProgressUpdateTask - ); - recoverableErrors = 0 !== (finishedWork.flags & 13878); - if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) { - recoverableErrors = ReactSharedInternals.T; - ReactSharedInternals.T = null; - transitions = currentUpdatePriority; - currentUpdatePriority = DiscreteEventPriority; - spawnedLane = executionContext; - executionContext |= CommitContext; - try { - commitBeforeMutationEffects(root, finishedWork, lanes); - } finally { - (executionContext = spawnedLane), - (currentUpdatePriority = transitions), - (ReactSharedInternals.T = recoverableErrors); - } + commitRoot( + root, + finishedWork, + lanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes, + suspendedState, + suspendedCommitReason, + completedRenderEndTime + ); + } + } + function commitRoot( + root, + finishedWork, + lanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes, + suspendedState, + suspendedCommitReason, + completedRenderEndTime + ) { + var remainingLanes = finishedWork.lanes | finishedWork.childLanes; + pendingEffectsRemainingLanes = remainingLanes; + remainingLanes |= concurrentlyUpdatedLanes; + markRootFinished( + root, + lanes, + remainingLanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes + ); + pendingViewTransitionEvents = null; + (lanes & 335544064) === lanes + ? ((pendingTransitionTypes = claimQueuedTransitionTypes(root)), + (spawnedLane = 10262)) + : ((pendingTransitionTypes = null), (spawnedLane = 10256)); + 0 !== finishedWork.actualDuration || + 0 !== (finishedWork.subtreeFlags & spawnedLane) || + 0 !== (finishedWork.flags & spawnedLane) + ? ((root.callbackNode = null), + (root.callbackPriority = 0), + scheduleCallback(NormalPriority$1, function () { + schedulerEvent = global.event; + pendingDelayedCommitReason === IMMEDIATE_COMMIT && + (pendingDelayedCommitReason = DELAYED_PASSIVE_COMMIT); + flushPassiveEffects(); + return null; + })) + : ((root.callbackNode = null), (root.callbackPriority = 0)); + commitErrors = null; + commitStartTime = now(); + null !== suspendedCommitReason && + logSuspendedCommitPhase( + completedRenderEndTime, + commitStartTime, + suspendedCommitReason, + workInProgressUpdateTask + ); + shouldStartViewTransition = !1; + suspendedCommitReason = 0 !== (finishedWork.flags & 13878); + if (0 !== (finishedWork.subtreeFlags & 13878) || suspendedCommitReason) { + suspendedCommitReason = ReactSharedInternals.T; + ReactSharedInternals.T = null; + completedRenderEndTime = currentUpdatePriority; + currentUpdatePriority = DiscreteEventPriority; + spawnedLane = executionContext; + executionContext |= CommitContext; + try { + commitBeforeMutationEffects(root, finishedWork, lanes); + } finally { + (executionContext = spawnedLane), + (currentUpdatePriority = completedRenderEndTime), + (ReactSharedInternals.T = suspendedCommitReason); } - pendingEffectsStatus = PENDING_MUTATION_PHASE; - flushMutationEffects(); - flushLayoutEffects(); - flushSpawnedWork(); + } + pendingEffectsStatus = PENDING_MUTATION_PHASE; + shouldStartViewTransition + ? ((animatingLanes |= lanes), + (animatingTask = null), + (pendingViewTransition = startViewTransition( + suspendedState, + root.containerInfo, + pendingTransitionTypes, + flushMutationEffects, + flushLayoutEffects, + flushAfterMutationEffects, + flushSpawnedWork, + flushPassiveEffects, + reportViewTransitionError, + suspendedViewTransition, + finishedViewTransition.bind(null, lanes) + ))) + : (flushMutationEffects(), flushLayoutEffects(), flushSpawnedWork()); + } + function reportViewTransitionError(error) { + if (pendingEffectsStatus !== NO_PENDING_EFFECTS) { + var onRecoverableError = pendingEffectsRoot.onRecoverableError; + onRecoverableError(error, makeErrorInfo(null)); + } + } + function suspendedViewTransition(reason) { + commitEndTime = now(); + logCommitPhase( + null === pendingSuspendedCommitReason + ? pendingEffectsRenderEndTime + : commitStartTime, + commitEndTime, + commitErrors, + pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, + workInProgressUpdateTask + ); + pendingSuspendedCommitReason = pendingSuspendedViewTransitionReason = + reason; + } + function finishedViewTransition(lanes) { + if (0 !== (animatingLanes & lanes)) { + var task = animatingTask; + animatingLanes &= ~lanes; + animatingTask = null; + 0 !== (lanes & 4194048) && + 0 === (workInProgressRootRenderLanes & 4194048) && + 0 === (pendingEffectsLanes & 4194048) && + (setCurrentTrackFromLanes(256), + logAnimatingPhase(transitionClampTime, now$1(), task)); + 0 !== (lanes & 62914560) && + 0 === (workInProgressRootRenderLanes & 62914560) && + 0 === (pendingEffectsLanes & 62914560) && + (setCurrentTrackFromLanes(4194304), + logAnimatingPhase(retryClampTime, now$1(), task)); + 0 !== (lanes & 2080374784) && + 0 === (workInProgressRootRenderLanes & 2080374784) && + 0 === (pendingEffectsLanes & 2080374784) && + (setCurrentTrackFromLanes(268435456), + logAnimatingPhase(idleClampTime, now$1(), task)); } } + function flushAfterMutationEffects() { + pendingEffectsStatus === PENDING_AFTER_MUTATION_PHASE && + ((pendingEffectsStatus = NO_PENDING_EFFECTS), + commitAfterMutationEffectsOnFiber( + pendingFinishedWork, + pendingEffectsRoot + ), + (pendingEffectsStatus = PENDING_SPAWNED_WORK)); + } function flushMutationEffects() { if (pendingEffectsStatus === PENDING_MUTATION_PHASE) { pendingEffectsStatus = NO_PENDING_EFFECTS; @@ -14467,8 +15720,9 @@ __DEV__ && try { (inProgressLanes = lanes), (inProgressRoot = root), + (inUpdateViewTransition = rootViewTransitionAffected = !1), resetComponentEffectTimers(), - commitMutationEffectsOnFiber(finishedWork, root), + commitMutationEffectsOnFiber(finishedWork, root, lanes), (inProgressRoot = inProgressLanes = null); } finally { (executionContext = prevExecutionContext), @@ -14542,41 +15796,13 @@ __DEV__ && suspendedViewTransitionReason = pendingEffectsRenderEndTime; startTime = pendingSuspendedCommitReason; commitEndTime = now(); - suspendedViewTransitionReason = - null === startTime ? suspendedViewTransitionReason : commitStartTime; - startTime = commitEndTime; - endTime = pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT; - rootHasLayoutEffect = workInProgressUpdateTask; - null !== commitErrors - ? logCommitErrored( - suspendedViewTransitionReason, - startTime, - commitErrors, - !1, - rootHasLayoutEffect - ) - : !supportsUserTiming || - startTime <= suspendedViewTransitionReason || - (rootHasLayoutEffect - ? rootHasLayoutEffect.run( - console.timeStamp.bind( - console, - endTime ? "Commit Interrupted View Transition" : "Commit", - suspendedViewTransitionReason, - startTime, - currentTrack, - "Scheduler \u269b", - endTime ? "error" : "secondary-dark" - ) - ) - : console.timeStamp( - endTime ? "Commit Interrupted View Transition" : "Commit", - suspendedViewTransitionReason, - startTime, - currentTrack, - "Scheduler \u269b", - endTime ? "error" : "secondary-dark" - )); + logCommitPhase( + null === startTime ? suspendedViewTransitionReason : commitStartTime, + commitEndTime, + commitErrors, + pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, + workInProgressUpdateTask + ); pendingEffectsStatus = PENDING_AFTER_MUTATION_PHASE; } } @@ -14621,30 +15847,31 @@ __DEV__ && (pendingDelayedCommitReason = ANIMATION_STARTED_COMMIT); } pendingEffectsStatus = NO_PENDING_EFFECTS; + startViewTransitionStartTime = pendingViewTransition; + pendingViewTransition = null; requestPaint(); - startViewTransitionStartTime = pendingEffectsRoot; + endTime = pendingEffectsRoot; var finishedWork = pendingFinishedWork; - endTime = pendingEffectsLanes; - abortedViewTransition = pendingRecoverableErrors; - var rootDidHavePassiveEffects = + abortedViewTransition = pendingEffectsLanes; + var recoverableErrors = pendingRecoverableErrors, + passiveSubtreeMask = + (abortedViewTransition & 335544064) === abortedViewTransition + ? 10262 + : 10256; + (passiveSubtreeMask = 0 !== finishedWork.actualDuration || - 0 !== (finishedWork.subtreeFlags & 10256) || - 0 !== (finishedWork.flags & 10256); - rootDidHavePassiveEffects + 0 !== (finishedWork.subtreeFlags & passiveSubtreeMask) || + 0 !== (finishedWork.flags & passiveSubtreeMask)) ? (pendingEffectsStatus = PENDING_PASSIVE_PHASE) : ((pendingEffectsStatus = NO_PENDING_EFFECTS), (pendingFinishedWork = pendingEffectsRoot = null), - releaseRootPooledCache( - startViewTransitionStartTime, - startViewTransitionStartTime.pendingLanes - ), + releaseRootPooledCache(endTime, endTime.pendingLanes), (nestedPassiveUpdateCount = 0), (rootWithPassiveNestedUpdates = null)); - var remainingLanes = startViewTransitionStartTime.pendingLanes; + var remainingLanes = endTime.pendingLanes; 0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null); - rootDidHavePassiveEffects || - commitDoubleInvokeEffectsInDEV(startViewTransitionStartTime, !1); - remainingLanes = lanesToEventPriority(endTime); + passiveSubtreeMask || commitDoubleInvokeEffectsInDEV(endTime, !1); + remainingLanes = lanesToEventPriority(abortedViewTransition); finishedWork = finishedWork.stateNode; if ( injectedHook && @@ -14682,22 +15909,20 @@ __DEV__ && err )); } - isDevToolsPresent && - startViewTransitionStartTime.memoizedUpdaters.clear(); - if (null !== abortedViewTransition) { + isDevToolsPresent && endTime.memoizedUpdaters.clear(); + if (null !== recoverableErrors) { didError = ReactSharedInternals.T; schedulerPriority = currentUpdatePriority; currentUpdatePriority = DiscreteEventPriority; ReactSharedInternals.T = null; try { - var onRecoverableError = - startViewTransitionStartTime.onRecoverableError; + var onRecoverableError = endTime.onRecoverableError; for ( finishedWork = 0; - finishedWork < abortedViewTransition.length; + finishedWork < recoverableErrors.length; finishedWork++ ) { - var recoverableError = abortedViewTransition[finishedWork], + var recoverableError = recoverableErrors[finishedWork], errorInfo = makeErrorInfo(recoverableError.stack); runWithFiberInDEV( recoverableError.source, @@ -14711,19 +15936,40 @@ __DEV__ && (currentUpdatePriority = schedulerPriority); } } + onRecoverableError = pendingViewTransitionEvents; + recoverableError = pendingTransitionTypes; + pendingTransitionTypes = null; + if ( + null !== onRecoverableError && + ((pendingViewTransitionEvents = null), + null === recoverableError && (recoverableError = []), + null !== startViewTransitionStartTime) + ) + for ( + errorInfo = 0; + errorInfo < onRecoverableError.length; + errorInfo++ + ) + (recoverableErrors = (0, onRecoverableError[errorInfo])( + recoverableError + )), + void 0 !== recoverableErrors && + startViewTransitionStartTime.finished.finally( + recoverableErrors + ); 0 !== (pendingEffectsLanes & 3) && - 0 !== startViewTransitionStartTime.tag && + 0 !== endTime.tag && flushPendingEffects(); - ensureRootIsScheduled(startViewTransitionStartTime); - remainingLanes = startViewTransitionStartTime.pendingLanes; - 0 !== (endTime & 261930) && 0 !== (remainingLanes & 42) + ensureRootIsScheduled(endTime); + remainingLanes = endTime.pendingLanes; + 0 !== (abortedViewTransition & 261930) && 0 !== (remainingLanes & 42) ? ((nestedUpdateScheduled = !0), - startViewTransitionStartTime === rootWithNestedUpdates + endTime === rootWithNestedUpdates ? nestedUpdateCount++ - : ((nestedUpdateCount = 0), - (rootWithNestedUpdates = startViewTransitionStartTime))) - : (nestedUpdateCount = 0); - rootDidHavePassiveEffects || finalizeRender(endTime, commitEndTime); + : ((nestedUpdateCount = 0), (rootWithNestedUpdates = endTime))) + : ((nestedUpdateCount = 0), (rootWithNestedUpdates = null)); + passiveSubtreeMask || + finalizeRender(abortedViewTransition, commitEndTime); flushSyncWorkAcrossRoots_impl(0, !1); } } @@ -14745,6 +15991,15 @@ __DEV__ && ((root.pooledCache = null), releaseCache(remainingLanes))); } function flushPendingEffects() { + null !== pendingViewTransition && + (console.warn("stopViewTransition is not implemented"), + didWarnAboutInterruptedViewTransitions || + ((didWarnAboutInterruptedViewTransitions = !0), + console.warn( + "A flushSync update cancelled a View Transition because it was called while the View Transition was still preparing. To preserve the synchronous semantics, React had to skip the View Transition. If you can, try to avoid flushSync() in a scenario that's likely to interfere." + )), + (pendingViewTransition = null), + (pendingDelayedCommitReason = ABORTED_VIEW_TRANSITION_COMMIT)); flushMutationEffects(); flushLayoutEffects(); flushSpawnedWork(); @@ -14780,36 +16035,17 @@ __DEV__ && var passiveEffectStartTime = 0; commitErrors = null; passiveEffectStartTime = now$1(); - if (pendingDelayedCommitReason === ANIMATION_STARTED_COMMIT) { + if (pendingDelayedCommitReason === ANIMATION_STARTED_COMMIT) + logAnimatingPhase( + commitEndTime, + passiveEffectStartTime, + animatingTask + ); + else { var startTime = commitEndTime, - endTime = passiveEffectStartTime; - !supportsUserTiming || - endTime <= startTime || - (animatingTask - ? animatingTask.run( - console.timeStamp.bind( - console, - "Animating", - startTime, - endTime, - currentTrack, - "Scheduler \u269b", - "secondary-dark" - ) - ) - : console.timeStamp( - "Animating", - startTime, - endTime, - currentTrack, - "Scheduler \u269b", - "secondary-dark" - )); - } else { - startTime = commitEndTime; - endTime = passiveEffectStartTime; - var delayedUntilPaint = - pendingDelayedCommitReason === DELAYED_PASSIVE_COMMIT; + endTime = passiveEffectStartTime, + delayedUntilPaint = + pendingDelayedCommitReason === DELAYED_PASSIVE_COMMIT; !supportsUserTiming || endTime <= startTime || (workInProgressUpdateTask @@ -15020,8 +16256,9 @@ __DEV__ && (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes && now$1() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) - ? (executionContext & RenderContext) === NoContext && - prepareFreshStack(root, 0) + ? (executionContext & RenderContext) === NoContext + ? prepareFreshStack(root, 0) + : (workInProgressRootPingedLanes |= pingedLanes) : (workInProgressRootPingedLanes |= pingedLanes), workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes && (workInProgressSuspendedRetryLanes = 0)); @@ -15069,14 +16306,14 @@ __DEV__ && parentFiber, isInStrictMode ) { - if (0 !== (parentFiber.subtreeFlags & 67117056)) + if (0 !== (parentFiber.subtreeFlags & 134225920)) for (parentFiber = parentFiber.child; null !== parentFiber; ) { var root = root$jscomp$0, fiber = parentFiber, isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE; isStrictModeFiber = isInStrictMode || isStrictModeFiber; 22 !== fiber.tag - ? fiber.flags & 67108864 + ? fiber.flags & 134217728 ? isStrictModeFiber && runWithFiberInDEV( fiber, @@ -15090,14 +16327,14 @@ __DEV__ && isStrictModeFiber ) : null === fiber.memoizedState && - (isStrictModeFiber && fiber.flags & 8192 + (isStrictModeFiber && fiber.flags & 134225920 ? runWithFiberInDEV( fiber, doubleInvokeEffectsOnFiber, root, fiber ) - : fiber.subtreeFlags & 67108864 && + : fiber.subtreeFlags & 134217728 && runWithFiberInDEV( fiber, recursivelyTraverseAndDoubleInvokeEffectsInDEV, @@ -15113,7 +16350,12 @@ __DEV__ && try { disappearLayoutEffects(fiber), disconnectPassiveEffect(fiber), - reappearLayoutEffects(root, fiber.alternate, fiber, !1), + reappearLayoutEffects( + root, + fiber.alternate, + fiber, + NoLayoutEffectTraversalFlags + ), reconnectPassiveEffects(root, fiber, 0, null, !1, 0); } finally { setIsStrictModeForDevtools(!1); @@ -15136,12 +16378,12 @@ __DEV__ && ); } function legacyCommitDoubleInvokeEffectsInDEV(fiber, hasPassiveEffects) { - invokeEffectsInDev(fiber, 134217728, invokeLayoutEffectUnmountInDEV); + invokeEffectsInDev(fiber, 268435456, invokeLayoutEffectUnmountInDEV); hasPassiveEffects && - invokeEffectsInDev(fiber, 268435456, invokePassiveEffectUnmountInDEV); - invokeEffectsInDev(fiber, 134217728, invokeLayoutEffectMountInDEV); + invokeEffectsInDev(fiber, 536870912, invokePassiveEffectUnmountInDEV); + invokeEffectsInDev(fiber, 268435456, invokeLayoutEffectMountInDEV); hasPassiveEffects && - invokeEffectsInDev(fiber, 268435456, invokePassiveEffectMountInDEV); + invokeEffectsInDev(fiber, 536870912, invokePassiveEffectMountInDEV); } function invokeEffectsInDev(firstChild, fiberFlags, invokeEffectFn) { for (var subtreeRoot = null; null != firstChild; ) { @@ -15217,30 +16459,15 @@ __DEV__ && ); }); } - function resolveFunctionForHotReloading(type) { + function resolveTypeForHotReloading(type) { if (null === resolveFamily) return type; var family = resolveFamily(type); return void 0 === family ? type : family.current; } - function resolveForwardRefForHotReloading(type) { - if (null === resolveFamily) return type; - var family = resolveFamily(type); - return void 0 === family - ? null !== type && - void 0 !== type && - "function" === typeof type.render && - ((family = resolveFunctionForHotReloading(type.render)), - type.render !== family) - ? ((family = { $$typeof: REACT_FORWARD_REF_TYPE, render: family }), - void 0 !== type.displayName && - (family.displayName = type.displayName), - family) - : type - : family.current; - } function isCompatibleFamilyForHotReloading(fiber, element) { if (null === resolveFamily) return !1; - var prevType = fiber.elementType; + var resolve = resolveFamily, + prevType = fiber.elementType; element = element.type; var needsCompareFamilies = !1, $$typeofNextType = @@ -15274,8 +16501,8 @@ __DEV__ && return !1; } return needsCompareFamilies && - ((fiber = resolveFamily(prevType)), - void 0 !== fiber && fiber === resolveFamily(element)) + ((fiber = resolve(prevType)), + void 0 !== fiber && fiber === resolve(element)) ? !0 : !1; } @@ -15295,39 +16522,58 @@ __DEV__ && alternate = _fiber.alternate, child = _fiber.child, sibling = _fiber.sibling, - tag = _fiber.tag; - _fiber = _fiber.type; - var candidateType = null; + tag = _fiber.tag, + type = _fiber.type, + elementType = _fiber.elementType, + candidateType = null; + _fiber = null; switch (tag) { case 0: - case 15: case 1: - candidateType = _fiber; + candidateType = type; + break; + case 15: + candidateType = type; + _fiber = elementType; + break; + case 14: + _fiber = elementType; break; case 11: - candidateType = _fiber.render; + (candidateType = type.render), (_fiber = elementType); } if (null === resolveFamily) throw Error("Expected resolveFamily to be set during hot reload."); - var needsRender = !1; - _fiber = !1; + var resolve = resolveFamily; + type = elementType = !1; null !== candidateType && - ((candidateType = resolveFamily(candidateType)), + ((candidateType = resolve(candidateType)), void 0 !== candidateType && (staleFamilies.has(candidateType) - ? (_fiber = !0) + ? (type = !0) : updatedFamilies.has(candidateType) && - (1 === tag ? (_fiber = !0) : (needsRender = !0)))); + (1 === tag ? (type = !0) : (elementType = !0)))); + type || + null === _fiber || + ((tag = resolve(_fiber)), + void 0 !== tag && staleFamilies.has(tag) + ? (type = !0) + : "object" === typeof _fiber && + _fiber.$$typeof === REACT_LAZY_TYPE && + ((tag = _fiber._payload), + 1 === tag._status && + ((tag = resolve(tag._result.default)), + void 0 !== tag && staleFamilies.has(tag) && (type = !0)))); null !== failedBoundaries && (failedBoundaries.has(fiber) || (null !== alternate && failedBoundaries.has(alternate))) && - (_fiber = !0); - _fiber && (fiber._debugNeedsRemount = !0); - if (_fiber || needsRender) + (type = !0); + type && (fiber._debugNeedsRemount = !0); + if (type || elementType) (alternate = enqueueConcurrentRenderForLane(fiber, 2)), null !== alternate && scheduleUpdateOnFiber(alternate, fiber, 2); null === child || - _fiber || + type || scheduleFibersWithFamiliesRecursively( child, updatedFamilies, @@ -15403,7 +16649,7 @@ __DEV__ && (workInProgress.deletions = null), (workInProgress.actualDuration = -0), (workInProgress.actualStartTime = -1.1)); - workInProgress.flags = current.flags & 65011712; + workInProgress.flags = current.flags & 1206910976; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -15430,18 +16676,15 @@ __DEV__ && switch (workInProgress.tag) { case 0: case 15: - workInProgress.type = resolveFunctionForHotReloading(current.type); - break; + case 14: case 1: - workInProgress.type = resolveFunctionForHotReloading(current.type); - break; case 11: - workInProgress.type = resolveForwardRefForHotReloading(current.type); + workInProgress.type = resolveTypeForHotReloading(current.type); } return workInProgress; } function resetWorkInProgress(workInProgress, renderLanes) { - workInProgress.flags &= 65011714; + workInProgress.flags &= 1206910978; var current = workInProgress.alternate; null === current ? ((workInProgress.childLanes = 0), @@ -15485,14 +16728,13 @@ __DEV__ && mode, lanes ) { - var fiberTag = 0, - resolvedType = type; - if ("function" === typeof type) - shouldConstruct(type) && (fiberTag = 1), - (resolvedType = resolveFunctionForHotReloading(resolvedType)); - else if ("string" === typeof type) fiberTag = 5; + var fiberTag = 0; + var resolvedType = resolveTypeForHotReloading(type); + if ("function" === typeof resolvedType) + shouldConstruct(resolvedType) && (fiberTag = 1); + else if ("string" === typeof resolvedType) fiberTag = 5; else - a: switch (type) { + a: switch (resolvedType) { case REACT_ACTIVITY_TYPE: return ( (key = createFiber(31, pendingProps, key, mode)), @@ -15541,9 +16783,24 @@ __DEV__ && (key.lanes = lanes), key ); + case REACT_LEGACY_HIDDEN_TYPE: + case REACT_VIEW_TRANSITION_TYPE: + return ( + (type = mode | 32), + (key = createFiber(30, pendingProps, key, type)), + (key.elementType = REACT_VIEW_TRANSITION_TYPE), + (key.lanes = lanes), + (key.stateNode = { + autoName: null, + paired: null, + clones: null, + ref: null + }), + key + ); default: - if ("object" === typeof type && null !== type) - switch (type.$$typeof) { + if ("object" === typeof resolvedType && null !== resolvedType) + switch (resolvedType.$$typeof) { case REACT_CONTEXT_TYPE: fiberTag = 10; break a; @@ -15552,7 +16809,6 @@ __DEV__ && break a; case REACT_FORWARD_REF_TYPE: fiberTag = 11; - resolvedType = resolveForwardRefForHotReloading(resolvedType); break a; case REACT_MEMO_TYPE: fiberTag = 14; @@ -15562,27 +16818,27 @@ __DEV__ && resolvedType = null; break a; } - resolvedType = ""; + pendingProps = ""; if ( void 0 === type || ("object" === typeof type && null !== type && 0 === Object.keys(type).length) ) - resolvedType += + pendingProps += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports."; null === type - ? (pendingProps = "null") + ? (resolvedType = "null") : isArrayImpl(type) - ? (pendingProps = "array") + ? (resolvedType = "array") : void 0 !== type && type.$$typeof === REACT_ELEMENT_TYPE - ? ((pendingProps = + ? ((resolvedType = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />"), - (resolvedType = + (pendingProps = " Did you accidentally export a JSX literal instead of a component?")) - : (pendingProps = typeof type); + : (resolvedType = typeof type); fiberTag = owner ? "number" === typeof owner.tag ? getComponentNameFromFiber(owner) @@ -15591,12 +16847,12 @@ __DEV__ && : null : null; fiberTag && - (resolvedType += + (pendingProps += "\n\nCheck the render method of `" + fiberTag + "`."); fiberTag = 29; pendingProps = Error( "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + - (pendingProps + "." + resolvedType) + (resolvedType + "." + pendingProps) ); resolvedType = null; } @@ -15687,6 +16943,7 @@ __DEV__ && this.pooledCache = null; this.pooledCacheLanes = 0; this.formState = formState; + this.transitionTypes = null; this.incompleteTransitions = new Map(); this.passiveEffectDuration = this.effectDuration = -0; this.memoizedUpdaters = new Set(); @@ -15707,25 +16964,30 @@ __DEV__ && function createPortal$1(children, containerInfo, implementation) { var key = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; - try { - testStringCoercion(key); - var JSCompiler_inline_result = !1; - } catch (e$7) { - JSCompiler_inline_result = !0; + if (null == key) key = null; + else if (key === REACT_OPTIMISTIC_KEY) key = REACT_OPTIMISTIC_KEY; + else { + try { + testStringCoercion(key); + var JSCompiler_inline_result = !1; + } catch (e$7) { + JSCompiler_inline_result = !0; + } + JSCompiler_inline_result && + (console.error( + "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", + ("function" === typeof Symbol && + Symbol.toStringTag && + key[Symbol.toStringTag]) || + key.constructor.name || + "Object" + ), + testStringCoercion(key)); + key = "" + key; } - JSCompiler_inline_result && - (console.error( - "The provided key is an unsupported type %s. This value must be coerced to a string before using it here.", - ("function" === typeof Symbol && - Symbol.toStringTag && - key[Symbol.toStringTag]) || - key.constructor.name || - "Object" - ), - testStringCoercion(key)); return { $$typeof: REACT_PORTAL_TYPE, - key: null == key ? null : "" + key, + key: key, children: children, containerInfo: containerInfo, implementation: implementation @@ -15831,44 +17093,6 @@ __DEV__ && function getCurrentFiberForDevTools() { return current; } - function findNodeHandle(componentOrHandle) { - var owner = current; - null !== owner && - isRendering && - null !== owner.stateNode && - (owner.stateNode._warnedAboutRefsInRender || - console.error( - "%s is accessing findNodeHandle inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", - getComponentNameFromType(owner.type) || "A component" - ), - (owner.stateNode._warnedAboutRefsInRender = !0)); - if (null == componentOrHandle) return null; - if ("number" === typeof componentOrHandle) return componentOrHandle; - if (componentOrHandle._nativeTag) return componentOrHandle._nativeTag; - if ( - null != componentOrHandle.canonical && - null != componentOrHandle.canonical.nativeTag - ) - return componentOrHandle.canonical.nativeTag; - if ( - (owner = - ReactNativePrivateInterface.getNativeTagFromPublicInstance( - componentOrHandle - )) - ) - return owner; - componentOrHandle = findHostInstanceWithWarning( - componentOrHandle, - "findNodeHandle" - ); - return null == componentOrHandle - ? componentOrHandle - : null != componentOrHandle._nativeTag - ? componentOrHandle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance( - componentOrHandle - ); - } function getNodeFromInternalInstanceHandle(internalInstanceHandle) { return ( internalInstanceHandle && @@ -15886,6 +17110,67 @@ __DEV__ && "The current renderer does not support Resources. This error is likely caused by a bug in React. Please file an issue." ); } + function ViewTransitionPseudoElement(pseudo, name) { + this._pseudo = pseudo; + this._name = name; + } + function measureClonedInstance() { + console.warn("measureClonedInstance is not implemented"); + return { + rect: { x: 0, y: 0, width: 0, height: 0 }, + abs: !1, + clip: !1, + view: !0 + }; + } + function createViewTransitionInstance(name) { + var tag = allocateTag(); + fabricCreateViewTransitionInstance(name, tag); + return { + name: name, + old: new ViewTransitionPseudoElement("old", name), + new: new ViewTransitionPseudoElement("new", name) + }; + } + function startViewTransition( + suspendedState, + rootContainer, + transitionTypes, + mutationCallback, + layoutCallback, + afterMutationCallback, + spawnedWorkCallback, + passiveCallback + ) { + suspendedState = fabricStartViewTransition(function () { + mutationCallback(); + layoutCallback(); + afterMutationCallback(); + }); + if (null == suspendedState) + return ( + console.warn( + "startViewTransition didn't kick off transition in Fabric, the ViewTransition ReactNativeFeatureFlag might not be enabled." + ), + mutationCallback(), + layoutCallback(), + spawnedWorkCallback(), + null + ); + suspendedState.ready.then(function () { + spawnedWorkCallback(); + fabricStartViewTransitionReadyFinished(); + }); + suspendedState.finished.finally(function () { + passiveCallback(); + }); + return suspendedState; + } + function allocateTag() { + var tag = nextReactTag; + nextReactTag += 2; + return tag; + } function createTextInstance( text, rootContainerInstance, @@ -15896,8 +17181,7 @@ __DEV__ && console.error( "Text strings must be rendered within a component." ); - hostContext = nextReactTag; - nextReactTag += 2; + hostContext = allocateTag(); return { node: createNode( hostContext, @@ -15913,7 +17197,7 @@ __DEV__ && if (null == instance.canonical.publicInstance) { var $jscomp$nullish$tmp0; instance.canonical.publicInstance = - ReactNativePrivateInterface.createPublicInstance( + reactPrivateInterface.createPublicInstance( instance.canonical.nativeTag, instance.canonical.viewConfig, instance.canonical.internalInstanceHandle, @@ -15926,12 +17210,15 @@ __DEV__ && } return instance.canonical.publicInstance; } - return null != instance.containerInfo && - null != instance.containerInfo.publicInstance + return null != instance.containerInfo ? instance.containerInfo.publicInstance - : null != instance._nativeTag - ? instance - : null; + : null; + } + function getPublicInstanceFromHostFiber(fiber) { + fiber = getPublicInstance(fiber.stateNode); + if (null === fiber) + throw Error("Expected to find a host node. This is a bug in React."); + return fiber; } function resolveUpdatePriority() { if (0 !== currentUpdatePriority) return currentUpdatePriority; @@ -15949,9 +17236,32 @@ __DEV__ && } return DefaultEventPriority; } + function resolveEventType() { + var event = global.event; + event && event !== schedulerEvent + ? event.type + ? (event = event.type) + : ((event = event.dispatchConfig), + (event = + null == event || null == event.phasedRegistrationNames + ? null + : (event = + event.phasedRegistrationNames.bubbled || + event.phasedRegistrationNames.captured) + ? event.startsWith("on") + ? event.slice(2).toLowerCase() + : event.toLowerCase() + : null)) + : (event = null); + return event; + } + function resolveEventTimeStamp() { + var event = global.event; + return event && event !== schedulerEvent ? event.timeStamp : -1.1; + } function cloneHiddenInstance(instance) { var node = instance.node, - updatePayload = ReactNativePrivateInterface.createAttributePayload( + updatePayload = reactPrivateInterface.createAttributePayload( { style: { display: "none" } }, instance.canonical.viewConfig.validAttributes ); @@ -15963,9 +17273,56 @@ __DEV__ && function replaceContainerChildren(container, newChildren) { completeRoot(container.containerTag, newChildren); } + function FragmentInstance(fragmentFiber) { + this._fragmentFiber = fragmentFiber; + this._observers = null; + } + function observeChild(child, observer) { + child = getPublicInstanceFromHostFiber(child); + observer.observe(child); + return !1; + } + function unobserveChild(child, observer) { + child = getPublicInstanceFromHostFiber(child); + observer.unobserve(child); + return !1; + } + function collectChildren(child, collection) { + collection.push(child); + return !1; + } + function collectClientRects(child, rects) { + child = getPublicInstanceFromHostFiber(child); + rects.push(child.getBoundingClientRect()); + return !1; + } + function addFragmentHandleToFiber(child, fragmentInstance) { + child = getPublicInstanceFromHostFiber(child); + null != child && addFragmentHandleToInstance(child, fragmentInstance); + return !1; + } + function addFragmentHandleToInstance(instance, fragmentInstance) { + null == instance.reactFragments && (instance.reactFragments = new Set()); + instance.reactFragments.add(fragmentInstance); + } + function commitNewChildToFragmentInstance(childInstance, fragmentInstance) { + if (null != childInstance.canonical) { + var publicInstance = getPublicInstance(childInstance); + if (null !== fragmentInstance._observers) { + if (null == publicInstance) + throw Error( + "Expected to find a host node. This is a bug in React." + ); + fragmentInstance._observers.forEach(function (observer) { + observer.observe(publicInstance); + }); + } + addFragmentHandleToInstance(publicInstance, fragmentInstance); + } + } function nativeOnUncaughtError(error, errorInfo) { !1 !== - ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog({ + reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog({ errorBoundary: null, error: error, componentStack: @@ -15983,7 +17340,7 @@ __DEV__ && function nativeOnCaughtError(error, errorInfo) { if ( !1 !== - ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog({ + reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog({ errorBoundary: errorInfo.errorBoundary, error: error, componentStack: @@ -16027,9 +17384,9 @@ __DEV__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); - require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); + require("react-native/setup-env"); var React = require("react"), - ReactNativePrivateInterface = require("react-native/Libraries/ReactPrivate/ReactNativePrivateInterface"), + reactPrivateInterface = require("react-native/react-private-interface"), Scheduler = require("scheduler"), isArrayImpl = Array.isArray, ReactSharedInternals = @@ -16064,12 +17421,14 @@ __DEV__ && REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"); Symbol.for("react.scope"); - var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"); - Symbol.for("react.legacy_hidden"); + var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"), + REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); Symbol.for("react.tracing_marker"); - var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"); - Symbol.for("react.view_transition"); - var MAYBE_ITERATOR_SYMBOL = Symbol.iterator, + var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"), + REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), + REACT_RECOVERABLE_TYPE = Symbol.for("react.recoverable"), + MAYBE_ITERATOR_SYMBOL = Symbol.iterator, + REACT_OPTIMISTIC_KEY = Symbol.for("react.optimistic_key"), REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"), current = null, isRendering = !1, @@ -16158,7 +17517,7 @@ __DEV__ && bubbles: null, cancelable: null, timeStamp: function (event) { - return event.timeStamp || Date.now(); + return event.timeStamp || event.timestamp || currentTimeStamp(); }, defaultPrevented: null, isTrusted: null @@ -16621,10 +17980,10 @@ __DEV__ && eventNameDispatchConfigs = {}, registrationNameModules = {}, customBubblingEventTypes = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry + reactPrivateInterface.ReactNativeViewConfigRegistry .customBubblingEventTypes, customDirectEventTypes = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry + reactPrivateInterface.ReactNativeViewConfigRegistry .customDirectEventTypes; if (eventPluginOrder) throw Error( @@ -16705,6 +18064,7 @@ __DEV__ && }); var isInsideEventHandler = !1, eventQueue = null, + _enableNativeEventTargetEventDispatching = null, scheduleCallback$3 = Scheduler.unstable_scheduleCallback, cancelCallback$1 = Scheduler.unstable_cancelCallback, shouldYield = Scheduler.unstable_shouldYield, @@ -16730,14 +18090,14 @@ __DEV__ && ContinuousEventPriority = 8, DefaultEventPriority = 32, IdleEventPriority = 268435456, - instanceCache = new Map(), bind = Function.prototype.bind, valueStack = []; var fiberStack = []; var index$jscomp$0 = -1, emptyContextObject = {}; Object.freeze(emptyContextObject); - var lastResetTime = 0; + var globalClientIdCounter$1 = 0, + lastResetTime = 0; if ( "object" === typeof performance && "function" === typeof performance.now @@ -16801,7 +18161,7 @@ __DEV__ && end: -0, detail: { devtools: reusableComponentDevToolDetails } }, - resuableChangedPropsEntry = ["Changed Props", ""], + reusableChangedPropsEntry = ["Changed Props", ""], reusableDeeplyEqualPropsEntry = [ "Changed Props", "This component received deeply equal props. It might benefit from useMemo or the React Compiler in its owner." @@ -16850,6 +18210,7 @@ __DEV__ && _currentRenderer: null, _currentRenderer2: null }, + entangledTransitionTypes = null, now = Scheduler.unstable_now, createTask = console.createTask ? console.createTask @@ -16888,6 +18249,9 @@ __DEV__ && transitionEventType = null, transitionEventRepeatTime = -1.1, transitionSuspendedTime = -1.1, + retryClampTime = -0, + idleClampTime = -0, + animatingLanes = 0, animatingTask = null, yieldReason = 0, yieldStartTime = -1.1, @@ -16915,16 +18279,38 @@ __DEV__ && ) { if (0 > transitionStartTime && 0 > transitionUpdateTime) { transitionStartTime = now(); + var newEventTime = resolveEventTimeStamp(), + newEventType = resolveEventType(); if ( - -1.1 !== transitionEventRepeatTime || - null !== transitionEventType + newEventTime !== transitionEventRepeatTime || + newEventType !== transitionEventType ) transitionEventRepeatTime = -1.1; - transitionEventTime = -1.1; - transitionEventType = null; + transitionEventTime = newEventTime; + transitionEventType = newEventType; } entangleAsyncAction(transition, returnValue); } + if (null !== entangledTransitionTypes) + for (newEventTime = firstScheduledRoot; null !== newEventTime; ) + queueTransitionTypes(newEventTime, entangledTransitionTypes), + (newEventTime = newEventTime.next); + newEventTime = transition.types; + if (null !== newEventTime) { + for (newEventType = firstScheduledRoot; null !== newEventType; ) + queueTransitionTypes(newEventType, newEventTime), + (newEventType = newEventType.next); + if (0 !== currentEntangledLane) { + newEventType = entangledTransitionTypes; + null === newEventType && + (newEventType = entangledTransitionTypes = []); + for (var i = 0; i < newEventTime.length; i++) { + var transitionType = newEventTime[i]; + -1 === newEventType.indexOf(transitionType) && + newEventType.push(transitionType); + } + } + } null !== prevOnStartTransitionFinish && prevOnStartTransitionFinish(transition, returnValue); }; @@ -17122,7 +18508,8 @@ __DEV__ && pendingUNSAFE_ComponentWillUpdateWarnings = []; pendingLegacyContextWarning = new Map(); }; - var callComponent = { + var REACT_RECOVERABLE_DIGEST = "", + callComponent = { react_stack_bottom_frame: function (Component, props, secondArg) { var wasRendering = isRendering; isRendering = !0; @@ -17386,10 +18773,10 @@ __DEV__ && useActionState: throwInvalidHookError, useOptimistic: throwInvalidHookError, useMemoCache: throwInvalidHookError, - useCacheRefresh: throwInvalidHookError - }; - ContextOnlyDispatcher.useEffectEvent = throwInvalidHookError; - var HooksDispatcherOnMountInDEV = null, + useCacheRefresh: throwInvalidHookError, + useEffectEvent: throwInvalidHookError + }, + HooksDispatcherOnMountInDEV = null, HooksDispatcherOnMountWithHookTypesInDEV = null, HooksDispatcherOnUpdateInDEV = null, HooksDispatcherOnRerenderInDEV = null, @@ -18429,6 +19816,7 @@ __DEV__ && var didWarnAboutReassigningProps = !1; var didWarnAboutRevealOrder = {}; var didWarnAboutTailOptions = {}; + var didWarnAboutClassNameOnViewTransition = {}; var SUSPENDED_MARKER = { dehydrated: null, treeContext: null, @@ -18438,12 +19826,24 @@ __DEV__ && hasWarnedAboutUsingNoValuePropOnContextProvider = !1, didWarnAboutUndefinedSnapshotBeforeUpdate = null; didWarnAboutUndefinedSnapshotBeforeUpdate = new Set(); - var offscreenSubtreeIsHidden = !1, + var viewTransitionMutationContext = !1, + shouldStartViewTransition = !1, + appearingViewTransitions = null, + viewTransitionCancelableChildren = null, + viewTransitionHostInstanceIdx = 0, + mountedNamedViewTransitions = new Map(), + didWarnAboutName = {}, + NoLayoutEffectTraversalFlags = 0, + IncludeWorkInProgressEffects = 1, + offscreenSubtreeIsHidden = !1, offscreenSubtreeWasHidden = !1, PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, nextEffect = null, inProgressLanes = null, inProgressRoot = null, + viewTransitionContextChanged = !1, + inUpdateViewTransition = !1, + rootViewTransitionAffected = !1, inHydratedSubtree = !1, suspenseyCommitFlag = 8192, DefaultAsyncDispatcher = { @@ -18536,6 +19936,9 @@ __DEV__ && pendingEffectsRenderEndTime = -0, pendingPassiveTransitions = null, pendingRecoverableErrors = null, + pendingViewTransition = null, + pendingViewTransitionEvents = null, + pendingTransitionTypes = null, pendingSuspendedCommitReason = null, pendingDelayedCommitReason = IMMEDIATE_COMMIT, pendingSuspendedViewTransitionReason = null, @@ -18548,6 +19951,7 @@ __DEV__ && nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null, isRunningInsertionEffect = !1, + didWarnAboutInterruptedViewTransitions = !1, didWarnStateUpdateForNotYetMountedComponent = null, didWarnAboutUpdateInRender = !1; var didWarnAboutUpdateInRenderForAnotherComponent = new Set(); @@ -18691,44 +20095,49 @@ __DEV__ && commitHydratedInstance = shim$1, preloadResource = shim, suspendResource = shim, - _nativeFabricUIManage = nativeFabricUIManager, - createNode = _nativeFabricUIManage.createNode, - cloneNodeWithNewChildren = _nativeFabricUIManage.cloneNodeWithNewChildren, + fabricCreateViewTransitionInstance = + reactPrivateInterface.fabricUIManager.createViewTransitionInstance, + fabricStartViewTransition = + reactPrivateInterface.fabricUIManager.startViewTransition, + fabricStartViewTransitionReadyFinished = + reactPrivateInterface.fabricUIManager.startViewTransitionReadyFinished, + createNode = reactPrivateInterface.fabricUIManager.createNode, + cloneNodeWithNewChildren = + reactPrivateInterface.fabricUIManager.cloneNodeWithNewChildren, cloneNodeWithNewChildrenAndProps = - _nativeFabricUIManage.cloneNodeWithNewChildrenAndProps, - cloneNodeWithNewProps = _nativeFabricUIManage.cloneNodeWithNewProps, - createChildNodeSet = _nativeFabricUIManage.createChildSet, - appendChildNode = _nativeFabricUIManage.appendChild, - appendChildNodeToSet = _nativeFabricUIManage.appendChildToSet, - completeRoot = _nativeFabricUIManage.completeRoot, - registerEventHandler = _nativeFabricUIManage.registerEventHandler, + reactPrivateInterface.fabricUIManager.cloneNodeWithNewChildrenAndProps, + cloneNodeWithNewProps = + reactPrivateInterface.fabricUIManager.cloneNodeWithNewProps, + createChildNodeSet = reactPrivateInterface.fabricUIManager.createChildSet, + appendChildNode = reactPrivateInterface.fabricUIManager.appendChild, + appendChildNodeToSet = + reactPrivateInterface.fabricUIManager.appendChildToSet, + completeRoot = reactPrivateInterface.fabricUIManager.completeRoot, + registerEventHandler = + reactPrivateInterface.fabricUIManager.registerEventHandler, FabricDiscretePriority = - _nativeFabricUIManage.unstable_DiscreteEventPriority, + reactPrivateInterface.fabricUIManager.unstable_DiscreteEventPriority, FabricContinuousPriority = - _nativeFabricUIManage.unstable_ContinuousEventPriority, - FabricIdlePriority = _nativeFabricUIManage.unstable_IdleEventPriority, + reactPrivateInterface.fabricUIManager.unstable_ContinuousEventPriority, + FabricIdlePriority = + reactPrivateInterface.fabricUIManager.unstable_IdleEventPriority, fabricGetCurrentEventPriority = - _nativeFabricUIManage.unstable_getCurrentEventPriority, + reactPrivateInterface.fabricUIManager.unstable_getCurrentEventPriority, + fabricSuspendOnActiveViewTransition = + reactPrivateInterface.fabricUIManager.suspendOnActiveViewTransition, extraDevToolsConfig = { getInspectorDataForInstance: getInspectorDataForInstance, - getInspectorDataForViewTag: function (viewTag) { - viewTag = instanceCache.get(viewTag) || null; - return getInspectorDataForInstance(viewTag); - }, getInspectorDataForViewAtPoint: function ( inspectedView, locationX, locationY, callback ) { - var closestInstance = null, - fabricNode = - ReactNativePrivateInterface.getNodeFromPublicInstance( - inspectedView - ); - fabricNode - ? nativeFabricUIManager.findNodeAtPoint( - fabricNode, + var closestInstance = null; + (inspectedView = + reactPrivateInterface.getNodeFromPublicInstance(inspectedView)) + ? reactPrivateInterface.fabricUIManager.findNodeAtPoint( + inspectedView, locationX, locationY, function (internalInstanceHandle) { @@ -18757,7 +20166,7 @@ __DEV__ && .publicInstance, nativeViewTag = internalInstanceHandle.stateNode.canonical.nativeTag; - nativeFabricUIManager.measure( + reactPrivateInterface.fabricUIManager.measure( node, function (x, y, width, height, pageX, pageY) { x = getInspectorDataForInstance(closestInstance); @@ -18779,44 +20188,135 @@ __DEV__ && } } ) - : null != inspectedView._internalFiberInstanceHandleDEV - ? ReactNativePrivateInterface.UIManager.findSubviewIn( - findNodeHandle(inspectedView), - [locationX, locationY], - function (nativeViewTag, left, top, width, height) { - var inspectorData = getInspectorDataForInstance( - instanceCache.get(nativeViewTag) || null - ); - callback( - assign({}, inspectorData, { - pointerY: locationY, - frame: { - left: left, - top: top, - width: width, - height: height - }, - touchedViewTag: nativeViewTag, - closestPublicInstance: nativeViewTag - }) - ); - } - ) - : console.error( - "getInspectorDataForViewAtPoint expects to receive a host component" - ); + : console.error( + "getInspectorDataForViewAtPoint expects to receive a host component" + ); } }, getViewConfigForType = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get, + reactPrivateInterface.ReactNativeViewConfigRegistry.get, nextReactTag = 2; registerEventHandler && registerEventHandler(dispatchEvent); var currentUpdatePriority = 0, + schedulerEvent = void 0, warnsIfNotActing = !1, scheduleTimeout = setTimeout, cancelTimeout = clearTimeout, - noTimeout = -1, - NotPendingTransition = null, + noTimeout = -1; + FragmentInstance.prototype.observeUsing = function (observer) { + null === this._observers && (this._observers = new Set()); + this._observers.add(observer); + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + observeChild, + observer, + void 0, + void 0 + ); + }; + FragmentInstance.prototype.unobserveUsing = function (observer) { + var observers = this._observers; + null !== observers && observers.has(observer) + ? (observers.delete(observer), + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + unobserveChild, + observer, + void 0, + void 0 + )) + : console.error( + "You are calling unobserveUsing() with an observer that is not being observed with this fragment instance. First attach the observer with observeUsing()" + ); + }; + FragmentInstance.prototype.compareDocumentPosition = function (otherNode) { + var parentHostFiber = getFragmentParentInstanceOrContainerFiber( + this._fragmentFiber + ); + if (null === parentHostFiber) return Node.DOCUMENT_POSITION_DISCONNECTED; + var children = []; + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + collectChildren, + children, + void 0, + void 0 + ); + if (0 === children.length) { + var parentHostInstance = + getPublicInstanceFromHostFiber(parentHostFiber); + children = this._fragmentFiber; + parentHostFiber = getPublicInstanceFromHostFiber; + var parentResult = + parentHostInstance.compareDocumentPosition(otherNode); + var result = parentResult; + parentHostInstance === otherNode + ? (result = Node.DOCUMENT_POSITION_CONTAINS) + : parentResult & Node.DOCUMENT_POSITION_CONTAINED_BY && + ((parentHostInstance = [null, null]), + (result = getFragmentParentInstanceOrContainerFiber(children)), + null !== result && + findFragmentInstanceOrTextInstanceSiblings( + parentHostInstance, + children, + result.child, + { foundSelf: !1 } + ), + (children = parentHostInstance[1]), + null === children + ? (result = Node.DOCUMENT_POSITION_PRECEDING) + : ((otherNode = + parentHostFiber(children).compareDocumentPosition(otherNode)), + (result = + 0 === otherNode || + otherNode & Node.DOCUMENT_POSITION_FOLLOWING + ? Node.DOCUMENT_POSITION_FOLLOWING + : Node.DOCUMENT_POSITION_PRECEDING))); + return (result |= Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC); + } + parentHostFiber = getPublicInstanceFromHostFiber(children[0]); + children = getPublicInstanceFromHostFiber(children[children.length - 1]); + parentHostInstance = parentHostFiber.compareDocumentPosition(otherNode); + parentResult = children.compareDocumentPosition(otherNode); + result = + parentHostInstance & Node.DOCUMENT_POSITION_CONTAINED_BY || + parentResult & Node.DOCUMENT_POSITION_CONTAINED_BY; + parentResult = + parentHostInstance & Node.DOCUMENT_POSITION_FOLLOWING && + parentResult & Node.DOCUMENT_POSITION_PRECEDING; + return parentHostFiber === otherNode || + children === otherNode || + result || + parentResult + ? Node.DOCUMENT_POSITION_CONTAINED_BY + : parentHostInstance; + }; + FragmentInstance.prototype.getRootNode = function (getRootNodeOptions) { + var parentHostFiber = getFragmentParentInstanceOrContainerFiber( + this._fragmentFiber + ); + return null === parentHostFiber + ? this + : getPublicInstanceFromHostFiber(parentHostFiber).getRootNode( + getRootNodeOptions + ); + }; + FragmentInstance.prototype.getClientRects = function () { + var rects = []; + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + collectClientRects, + rects, + void 0, + void 0 + ); + return rects; + }; + var NotPendingTransition = null, HostTransitionContext = { $$typeof: REACT_CONTEXT_TYPE, Provider: null, @@ -18825,9 +20325,6 @@ __DEV__ && _currentValue2: NotPendingTransition, _threadCount: 0 }, - supportsMicrotasks = - "undefined" !== typeof RN$enableMicrotasksInReact && - !!RN$enableMicrotasksInReact, scheduleMicrotask = "function" === typeof queueMicrotask ? queueMicrotask : scheduleTimeout; (function ( @@ -18863,14 +20360,14 @@ __DEV__ && onChange: function (from, to, blockNativeResponder) { from && from.stateNode && - nativeFabricUIManager.setIsJSResponder( + reactPrivateInterface.fabricUIManager.setIsJSResponder( from.stateNode.node, !1, blockNativeResponder || !1 ); to && to.stateNode && - nativeFabricUIManager.setIsJSResponder( + reactPrivateInterface.fabricUIManager.setIsJSResponder( to.stateNode.node, !0, blockNativeResponder || !1 @@ -18879,7 +20376,7 @@ __DEV__ && }); if ( "function" !== - typeof ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog + typeof reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog ) throw Error( "Expected ReactFiberErrorDialog.showErrorDialog to be a function." @@ -18901,10 +20398,10 @@ __DEV__ && (function () { var internals = { bundleType: 1, - version: "19.2.3", + version: "19.3.0", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.3" + reconcilerVersion: "19.3.0" }; null !== extraDevToolsConfig && (internals.rendererConfig = extraDevToolsConfig); @@ -18933,23 +20430,16 @@ __DEV__ && ); }; exports.dispatchCommand = function (handle, command, args) { - var nativeTag = - null != handle._nativeTag - ? handle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance(handle); - null == nativeTag - ? console.error( - "dispatchCommand was called with a ref that isn't a native component. Use React.forwardRef to get access to the underlying native component" + handle = reactPrivateInterface.getNodeFromPublicInstance(handle); + null != handle + ? reactPrivateInterface.fabricUIManager.dispatchCommand( + handle, + command, + args ) - : ((handle = - ReactNativePrivateInterface.getNodeFromPublicInstance(handle)), - null != handle - ? nativeFabricUIManager.dispatchCommand(handle, command, args) - : ReactNativePrivateInterface.UIManager.dispatchViewManagerCommand( - nativeTag, - command, - args - )); + : console.error( + "dispatchCommand was called with a ref that isn't a native component. Use React.forwardRef to get access to the underlying native component" + ); }; exports.findHostInstance_DEPRECATED = function (componentOrHandle) { var owner = current; @@ -18967,14 +20457,46 @@ __DEV__ && : componentOrHandle.canonical && componentOrHandle.canonical.publicInstance ? componentOrHandle.canonical.publicInstance - : componentOrHandle._nativeTag - ? componentOrHandle - : findHostInstanceWithWarning( - componentOrHandle, - "findHostInstance_DEPRECATED" - ); + : findHostInstanceWithWarning( + componentOrHandle, + "findHostInstance_DEPRECATED" + ); + }; + exports.findNodeHandle = function (componentOrHandle) { + var owner = current; + null !== owner && + isRendering && + null !== owner.stateNode && + (owner.stateNode._warnedAboutRefsInRender || + console.error( + "%s is accessing findNodeHandle inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", + getComponentNameFromType(owner.type) || "A component" + ), + (owner.stateNode._warnedAboutRefsInRender = !0)); + if (null == componentOrHandle) return null; + if ("number" === typeof componentOrHandle) return componentOrHandle; + if ( + null != componentOrHandle.canonical && + null != componentOrHandle.canonical.nativeTag + ) + return componentOrHandle.canonical.nativeTag; + if ( + (owner = + reactPrivateInterface.getNativeTagFromPublicInstance( + componentOrHandle + )) + ) + return owner; + componentOrHandle = findHostInstanceWithWarning( + componentOrHandle, + "findNodeHandle" + ); + return null == componentOrHandle + ? componentOrHandle + : reactPrivateInterface.getNativeTagFromPublicInstance( + componentOrHandle + ); }; - exports.findNodeHandle = findNodeHandle; exports.getNodeFromInternalInstanceHandle = getNodeFromInternalInstanceHandle; exports.getPublicInstanceFromInternalInstanceHandle = function ( @@ -18986,7 +20508,7 @@ __DEV__ && : 6 === internalInstanceHandle.tag ? (null == instance.publicInstance && (instance.publicInstance = - ReactNativePrivateInterface.createPublicTextInstance( + reactPrivateInterface.createPublicTextInstance( internalInstanceHandle )), instance.publicInstance) @@ -18998,25 +20520,35 @@ __DEV__ && : null; }; exports.isChildPublicInstance = function (parentInstance, childInstance) { - if ( - parentInstance._internalFiberInstanceHandleDEV && - childInstance._internalFiberInstanceHandleDEV - ) - return doesFiberContain( - parentInstance._internalFiberInstanceHandleDEV, - childInstance._internalFiberInstanceHandleDEV - ); parentInstance = - ReactNativePrivateInterface.getInternalInstanceHandleFromPublicInstance( + reactPrivateInterface.getInternalInstanceHandleFromPublicInstance( parentInstance ); childInstance = - ReactNativePrivateInterface.getInternalInstanceHandleFromPublicInstance( + reactPrivateInterface.getInternalInstanceHandleFromPublicInstance( childInstance ); - return null != parentInstance && null != childInstance - ? doesFiberContain(parentInstance, childInstance) - : !1; + if (null != parentInstance && null != childInstance) { + a: { + for ( + var parentFiberAlternate = parentInstance.alternate; + null !== childInstance; + + ) { + if ( + childInstance === parentInstance || + childInstance === parentFiberAlternate + ) { + parentInstance = !0; + break a; + } + childInstance = childInstance.return; + } + parentInstance = !1; + } + return parentInstance; + } + return !1; }; exports.render = function ( element, @@ -19041,7 +20573,7 @@ __DEV__ && (onRecoverableError = options.onRecoverableError); options = { publicInstance: - ReactNativePrivateInterface.createPublicRootInstance(containerTag), + reactPrivateInterface.createPublicRootInstance(containerTag), containerTag: containerTag }; concurrentRoot = concurrentRoot ? 1 : 0; @@ -19086,22 +20618,15 @@ __DEV__ && return element; }; exports.sendAccessibilityEvent = function (handle, eventType) { - var nativeTag = - null != handle._nativeTag - ? handle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance(handle); - null == nativeTag - ? console.error( - "sendAccessibilityEvent was called with a ref that isn't a native component. Use React.forwardRef to get access to the underlying native component" + handle = reactPrivateInterface.getNodeFromPublicInstance(handle); + null != handle + ? reactPrivateInterface.fabricUIManager.sendAccessibilityEvent( + handle, + eventType ) - : ((handle = - ReactNativePrivateInterface.getNodeFromPublicInstance(handle)), - null != handle - ? nativeFabricUIManager.sendAccessibilityEvent(handle, eventType) - : ReactNativePrivateInterface.legacySendAccessibilityEvent( - nativeTag, - eventType - )); + : console.error( + "sendAccessibilityEvent was called with a ref that isn't a native component. Use React.forwardRef to get access to the underlying native component" + ); }; exports.stopSurface = function (containerTag) { var root = roots.get(containerTag); diff --git a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js index 2625bf690ab0..bf3cacd4395c 100644 --- a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js +++ b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js @@ -7,14 +7,14 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<<8d29d23a1c540d7502dd188e691eb725>> + * @generated SignedSource<<3c59d85aa170213f7f757b2501b0b2f6>> * * This file was sync'd from the facebook/react repository. */ "use strict"; -require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); -var ReactNativePrivateInterface = require("react-native/Libraries/ReactPrivate/ReactNativePrivateInterface"), +require("react-native/setup-env"); +var reactPrivateInterface = require("react-native/react-private-interface"), React = require("react"), Scheduler = require("scheduler"), isArrayImpl = Array.isArray, @@ -71,7 +71,26 @@ function describeNativeComponentFrame(fn, construct) { } catch (x$1) { control = x$1; } - fn.call(Fake.prototype); + Fake = !1; + try { + var prevProps = Object.getOwnPropertyDescriptor( + fn.prototype, + "props" + ); + Object.defineProperty(fn.prototype, "props", { + configurable: !0, + set: function () { + throw Error(); + } + }); + Fake = !0; + new fn(); + } finally { + Fake && + (void 0 !== prevProps + ? Object.defineProperty(fn.prototype, "props", prevProps) + : delete fn.prototype.props); + } } } else { try { @@ -196,6 +215,8 @@ function describeFiber(fiber, childFiber) { return describeNativeComponentFrame(fiber.type, !0); case 31: return describeBuiltInComponentFrame("Activity"); + case 30: + return describeBuiltInComponentFrame("ViewTransition"); default: return ""; } @@ -228,12 +249,13 @@ var REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"); Symbol.for("react.scope"); -var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"); -Symbol.for("react.legacy_hidden"); +var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"), + REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); Symbol.for("react.tracing_marker"); -var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"); -Symbol.for("react.view_transition"); -var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; +var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"), + REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), + REACT_RECOVERABLE_TYPE = Symbol.for("react.recoverable"), + MAYBE_ITERATOR_SYMBOL = Symbol.iterator; function getIteratorFn(maybeIterable) { if (null === maybeIterable || "object" !== typeof maybeIterable) return null; maybeIterable = @@ -241,7 +263,8 @@ function getIteratorFn(maybeIterable) { maybeIterable["@@iterator"]; return "function" === typeof maybeIterable ? maybeIterable : null; } -var REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"); +var REACT_OPTIMISTIC_KEY = Symbol.for("react.optimistic_key"), + REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"); function getComponentNameFromType(type) { if (null == type) return null; if ("function" === typeof type) @@ -262,6 +285,8 @@ function getComponentNameFromType(type) { return "SuspenseList"; case REACT_ACTIVITY_TYPE: return "Activity"; + case REACT_VIEW_TRANSITION_TYPE: + return "ViewTransition"; } if ("object" === typeof type) switch (type.$$typeof) { @@ -301,11 +326,14 @@ var hasError = !1, getNodeFromInstance$1 = null; function executeDispatch(event, listener, inst) { event.currentTarget = getNodeFromInstance$1(inst); + inst = global.event; + global.event = event; try { listener(event); } catch (error) { hasError || ((hasError = !0), (caughtError = error)); } + global.event = inst; event.currentTarget = null; } function executeDirectDispatch(event) { @@ -321,6 +349,19 @@ function executeDirectDispatch(event) { event._dispatchInstances = null; return dispatchListener; } +function currentTimeStamp() { + currentTimeStamp = + "object" === typeof performance && + null !== performance && + "function" === typeof performance.now + ? function () { + return performance.now(); + } + : function () { + return Date.now(); + }; + return currentTimeStamp(); +} function functionThatReturnsTrue() { return !0; } @@ -397,7 +438,7 @@ SyntheticEvent.Interface = { bubbles: null, cancelable: null, timeStamp: function (event) { - return event.timeStamp || Date.now(); + return event.timeStamp || event.timestamp || currentTimeStamp(); }, defaultPrevented: null, isTrusted: null @@ -1100,11 +1141,10 @@ function getListener(inst, registrationName) { return inst; } var customBubblingEventTypes = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry + reactPrivateInterface.ReactNativeViewConfigRegistry .customBubblingEventTypes, customDirectEventTypes = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry - .customDirectEventTypes; + reactPrivateInterface.ReactNativeViewConfigRegistry.customDirectEventTypes; function accumulateDirectionalDispatches(inst, phase, event) { if ( (phase = getListener( @@ -1169,7 +1209,7 @@ eventPluginOrder = Array.prototype.slice.call([ "ReactNativeBridgeEventPlugin" ]); recomputePluginOrdering(); -var injectedNamesToPlugins$jscomp$inline_277 = { +var injectedNamesToPlugins$jscomp$inline_294 = { ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: { eventTypes: {}, @@ -1215,32 +1255,32 @@ var injectedNamesToPlugins$jscomp$inline_277 = { } } }, - isOrderingDirty$jscomp$inline_278 = !1, - pluginName$jscomp$inline_279; -for (pluginName$jscomp$inline_279 in injectedNamesToPlugins$jscomp$inline_277) + isOrderingDirty$jscomp$inline_295 = !1, + pluginName$jscomp$inline_296; +for (pluginName$jscomp$inline_296 in injectedNamesToPlugins$jscomp$inline_294) if ( - injectedNamesToPlugins$jscomp$inline_277.hasOwnProperty( - pluginName$jscomp$inline_279 + injectedNamesToPlugins$jscomp$inline_294.hasOwnProperty( + pluginName$jscomp$inline_296 ) ) { - var pluginModule$jscomp$inline_280 = - injectedNamesToPlugins$jscomp$inline_277[pluginName$jscomp$inline_279]; + var pluginModule$jscomp$inline_297 = + injectedNamesToPlugins$jscomp$inline_294[pluginName$jscomp$inline_296]; if ( - !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_279) || - namesToPlugins[pluginName$jscomp$inline_279] !== - pluginModule$jscomp$inline_280 + !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_296) || + namesToPlugins[pluginName$jscomp$inline_296] !== + pluginModule$jscomp$inline_297 ) { - if (namesToPlugins[pluginName$jscomp$inline_279]) + if (namesToPlugins[pluginName$jscomp$inline_296]) throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + - (pluginName$jscomp$inline_279 + "`.") + (pluginName$jscomp$inline_296 + "`.") ); - namesToPlugins[pluginName$jscomp$inline_279] = - pluginModule$jscomp$inline_280; - isOrderingDirty$jscomp$inline_278 = !0; + namesToPlugins[pluginName$jscomp$inline_296] = + pluginModule$jscomp$inline_297; + isOrderingDirty$jscomp$inline_295 = !0; } } -isOrderingDirty$jscomp$inline_278 && recomputePluginOrdering(); +isOrderingDirty$jscomp$inline_295 && recomputePluginOrdering(); function batchedUpdatesImpl(fn, bookkeeping) { return fn(bookkeeping); } @@ -1274,46 +1314,71 @@ function executeDispatchesAndReleaseTopLevel(e) { e.isPersistent() || e.constructor.release(e); } } -function dispatchEvent(target, topLevelType, nativeEvent) { - var eventTarget = null; - if (null != target) { - var stateNode = target.stateNode; - null != stateNode && (eventTarget = getPublicInstance(stateNode)); - } +var _enableNativeEventTargetEventDispatching = null; +function dispatchEvent(target, topLevelType, nativeEventParam) { + var nativeEvent = + null != nativeEventParam && "object" === typeof nativeEventParam + ? nativeEventParam + : {}, + eventTarget = null; + null != target && + ((nativeEventParam = target.stateNode), + null != nativeEventParam && + (eventTarget = getPublicInstance(nativeEventParam))); batchedUpdates$1(function () { var event = { eventName: topLevelType, nativeEvent: nativeEvent }; - ReactNativePrivateInterface.RawEventEmitter.emit(topLevelType, event); - ReactNativePrivateInterface.RawEventEmitter.emit("*", event); - event = eventTarget; - for ( - var events = null, legacyPlugins = plugins, i = 0; - i < legacyPlugins.length; - i++ - ) { - var possiblePlugin = legacyPlugins[i]; - possiblePlugin && - (possiblePlugin = possiblePlugin.extractEvents( + reactPrivateInterface.RawEventEmitter.emit(topLevelType, event); + reactPrivateInterface.RawEventEmitter.emit("*", event); + null == _enableNativeEventTargetEventDispatching && + ((event = + null != reactPrivateInterface.ReactNativeFeatureFlags + ? reactPrivateInterface.ReactNativeFeatureFlags + .enableNativeEventTargetEventDispatching + : null), + (_enableNativeEventTargetEventDispatching = + "function" === typeof event && event())); + if (_enableNativeEventTargetEventDispatching) + null != eventTarget && + reactPrivateInterface.dispatchNativeEvent( + eventTarget, topLevelType, - target, - nativeEvent, - event - )) && - (events = accumulateInto(events, possiblePlugin)); - } - event = events; - null !== event && (eventQueue = accumulateInto(eventQueue, event)); - event = eventQueue; - eventQueue = null; - if (event) { - forEachAccumulated(event, executeDispatchesAndReleaseTopLevel); - if (eventQueue) - throw Error( - "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." - ); - if (hasError) - throw ( - ((event = caughtError), (hasError = !1), (caughtError = null), event) + nativeEvent ); + else { + event = eventTarget; + for ( + var events = null, legacyPlugins = plugins, i = 0; + i < legacyPlugins.length; + i++ + ) { + var possiblePlugin = legacyPlugins[i]; + possiblePlugin && + (possiblePlugin = possiblePlugin.extractEvents( + topLevelType, + target, + nativeEvent, + event + )) && + (events = accumulateInto(events, possiblePlugin)); + } + event = events; + null !== event && (eventQueue = accumulateInto(eventQueue, event)); + event = eventQueue; + eventQueue = null; + if (event) { + forEachAccumulated(event, executeDispatchesAndReleaseTopLevel); + if (eventQueue) + throw Error( + "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." + ); + if (hasError) + throw ( + ((event = caughtError), + (hasError = !1), + (caughtError = null), + event) + ); + } } }); } @@ -1377,7 +1442,7 @@ function getHighestPriorityLanes(lanes) { case 32768: case 65536: case 131072: - return lanes & 261888; + return lanes & -lanes; case 262144: case 524288: case 1048576: @@ -1450,6 +1515,22 @@ function checkIfRootIsPrerendering(root, renderLanes) { renderLanes) ); } +function getEntangledLanes(root, renderLanes) { + 0 !== (renderLanes & 8) && (renderLanes |= renderLanes & 32); + var allEntangledLanes = root.entangledLanes; + if (0 !== allEntangledLanes) + for ( + root = root.entanglements, allEntangledLanes &= renderLanes; + 0 < allEntangledLanes; + + ) { + var index$6 = 31 - clz32(allEntangledLanes), + lane = 1 << index$6; + renderLanes |= root[index$6]; + allEntangledLanes &= ~lane; + } + return renderLanes; +} function computeExpirationTime(lane, currentTime) { switch (lane) { case 1: @@ -1628,18 +1709,12 @@ function lanesToEventPriority(lanes) { : 2; } function getNearestMountedFiber(fiber) { - var node = fiber, - nearestMounted = fiber; - if (fiber.alternate) for (; node.return; ) node = node.return; - else { - fiber = node; - do - (node = fiber), - 0 !== (node.flags & 4098) && (nearestMounted = node.return), - (fiber = node.return); - while (fiber); - } - return 3 === node.tag ? nearestMounted : null; + for (var node = fiber, nextNode = node; nextNode && !nextNode.alternate; ) + (node = nextNode), + 0 !== (node.flags & 4098) && (fiber = node.return), + (nextNode = node.return); + for (; node.return; ) node = node.return; + return 3 === node.tag ? fiber : null; } function assertIsMounted(fiber) { if (getNearestMountedFiber(fiber) !== fiber) @@ -1731,6 +1806,66 @@ function findCurrentHostFiberImpl(node) { } return null; } +function traverseVisibleInstancesAndTextInstances( + child, + searchWithinHosts, + fn, + a, + b, + c +) { + for (; null !== child; ) { + if ( + ((5 === child.tag || 27 === child.tag || 6 === child.tag) && + fn(child, a, b, c)) || + ((22 !== child.tag || null === child.memoizedState) && + (searchWithinHosts || (5 !== child.tag && 27 !== child.tag)) && + traverseVisibleInstancesAndTextInstances( + child.child, + searchWithinHosts, + fn, + a, + b, + c + )) + ) + return !0; + child = child.sibling; + } + return !1; +} +function getFragmentParentInstanceOrContainerFiber(fiber) { + for (fiber = fiber.return; null !== fiber; ) { + if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) return fiber; + fiber = fiber.return; + } + return null; +} +function findFragmentInstanceOrTextInstanceSiblings( + result, + self, + child, + state +) { + for (; null !== child; ) { + if (child === self) state.foundSelf = !0; + else if (5 === child.tag || 27 === child.tag || 6 === child.tag) { + if (state.foundSelf) return (result[1] = child), !0; + result[0] = child; + } else if ( + (22 !== child.tag || null === child.memoizedState) && + findFragmentInstanceOrTextInstanceSiblings( + result, + self, + child.child, + state + ) + ) + return !0; + child = child.sibling; + } + return !1; +} var valueStack = [], index = -1; function createCursor(defaultValue) { @@ -1745,7 +1880,42 @@ function push(cursor, value) { valueStack[index] = cursor.current; cursor.current = value; } -var emptyContextObject = {}; +var emptyContextObject = {}, + globalClientIdCounter$1 = 0; +function getViewTransitionName(props, instance) { + if (null != props.name && "auto" !== props.name) return props.name; + if (null !== instance.autoName) return instance.autoName; + props = pendingEffectsRoot.identifierPrefix; + var globalClientId = globalClientIdCounter$1++; + props = "_" + props + "t_" + globalClientId.toString(32) + "_"; + return (instance.autoName = props); +} +function getClassNameByType(classByType) { + if (null == classByType || "string" === typeof classByType) + return classByType; + var className = null, + activeTypes = pendingTransitionTypes; + if (null !== activeTypes) + for (var i = 0; i < activeTypes.length; i++) { + var match = classByType[activeTypes[i]]; + if (null != match) { + if ("none" === match) return "none"; + className = null == className ? match : className + (" " + match); + } + } + return null == className ? classByType.default : className; +} +function getViewTransitionClassName(defaultClass, eventClass) { + defaultClass = getClassNameByType(defaultClass); + eventClass = getClassNameByType(eventClass); + return null == eventClass + ? "auto" === defaultClass + ? null + : defaultClass + : "auto" === eventClass + ? null + : eventClass; +} function is(x, y) { return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y); } @@ -1817,10 +1987,13 @@ function popHostContainer() { pop(rootInstanceStackCursor); } function pushHostContext(fiber) { - null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber); - var context = contextStackCursor.current; - context !== context && - (push(contextFiberStackCursor, fiber), push(contextStackCursor, context)); + var stateHook = fiber.memoizedState; + null !== stateHook && + ((HostTransitionContext._currentValue2 = stateHook.memoizedState), + push(hostTransitionProviderCursor, fiber)); + stateHook = contextStackCursor.current; + stateHook !== stateHook && + (push(contextFiberStackCursor, fiber), push(contextStackCursor, stateHook)); } function popHostContext(fiber) { contextFiberStackCursor.current === fiber && @@ -1908,7 +2081,21 @@ function propagateContextChanges( null !== list && (list.lanes |= renderLanes); scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress); nextFiber = null; - } else nextFiber = fiber.child; + } else + 13 === fiber.tag && + null !== fiber.memoizedState && + null === fiber.memoizedState.dehydrated + ? ((fiber.lanes |= renderLanes), + (nextFiber = fiber.alternate), + null !== nextFiber && (nextFiber.lanes |= renderLanes), + scheduleContextWorkOnParentPath( + fiber.return, + renderLanes, + workInProgress + ), + (nextFiber = fiber.child), + (nextFiber = null !== nextFiber ? nextFiber.sibling : null)) + : (nextFiber = fiber.child); if (null !== nextFiber) nextFiber.return = fiber; else for (nextFiber = fiber; null !== nextFiber; ) { @@ -1972,6 +2159,7 @@ function propagateParentContextChanges( forcePropagateEntireTree ); workInProgress.flags |= 262144; + return null !== current; } function checkIfContextChanged(currentDependencies) { for ( @@ -2059,6 +2247,22 @@ function releaseCache(cache) { cache.controller.abort(); }); } +function queueTransitionTypes(root, transitionTypes) { + if (0 !== (root.pendingLanes & 4194048)) { + var queued = root.transitionTypes; + null === queued && (queued = root.transitionTypes = []); + for (root = 0; root < transitionTypes.length; root++) { + var transitionType = transitionTypes[root]; + -1 === queued.indexOf(transitionType) && queued.push(transitionType); + } + } +} +var entangledTransitionTypes = null; +function claimQueuedTransitionTypes(root) { + var claimed = root.transitionTypes; + root.transitionTypes = null; + return claimed; +} function noop() {} var firstScheduledRoot = null, lastScheduledRoot = null, @@ -2240,16 +2444,14 @@ function performSyncWorkOnRoot(root, lanes) { performWorkOnRoot(root, lanes, !0); } function scheduleImmediateRootScheduleTask() { - supportsMicrotasks - ? scheduleMicrotask(function () { - 0 !== (executionContext & 6) - ? scheduleCallback$3( - ImmediatePriority, - processRootScheduleInImmediateTask - ) - : processRootScheduleInMicrotask(); - }) - : scheduleCallback$3(ImmediatePriority, processRootScheduleInImmediateTask); + scheduleMicrotask(function () { + 0 !== (executionContext & 6) + ? scheduleCallback$3( + ImmediatePriority, + processRootScheduleInImmediateTask + ) + : processRootScheduleInMicrotask(); + }); } function requestTransitionLane() { if (0 === currentEventTransitionLane) { @@ -2287,7 +2489,7 @@ function entangleAsyncAction(transition, thenable) { function pingEngtangledActionScope() { if ( 0 === --currentEntangledPendingCount && - null !== currentEntangledListeners + ((entangledTransitionTypes = null), null !== currentEntangledListeners) ) { null !== currentEntangledActionThenable && (currentEntangledActionThenable.status = "fulfilled"); @@ -2330,6 +2532,22 @@ ReactSharedInternals.S = function (transition, returnValue) { null !== returnValue && "function" === typeof returnValue.then && entangleAsyncAction(transition, returnValue); + if (null !== entangledTransitionTypes) + for (var root = firstScheduledRoot; null !== root; ) + queueTransitionTypes(root, entangledTransitionTypes), (root = root.next); + root = transition.types; + if (null !== root) { + for (var root$18 = firstScheduledRoot; null !== root$18; ) + queueTransitionTypes(root$18, root), (root$18 = root$18.next); + if (0 !== currentEntangledLane) { + root$18 = entangledTransitionTypes; + null === root$18 && (root$18 = entangledTransitionTypes = []); + for (var i = 0; i < root.length; i++) { + var transitionType = root[i]; + -1 === root$18.indexOf(transitionType) && root$18.push(transitionType); + } + } + } null !== prevOnStartTransitionFinish && prevOnStartTransitionFinish(transition, returnValue); }; @@ -2396,11 +2614,13 @@ function trackUsedThenable(thenableState, thenable, index) { case "fulfilled": return thenable.value; case "rejected": - throw ( - ((thenableState = thenable.reason), - checkIfUseWrappedInAsyncCatch(thenableState), - thenableState) - ); + thenableState = thenable.reason; + checkIfUseWrappedInAsyncCatch(thenableState); + if (void 0 === thenableState && !("reason" in thenable)) + throw Error( + "A rejected Promise was passed to React without a `reason` property. React threw a generic error from where the Promise was used to assist in identifying the problematic Promise. Make sure that instrumented Promises correctly set the `reason` property when setting `status` to `'rejected'`." + ); + throw thenableState; default: if ("string" === typeof thenable.status) thenable.then(noop, noop); else { @@ -2515,9 +2735,9 @@ function createChildReconciler(shouldTrackSideEffects) { } function mapRemainingChildren(currentFirstChild) { for (var existingChildren = new Map(); null !== currentFirstChild; ) - null !== currentFirstChild.key - ? existingChildren.set(currentFirstChild.key, currentFirstChild) - : existingChildren.set(currentFirstChild.index, currentFirstChild), + null === currentFirstChild.key + ? existingChildren.set(currentFirstChild.index, currentFirstChild) + : existingChildren.set(currentFirstChild.key, currentFirstChild), (currentFirstChild = currentFirstChild.sibling); return existingChildren; } @@ -2536,16 +2756,16 @@ function createChildReconciler(shouldTrackSideEffects) { return ( (newIndex = newIndex.index), newIndex < lastPlacedIndex - ? ((newFiber.flags |= 67108866), lastPlacedIndex) + ? ((newFiber.flags |= 2), lastPlacedIndex) : newIndex ); - newFiber.flags |= 67108866; + newFiber.flags |= 134217730; return lastPlacedIndex; } function placeSingleChild(newFiber) { shouldTrackSideEffects && null === newFiber.alternate && - (newFiber.flags |= 67108866); + (newFiber.flags |= 134217730); return newFiber; } function updateTextNode(returnFiber, current, textContent, lanes) { @@ -2562,12 +2782,16 @@ function createChildReconciler(shouldTrackSideEffects) { function updateElement(returnFiber, current, element, lanes) { var elementType = element.type; if (elementType === REACT_FRAGMENT_TYPE) - return updateFragment( - returnFiber, - current, - element.props.children, - lanes, - element.key + return ( + (returnFiber = updateFragment( + returnFiber, + current, + element.props.children, + lanes, + element.key + )), + coerceRef(returnFiber, element), + returnFiber ); if ( null !== current && @@ -2888,10 +3112,9 @@ function createChildReconciler(shouldTrackSideEffects) { )), null !== nextOldFiber && (shouldTrackSideEffects && - null !== nextOldFiber.alternate && - oldFiber.delete( - null === nextOldFiber.key ? newIdx : nextOldFiber.key - ), + ((newFiber = nextOldFiber.alternate), + null !== newFiber && + oldFiber.delete(null === newFiber.key ? newIdx : newFiber.key)), (currentFirstChild = placeChild( nextOldFiber, currentFirstChild, @@ -2967,8 +3190,11 @@ function createChildReconciler(shouldTrackSideEffects) { (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)), null !== step && (shouldTrackSideEffects && - null !== step.alternate && - oldFiber.delete(null === step.key ? newIdx : step.key), + ((nextOldFiber = step.alternate), + null !== nextOldFiber && + oldFiber.delete( + null === nextOldFiber.key ? newIdx : nextOldFiber.key + )), (currentFirstChild = placeChild(step, currentFirstChild, newIdx)), null === previousNewFiber ? (resultingFirstChild = step) @@ -2990,6 +3216,7 @@ function createChildReconciler(shouldTrackSideEffects) { null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && + void 0 === newChild.props.ref && (newChild = newChild.props.children); if ("object" === typeof newChild && null !== newChild) { switch (newChild.$$typeof) { @@ -3008,6 +3235,7 @@ function createChildReconciler(shouldTrackSideEffects) { currentFirstChild, newChild.props.children ); + coerceRef(lanes, newChild); lanes.return = returnFiber; returnFiber = lanes; break a; @@ -3041,6 +3269,7 @@ function createChildReconciler(shouldTrackSideEffects) { lanes, newChild.key )), + coerceRef(lanes, newChild), (lanes.return = returnFiber), (returnFiber = lanes)) : ((lanes = createFiberFromTypeAndProps( @@ -3553,7 +3782,7 @@ function pushOffscreenSuspenseHandler(fiber) { ? (push(suspenseStackCursor, suspenseStackCursor.current), push(suspenseHandlerStackCursor, fiber), null === shellBoundary && (shellBoundary = fiber)) - : reuseSuspenseHandlerOnStack(fiber); + : reuseSuspenseHandlerOnStack(); } function reuseSuspenseHandlerOnStack() { push(suspenseStackCursor, suspenseStackCursor.current); @@ -3565,6 +3794,15 @@ function popSuspenseHandler(fiber) { pop(suspenseStackCursor); } var suspenseStackCursor = createCursor(0); +function pushSuspenseListContext(fiber, newContext) { + push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current); + push(suspenseStackCursor, newContext); +} +function popSuspenseListContext(fiber) { + pop(suspenseStackCursor); + pop(suspenseHandlerStackCursor); + shellBoundary === fiber && (shellBoundary = null); +} function findFirstSuspended(row) { for (var node = row; null !== node; ) { if (13 === node.tag) { @@ -3573,10 +3811,7 @@ function findFirstSuspended(row) { return node; } else if ( 19 === node.tag && - ("forwards" === node.memoizedProps.revealOrder || - "backwards" === node.memoizedProps.revealOrder || - "unstable_legacy-backwards" === node.memoizedProps.revealOrder || - "together" === node.memoizedProps.revealOrder) + "independent" !== node.memoizedProps.revealOrder ) { if (0 !== (node.flags & 128)) return node; } else if (null !== node.child) { @@ -3797,6 +4032,7 @@ function useThenable(thenable) { function use(usable) { if (null !== usable && "object" === typeof usable) { if ("function" === typeof usable.then) return useThenable(usable); + if (usable.$$typeof === REACT_RECOVERABLE_TYPE) return; if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable); } throw Error("An unsupported type was passed to use(): " + String(usable)); @@ -3867,7 +4103,7 @@ function updateReducerImpl(hook, current, reducer) { var newBaseQueueFirst = (baseFirst = null), newBaseQueueLast = null, update = current, - didReadFromEntangledAsyncAction$46 = !1; + didReadFromEntangledAsyncAction$48 = !1; do { var updateLane = update.lane & -536870913; if ( @@ -3889,11 +4125,11 @@ function updateReducerImpl(hook, current, reducer) { next: null }), updateLane === currentEntangledLane && - (didReadFromEntangledAsyncAction$46 = !0); + (didReadFromEntangledAsyncAction$48 = !0); else if ((renderLanes & revertLane) === revertLane) { update = update.next; revertLane === currentEntangledLane && - (didReadFromEntangledAsyncAction$46 = !0); + (didReadFromEntangledAsyncAction$48 = !0); continue; } else (updateLane = { @@ -3941,7 +4177,7 @@ function updateReducerImpl(hook, current, reducer) { if ( !objectIs(pendingQueue, hook.memoizedState) && ((didReceiveUpdate = !0), - didReadFromEntangledAsyncAction$46 && + didReadFromEntangledAsyncAction$48 && ((reducer = currentEntangledActionThenable), null !== reducer)) ) throw reducer; @@ -3990,18 +4226,19 @@ function updateSyncExternalStore(subscribe, getSnapshot) { updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [ subscribe ]); - if ( + subscribe = hook.getSnapshot !== getSnapshot || snapshotChanged || - (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1) - ) { + (null !== workInProgressHook && + 0 !== (workInProgressHook.memoizedState.tag & 1)); + pushSimpleEffect( + subscribe ? 9 : 8, + { destroy: void 0 }, + updateStoreInstance.bind(null, fiber, hook, nextSnapshot, getSnapshot), + null + ); + if (subscribe) { fiber.flags |= 2048; - pushSimpleEffect( - 9, - { destroy: void 0 }, - updateStoreInstance.bind(null, fiber, hook, nextSnapshot, getSnapshot), - null - ); if (null === workInProgressRoot) throw Error( "Expected a work-in-progress root. This is a bug in React. Please file an issue." @@ -4088,7 +4325,7 @@ function dispatchActionState( payload ) { if (isRenderPhaseUpdate(fiber)) - throw Error("Cannot update form state while rendering."); + throw Error("Cannot update action state while rendering."); fiber = actionQueue.action; if (null !== fiber) { var actionNode = { @@ -4123,6 +4360,8 @@ function runActionStateAction(actionQueue, node) { if (node.isTransition) { var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition.types = + null !== prevTransition ? prevTransition.types : null; ReactSharedInternals.T = currentTransition; try { var returnValue = action(prevState, payload), @@ -4142,8 +4381,8 @@ function runActionStateAction(actionQueue, node) { try { (prevTransition = action(prevState, payload)), handleActionReturnValue(actionQueue, node, prevTransition); - } catch (error$50) { - onActionError(actionQueue, node, error$50); + } catch (error$52) { + onActionError(actionQueue, node, error$52); } } function handleActionReturnValue(actionQueue, node, returnValue) { @@ -4437,7 +4676,7 @@ function updateDeferredValueImpl(hook, prevValue, value, initialValue) { hook ); if ( - 0 === (renderLanes & 42) || + 0 === (renderLanes & 106) || (0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) ) @@ -4453,6 +4692,8 @@ function startTransition(fiber, queue, pendingState, finishedState, callback) { 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8; var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition.types = + null !== prevTransition ? prevTransition.types : null; ReactSharedInternals.T = currentTransition; dispatchOptimisticSetState(fiber, !1, queue, pendingState); try { @@ -4637,32 +4878,32 @@ function entangleTransitionUpdate(root, queue, lane) { } } var ContextOnlyDispatcher = { - readContext: readContext, - use: use, - useCallback: throwInvalidHookError, - useContext: throwInvalidHookError, - useEffect: throwInvalidHookError, - useImperativeHandle: throwInvalidHookError, - useLayoutEffect: throwInvalidHookError, - useInsertionEffect: throwInvalidHookError, - useMemo: throwInvalidHookError, - useReducer: throwInvalidHookError, - useRef: throwInvalidHookError, - useState: throwInvalidHookError, - useDebugValue: throwInvalidHookError, - useDeferredValue: throwInvalidHookError, - useTransition: throwInvalidHookError, - useSyncExternalStore: throwInvalidHookError, - useId: throwInvalidHookError, - useHostTransitionStatus: throwInvalidHookError, - useFormState: throwInvalidHookError, - useActionState: throwInvalidHookError, - useOptimistic: throwInvalidHookError, - useMemoCache: throwInvalidHookError, - useCacheRefresh: throwInvalidHookError -}; -ContextOnlyDispatcher.useEffectEvent = throwInvalidHookError; -var HooksDispatcherOnMount = { + readContext: readContext, + use: use, + useCallback: throwInvalidHookError, + useContext: throwInvalidHookError, + useEffect: throwInvalidHookError, + useImperativeHandle: throwInvalidHookError, + useLayoutEffect: throwInvalidHookError, + useInsertionEffect: throwInvalidHookError, + useMemo: throwInvalidHookError, + useReducer: throwInvalidHookError, + useRef: throwInvalidHookError, + useState: throwInvalidHookError, + useDebugValue: throwInvalidHookError, + useDeferredValue: throwInvalidHookError, + useTransition: throwInvalidHookError, + useSyncExternalStore: throwInvalidHookError, + useId: throwInvalidHookError, + useHostTransitionStatus: throwInvalidHookError, + useFormState: throwInvalidHookError, + useActionState: throwInvalidHookError, + useOptimistic: throwInvalidHookError, + useMemoCache: throwInvalidHookError, + useCacheRefresh: throwInvalidHookError, + useEffectEvent: throwInvalidHookError + }, + HooksDispatcherOnMount = { readContext: readContext, use: use, useCallback: function (callback, deps) { @@ -4883,62 +5124,62 @@ var HooksDispatcherOnMount = { return updateOptimisticImpl(hook, currentHook, passthrough, reducer); }, useMemoCache: useMemoCache, - useCacheRefresh: updateRefresh - }; -HooksDispatcherOnUpdate.useEffectEvent = updateEvent; -var HooksDispatcherOnRerender = { - readContext: readContext, - use: use, - useCallback: updateCallback, - useContext: readContext, - useEffect: updateEffect, - useImperativeHandle: updateImperativeHandle, - useInsertionEffect: updateInsertionEffect, - useLayoutEffect: updateLayoutEffect, - useMemo: updateMemo, - useReducer: rerenderReducer, - useRef: updateRef, - useState: function () { - return rerenderReducer(basicStateReducer); - }, - useDebugValue: mountDebugValue, - useDeferredValue: function (value, initialValue) { - var hook = updateWorkInProgressHook(); - return null === currentHook - ? mountDeferredValueImpl(hook, value, initialValue) - : updateDeferredValueImpl( - hook, - currentHook.memoizedState, - value, - initialValue - ); + useCacheRefresh: updateRefresh, + useEffectEvent: updateEvent }, - useTransition: function () { - var booleanOrThenable = rerenderReducer(basicStateReducer)[0], - start = updateWorkInProgressHook().memoizedState; - return [ - "boolean" === typeof booleanOrThenable - ? booleanOrThenable - : useThenable(booleanOrThenable), - start - ]; - }, - useSyncExternalStore: updateSyncExternalStore, - useId: updateId, - useHostTransitionStatus: useHostTransitionStatus, - useFormState: rerenderActionState, - useActionState: rerenderActionState, - useOptimistic: function (passthrough, reducer) { - var hook = updateWorkInProgressHook(); - if (null !== currentHook) - return updateOptimisticImpl(hook, currentHook, passthrough, reducer); - hook.baseState = passthrough; - return [passthrough, hook.queue.dispatch]; - }, - useMemoCache: useMemoCache, - useCacheRefresh: updateRefresh -}; -HooksDispatcherOnRerender.useEffectEvent = updateEvent; + HooksDispatcherOnRerender = { + readContext: readContext, + use: use, + useCallback: updateCallback, + useContext: readContext, + useEffect: updateEffect, + useImperativeHandle: updateImperativeHandle, + useInsertionEffect: updateInsertionEffect, + useLayoutEffect: updateLayoutEffect, + useMemo: updateMemo, + useReducer: rerenderReducer, + useRef: updateRef, + useState: function () { + return rerenderReducer(basicStateReducer); + }, + useDebugValue: mountDebugValue, + useDeferredValue: function (value, initialValue) { + var hook = updateWorkInProgressHook(); + return null === currentHook + ? mountDeferredValueImpl(hook, value, initialValue) + : updateDeferredValueImpl( + hook, + currentHook.memoizedState, + value, + initialValue + ); + }, + useTransition: function () { + var booleanOrThenable = rerenderReducer(basicStateReducer)[0], + start = updateWorkInProgressHook().memoizedState; + return [ + "boolean" === typeof booleanOrThenable + ? booleanOrThenable + : useThenable(booleanOrThenable), + start + ]; + }, + useSyncExternalStore: updateSyncExternalStore, + useId: updateId, + useHostTransitionStatus: useHostTransitionStatus, + useFormState: rerenderActionState, + useActionState: rerenderActionState, + useOptimistic: function (passthrough, reducer) { + var hook = updateWorkInProgressHook(); + if (null !== currentHook) + return updateOptimisticImpl(hook, currentHook, passthrough, reducer); + hook.baseState = passthrough; + return [passthrough, hook.queue.dispatch]; + }, + useMemoCache: useMemoCache, + useCacheRefresh: updateRefresh, + useEffectEvent: updateEvent + }; function applyDerivedStateFromProps( workInProgress, ctor, @@ -5077,9 +5318,9 @@ function resolveClassComponentProps(Component, baseProps) { } if ((Component = Component.defaultProps)) { newProps === baseProps && (newProps = assign({}, newProps)); - for (var propName$52 in Component) - void 0 === newProps[propName$52] && - (newProps[propName$52] = Component[propName$52]); + for (var propName$54 in Component) + void 0 === newProps[propName$54] && + (newProps[propName$54] = Component[propName$54]); } return newProps; } @@ -5186,6 +5427,7 @@ function throwException( switch (currentSourceFiber.tag) { case 31: case 13: + case 19: return ( sourceFiber.mode & 1 && (null === shellBoundary @@ -5285,17 +5527,17 @@ function throwException( !1 ); case 1: + sourceFiber = returnFiber.type; + currentSourceFiber = returnFiber.stateNode; if ( - ((sourceFiber = returnFiber.type), - (currentSourceFiber = returnFiber.stateNode), 0 === (returnFiber.flags & 128) && - ("function" === typeof sourceFiber.getDerivedStateFromError || - (null !== currentSourceFiber && - "function" === typeof currentSourceFiber.componentDidCatch && - (null === legacyErrorBoundariesThatAlreadyFailed || - !legacyErrorBoundariesThatAlreadyFailed.has( - currentSourceFiber - ))))) + ("function" === typeof sourceFiber.getDerivedStateFromError || + (null !== currentSourceFiber && + "function" === typeof currentSourceFiber.componentDidCatch && + (null === legacyErrorBoundariesThatAlreadyFailed || + !legacyErrorBoundariesThatAlreadyFailed.has( + currentSourceFiber + )))) ) return ( (returnFiber.flags |= 65536), @@ -5311,6 +5553,10 @@ function throwException( enqueueCapturedUpdate(returnFiber, rootRenderLanes), !1 ); + break; + case 22: + if (null !== returnFiber.memoizedState) + return (returnFiber.flags |= 65536), !1; } returnFiber = returnFiber.return; } while (null !== returnFiber); @@ -5515,11 +5761,11 @@ function updateOffscreenComponent( null !== prevState ? (pushTransition(workInProgress, prevState.cachePool), pushHiddenContext(workInProgress, prevState), - reuseSuspenseHandlerOnStack(workInProgress), + reuseSuspenseHandlerOnStack(), (workInProgress.memoizedState = null)) : (null !== current && pushTransition(workInProgress, null), reuseHiddenContextOnStack(), - reuseSuspenseHandlerOnStack(workInProgress)); + reuseSuspenseHandlerOnStack()); reconcileChildren(current, workInProgress, nextChildren, renderLanes); return workInProgress.child; } @@ -5906,172 +6152,81 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) { JSCompiler_temp = 0 !== (workInProgress.flags & 32); workInProgress.flags &= -33; if (null === current) { - var nextPrimaryChildren = nextProps.children; + didSuspend = nextProps.children; nextProps = nextProps.fallback; - if (showFallback) - return ( - reuseSuspenseHandlerOnStack(workInProgress), - (showFallback = workInProgress.mode), - (didSuspend = workInProgress.child), - (nextPrimaryChildren = { - mode: "hidden", - children: nextPrimaryChildren - }), - 0 === (showFallback & 1) && null !== didSuspend - ? ((didSuspend.childLanes = 0), - (didSuspend.pendingProps = nextPrimaryChildren)) - : (didSuspend = mountWorkInProgressOffscreenFiber( - nextPrimaryChildren, - showFallback - )), - (nextProps = createFiberFromFragment( - nextProps, - showFallback, - renderLanes, - null - )), - (didSuspend.return = workInProgress), - (nextProps.return = workInProgress), - (didSuspend.sibling = nextProps), - (workInProgress.child = didSuspend), - (nextProps = workInProgress.child), - (nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes)), - (nextProps.childLanes = getRemainingWorkInPrimaryTree( - current, - JSCompiler_temp, - renderLanes - )), - (workInProgress.memoizedState = SUSPENDED_MARKER), - bailoutOffscreenComponent(null, nextProps) + if (showFallback) { + reuseSuspenseHandlerOnStack(); + showFallback = workInProgress.mode; + var progressedPrimaryFragment = workInProgress.child; + didSuspend = { mode: "hidden", children: didSuspend }; + 0 === (showFallback & 1) && null !== progressedPrimaryFragment + ? ((progressedPrimaryFragment.childLanes = 0), + (progressedPrimaryFragment.pendingProps = didSuspend)) + : (progressedPrimaryFragment = mountWorkInProgressOffscreenFiber( + didSuspend, + showFallback + )); + nextProps = createFiberFromFragment( + nextProps, + showFallback, + renderLanes, + null + ); + progressedPrimaryFragment.return = workInProgress; + nextProps.return = workInProgress; + progressedPrimaryFragment.sibling = nextProps; + workInProgress.child = progressedPrimaryFragment; + nextProps = workInProgress.child; + nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes); + nextProps.childLanes = getRemainingWorkInPrimaryTree( + current, + JSCompiler_temp, + renderLanes ); + workInProgress.memoizedState = SUSPENDED_MARKER; + return bailoutOffscreenComponent(null, nextProps); + } pushPrimaryTreeSuspenseHandler(workInProgress); - return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren); - } - nextPrimaryChildren = current.memoizedState; - if (null !== nextPrimaryChildren && null !== nextPrimaryChildren.dehydrated) { - if (didSuspend) - workInProgress.flags & 256 - ? (pushPrimaryTreeSuspenseHandler(workInProgress), - (workInProgress.flags &= -257), - (workInProgress = retrySuspenseComponentWithoutHydrating( - current, - workInProgress, - renderLanes - ))) - : null !== workInProgress.memoizedState - ? (reuseSuspenseHandlerOnStack(workInProgress), - (workInProgress.child = current.child), - (workInProgress.flags |= 128), - (workInProgress = null)) - : (reuseSuspenseHandlerOnStack(workInProgress), - (showFallback = nextProps.fallback), - (nextPrimaryChildren = workInProgress.mode), - (nextProps = mountWorkInProgressOffscreenFiber( - { mode: "visible", children: nextProps.children }, - nextPrimaryChildren - )), - (showFallback = createFiberFromFragment( - showFallback, - nextPrimaryChildren, - renderLanes, - null - )), - (showFallback.flags |= 2), - (nextProps.return = workInProgress), - (showFallback.return = workInProgress), - (nextProps.sibling = showFallback), - (workInProgress.child = nextProps), - 0 !== (workInProgress.mode & 1) && - reconcileChildFibers( - workInProgress, - current.child, - null, - renderLanes - ), - (nextProps = workInProgress.child), - (nextProps.memoizedState = - mountSuspenseOffscreenState(renderLanes)), - (nextProps.childLanes = getRemainingWorkInPrimaryTree( - current, - JSCompiler_temp, - renderLanes - )), - (workInProgress.memoizedState = SUSPENDED_MARKER), - (workInProgress = bailoutOffscreenComponent(null, nextProps))); - else if ((pushPrimaryTreeSuspenseHandler(workInProgress), shim$1())) - (JSCompiler_temp = shim$1().digest), - (nextProps = Error( - "The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering." - )), - (nextProps.stack = ""), - (nextProps.digest = JSCompiler_temp), - (JSCompiler_temp = { value: nextProps, source: null, stack: null }), - null === hydrationErrors - ? (hydrationErrors = [JSCompiler_temp]) - : hydrationErrors.push(JSCompiler_temp), - (workInProgress = retrySuspenseComponentWithoutHydrating( - current, - workInProgress, - renderLanes - )); - else if ( - (didReceiveUpdate || - propagateParentContextChanges(current, workInProgress, renderLanes, !1), - (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)), - didReceiveUpdate || JSCompiler_temp) - ) { - JSCompiler_temp = workInProgressRoot; - if ( - null !== JSCompiler_temp && - ((nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes)), - 0 !== nextProps && nextProps !== nextPrimaryChildren.retryLane) - ) - throw ( - ((nextPrimaryChildren.retryLane = nextProps), - enqueueConcurrentRenderForLane(current, nextProps), - scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps), - SelectiveHydrationException) - ); - shim$1() || renderDidSuspendDelayIfPossible(); - workInProgress = retrySuspenseComponentWithoutHydrating( + return mountSuspensePrimaryChildren(workInProgress, didSuspend); + } + progressedPrimaryFragment = current.memoizedState; + if (null !== progressedPrimaryFragment) { + var dehydrated = progressedPrimaryFragment.dehydrated; + if (null !== dehydrated) + return updateDehydratedSuspenseComponent( current, workInProgress, + didSuspend, + JSCompiler_temp, + nextProps, + dehydrated, + progressedPrimaryFragment, renderLanes ); - } else - shim$1() - ? ((workInProgress.flags |= 192), - (workInProgress.child = current.child), - (workInProgress = null)) - : ((workInProgress = mountSuspensePrimaryChildren( - workInProgress, - nextProps.children - )), - (workInProgress.flags |= 4096)); - return workInProgress; } if (showFallback) { - reuseSuspenseHandlerOnStack(workInProgress); + reuseSuspenseHandlerOnStack(); showFallback = nextProps.fallback; - nextPrimaryChildren = workInProgress.mode; - didSuspend = current.child; - var currentFallbackChildFragment = didSuspend.sibling, - primaryChildProps = { mode: "hidden", children: nextProps.children }; - 0 === (nextPrimaryChildren & 1) && workInProgress.child !== didSuspend + didSuspend = workInProgress.mode; + progressedPrimaryFragment = current.child; + dehydrated = progressedPrimaryFragment.sibling; + var primaryChildProps = { mode: "hidden", children: nextProps.children }; + 0 === (didSuspend & 1) && workInProgress.child !== progressedPrimaryFragment ? ((nextProps = workInProgress.child), (nextProps.childLanes = 0), (nextProps.pendingProps = primaryChildProps), (workInProgress.deletions = null)) - : ((nextProps = createWorkInProgress(didSuspend, primaryChildProps)), - (nextProps.subtreeFlags = didSuspend.subtreeFlags & 65011712)); - null !== currentFallbackChildFragment - ? (showFallback = createWorkInProgress( - currentFallbackChildFragment, - showFallback - )) + : ((nextProps = createWorkInProgress( + progressedPrimaryFragment, + primaryChildProps + )), + (nextProps.subtreeFlags = + progressedPrimaryFragment.subtreeFlags & 1206910976)); + null !== dehydrated + ? (showFallback = createWorkInProgress(dehydrated, showFallback)) : ((showFallback = createFiberFromFragment( showFallback, - nextPrimaryChildren, + didSuspend, renderLanes, null )), @@ -6085,17 +6240,20 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) { showFallback = current.child.memoizedState; null === showFallback ? (showFallback = mountSuspenseOffscreenState(renderLanes)) - : ((nextPrimaryChildren = showFallback.cachePool), - null !== nextPrimaryChildren - ? ((didSuspend = CacheContext._currentValue2), - (nextPrimaryChildren = - nextPrimaryChildren.parent !== didSuspend - ? { parent: didSuspend, pool: didSuspend } - : nextPrimaryChildren)) - : (nextPrimaryChildren = getSuspendedCache()), + : ((didSuspend = showFallback.cachePool), + null !== didSuspend + ? ((progressedPrimaryFragment = CacheContext._currentValue2), + (didSuspend = + didSuspend.parent !== progressedPrimaryFragment + ? { + parent: progressedPrimaryFragment, + pool: progressedPrimaryFragment + } + : didSuspend)) + : (didSuspend = getSuspendedCache()), (showFallback = { baseLanes: showFallback.baseLanes | renderLanes, - cachePool: nextPrimaryChildren + cachePool: didSuspend })); nextProps.memoizedState = showFallback; nextProps.childLanes = getRemainingWorkInPrimaryTree( @@ -6152,57 +6310,206 @@ function retrySuspenseComponentWithoutHydrating( workInProgress.memoizedState = null; return current; } -function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) { - fiber.lanes |= renderLanes; - var alternate = fiber.alternate; - null !== alternate && (alternate.lanes |= renderLanes); - scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot); -} -function initSuspenseListRenderState( +function updateDehydratedSuspenseComponent( + current, workInProgress, - isBackwards, - tail, - lastContentRow, - tailMode, - treeForkCount + didSuspend, + didPrimaryChildrenDefer, + nextProps, + suspenseInstance, + suspenseState, + renderLanes ) { - var renderState = workInProgress.memoizedState; - null === renderState - ? (workInProgress.memoizedState = { - isBackwards: isBackwards, - rendering: null, - renderingStartTime: 0, - last: lastContentRow, - tail: tail, - tailMode: tailMode, - treeForkCount: treeForkCount - }) - : ((renderState.isBackwards = isBackwards), - (renderState.rendering = null), - (renderState.renderingStartTime = 0), - (renderState.last = lastContentRow), - (renderState.tail = tail), - (renderState.tailMode = tailMode), - (renderState.treeForkCount = treeForkCount)); -} -function updateSuspenseListComponent(current, workInProgress, renderLanes) { - var nextProps = workInProgress.pendingProps, - revealOrder = nextProps.revealOrder, - tailMode = nextProps.tail; - nextProps = nextProps.children; - var suspenseContext = suspenseStackCursor.current, - shouldForceFallback = 0 !== (suspenseContext & 2); - shouldForceFallback - ? ((suspenseContext = (suspenseContext & 1) | 2), - (workInProgress.flags |= 128)) - : (suspenseContext &= 1); - push(suspenseStackCursor, suspenseContext); - reconcileChildren(current, workInProgress, nextProps, renderLanes); - if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128)) - a: for (current = workInProgress.child; null !== current; ) { - if (13 === current.tag) - null !== current.memoizedState && - scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress); + if (didSuspend) { + if (workInProgress.flags & 256) + return ( + pushPrimaryTreeSuspenseHandler(workInProgress), + (workInProgress.flags &= -257), + retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ) + ); + if (null !== workInProgress.memoizedState) + return ( + reuseSuspenseHandlerOnStack(), + (workInProgress.child = current.child), + (workInProgress.flags |= 128), + null + ); + reuseSuspenseHandlerOnStack(); + suspenseState = nextProps.fallback; + didSuspend = workInProgress.mode; + nextProps = mountWorkInProgressOffscreenFiber( + { mode: "visible", children: nextProps.children }, + didSuspend + ); + suspenseState = createFiberFromFragment( + suspenseState, + didSuspend, + renderLanes, + null + ); + suspenseState.flags |= 2; + nextProps.return = workInProgress; + suspenseState.return = workInProgress; + nextProps.sibling = suspenseState; + workInProgress.child = nextProps; + 0 !== (workInProgress.mode & 1) && + reconcileChildFibers(workInProgress, current.child, null, renderLanes); + nextProps = workInProgress.child; + nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes); + nextProps.childLanes = getRemainingWorkInPrimaryTree( + current, + didPrimaryChildrenDefer, + renderLanes + ); + workInProgress.memoizedState = SUSPENDED_MARKER; + return bailoutOffscreenComponent(null, nextProps); + } + pushPrimaryTreeSuspenseHandler(workInProgress); + if (shim$1()) + return ( + (didPrimaryChildrenDefer = shim$1().digest), + "" !== didPrimaryChildrenDefer && + ((nextProps = Error( + "The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering." + )), + (nextProps.stack = ""), + (nextProps.digest = didPrimaryChildrenDefer), + (didPrimaryChildrenDefer = { + value: nextProps, + source: null, + stack: null + }), + null === hydrationErrors + ? (hydrationErrors = [didPrimaryChildrenDefer]) + : hydrationErrors.push(didPrimaryChildrenDefer)), + retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ) + ); + didReceiveUpdate || + propagateParentContextChanges(current, workInProgress, renderLanes, !1); + didPrimaryChildrenDefer = 0 !== (renderLanes & current.childLanes); + if (didReceiveUpdate || didPrimaryChildrenDefer) { + if (null !== currentTreeHiddenStackCursor.current) + return retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ); + didPrimaryChildrenDefer = workInProgressRoot; + if ( + null !== didPrimaryChildrenDefer && + ((nextProps = getBumpedLaneForHydration( + didPrimaryChildrenDefer, + renderLanes + )), + 0 !== nextProps && nextProps !== suspenseState.retryLane) + ) + throw ( + ((suspenseState.retryLane = nextProps), + enqueueConcurrentRenderForLane(current, nextProps), + scheduleUpdateOnFiber(didPrimaryChildrenDefer, current, nextProps), + SelectiveHydrationException) + ); + shim$1() || renderDidSuspendDelayIfPossible(); + return retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ); + } + if (shim$1()) + return ( + (workInProgress.flags |= 192), + (workInProgress.child = current.child), + null + ); + current = mountSuspensePrimaryChildren(workInProgress, nextProps.children); + current.flags |= 134221824; + return current; +} +function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) { + fiber.lanes |= renderLanes; + var alternate = fiber.alternate; + null !== alternate && (alternate.lanes |= renderLanes); + scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot); +} +function findLastContentRow(firstChild) { + for (var lastContentRow = null; null !== firstChild; ) { + var currentRow = firstChild.alternate; + null !== currentRow && + null === findFirstSuspended(currentRow) && + (lastContentRow = firstChild); + firstChild = firstChild.sibling; + } + return lastContentRow; +} +function initSuspenseListRenderState( + workInProgress, + isBackwards, + tail, + lastContentRow, + tailMode, + treeForkCount +) { + var renderState = workInProgress.memoizedState; + null === renderState + ? (workInProgress.memoizedState = { + isBackwards: isBackwards, + rendering: null, + renderingStartTime: 0, + last: lastContentRow, + tail: tail, + tailMode: tailMode, + treeForkCount: treeForkCount + }) + : ((renderState.isBackwards = isBackwards), + (renderState.rendering = null), + (renderState.renderingStartTime = 0), + (renderState.last = lastContentRow), + (renderState.tail = tail), + (renderState.tailMode = tailMode), + (renderState.treeForkCount = treeForkCount)); +} +function reverseChildren(fiber) { + var row = fiber.child; + for (fiber.child = null; null !== row; ) { + var nextRow = row.sibling; + row.sibling = fiber.child; + fiber.child = row; + row = nextRow; + } +} +function updateSuspenseListComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps, + revealOrder = nextProps.revealOrder, + tailMode = nextProps.tail; + nextProps = nextProps.children; + var suspenseContext = suspenseStackCursor.current; + if (workInProgress.flags & 128) + return pushSuspenseListContext(workInProgress, suspenseContext), null; + var shouldForceFallback = 0 !== (suspenseContext & 2); + shouldForceFallback + ? ((suspenseContext = (suspenseContext & 1) | 2), + (workInProgress.flags |= 128)) + : (suspenseContext &= 1); + pushSuspenseListContext(workInProgress, suspenseContext); + "backwards" === revealOrder && null !== current + ? (reverseChildren(current), + reconcileChildren(current, workInProgress, nextProps, renderLanes), + reverseChildren(current)) + : reconcileChildren(current, workInProgress, nextProps, renderLanes); + if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128)) + a: for (current = workInProgress.child; null !== current; ) { + if (13 === current.tag) + null !== current.memoizedState && + scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress); else if (19 === current.tag) scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress); else if (null !== current.child) { @@ -6222,29 +6529,23 @@ function updateSuspenseListComponent(current, workInProgress, renderLanes) { if (0 === (workInProgress.mode & 1)) workInProgress.memoizedState = null; else switch (revealOrder) { - case "forwards": - renderLanes = workInProgress.child; - for (revealOrder = null; null !== renderLanes; ) - (current = renderLanes.alternate), - null !== current && - null === findFirstSuspended(current) && - (revealOrder = renderLanes), - (renderLanes = renderLanes.sibling); - renderLanes = revealOrder; + case "backwards": + renderLanes = findLastContentRow(workInProgress.child); null === renderLanes ? ((revealOrder = workInProgress.child), (workInProgress.child = null)) - : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null)); + : ((revealOrder = renderLanes.sibling), + (renderLanes.sibling = null), + reverseChildren(workInProgress)); initSuspenseListRenderState( workInProgress, - !1, + !0, revealOrder, - renderLanes, + null, tailMode, 0 ); break; - case "backwards": case "unstable_legacy-backwards": renderLanes = null; revealOrder = workInProgress.child; @@ -6271,11 +6572,33 @@ function updateSuspenseListComponent(current, workInProgress, renderLanes) { case "together": initSuspenseListRenderState(workInProgress, !1, null, null, void 0, 0); break; - default: + case "independent": workInProgress.memoizedState = null; + break; + default: + (renderLanes = findLastContentRow(workInProgress.child)), + null === renderLanes + ? ((revealOrder = workInProgress.child), + (workInProgress.child = null)) + : ((revealOrder = renderLanes.sibling), + (renderLanes.sibling = null)), + initSuspenseListRenderState( + workInProgress, + !1, + revealOrder, + renderLanes, + tailMode, + 0 + ); } return workInProgress.child; } +function updateContextProvider(current, workInProgress, renderLanes) { + var newProps = workInProgress.pendingProps; + pushProvider(workInProgress, workInProgress.type, newProps.value); + reconcileChildren(current, workInProgress, newProps.children, renderLanes); + return workInProgress.child; +} function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) { 0 === (workInProgress.mode & 1) && null !== current && @@ -6352,15 +6675,22 @@ function attemptEarlyBailoutIfNoScheduledUpdate( ); break; case 13: - var state$72 = workInProgress.memoizedState; - if (null !== state$72) { - if (null !== state$72.dehydrated) + var state$76 = workInProgress.memoizedState; + if (null !== state$76) { + if (null !== state$76.dehydrated) return ( pushPrimaryTreeSuspenseHandler(workInProgress), (workInProgress.flags |= 128), null ); - if (0 !== (renderLanes & workInProgress.child.childLanes)) + state$76 = propagateParentContextChanges( + current, + workInProgress, + renderLanes, + !1 + ); + var primaryChildLanes = workInProgress.child.childLanes; + if (state$76 || 0 !== (renderLanes & primaryChildLanes)) return updateSuspenseComponent(current, workInProgress, renderLanes); pushPrimaryTreeSuspenseHandler(workInProgress); current = bailoutOnAlreadyFinishedWork( @@ -6373,18 +6703,24 @@ function attemptEarlyBailoutIfNoScheduledUpdate( pushPrimaryTreeSuspenseHandler(workInProgress); break; case 19: - var didSuspendBefore = 0 !== (current.flags & 128); - state$72 = 0 !== (renderLanes & workInProgress.childLanes); - state$72 || + if (workInProgress.flags & 128) + return updateSuspenseListComponent( + current, + workInProgress, + renderLanes + ); + primaryChildLanes = 0 !== (current.flags & 128); + state$76 = 0 !== (renderLanes & workInProgress.childLanes); + state$76 || (propagateParentContextChanges( current, workInProgress, renderLanes, !1 ), - (state$72 = 0 !== (renderLanes & workInProgress.childLanes))); - if (didSuspendBefore) { - if (state$72) + (state$76 = 0 !== (renderLanes & workInProgress.childLanes))); + if (primaryChildLanes) { + if (state$76) return updateSuspenseListComponent( current, workInProgress, @@ -6392,13 +6728,13 @@ function attemptEarlyBailoutIfNoScheduledUpdate( ); workInProgress.flags |= 128; } - didSuspendBefore = workInProgress.memoizedState; - null !== didSuspendBefore && - ((didSuspendBefore.rendering = null), - (didSuspendBefore.tail = null), - (didSuspendBefore.lastEffect = null)); - push(suspenseStackCursor, suspenseStackCursor.current); - if (state$72) break; + primaryChildLanes = workInProgress.memoizedState; + null !== primaryChildLanes && + ((primaryChildLanes.rendering = null), + (primaryChildLanes.tail = null), + (primaryChildLanes.lastEffect = null)); + pushSuspenseListContext(workInProgress, suspenseStackCursor.current); + if (state$76) break; else return null; case 22: return ( @@ -6487,6 +6823,15 @@ function beginWork(current, workInProgress, renderLanes) { renderLanes ); break a; + } else if ($$typeof === REACT_CONTEXT_TYPE) { + workInProgress.tag = 10; + workInProgress.type = elementType; + workInProgress = updateContextProvider( + null, + workInProgress, + renderLanes + ); + break a; } } workInProgress = getComponentNameFromType(elementType) || elementType; @@ -6606,12 +6951,9 @@ function beginWork(current, workInProgress, renderLanes) { ); case 7: return ( - reconcileChildren( - current, - workInProgress, - workInProgress.pendingProps, - renderLanes - ), + (elementType = workInProgress.pendingProps), + markRef(current, workInProgress), + reconcileChildren(current, workInProgress, elementType, renderLanes), workInProgress.child ); case 8: @@ -6635,17 +6977,7 @@ function beginWork(current, workInProgress, renderLanes) { workInProgress.child ); case 10: - return ( - (elementType = workInProgress.pendingProps), - pushProvider(workInProgress, workInProgress.type, elementType.value), - reconcileChildren( - current, - workInProgress, - elementType.children, - renderLanes - ), - workInProgress.child - ); + return updateContextProvider(current, workInProgress, renderLanes); case 9: return ( ($$typeof = workInProgress.type._context), @@ -6751,19 +7083,21 @@ function beginWork(current, workInProgress, renderLanes) { ); nextProps = 0 !== (renderLanes & current.childLanes); if (didReceiveUpdate || nextProps) { - $$typeof = workInProgressRoot; - if ( - null !== $$typeof && - ((nextProps = getBumpedLaneForHydration($$typeof, renderLanes)), - 0 !== nextProps && nextProps !== elementType.retryLane) - ) - throw ( - ((elementType.retryLane = nextProps), - enqueueConcurrentRenderForLane(current, nextProps), - scheduleUpdateOnFiber($$typeof, current, nextProps), - SelectiveHydrationException) - ); - renderDidSuspendDelayIfPossible(); + if (null === currentTreeHiddenStackCursor.current) { + $$typeof = workInProgressRoot; + if ( + null !== $$typeof && + ((nextProps = getBumpedLaneForHydration($$typeof, renderLanes)), + 0 !== nextProps && nextProps !== elementType.retryLane) + ) + throw ( + ((elementType.retryLane = nextProps), + enqueueConcurrentRenderForLane(current, nextProps), + scheduleUpdateOnFiber($$typeof, current, nextProps), + SelectiveHydrationException) + ); + renderDidSuspendDelayIfPossible(); + } workInProgress = retryActivityComponentWithoutHydrating( current, workInProgress, @@ -6771,7 +7105,7 @@ function beginWork(current, workInProgress, renderLanes) { ); } else (workInProgress = mountActivityChildren(workInProgress, $$typeof)), - (workInProgress.flags |= 4096); + (workInProgress.flags |= 134221824); } else (renderLanes = createWorkInProgress(current.child, { @@ -6840,6 +7174,30 @@ function beginWork(current, workInProgress, renderLanes) { ), workInProgress.child ); + case 30: + return ( + null === workInProgress.stateNode && + (workInProgress.stateNode = { + autoName: null, + paired: null, + clones: null, + ref: null + }), + (elementType = workInProgress.pendingProps), + null != elementType.name && + "auto" !== elementType.name && + (workInProgress.flags |= null === current ? 18882560 : 18874368), + null !== current && current.memoizedProps.name !== elementType.name + ? (workInProgress.flags |= 4194816) + : markRef(current, workInProgress), + reconcileChildren( + current, + workInProgress, + elementType.children, + renderLanes + ), + workInProgress.child + ); case 29: throw workInProgress.pendingProps; } @@ -6960,26 +7318,29 @@ function scheduleRetryEffect(workInProgress, retryQueue) { } function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { switch (renderState.tailMode) { - case "hidden": - hasRenderedATailFallback = renderState.tail; - for (var lastTailNode = null; null !== hasRenderedATailFallback; ) - null !== hasRenderedATailFallback.alternate && - (lastTailNode = hasRenderedATailFallback), - (hasRenderedATailFallback = hasRenderedATailFallback.sibling); - null === lastTailNode - ? (renderState.tail = null) - : (lastTailNode.sibling = null); + case "visible": break; case "collapsed": - lastTailNode = renderState.tail; - for (var lastTailNode$84 = null; null !== lastTailNode; ) - null !== lastTailNode.alternate && (lastTailNode$84 = lastTailNode), - (lastTailNode = lastTailNode.sibling); - null === lastTailNode$84 + for ( + var tailNode = renderState.tail, lastTailNode = null; + null !== tailNode; + + ) + null !== tailNode.alternate && (lastTailNode = tailNode), + (tailNode = tailNode.sibling); + null === lastTailNode ? hasRenderedATailFallback || null === renderState.tail ? (renderState.tail = null) : (renderState.tail.sibling = null) - : (lastTailNode$84.sibling = null); + : (lastTailNode.sibling = null); + break; + default: + hasRenderedATailFallback = renderState.tail; + for (tailNode = null; null !== hasRenderedATailFallback; ) + null !== hasRenderedATailFallback.alternate && + (tailNode = hasRenderedATailFallback), + (hasRenderedATailFallback = hasRenderedATailFallback.sibling); + null === tailNode ? (renderState.tail = null) : (tailNode.sibling = null); } } function bubbleProperties(completedWork) { @@ -6989,19 +7350,19 @@ function bubbleProperties(completedWork) { newChildLanes = 0, subtreeFlags = 0; if (didBailout) - for (var child$85 = completedWork.child; null !== child$85; ) - (newChildLanes |= child$85.lanes | child$85.childLanes), - (subtreeFlags |= child$85.subtreeFlags & 65011712), - (subtreeFlags |= child$85.flags & 65011712), - (child$85.return = completedWork), - (child$85 = child$85.sibling); + for (var child$89 = completedWork.child; null !== child$89; ) + (newChildLanes |= child$89.lanes | child$89.childLanes), + (subtreeFlags |= child$89.subtreeFlags & 1206910976), + (subtreeFlags |= child$89.flags & 1206910976), + (child$89.return = completedWork), + (child$89 = child$89.sibling); else - for (child$85 = completedWork.child; null !== child$85; ) - (newChildLanes |= child$85.lanes | child$85.childLanes), - (subtreeFlags |= child$85.subtreeFlags), - (subtreeFlags |= child$85.flags), - (child$85.return = completedWork), - (child$85 = child$85.sibling); + for (child$89 = completedWork.child; null !== child$89; ) + (newChildLanes |= child$89.lanes | child$89.childLanes), + (subtreeFlags |= child$89.subtreeFlags), + (subtreeFlags |= child$89.flags), + (child$89.return = completedWork), + (child$89 = child$89.sibling); completedWork.subtreeFlags |= subtreeFlags; completedWork.childLanes = newChildLanes; return didBailout; @@ -7023,66 +7384,63 @@ function completeWork(current, workInProgress, renderLanes) { case 1: return bubbleProperties(workInProgress), null; case 3: - return ( - (newProps = workInProgress.stateNode), - (renderLanes = null), - null !== current && (renderLanes = current.memoizedState.cache), - workInProgress.memoizedState.cache !== renderLanes && - (workInProgress.flags |= 2048), - popProvider(CacheContext), - popHostContainer(), - newProps.pendingContext && - ((newProps.context = newProps.pendingContext), - (newProps.pendingContext = null)), - (null !== current && null !== current.child) || - null === current || - (current.memoizedState.isDehydrated && - 0 === (workInProgress.flags & 256)) || - ((workInProgress.flags |= 1024), - upgradeHydrationErrorsToRecoverable()), - updateHostContainer(current, workInProgress), - bubbleProperties(workInProgress), - null - ); + newProps = workInProgress.stateNode; + var previousCache = null; + null !== current && (previousCache = current.memoizedState.cache); + workInProgress.memoizedState.cache !== previousCache && + (workInProgress.flags |= 2048); + popProvider(CacheContext); + popHostContainer(); + newProps.pendingContext && + ((newProps.context = newProps.pendingContext), + (newProps.pendingContext = null)); + (null !== current && null !== current.child) || + null === current || + (current.memoizedState.isDehydrated && + 0 === (workInProgress.flags & 256)) || + ((workInProgress.flags |= 1024), upgradeHydrationErrorsToRecoverable()); + updateHostContainer(current, workInProgress); + bubbleProperties(workInProgress); + return null; case 26: case 27: case 5: popHostContext(workInProgress); - var type = workInProgress.type; + renderLanes = workInProgress.type; if (null !== current && null != workInProgress.stateNode) if ( - ((renderLanes = current.stateNode), - (type = current.memoizedProps), + ((previousCache = current.stateNode), + (renderLanes = current.memoizedProps), (current = doesRequireClone(current, workInProgress)) || - type !== newProps) + renderLanes !== newProps) ) { b: { - type = ReactNativePrivateInterface.diffAttributePayloads( - type, + renderLanes = reactPrivateInterface.diffAttributePayloads( + renderLanes, newProps, - renderLanes.canonical.viewConfig.validAttributes + previousCache.canonical.viewConfig.validAttributes ); - renderLanes.canonical.currentProps = newProps; - newProps = renderLanes.node; + previousCache.canonical.currentProps = newProps; + newProps = previousCache.node; if (current) newProps = - null !== type - ? cloneNodeWithNewChildrenAndProps(newProps, type) + null !== renderLanes + ? cloneNodeWithNewChildrenAndProps(newProps, renderLanes) : cloneNodeWithNewChildren(newProps); - else if (null !== type) - newProps = cloneNodeWithNewProps(newProps, type); + else if (null !== renderLanes) + newProps = cloneNodeWithNewProps(newProps, renderLanes); else { - newProps = renderLanes; + newProps = previousCache; break b; } - newProps = { node: newProps, canonical: renderLanes.canonical }; + newProps = { node: newProps, canonical: previousCache.canonical }; } - newProps === renderLanes - ? (workInProgress.stateNode = renderLanes) + newProps === previousCache + ? (workInProgress.stateNode = previousCache) : ((workInProgress.flags |= 8), (workInProgress.stateNode = newProps), current && appendAllChildren(newProps, workInProgress, !1, !1)); - } else workInProgress.stateNode = renderLanes; + } else workInProgress.stateNode = previousCache; else { if (!newProps) { if (null === workInProgress.stateNode) @@ -7090,27 +7448,27 @@ function completeWork(current, workInProgress, renderLanes) { "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); bubbleProperties(workInProgress); + workInProgress.subtreeFlags &= -33554433; return null; } current = rootInstanceStackCursor.current; - renderLanes = nextReactTag; - nextReactTag += 2; - type = getViewConfigForType(type); - var updatePayload = ReactNativePrivateInterface.createAttributePayload( + previousCache = allocateTag(); + renderLanes = getViewConfigForType(renderLanes); + var updatePayload = reactPrivateInterface.createAttributePayload( newProps, - type.validAttributes + renderLanes.validAttributes ); current = { node: createNode( - renderLanes, - type.uiViewClassName, + previousCache, + renderLanes.uiViewClassName, current.containerTag, updatePayload, workInProgress ), canonical: { - nativeTag: renderLanes, - viewConfig: type, + nativeTag: previousCache, + viewConfig: renderLanes, currentProps: newProps, internalInstanceHandle: workInProgress, publicInstance: null, @@ -7122,18 +7480,19 @@ function completeWork(current, workInProgress, renderLanes) { workInProgress.stateNode = current; } bubbleProperties(workInProgress); + workInProgress.subtreeFlags &= -33554433; workInProgress.flags &= -16777217; return null; case 6: if (current && null != workInProgress.stateNode) current.memoizedProps !== newProps ? ((current = rootInstanceStackCursor.current), - (renderLanes = contextStackCursor.current), + (previousCache = contextStackCursor.current), (workInProgress.flags |= 8), (workInProgress.stateNode = createTextInstance( newProps, current, - renderLanes, + previousCache, workInProgress ))) : (workInProgress.stateNode = current.stateNode); @@ -7143,12 +7502,12 @@ function completeWork(current, workInProgress, renderLanes) { "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); current = rootInstanceStackCursor.current; - renderLanes = contextStackCursor.current; + previousCache = contextStackCursor.current; workInProgress.flags |= 8; workInProgress.stateNode = createTextInstance( newProps, current, - renderLanes, + previousCache, workInProgress ); } @@ -7210,14 +7569,14 @@ function completeWork(current, workInProgress, renderLanes) { (workInProgress.memoizedState = null); workInProgress.flags |= 4; bubbleProperties(workInProgress); - type = !1; + previousCache = !1; } else - (type = upgradeHydrationErrorsToRecoverable()), + (previousCache = upgradeHydrationErrorsToRecoverable()), null !== current && null !== current.memoizedState && - (current.memoizedState.hydrationErrors = type), - (type = !0); - if (!type) { + (current.memoizedState.hydrationErrors = previousCache), + (previousCache = !0); + if (!previousCache) { if (workInProgress.flags & 256) return popSuspenseHandler(workInProgress), workInProgress; popSuspenseHandler(workInProgress); @@ -7230,17 +7589,17 @@ function completeWork(current, workInProgress, renderLanes) { newProps = null !== newProps; current = null !== current && null !== current.memoizedState; newProps && - ((renderLanes = workInProgress.child), - (type = null), - null !== renderLanes.alternate && - null !== renderLanes.alternate.memoizedState && - null !== renderLanes.alternate.memoizedState.cachePool && - (type = renderLanes.alternate.memoizedState.cachePool.pool), + ((previousCache = workInProgress.child), + (renderLanes = null), + null !== previousCache.alternate && + null !== previousCache.alternate.memoizedState && + null !== previousCache.alternate.memoizedState.cachePool && + (renderLanes = previousCache.alternate.memoizedState.cachePool.pool), (updatePayload = null), - null !== renderLanes.memoizedState && - null !== renderLanes.memoizedState.cachePool && - (updatePayload = renderLanes.memoizedState.cachePool.pool), - updatePayload !== type && (renderLanes.flags |= 2048)); + null !== previousCache.memoizedState && + null !== previousCache.memoizedState.cachePool && + (updatePayload = previousCache.memoizedState.cachePool.pool), + updatePayload !== renderLanes && (previousCache.flags |= 2048)); newProps !== current && newProps && (workInProgress.child.flags |= 8192); scheduleRetryEffect(workInProgress, workInProgress.updateQueue); bubbleProperties(workInProgress); @@ -7249,6 +7608,7 @@ function completeWork(current, workInProgress, renderLanes) { return ( popHostContainer(), updateHostContainer(current, workInProgress), + (workInProgress.flags |= 67108864), bubbleProperties(workInProgress), null ); @@ -7259,13 +7619,13 @@ function completeWork(current, workInProgress, renderLanes) { case 17: return bubbleProperties(workInProgress), null; case 19: - pop(suspenseStackCursor); - type = workInProgress.memoizedState; - if (null === type) return bubbleProperties(workInProgress), null; - newProps = 0 !== (workInProgress.flags & 128); - updatePayload = type.rendering; + popSuspenseListContext(workInProgress); + newProps = workInProgress.memoizedState; + if (null === newProps) return bubbleProperties(workInProgress), null; + previousCache = 0 !== (workInProgress.flags & 128); + updatePayload = newProps.rendering; if (null === updatePayload) - if (newProps) cutOffTailIfNeeded(type, !1); + if (previousCache) cutOffTailIfNeeded(newProps, !1); else { if ( 0 !== workInProgressRootExitStatus || @@ -7275,7 +7635,7 @@ function completeWork(current, workInProgress, renderLanes) { updatePayload = findFirstSuspended(current); if (null !== updatePayload) { workInProgress.flags |= 128; - cutOffTailIfNeeded(type, !1); + cutOffTailIfNeeded(newProps, !1); current = updatePayload.updateQueue; workInProgress.updateQueue = current; scheduleRetryEffect(workInProgress, current); @@ -7284,66 +7644,86 @@ function completeWork(current, workInProgress, renderLanes) { for (newProps = workInProgress.child; null !== newProps; ) resetWorkInProgress(newProps, current), (newProps = newProps.sibling); - push( - suspenseStackCursor, + pushSuspenseListContext( + workInProgress, (suspenseStackCursor.current & 1) | 2 ); return workInProgress.child; } current = current.sibling; } - null !== type.tail && + null !== newProps.tail && now() > workInProgressRootRenderTargetTime && ((workInProgress.flags |= 128), - (newProps = !0), - cutOffTailIfNeeded(type, !1), + (previousCache = !0), + cutOffTailIfNeeded(newProps, !1), (workInProgress.lanes = 4194304)); } else { - if (!newProps) + if (!previousCache) if ( ((current = findFirstSuspended(updatePayload)), null !== current) ) { if ( ((workInProgress.flags |= 128), - (newProps = !0), + (previousCache = !0), (current = current.updateQueue), (workInProgress.updateQueue = current), scheduleRetryEffect(workInProgress, current), - cutOffTailIfNeeded(type, !0), - null === type.tail && - "hidden" === type.tailMode && + cutOffTailIfNeeded(newProps, !0), + null === newProps.tail && + "collapsed" !== newProps.tailMode && + "visible" !== newProps.tailMode && !updatePayload.alternate) ) return bubbleProperties(workInProgress), null; } else - 2 * now() - type.renderingStartTime > + 2 * now() - newProps.renderingStartTime > workInProgressRootRenderTargetTime && 536870912 !== renderLanes && ((workInProgress.flags |= 128), - (newProps = !0), - cutOffTailIfNeeded(type, !1), + (previousCache = !0), + cutOffTailIfNeeded(newProps, !1), (workInProgress.lanes = 4194304)); - type.isBackwards + newProps.isBackwards ? ((updatePayload.sibling = workInProgress.child), (workInProgress.child = updatePayload)) - : ((current = type.last), + : ((current = newProps.last), null !== current ? (current.sibling = updatePayload) : (workInProgress.child = updatePayload), - (type.last = updatePayload)); + (newProps.last = updatePayload)); + } + if (null !== newProps.tail) { + current = newProps.tail; + a: { + for (renderLanes = current; null !== renderLanes; ) { + if (null !== renderLanes.alternate) { + renderLanes = !1; + break a; + } + renderLanes = renderLanes.sibling; + } + renderLanes = !0; + } + newProps.rendering = current; + newProps.tail = current.sibling; + newProps.renderingStartTime = now(); + current.sibling = null; + updatePayload = suspenseStackCursor.current; + updatePayload = previousCache + ? (updatePayload & 1) | 2 + : updatePayload & 1; + "visible" !== newProps.tailMode && + "collapsed" !== newProps.tailMode && + renderLanes + ? ((newProps = updatePayload), + push(suspenseHandlerStackCursor, workInProgress), + push(suspenseStackCursor, newProps), + null === shellBoundary && (shellBoundary = workInProgress)) + : pushSuspenseListContext(workInProgress, updatePayload); + return current; } - if (null !== type.tail) - return ( - (workInProgress = type.tail), - (type.rendering = workInProgress), - (type.tail = workInProgress.sibling), - (type.renderingStartTime = now()), - (workInProgress.sibling = null), - (current = suspenseStackCursor.current), - push(suspenseStackCursor, newProps ? (current & 1) | 2 : current & 1), - workInProgress - ); bubbleProperties(workInProgress); return null; case 22: @@ -7370,11 +7750,11 @@ function completeWork(current, workInProgress, renderLanes) { null !== current.memoizedState && null !== current.memoizedState.cachePool && (newProps = current.memoizedState.cachePool.pool), - (renderLanes = null), + (previousCache = null), null !== workInProgress.memoizedState && null !== workInProgress.memoizedState.cachePool && - (renderLanes = workInProgress.memoizedState.cachePool.pool), - renderLanes !== newProps && (workInProgress.flags |= 2048), + (previousCache = workInProgress.memoizedState.cachePool.pool), + previousCache !== newProps && (workInProgress.flags |= 2048), null !== current && pop(resumedCache), null ); @@ -7391,7 +7771,11 @@ function completeWork(current, workInProgress, renderLanes) { case 25: return null; case 30: - return null; + return ( + (workInProgress.flags |= 33554432), + bubbleProperties(workInProgress), + null + ); case 29: return null; } @@ -7451,7 +7835,18 @@ function unwindWork(current, workInProgress) { ? ((workInProgress.flags = (current & -65537) | 128), workInProgress) : null; case 19: - return pop(suspenseStackCursor), null; + return ( + popSuspenseListContext(workInProgress), + (current = workInProgress.flags), + current & 65536 + ? ((workInProgress.flags = (current & -65537) | 128), + (current = workInProgress.memoizedState), + null !== current && + ((current.rendering = null), (current.tail = null)), + (workInProgress.flags |= 4), + workInProgress) + : null + ); case 4: return popHostContainer(), null; case 10: @@ -7497,7 +7892,7 @@ function unwindInterruptedWork(current, interruptedWork) { popSuspenseHandler(interruptedWork); break; case 19: - pop(suspenseStackCursor); + popSuspenseListContext(interruptedWork); break; case 10: popProvider(interruptedWork.type); @@ -7610,6 +8005,25 @@ function safelyAttachRef(current, nearestMountedAncestor) { var instanceToUse = getPublicInstance(current.stateNode); break; case 30: + var instance = current.stateNode, + name = getViewTransitionName(current.memoizedProps, instance); + if (null === instance.ref || instance.ref.name !== name) + instance.ref = createViewTransitionInstance(name); + instanceToUse = instance.ref; + break; + case 7: + if (null === current.stateNode) { + var fragmentInstance = new FragmentInstance(current); + traverseVisibleInstancesAndTextInstances( + current.child, + !1, + addFragmentHandleToFiber, + fragmentInstance, + void 0, + void 0 + ); + current.stateNode = fragmentInstance; + } instanceToUse = current.stateNode; break; default: @@ -7640,11 +8054,45 @@ function safelyDetachRef(current, nearestMountedAncestor) { else if ("function" === typeof ref) try { ref(null); - } catch (error$111) { - captureCommitPhaseError(current, nearestMountedAncestor, error$111); + } catch (error$117) { + captureCommitPhaseError(current, nearestMountedAncestor, error$117); } else ref.current = null; } +var viewTransitionMutationContext = !1; +function pushMutationContext() { + var prev = viewTransitionMutationContext; + viewTransitionMutationContext = !1; + return prev; +} +function commitFragmentInstanceInsertionEffects(fiber) { + for (var parent = fiber.return; null !== parent; ) { + isFragmentInstanceParent(parent) && + commitNewChildToFragmentInstance(fiber.stateNode, parent.stateNode); + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } +} +function commitFragmentInstanceDeletionEffects(fiber) { + for (var parent = fiber.return; null !== parent; ) { + if (isFragmentInstanceParent(parent)) { + var fragmentInstance = parent.stateNode; + var childInstance = fiber.stateNode; + null != childInstance.canonical && + ((childInstance = getPublicInstance(childInstance)), + null != childInstance.reactFragments && + childInstance.reactFragments.delete(fragmentInstance)); + } + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } +} +function isFragmentInstanceHostBoundary(fiber) { + return 5 === fiber.tag || 3 === fiber.tag || !1; +} +function isFragmentInstanceParent(fiber) { + return fiber && 7 === fiber.tag && null !== fiber.stateNode; +} function commitHostMount(finishedWork) { try { throw Error( @@ -7654,6 +8102,42 @@ function commitHostMount(finishedWork) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } +function commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances +) { + if (5 === finishedWork.tag) { + if ( + (5 === finishedWork.tag || + 27 === finishedWork.tag || + 6 === finishedWork.tag) && + null === finishedWork.alternate && + null !== parentFragmentInstances + ) + for (var i = 0; i < parentFragmentInstances.length; i++) + commitNewChildToFragmentInstance( + finishedWork.stateNode, + parentFragmentInstances[i] + ); + } else if ( + 4 !== finishedWork.tag && + ((finishedWork = finishedWork.child), null !== finishedWork) + ) + for ( + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ), + finishedWork = finishedWork.sibling; + null !== finishedWork; + + ) + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ), + (finishedWork = finishedWork.sibling); +} function commitHostPortalContainerChildren( portal, finishedWork, @@ -7666,84 +8150,313 @@ function commitHostPortalContainerChildren( captureCommitPhaseError(finishedWork, finishedWork.return, error); } } -var offscreenSubtreeIsHidden = !1, - offscreenSubtreeWasHidden = !1, - PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, - nextEffect = null; -function commitBeforeMutationEffects(root, firstChild) { - for (nextEffect = firstChild; null !== nextEffect; ) - if ( - ((root = nextEffect), - (firstChild = root.child), - 0 !== (root.subtreeFlags & 1028) && null !== firstChild) +var shouldStartViewTransition = !1, + appearingViewTransitions = null; +function trackEnterViewTransitions(placement) { + if (30 === placement.tag || 0 !== (placement.subtreeFlags & 33554432)) + shouldStartViewTransition = !0; +} +var viewTransitionCancelableChildren = null; +function pushViewTransitionCancelableScope() { + var prevChildren = viewTransitionCancelableChildren; + viewTransitionCancelableChildren = null; + return prevChildren; +} +var viewTransitionHostInstanceIdx = 0; +function applyViewTransitionToHostInstances() { + viewTransitionHostInstanceIdx = 0; + return !1; +} +function commitAppearingPairViewTransitions(placement) { + if (0 !== (placement.subtreeFlags & 18874368)) + for (placement = placement.child; null !== placement; ) { + if (22 !== placement.tag || null === placement.memoizedState) + if ( + (commitAppearingPairViewTransitions(placement), + 30 === placement.tag && + 0 !== (placement.flags & 18874368) && + placement.stateNode.paired) + ) { + var props = placement.memoizedProps; + if (null == props.name || "auto" === props.name) + throw Error( + "Found a pair with an auto name. This is a bug in React." + ); + "none" !== getViewTransitionClassName(props.default, props.share) && + applyViewTransitionToHostInstances(); + } + placement = placement.sibling; + } +} +function commitEnterViewTransitions(placement, gesture) { + if (30 === placement.tag) { + var state = placement.stateNode, + props = placement.memoizedProps; + getViewTransitionName(props, state); + "none" !== + getViewTransitionClassName( + props.default, + state.paired ? props.share : props.enter ) - (firstChild.return = root), (nextEffect = firstChild); - else - for (; null !== nextEffect; ) { - root = nextEffect; - var current = root.alternate; - firstChild = root.flags; - switch (root.tag) { - case 0: - if ( - 0 !== (firstChild & 4) && - ((firstChild = root.updateQueue), - (firstChild = null !== firstChild ? firstChild.events : null), - null !== firstChild) - ) - for (var ii = 0; ii < firstChild.length; ii++) { - var _eventPayloads$ii = firstChild[ii]; - _eventPayloads$ii.ref.impl = _eventPayloads$ii.nextImpl; - } - break; - case 11: - case 15: - break; - case 1: - if (0 !== (firstChild & 1024) && null !== current) { - firstChild = void 0; - ii = root; - _eventPayloads$ii = current.memoizedProps; - current = current.memoizedState; - var instance = ii.stateNode; - try { - var resolvedPrevProps = resolveClassComponentProps( - ii.type, - _eventPayloads$ii - ); - firstChild = instance.getSnapshotBeforeUpdate( - resolvedPrevProps, - current - ); - instance.__reactInternalSnapshotBeforeUpdate = firstChild; - } catch (error) { - captureCommitPhaseError(ii, ii.return, error); + ? applyViewTransitionToHostInstances() && + (commitAppearingPairViewTransitions(placement), + state.paired || + gesture || + scheduleViewTransitionEvent(placement, props.onEnter)) + : commitAppearingPairViewTransitions(placement); + } else if (0 !== (placement.subtreeFlags & 33554432)) + for (placement = placement.child; null !== placement; ) + commitEnterViewTransitions(placement, gesture), + (placement = placement.sibling); + else commitAppearingPairViewTransitions(placement); +} +function commitDeletedPairViewTransitions(deletion) { + if ( + null !== appearingViewTransitions && + 0 !== appearingViewTransitions.size + ) { + var pairs = appearingViewTransitions; + if (0 !== (deletion.subtreeFlags & 18874368)) + for (deletion = deletion.child; null !== deletion; ) { + if (22 !== deletion.tag || null === deletion.memoizedState) { + if (30 === deletion.tag && 0 !== (deletion.flags & 18874368)) { + var props = deletion.memoizedProps, + name = props.name; + if (null != name && "auto" !== name) { + var pair = pairs.get(name); + if (void 0 !== pair) { + if ( + "none" !== + getViewTransitionClassName(props.default, props.share) && + applyViewTransitionToHostInstances() + ) { + var oldInstance = deletion.stateNode; + pair.paired = oldInstance; + oldInstance.paired = pair; + scheduleViewTransitionEvent(deletion, props.onShare); + } + pairs.delete(name); + if (0 === pairs.size) break; } } - break; - case 3: - break; - case 5: - case 26: - case 27: - case 6: - case 4: - case 17: - break; - default: - if (0 !== (firstChild & 1024)) - throw Error( - "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." - ); + } + commitDeletedPairViewTransitions(deletion); } - firstChild = root.sibling; - if (null !== firstChild) { - firstChild.return = root.return; - nextEffect = firstChild; - break; + deletion = deletion.sibling; + } + } +} +function commitExitViewTransitions(deletion) { + if (30 === deletion.tag) { + var props = deletion.memoizedProps, + name = getViewTransitionName(props, deletion.stateNode), + pair = + null !== appearingViewTransitions + ? appearingViewTransitions.get(name) + : void 0; + if ( + "none" !== + getViewTransitionClassName( + props.default, + void 0 !== pair ? props.share : props.exit + ) && + applyViewTransitionToHostInstances() + ) + if (void 0 !== pair) { + var oldInstance = deletion.stateNode; + pair.paired = oldInstance; + oldInstance.paired = pair; + appearingViewTransitions.delete(name); + scheduleViewTransitionEvent(deletion, props.onShare); + } else scheduleViewTransitionEvent(deletion, props.onExit); + null !== appearingViewTransitions && + commitDeletedPairViewTransitions(deletion); + } else if (0 !== (deletion.subtreeFlags & 33554432)) + for (deletion = deletion.child; null !== deletion; ) + commitExitViewTransitions(deletion), (deletion = deletion.sibling); + else + null !== appearingViewTransitions && + commitDeletedPairViewTransitions(deletion); +} +function commitNestedViewTransitions(changedParent) { + for (changedParent = changedParent.child; null !== changedParent; ) { + if (30 === changedParent.tag) { + var props = changedParent.memoizedProps, + name = getViewTransitionName(props, changedParent.stateNode); + props = getViewTransitionClassName(props.default, props.update); + changedParent.flags &= -5; + "none" !== props && + applyViewTransitionToHostInstances( + changedParent, + name, + props, + (changedParent.memoizedState = []) + ); + } else + 0 !== (changedParent.subtreeFlags & 33554432) && + commitNestedViewTransitions(changedParent); + changedParent = changedParent.sibling; + } +} +function restorePairedViewTransitions(parent) { + if (0 !== (parent.subtreeFlags & 18874368)) + for (parent = parent.child; null !== parent; ) { + if (22 !== parent.tag || null === parent.memoizedState) { + if (30 === parent.tag && 0 !== (parent.flags & 18874368)) { + var instance = parent.stateNode; + null !== instance.paired && (instance.paired = null); } - nextEffect = root.return; + restorePairedViewTransitions(parent); } + parent = parent.sibling; + } +} +function restoreEnterOrExitViewTransitions(fiber) { + if (30 === fiber.tag) + (fiber.stateNode.paired = null), restorePairedViewTransitions(fiber); + else if (0 !== (fiber.subtreeFlags & 33554432)) + for (fiber = fiber.child; null !== fiber; ) + restoreEnterOrExitViewTransitions(fiber), (fiber = fiber.sibling); + else restorePairedViewTransitions(fiber); +} +function measureNestedViewTransitions(changedParent, gesture) { + for (changedParent = changedParent.child; null !== changedParent; ) { + if (30 === changedParent.tag) { + var props = changedParent.memoizedProps, + state = changedParent.stateNode; + getViewTransitionName(props, state); + getViewTransitionClassName(props.default, props.update); + gesture + ? ((props = state.clones), + null !== props && props.map(measureClonedInstance)) + : (changedParent.memoizedState = null); + viewTransitionHostInstanceIdx = 0; + } else + 0 !== (changedParent.subtreeFlags & 33554432) && + measureNestedViewTransitions(changedParent, gesture); + changedParent = changedParent.sibling; + } +} +var offscreenSubtreeIsHidden = !1, + offscreenSubtreeWasHidden = !1, + PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, + nextEffect = null, + viewTransitionContextChanged = !1; +function commitBeforeMutationEffects(root, firstChild, committedLanes) { + root = (committedLanes & 335544064) === committedLanes; + nextEffect = firstChild; + for (firstChild = root ? 9270 : 1024; null !== nextEffect; ) { + committedLanes = nextEffect; + if (root) { + var deletions = committedLanes.deletions; + if (null !== deletions) + for (var i = 0; i < deletions.length; i++) + root && commitExitViewTransitions(deletions[i]); + } + if (null === committedLanes.alternate && 0 !== (committedLanes.flags & 2)) + root && trackEnterViewTransitions(committedLanes), + commitBeforeMutationEffects_complete(root); + else { + if (22 === committedLanes.tag && 0 !== (committedLanes.mode & 1)) + if ( + ((deletions = committedLanes.alternate), + null !== committedLanes.memoizedState) + ) { + null !== deletions && + null === deletions.memoizedState && + root && + commitExitViewTransitions(deletions); + commitBeforeMutationEffects_complete(root); + continue; + } else if (null !== deletions && null !== deletions.memoizedState) { + root && trackEnterViewTransitions(committedLanes); + commitBeforeMutationEffects_complete(root); + continue; + } + deletions = committedLanes.child; + 0 !== (committedLanes.subtreeFlags & firstChild) && null !== deletions + ? ((deletions.return = committedLanes), (nextEffect = deletions)) + : (root && commitNestedViewTransitions(committedLanes), + commitBeforeMutationEffects_complete(root)); + } + } + appearingViewTransitions = null; +} +function commitBeforeMutationEffects_complete( + isViewTransitionEligible$jscomp$0 +) { + for (; null !== nextEffect; ) { + var fiber = nextEffect, + isViewTransitionEligible = isViewTransitionEligible$jscomp$0, + current = fiber.alternate, + flags = fiber.flags; + switch (fiber.tag) { + case 0: + case 11: + case 15: + break; + case 1: + if (0 !== (flags & 1024) && null !== current) { + isViewTransitionEligible = void 0; + flags = current.memoizedProps; + current = current.memoizedState; + var instance = fiber.stateNode; + try { + var resolvedPrevProps = resolveClassComponentProps( + fiber.type, + flags + ); + isViewTransitionEligible = instance.getSnapshotBeforeUpdate( + resolvedPrevProps, + current + ); + instance.__reactInternalSnapshotBeforeUpdate = + isViewTransitionEligible; + } catch (error) { + captureCommitPhaseError(fiber, fiber.return, error); + } + } + break; + case 3: + break; + case 5: + case 26: + case 27: + case 6: + case 4: + case 17: + break; + case 30: + isViewTransitionEligible && + null !== current && + ((isViewTransitionEligible = getViewTransitionName( + current.memoizedProps, + current.stateNode + )), + (flags = fiber.memoizedProps), + (flags = getViewTransitionClassName(flags.default, flags.update)), + "none" !== flags && + applyViewTransitionToHostInstances( + current, + isViewTransitionEligible, + flags, + (current.memoizedState = []) + )); + break; + default: + if (0 !== (flags & 1024)) + throw Error( + "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." + ); + } + current = fiber.sibling; + if (null !== current) { + current.return = fiber.return; + nextEffect = current; + break; + } + nextEffect = fiber.return; + } } function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { var flags = finishedWork.flags; @@ -7775,11 +8488,11 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { current, finishedRoot.__reactInternalSnapshotBeforeUpdate ); - } catch (error$110) { + } catch (error$115) { captureCommitPhaseError( finishedWork, finishedWork.return, - error$110 + error$115 ); } } @@ -7845,27 +8558,33 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { null !== finishedWork.memoizedState || offscreenSubtreeIsHidden), !flags) ) { - current = + var newOffscreenSubtreeWasHidden = (null !== current && null !== current.memoizedState) || offscreenSubtreeWasHidden; - prevProps = offscreenSubtreeIsHidden; - var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; + current = offscreenSubtreeIsHidden; + prevProps = offscreenSubtreeWasHidden; offscreenSubtreeIsHidden = flags; - (offscreenSubtreeWasHidden = current) && - !prevOffscreenSubtreeWasHidden - ? recursivelyTraverseReappearLayoutEffects( + (offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden) && + !prevProps + ? ((flags = 0), + 0 !== (finishedWork.subtreeFlags & 8772) && (flags |= 1), + recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - 0 !== (finishedWork.subtreeFlags & 8772) - ) + flags + )) : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); - offscreenSubtreeIsHidden = prevProps; - offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; + offscreenSubtreeIsHidden = current; + offscreenSubtreeWasHidden = prevProps; } } else recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); break; case 30: + recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); + flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); break; + case 7: + flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); default: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); } @@ -7909,8 +8628,11 @@ function commitDeletionEffectsOnFiber( case 27: case 5: offscreenSubtreeWasHidden || - safelyDetachRef(deletedFiber, nearestMountedAncestor); + safelyDetachRef(deletedFiber, nearestMountedAncestor), + commitFragmentInstanceDeletionEffects(deletedFiber); case 6: + 6 === deletedFiber.tag && + commitFragmentInstanceDeletionEffects(deletedFiber); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, @@ -7935,8 +8657,7 @@ function commitDeletionEffectsOnFiber( case 11: case 14: case 15: - offscreenSubtreeWasHidden || - commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); + commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); offscreenSubtreeWasHidden || commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor); recursivelyTraverseDeletionEffects( @@ -7986,6 +8707,23 @@ function commitDeletionEffectsOnFiber( deletedFiber ); break; + case 30: + safelyDetachRef(deletedFiber, nearestMountedAncestor); + recursivelyTraverseDeletionEffects( + finishedRoot, + nearestMountedAncestor, + deletedFiber + ); + break; + case 7: + offscreenSubtreeWasHidden || + safelyDetachRef(deletedFiber, nearestMountedAncestor); + recursivelyTraverseDeletionEffects( + finishedRoot, + nearestMountedAncestor, + deletedFiber + ); + break; default: recursivelyTraverseDeletionEffects( finishedRoot, @@ -8029,7 +8767,7 @@ function attachSuspenseRetryListeners(finishedWork, wakeables) { } }); } -function recursivelyTraverseMutationEffects(root, parentFiber) { +function recursivelyTraverseMutationEffects(root, parentFiber, lanes) { var deletions = parentFiber.deletions; if (null !== deletions) for (var i = 0; i < deletions.length; i++) { @@ -8041,10 +8779,10 @@ function recursivelyTraverseMutationEffects(root, parentFiber) { } if (parentFiber.subtreeFlags & 13886) for (parentFiber = parentFiber.child; null !== parentFiber; ) - commitMutationEffectsOnFiber(parentFiber, root), + commitMutationEffectsOnFiber(parentFiber, root, lanes), (parentFiber = parentFiber.sibling); } -function commitMutationEffectsOnFiber(finishedWork, root) { +function commitMutationEffectsOnFiber(finishedWork, root, lanes) { var current = finishedWork.alternate, flags = finishedWork.flags; switch (finishedWork.tag) { @@ -8052,7 +8790,17 @@ function commitMutationEffectsOnFiber(finishedWork, root) { case 11: case 14: case 15: - recursivelyTraverseMutationEffects(root, finishedWork); + if ( + flags & 4 && + ((current = finishedWork.updateQueue), + (current = null !== current ? current.events : null), + null !== current) + ) + for (var ii = 0; ii < current.length; ii++) { + var _eventPayloads$ii2 = current[ii]; + _eventPayloads$ii2.ref.impl = _eventPayloads$ii2.nextImpl; + } + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && (commitHookEffectListUnmount(3, finishedWork, finishedWork.return), @@ -8060,7 +8808,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { commitHookEffectListUnmount(5, finishedWork, finishedWork.return)); break; case 1: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || @@ -8079,7 +8827,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { case 26: case 27: case 5: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || @@ -8089,25 +8837,30 @@ function commitMutationEffectsOnFiber(finishedWork, root) { (finishedWork.alternate.stateNode = finishedWork.stateNode); break; case 6: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); break; case 3: - recursivelyTraverseMutationEffects(root, finishedWork); + viewTransitionMutationContext = !1; + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); if (flags & 4) { flags = root.containerInfo; root = root.pendingChildren; try { - completeRoot(flags.containerTag, root); + completeRoot(flags.containerTag, root), + (viewTransitionMutationContext = !0); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } + viewTransitionMutationContext = !1; break; case 4: - recursivelyTraverseMutationEffects(root, finishedWork); + current = pushMutationContext(); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); + viewTransitionMutationContext = current; flags & 4 && commitHostPortalContainerChildren( finishedWork.stateNode, @@ -8116,11 +8869,11 @@ function commitMutationEffectsOnFiber(finishedWork, root) { ); break; case 12: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); break; case 31: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && ((flags = finishedWork.updateQueue), @@ -8129,7 +8882,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, flags))); break; case 13: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); finishedWork.child.flags & 8192 && ((root = null !== current && null !== current.memoizedState), @@ -8143,30 +8896,36 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, flags))); break; case 22: - var isHidden = null !== finishedWork.memoizedState, - wasHidden = null !== current && null !== current.memoizedState; + ii = null !== finishedWork.memoizedState; + _eventPayloads$ii2 = null !== current && null !== current.memoizedState; if (finishedWork.mode & 1) { var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden, prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; - offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || isHidden; - offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || wasHidden; - recursivelyTraverseMutationEffects(root, finishedWork); + offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || ii; + offscreenSubtreeWasHidden = + prevOffscreenSubtreeWasHidden || _eventPayloads$ii2; + recursivelyTraverseMutationEffects(root, finishedWork, lanes); offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden; - } else recursivelyTraverseMutationEffects(root, finishedWork); + } else recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 8192 && ((root = finishedWork.stateNode), - (root._visibility = isHidden - ? root._visibility & -2 - : root._visibility | 1), - isHidden && - (null === current || - wasHidden || - offscreenSubtreeIsHidden || - offscreenSubtreeWasHidden || - (0 !== (finishedWork.mode & 1) && - recursivelyTraverseDisappearLayoutEffects(finishedWork)))); + (root._visibility = ii ? root._visibility & -2 : root._visibility | 1), + !ii || + null === current || + _eventPayloads$ii2 || + offscreenSubtreeIsHidden || + offscreenSubtreeWasHidden || + 0 === (finishedWork.mode & 1) || + ((root = _eventPayloads$ii2 || offscreenSubtreeWasHidden), + (lanes = offscreenSubtreeIsHidden), + (current = offscreenSubtreeWasHidden), + (offscreenSubtreeIsHidden = ii || offscreenSubtreeIsHidden), + (offscreenSubtreeWasHidden = root), + recursivelyTraverseDisappearLayoutEffects(finishedWork), + (offscreenSubtreeIsHidden = lanes), + (offscreenSubtreeWasHidden = current))); flags & 4 && ((flags = finishedWork.updateQueue), null !== flags && @@ -8176,7 +8935,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, root)))); break; case 19: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && ((flags = finishedWork.updateQueue), @@ -8185,19 +8944,135 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, flags))); break; case 30: + flags & 512 && + (offscreenSubtreeWasHidden || + null === current || + safelyDetachRef(current, current.return)); + flags = pushMutationContext(); + ii = (lanes & 335544064) === lanes; + _eventPayloads$ii2 = finishedWork.memoizedProps; + ii && + "none" !== + getViewTransitionClassName( + _eventPayloads$ii2.default, + _eventPayloads$ii2.update + ); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); + commitReconciliationEffects(finishedWork); + ii && + null !== current && + viewTransitionMutationContext && + (finishedWork.flags |= 4); + viewTransitionMutationContext = flags; break; case 21: break; + case 7: + flags & 512 && + (offscreenSubtreeWasHidden || + null === current || + safelyDetachRef(current, current.return)), + current && + null !== current.stateNode && + (current.stateNode._fragmentFiber = finishedWork); default: - recursivelyTraverseMutationEffects(root, finishedWork), + recursivelyTraverseMutationEffects(root, finishedWork, lanes), commitReconciliationEffects(finishedWork); } } function commitReconciliationEffects(finishedWork) { var flags = finishedWork.flags; - flags & 2 && (finishedWork.flags &= -3); + if (flags & 2) { + try { + for ( + var parentFragmentInstances = null, parent = finishedWork.return; + null !== parent; + + ) { + if (isFragmentInstanceParent(parent)) { + var fragmentInstance = parent.stateNode; + null === parentFragmentInstances + ? (parentFragmentInstances = [fragmentInstance]) + : parentFragmentInstances.push(fragmentInstance); + } + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ); + } catch (error) { + captureCommitPhaseError(finishedWork, finishedWork.return, error); + } + finishedWork.flags &= -3; + } flags & 4096 && (finishedWork.flags &= -4097); } +function recursivelyTraverseAfterMutationEffects(root, parentFiber) { + if (parentFiber.subtreeFlags & 9270) + for (parentFiber = parentFiber.child; null !== parentFiber; ) + commitAfterMutationEffectsOnFiber(parentFiber, root), + (parentFiber = parentFiber.sibling); + else measureNestedViewTransitions(parentFiber, !1); +} +function commitAfterMutationEffectsOnFiber(finishedWork, root) { + var current = finishedWork.alternate; + if (null === current) commitEnterViewTransitions(finishedWork, !1); + else + switch (finishedWork.tag) { + case 3: + viewTransitionContextChanged = !1; + pushViewTransitionCancelableScope(); + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionCancelableChildren = null; + break; + case 5: + recursivelyTraverseAfterMutationEffects(root, finishedWork); + break; + case 4: + current = viewTransitionContextChanged; + viewTransitionContextChanged = !1; + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionContextChanged = current; + break; + case 22: + 0 !== (finishedWork.mode & 1) + ? null === finishedWork.memoizedState && + (null !== current.memoizedState + ? commitEnterViewTransitions(finishedWork, !1) + : recursivelyTraverseAfterMutationEffects(root, finishedWork)) + : recursivelyTraverseAfterMutationEffects(root, finishedWork); + break; + case 30: + var prevContextChanged$126 = viewTransitionContextChanged, + prevCancelableChildren = pushViewTransitionCancelableScope(); + viewTransitionContextChanged = !1; + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionContextChanged && (finishedWork.flags |= 4); + root = finishedWork.memoizedProps; + var state = finishedWork.stateNode; + getViewTransitionName(root, state); + getViewTransitionName(current.memoizedProps, state); + "none" !== getViewTransitionClassName(root.default, root.update) && + ((root = current.memoizedState), + (current.memoizedState = null), + (viewTransitionHostInstanceIdx = 0), + viewTransitionHostInstanceIdx !== (null === root ? 0 : root.length) && + (finishedWork.flags |= 32)); + null !== prevCancelableChildren && + (prevCancelableChildren.push.apply( + prevCancelableChildren, + viewTransitionCancelableChildren + ), + (viewTransitionCancelableChildren = prevCancelableChildren)); + viewTransitionContextChanged = + 0 !== (finishedWork.flags & 32) ? !0 : prevContextChanged$126; + break; + default: + recursivelyTraverseAfterMutationEffects(root, finishedWork); + } +} function recursivelyTraverseLayoutEffects(root, parentFiber) { if (parentFiber.subtreeFlags & 8772) for (parentFiber = parentFiber.child; null !== parentFiber; ) @@ -8226,9 +9101,17 @@ function recursivelyTraverseDisappearLayoutEffects(parentFiber) { ); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; - case 27: + case 27: + case 5: + safelyDetachRef(finishedWork, finishedWork.return); + (5 !== finishedWork.tag && 27 !== finishedWork.tag) || + commitFragmentInstanceDeletionEffects(finishedWork); + recursivelyTraverseDisappearLayoutEffects(finishedWork); + break; + case 6: + commitFragmentInstanceDeletionEffects(finishedWork); + break; case 26: - case 5: safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; @@ -8237,8 +9120,11 @@ function recursivelyTraverseDisappearLayoutEffects(parentFiber) { recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 30: + safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; + case 7: + safelyDetachRef(finishedWork, finishedWork.return); default: recursivelyTraverseDisappearLayoutEffects(finishedWork); } @@ -8248,15 +9134,18 @@ function recursivelyTraverseDisappearLayoutEffects(parentFiber) { function recursivelyTraverseReappearLayoutEffects( finishedRoot$jscomp$0, parentFiber, - includeWorkInProgressEffects + layoutEffectTraversalFlags ) { - includeWorkInProgressEffects = - includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772); + layoutEffectTraversalFlags = + 0 !== (parentFiber.subtreeFlags & 8772) + ? layoutEffectTraversalFlags + : layoutEffectTraversalFlags & -2; for (parentFiber = parentFiber.child; null !== parentFiber; ) { var current = parentFiber.alternate, finishedRoot = finishedRoot$jscomp$0, finishedWork = parentFiber, - flags = finishedWork.flags; + flags = finishedWork.flags, + includeWorkInProgressEffects = 0 !== (layoutEffectTraversalFlags & 1); switch (finishedWork.tag) { case 0: case 11: @@ -8264,7 +9153,7 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); commitHookEffectListMount(4, finishedWork); break; @@ -8272,7 +9161,7 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); current = finishedWork; finishedRoot = current.stateNode; @@ -8305,12 +9194,28 @@ function recursivelyTraverseReappearLayoutEffects( safelyAttachRef(finishedWork, finishedWork.return); break; case 27: - case 26: case 5: + (5 !== finishedWork.tag && 27 !== finishedWork.tag) || + commitFragmentInstanceInsertionEffects(finishedWork); recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags + ); + includeWorkInProgressEffects && + null === current && + flags & 4 && + commitHostMount(finishedWork); + safelyAttachRef(finishedWork, finishedWork.return); + break; + case 6: + commitFragmentInstanceInsertionEffects(finishedWork); + break; + case 26: + recursivelyTraverseReappearLayoutEffects( + finishedRoot, + finishedWork, + layoutEffectTraversalFlags ); includeWorkInProgressEffects && null === current && @@ -8322,21 +9227,21 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 31: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 13: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 22: @@ -8344,17 +9249,25 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); safelyAttachRef(finishedWork, finishedWork.return); break; case 30: + recursivelyTraverseReappearLayoutEffects( + finishedRoot, + finishedWork, + layoutEffectTraversalFlags + ); + safelyAttachRef(finishedWork, finishedWork.return); break; + case 7: + safelyAttachRef(finishedWork, finishedWork.return); default: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); } parentFiber = parentFiber.sibling; @@ -8388,7 +9301,10 @@ function recursivelyTraversePassiveMountEffects( committedLanes, committedTransitions ) { - if (parentFiber.subtreeFlags & 10256) + if ( + parentFiber.subtreeFlags & + ((committedLanes & 335544064) === committedLanes ? 10262 : 10256) + ) for (parentFiber = parentFiber.child; null !== parentFiber; ) commitPassiveMountOnFiber( root, @@ -8404,6 +9320,13 @@ function commitPassiveMountOnFiber( committedLanes, committedTransitions ) { + var isViewTransitionEligible = + (committedLanes & 335544064) === committedLanes; + isViewTransitionEligible && + null === finishedWork.alternate && + null !== finishedWork.return && + null !== finishedWork.return.alternate && + restoreEnterOrExitViewTransitions(finishedWork); var flags = finishedWork.flags; switch (finishedWork.tag) { case 0: @@ -8494,40 +9417,48 @@ function commitPassiveMountOnFiber( _finishedWork$memoize2 = finishedWork.stateNode; id = finishedWork.alternate; null !== finishedWork.memoizedState - ? _finishedWork$memoize2._visibility & 2 - ? recursivelyTraversePassiveMountEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions - ) - : finishedWork.mode & 1 - ? recursivelyTraverseAtomicPassiveEffects( + ? (isViewTransitionEligible && + null !== id && + null === id.memoizedState && + restoreEnterOrExitViewTransitions(id), + _finishedWork$memoize2._visibility & 2 + ? recursivelyTraversePassiveMountEffects( finishedRoot, - finishedWork + finishedWork, + committedLanes, + committedTransitions ) - : ((_finishedWork$memoize2._visibility |= 2), - recursivelyTraversePassiveMountEffects( + : finishedWork.mode & 1 + ? recursivelyTraverseAtomicPassiveEffects( + finishedRoot, + finishedWork + ) + : ((_finishedWork$memoize2._visibility |= 2), + recursivelyTraversePassiveMountEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions + ))) + : (isViewTransitionEligible && + null !== id && + null !== id.memoizedState && + restoreEnterOrExitViewTransitions(finishedWork), + _finishedWork$memoize2._visibility & 2 + ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions - )) - : _finishedWork$memoize2._visibility & 2 - ? recursivelyTraversePassiveMountEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions - ) - : ((_finishedWork$memoize2._visibility |= 2), - recursivelyTraverseReconnectPassiveEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - 0 !== (finishedWork.subtreeFlags & 10256) || !1 - )); + ) + : ((_finishedWork$memoize2._visibility |= 2), + recursivelyTraverseReconnectPassiveEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + 0 !== (finishedWork.subtreeFlags & 10256) || !1 + ))); flags & 2048 && commitOffscreenPassiveMountEffects(id, finishedWork); break; case 24: @@ -8540,6 +9471,14 @@ function commitPassiveMountOnFiber( flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); break; + case 30: + recursivelyTraversePassiveMountEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions + ); + break; default: recursivelyTraversePassiveMountEffects( finishedRoot, @@ -8705,6 +9644,20 @@ function accumulateSuspenseyCommitOnFiber(fiber) { : recursivelyAccumulateSuspenseyCommit(fiber); } break; + case 30: + if ( + 0 !== (fiber.flags & suspenseyCommitFlag) && + ((current = fiber.memoizedProps.name), + null != current && "auto" !== current) + ) { + var state = fiber.stateNode; + state.paired = null; + null === appearingViewTransitions && + (appearingViewTransitions = new Map()); + appearingViewTransitions.set(current, state); + } + recursivelyAccumulateSuspenseyCommit(fiber); + break; default: recursivelyAccumulateSuspenseyCommit(fiber); } @@ -8896,6 +9849,9 @@ var DefaultAsyncDispatcher = { pendingEffectsRemainingLanes = 0, pendingPassiveTransitions = null, pendingRecoverableErrors = null, + pendingViewTransition = null, + pendingViewTransitionEvents = null, + pendingTransitionTypes = null, nestedUpdateCount = 0, rootWithNestedUpdates = null; function requestUpdateLane(fiber) { @@ -8922,6 +9878,19 @@ function requestDeferredLane() { null !== lane && (lane.flags |= 32); return workInProgressDeferredLane; } +function scheduleViewTransitionEvent(fiber, callback) { + if (null != callback) { + var state = fiber.stateNode, + instance = state.ref; + null === instance && + (instance = state.ref = + createViewTransitionInstance( + getViewTransitionName(fiber.memoizedProps, state) + )); + null === pendingViewTransitionEvents && (pendingViewTransitionEvents = []); + pendingViewTransitionEvents.push(callback.bind(null, instance)); + } +} function scheduleUpdateOnFiber(root, fiber, lane) { if ( (root === workInProgressRoot && @@ -9005,7 +9974,10 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { JSCompiler_inline_result, !1 ); - if (2 !== JSCompiler_inline_result) { + if ( + 2 !== JSCompiler_inline_result && + 6 !== JSCompiler_inline_result + ) { if (workInProgressRootDidAttachPingListener) { root.errorRecoveryDisabledLanes |= renderWasConcurrent; workInProgressRootInterleavedUpdatedLanes |= @@ -9042,7 +10014,8 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { case 1: throw Error("Root did not complete. This is a bug in React."); case 4: - if ((lanes & 4194048) !== lanes) break; + if ((lanes & 4194048) !== lanes && (lanes & 62914560) !== lanes) + break; case 6: markRootSuspended( shouldTimeSlice, @@ -9075,7 +10048,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { if (0 !== getNextLanes(shouldTimeSlice, 0, !0)) break a; pendingEffectsLanes = lanes; shouldTimeSlice.timeoutHandle = scheduleTimeout( - commitRootWhenReady.bind( + completeRootWhenReady.bind( null, shouldTimeSlice, forceSync, @@ -9096,7 +10069,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { ); break a; } - commitRootWhenReady( + completeRootWhenReady( shouldTimeSlice, forceSync, workInProgressRootRecoverableErrors, @@ -9105,7 +10078,9 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, - workInProgressSuspendedRetryLanes + workInProgressSuspendedRetryLanes, + workInProgressRootDidSkipSuspendedSiblings, + renderWasConcurrent ); } } @@ -9113,7 +10088,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { } while (1); ensureRootIsScheduled(root$jscomp$0); } -function commitRootWhenReady( +function completeRootWhenReady( root, finishedWork, recoverableErrors, @@ -9125,25 +10100,53 @@ function commitRootWhenReady( suspendedRetryLanes ) { root.timeoutHandle = -1; - var subtreeFlags = finishedWork.subtreeFlags; - if (subtreeFlags & 8192 || 16785408 === (subtreeFlags & 16785408)) - accumulateSuspenseyCommitOnFiber(finishedWork), + didIncludeRenderPhaseUpdate = finishedWork.subtreeFlags; + var isViewTransitionEligible = (lanes & 335544064) === lanes, + suspendedState = null; + if ( + isViewTransitionEligible || + didIncludeRenderPhaseUpdate & 8192 || + 16785408 === (didIncludeRenderPhaseUpdate & 16785408) + ) + (appearingViewTransitions = suspendedState = null), + accumulateSuspenseyCommitOnFiber(finishedWork), + isViewTransitionEligible && + null != fabricSuspendOnActiveViewTransition && + fabricSuspendOnActiveViewTransition(), (lanes & 62914560) === lanes ? globalMostRecentFallbackTime - now() : (lanes & 4194048) === lanes ? globalMostRecentTransitionTime - now() : 0; - commitRoot( - root, - finishedWork, - lanes, - recoverableErrors, - transitions, - didIncludeRenderPhaseUpdate, - spawnedLane, - updatedLanes, - suspendedRetryLanes - ); + didIncludeRenderPhaseUpdate = suspendedState; + root.cancelPendingCommit = null; + do flushPendingEffects(); + while (0 !== pendingEffectsStatus); + if (0 !== (executionContext & 6)) + throw Error("Should not already be working."); + if (null !== finishedWork) { + if (finishedWork === root.current) + throw Error( + "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." + ); + root === workInProgressRoot && + ((workInProgress = workInProgressRoot = null), + (workInProgressRootRenderLanes = 0)); + pendingFinishedWork = finishedWork; + pendingEffectsRoot = root; + pendingEffectsLanes = lanes; + pendingPassiveTransitions = transitions; + pendingRecoverableErrors = recoverableErrors; + commitRoot( + root, + finishedWork, + lanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes, + didIncludeRenderPhaseUpdate + ); + } } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { @@ -9185,6 +10188,7 @@ function markRootSuspended( spawnedLane, didAttemptEntireTree ) { + suspendedLanes = getEntangledLanes(root, suspendedLanes); suspendedLanes &= ~workInProgressRootPingedLanes; suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; @@ -9244,20 +10248,7 @@ function prepareFreshStack(root, lanes) { workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors = null; workInProgressRootDidIncludeRecursiveRenderUpdate = !1; - 0 !== (lanes & 8) && (lanes |= lanes & 32); - var allEntangledLanes = root.entangledLanes; - if (0 !== allEntangledLanes) - for ( - root = root.entanglements, allEntangledLanes &= lanes; - 0 < allEntangledLanes; - - ) { - var index$6 = 31 - clz32(allEntangledLanes), - lane = 1 << index$6; - lanes |= root[index$6]; - allEntangledLanes &= ~lane; - } - entangledRenderLanes = lanes; + entangledRenderLanes = getEntangledLanes(root, lanes); finishQueueingConcurrentUpdates(); return timeoutHandle; } @@ -9359,8 +10350,8 @@ function renderRootSync(root, lanes, shouldYieldForPrerendering) { workLoopSync(); exitStatus = workInProgressRootExitStatus; break; - } catch (thrownValue$124) { - handleThrow(root, thrownValue$124); + } catch (thrownValue$135) { + handleThrow(root, thrownValue$135); } while (1); lanes && root.shellSuspendCounter++; @@ -9475,8 +10466,8 @@ function renderRootConcurrent(root, lanes) { } workLoopConcurrentByScheduler(); break; - } catch (thrownValue$126) { - handleThrow(root, thrownValue$126); + } catch (thrownValue$137) { + handleThrow(root, thrownValue$137); } while (1); lastContextDependency = currentlyRenderingFiber$1 = null; @@ -9650,78 +10641,79 @@ function commitRoot( root, finishedWork, lanes, - recoverableErrors, - transitions, - didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, - suspendedRetryLanes + suspendedRetryLanes, + suspendedState ) { - root.cancelPendingCommit = null; - do flushPendingEffects(); - while (0 !== pendingEffectsStatus); - if (0 !== (executionContext & 6)) - throw Error("Should not already be working."); - if (null !== finishedWork) { - if (finishedWork === root.current) - throw Error( - "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." - ); - didIncludeRenderPhaseUpdate = finishedWork.lanes | finishedWork.childLanes; - didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes; - markRootFinished( - root, - lanes, - didIncludeRenderPhaseUpdate, - spawnedLane, - updatedLanes, - suspendedRetryLanes - ); - root === workInProgressRoot && - ((workInProgress = workInProgressRoot = null), - (workInProgressRootRenderLanes = 0)); - pendingFinishedWork = finishedWork; - pendingEffectsRoot = root; - pendingEffectsLanes = lanes; - pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate; - pendingPassiveTransitions = transitions; - pendingRecoverableErrors = recoverableErrors; - 0 !== (finishedWork.subtreeFlags & 10256) || - 0 !== (finishedWork.flags & 10256) - ? ((root.callbackNode = null), - (root.callbackPriority = 0), - scheduleCallback(NormalPriority$1, function () { - flushPassiveEffects(); - return null; - })) - : ((root.callbackNode = null), (root.callbackPriority = 0)); - recoverableErrors = 0 !== (finishedWork.flags & 13878); - if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) { - recoverableErrors = ReactSharedInternals.T; - ReactSharedInternals.T = null; - transitions = currentUpdatePriority; - currentUpdatePriority = 2; - spawnedLane = executionContext; - executionContext |= 4; - try { - commitBeforeMutationEffects(root, finishedWork, lanes); - } finally { - (executionContext = spawnedLane), - (currentUpdatePriority = transitions), - (ReactSharedInternals.T = recoverableErrors); - } + var remainingLanes = finishedWork.lanes | finishedWork.childLanes; + pendingEffectsRemainingLanes = remainingLanes; + remainingLanes |= concurrentlyUpdatedLanes; + markRootFinished( + root, + lanes, + remainingLanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes + ); + pendingViewTransitionEvents = null; + (lanes & 335544064) === lanes + ? ((pendingTransitionTypes = claimQueuedTransitionTypes(root)), + (spawnedLane = 10262)) + : ((pendingTransitionTypes = null), (spawnedLane = 10256)); + 0 !== (finishedWork.subtreeFlags & spawnedLane) || + 0 !== (finishedWork.flags & spawnedLane) + ? ((root.callbackNode = null), + (root.callbackPriority = 0), + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + })) + : ((root.callbackNode = null), (root.callbackPriority = 0)); + shouldStartViewTransition = !1; + spawnedLane = 0 !== (finishedWork.flags & 13878); + if (0 !== (finishedWork.subtreeFlags & 13878) || spawnedLane) { + spawnedLane = ReactSharedInternals.T; + ReactSharedInternals.T = null; + updatedLanes = currentUpdatePriority; + currentUpdatePriority = 2; + suspendedRetryLanes = executionContext; + executionContext |= 4; + try { + commitBeforeMutationEffects(root, finishedWork, lanes); + } finally { + (executionContext = suspendedRetryLanes), + (currentUpdatePriority = updatedLanes), + (ReactSharedInternals.T = spawnedLane); } - pendingEffectsStatus = 1; - flushMutationEffects(); - flushLayoutEffects(); - flushSpawnedWork(); } + pendingEffectsStatus = 1; + shouldStartViewTransition + ? (pendingViewTransition = startViewTransition( + suspendedState, + root.containerInfo, + pendingTransitionTypes, + flushMutationEffects, + flushLayoutEffects, + flushAfterMutationEffects, + flushSpawnedWork, + flushPassiveEffects + )) + : (flushMutationEffects(), flushLayoutEffects(), flushSpawnedWork()); +} +function flushAfterMutationEffects() { + 3 === pendingEffectsStatus && + ((pendingEffectsStatus = 0), + commitAfterMutationEffectsOnFiber(pendingFinishedWork, pendingEffectsRoot), + (pendingEffectsStatus = 4)); } function flushMutationEffects() { if (1 === pendingEffectsStatus) { pendingEffectsStatus = 0; var root = pendingEffectsRoot, finishedWork = pendingFinishedWork, + lanes = pendingEffectsLanes, rootMutationHasEffect = 0 !== (finishedWork.flags & 13878); if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) { rootMutationHasEffect = ReactSharedInternals.T; @@ -9731,7 +10723,7 @@ function flushMutationEffects() { var prevExecutionContext = executionContext; executionContext |= 4; try { - commitMutationEffectsOnFiber(finishedWork, root); + commitMutationEffectsOnFiber(finishedWork, root, lanes); } finally { (executionContext = prevExecutionContext), (currentUpdatePriority = previousPriority), @@ -9769,19 +10761,22 @@ function flushLayoutEffects() { function flushSpawnedWork() { if (4 === pendingEffectsStatus || 3 === pendingEffectsStatus) { pendingEffectsStatus = 0; + var committedViewTransition = pendingViewTransition; + pendingViewTransition = null; requestPaint(); var root = pendingEffectsRoot, finishedWork = pendingFinishedWork, lanes = pendingEffectsLanes, - recoverableErrors = pendingRecoverableErrors; - 0 !== (finishedWork.subtreeFlags & 10256) || - 0 !== (finishedWork.flags & 10256) + recoverableErrors = pendingRecoverableErrors, + passiveSubtreeMask = (lanes & 335544064) === lanes ? 10262 : 10256; + 0 !== (finishedWork.subtreeFlags & passiveSubtreeMask) || + 0 !== (finishedWork.flags & passiveSubtreeMask) ? (pendingEffectsStatus = 5) : ((pendingEffectsStatus = 0), (pendingFinishedWork = pendingEffectsRoot = null), releaseRootPooledCache(root, root.pendingLanes)); - var remainingLanes = root.pendingLanes; - 0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null); + passiveSubtreeMask = root.pendingLanes; + 0 === passiveSubtreeMask && (legacyErrorBoundariesThatAlreadyFailed = null); lanesToEventPriority(lanes); finishedWork = finishedWork.stateNode; if (injectedHook && "function" === typeof injectedHook.onCommitFiberRoot) @@ -9795,7 +10790,7 @@ function flushSpawnedWork() { } catch (err) {} if (null !== recoverableErrors) { finishedWork = ReactSharedInternals.T; - remainingLanes = currentUpdatePriority; + passiveSubtreeMask = currentUpdatePriority; currentUpdatePriority = 2; ReactSharedInternals.T = null; try { @@ -9811,17 +10806,36 @@ function flushSpawnedWork() { } } finally { (ReactSharedInternals.T = finishedWork), - (currentUpdatePriority = remainingLanes); + (currentUpdatePriority = passiveSubtreeMask); } } + recoverableErrors = pendingViewTransitionEvents; + onRecoverableError = pendingTransitionTypes; + pendingTransitionTypes = null; + if ( + null !== recoverableErrors && + ((pendingViewTransitionEvents = null), + null === onRecoverableError && (onRecoverableError = []), + null !== committedViewTransition) + ) + for ( + recoverableError = 0; + recoverableError < recoverableErrors.length; + recoverableError++ + ) + (finishedWork = (0, recoverableErrors[recoverableError])( + onRecoverableError + )), + void 0 !== finishedWork && + committedViewTransition.finished.finally(finishedWork); 0 !== (pendingEffectsLanes & 3) && 0 !== root.tag && flushPendingEffects(); ensureRootIsScheduled(root); - remainingLanes = root.pendingLanes; - 0 !== (lanes & 261930) && 0 !== (remainingLanes & 42) + passiveSubtreeMask = root.pendingLanes; + 0 !== (lanes & 261930) && 0 !== (passiveSubtreeMask & 42) ? root === rootWithNestedUpdates ? nestedUpdateCount++ : ((nestedUpdateCount = 0), (rootWithNestedUpdates = root)) - : (nestedUpdateCount = 0); + : ((nestedUpdateCount = 0), (rootWithNestedUpdates = null)); flushSyncWorkAcrossRoots_impl(0, !1); } } @@ -9832,6 +10846,7 @@ function releaseRootPooledCache(root, remainingLanes) { ((root.pooledCache = null), releaseCache(remainingLanes))); } function flushPendingEffects() { + null !== pendingViewTransition && (pendingViewTransition = null); flushMutationEffects(); flushLayoutEffects(); flushSpawnedWork(); @@ -9956,7 +10971,9 @@ function pingSuspendedRoot(root, wakeable, pingedLanes) { (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes && 300 > now() - globalMostRecentFallbackTime) - ? 0 === (executionContext & 2) && prepareFreshStack(root, 0) + ? 0 === (executionContext & 2) + ? prepareFreshStack(root, 0) + : (workInProgressRootPingedLanes |= pingedLanes) : (workInProgressRootPingedLanes |= pingedLanes), workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes && (workInProgressSuspendedRetryLanes = 0)); @@ -10052,7 +11069,7 @@ function createWorkInProgress(current, pendingProps) { (workInProgress.flags = 0), (workInProgress.subtreeFlags = 0), (workInProgress.deletions = null)); - workInProgress.flags = current.flags & 65011712; + workInProgress.flags = current.flags & 1206910976; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -10071,7 +11088,7 @@ function createWorkInProgress(current, pendingProps) { return workInProgress; } function resetWorkInProgress(workInProgress, renderLanes) { - workInProgress.flags &= 65011714; + workInProgress.flags &= 1206910978; var current = workInProgress.alternate; null === current ? ((workInProgress.childLanes = 0), @@ -10112,10 +11129,10 @@ function createFiberFromTypeAndProps( ) { var fiberTag = 0; owner = type; - if ("function" === typeof type) shouldConstruct(type) && (fiberTag = 1); - else if ("string" === typeof type) fiberTag = 5; + if ("function" === typeof owner) shouldConstruct(owner) && (fiberTag = 1); + else if ("string" === typeof owner) fiberTag = 5; else - a: switch (type) { + a: switch (owner) { case REACT_ACTIVITY_TYPE: return ( (type = createFiberImplClass(31, pendingProps, key, mode)), @@ -10151,9 +11168,24 @@ function createFiberFromTypeAndProps( (type.lanes = lanes), type ); + case REACT_LEGACY_HIDDEN_TYPE: + case REACT_VIEW_TRANSITION_TYPE: + return ( + (type = mode | 32), + (type = createFiberImplClass(30, pendingProps, key, type)), + (type.elementType = REACT_VIEW_TRANSITION_TYPE), + (type.lanes = lanes), + (type.stateNode = { + autoName: null, + paired: null, + clones: null, + ref: null + }), + type + ); default: - if ("object" === typeof type && null !== type) - switch (type.$$typeof) { + if ("object" === typeof owner && null !== owner) + switch (owner.$$typeof) { case REACT_CONTEXT_TYPE: fiberTag = 10; break a; @@ -10250,6 +11282,7 @@ function FiberRootNode( this.pooledCache = null; this.pooledCacheLanes = 0; this.formState = formState; + this.transitionTypes = null; this.incompleteTransitions = new Map(); } function createPortal$1(children, containerInfo, implementation) { @@ -10257,7 +11290,12 @@ function createPortal$1(children, containerInfo, implementation) { 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; return { $$typeof: REACT_PORTAL_TYPE, - key: null == key ? null : "" + key, + key: + null == key + ? null + : key === REACT_OPTIMISTIC_KEY + ? REACT_OPTIMISTIC_KEY + : "" + key, children: children, containerInfo: containerInfo, implementation: implementation @@ -10303,30 +11341,84 @@ function shim() { "The current renderer does not support Resources. This error is likely caused by a bug in React. Please file an issue." ); } -var _nativeFabricUIManage = nativeFabricUIManager, - createNode = _nativeFabricUIManage.createNode, - cloneNodeWithNewChildren = _nativeFabricUIManage.cloneNodeWithNewChildren, +var fabricCreateViewTransitionInstance = + reactPrivateInterface.fabricUIManager.createViewTransitionInstance, + fabricStartViewTransition = + reactPrivateInterface.fabricUIManager.startViewTransition, + fabricStartViewTransitionReadyFinished = + reactPrivateInterface.fabricUIManager.startViewTransitionReadyFinished; +function ViewTransitionPseudoElement(pseudo, name) { + this._pseudo = pseudo; + this._name = name; +} +function measureClonedInstance() { + return { + rect: { x: 0, y: 0, width: 0, height: 0 }, + abs: !1, + clip: !1, + view: !0 + }; +} +function createViewTransitionInstance(name) { + var tag = allocateTag(); + fabricCreateViewTransitionInstance(name, tag); + return { + name: name, + old: new ViewTransitionPseudoElement("old", name), + new: new ViewTransitionPseudoElement("new", name) + }; +} +function startViewTransition( + suspendedState, + rootContainer, + transitionTypes, + mutationCallback, + layoutCallback, + afterMutationCallback, + spawnedWorkCallback, + passiveCallback +) { + suspendedState = fabricStartViewTransition(function () { + mutationCallback(); + layoutCallback(); + afterMutationCallback(); + }); + if (null == suspendedState) + return mutationCallback(), layoutCallback(), spawnedWorkCallback(), null; + suspendedState.ready.then(function () { + spawnedWorkCallback(); + fabricStartViewTransitionReadyFinished(); + }); + suspendedState.finished.finally(function () { + passiveCallback(); + }); + return suspendedState; +} +var createNode = reactPrivateInterface.fabricUIManager.createNode, + cloneNodeWithNewChildren = + reactPrivateInterface.fabricUIManager.cloneNodeWithNewChildren, cloneNodeWithNewChildrenAndProps = - _nativeFabricUIManage.cloneNodeWithNewChildrenAndProps, - cloneNodeWithNewProps = _nativeFabricUIManage.cloneNodeWithNewProps, - createChildNodeSet = _nativeFabricUIManage.createChildSet, - appendChildNode = _nativeFabricUIManage.appendChild, - appendChildNodeToSet = _nativeFabricUIManage.appendChildToSet, - completeRoot = _nativeFabricUIManage.completeRoot, - registerEventHandler = _nativeFabricUIManage.registerEventHandler, - FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority, + reactPrivateInterface.fabricUIManager.cloneNodeWithNewChildrenAndProps, + cloneNodeWithNewProps = + reactPrivateInterface.fabricUIManager.cloneNodeWithNewProps, + createChildNodeSet = reactPrivateInterface.fabricUIManager.createChildSet, + appendChildNode = reactPrivateInterface.fabricUIManager.appendChild, + appendChildNodeToSet = reactPrivateInterface.fabricUIManager.appendChildToSet, + completeRoot = reactPrivateInterface.fabricUIManager.completeRoot, + registerEventHandler = + reactPrivateInterface.fabricUIManager.registerEventHandler, + FabricDiscretePriority = + reactPrivateInterface.fabricUIManager.unstable_DiscreteEventPriority, FabricContinuousPriority = - _nativeFabricUIManage.unstable_ContinuousEventPriority, - FabricIdlePriority = _nativeFabricUIManage.unstable_IdleEventPriority, + reactPrivateInterface.fabricUIManager.unstable_ContinuousEventPriority, + FabricIdlePriority = + reactPrivateInterface.fabricUIManager.unstable_IdleEventPriority, fabricGetCurrentEventPriority = - _nativeFabricUIManage.unstable_getCurrentEventPriority, + reactPrivateInterface.fabricUIManager.unstable_getCurrentEventPriority, + fabricSuspendOnActiveViewTransition = + reactPrivateInterface.fabricUIManager.suspendOnActiveViewTransition, extraDevToolsConfig = { getInspectorDataForInstance: void 0, - getInspectorDataForViewTag: function () { - throw Error( - "getInspectorDataForViewTag() is not available in production" - ); - }, getInspectorDataForViewAtPoint: function () { throw Error( "getInspectorDataForViewAtPoint() is not available in production." @@ -10334,8 +11426,13 @@ var _nativeFabricUIManage = nativeFabricUIManager, } }, getViewConfigForType = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get, + reactPrivateInterface.ReactNativeViewConfigRegistry.get, nextReactTag = 2; +function allocateTag() { + var tag = nextReactTag; + nextReactTag += 2; + return tag; +} registerEventHandler && registerEventHandler(dispatchEvent); var PROD_HOST_CONTEXT = { isInAParentText: !0 }; function createTextInstance( @@ -10344,8 +11441,7 @@ function createTextInstance( hostContext, internalInstanceHandle ) { - hostContext = nextReactTag; - nextReactTag += 2; + hostContext = allocateTag(); return { node: createNode( hostContext, @@ -10361,7 +11457,7 @@ function getPublicInstance(instance) { if (null == instance.canonical.publicInstance) { var $jscomp$nullish$tmp0; instance.canonical.publicInstance = - ReactNativePrivateInterface.createPublicInstance( + reactPrivateInterface.createPublicInstance( instance.canonical.nativeTag, instance.canonical.viewConfig, instance.canonical.internalInstanceHandle, @@ -10373,12 +11469,15 @@ function getPublicInstance(instance) { } return instance.canonical.publicInstance; } - return null != instance.containerInfo && - null != instance.containerInfo.publicInstance + return null != instance.containerInfo ? instance.containerInfo.publicInstance - : null != instance._nativeTag - ? instance - : null; + : null; +} +function getPublicInstanceFromHostFiber(fiber) { + fiber = getPublicInstance(fiber.stateNode); + if (null === fiber) + throw Error("Expected to find a host node. This is a bug in React."); + return fiber; } var currentUpdatePriority = 0; function resolveUpdatePriority() { @@ -10401,7 +11500,7 @@ var scheduleTimeout = setTimeout, cancelTimeout = clearTimeout; function cloneHiddenInstance(instance) { var node = instance.node, - updatePayload = ReactNativePrivateInterface.createAttributePayload( + updatePayload = reactPrivateInterface.createAttributePayload( { style: { display: "none" } }, instance.canonical.viewConfig.validAttributes ); @@ -10410,6 +11509,159 @@ function cloneHiddenInstance(instance) { canonical: instance.canonical }; } +function FragmentInstance(fragmentFiber) { + this._fragmentFiber = fragmentFiber; + this._observers = null; +} +FragmentInstance.prototype.observeUsing = function (observer) { + null === this._observers && (this._observers = new Set()); + this._observers.add(observer); + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + observeChild, + observer, + void 0, + void 0 + ); +}; +function observeChild(child, observer) { + child = getPublicInstanceFromHostFiber(child); + observer.observe(child); + return !1; +} +FragmentInstance.prototype.unobserveUsing = function (observer) { + var observers = this._observers; + null !== observers && + observers.has(observer) && + (observers.delete(observer), + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + unobserveChild, + observer, + void 0, + void 0 + )); +}; +function unobserveChild(child, observer) { + child = getPublicInstanceFromHostFiber(child); + observer.unobserve(child); + return !1; +} +FragmentInstance.prototype.compareDocumentPosition = function (otherNode) { + var parentHostFiber = getFragmentParentInstanceOrContainerFiber( + this._fragmentFiber + ); + if (null === parentHostFiber) return Node.DOCUMENT_POSITION_DISCONNECTED; + var children = []; + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + collectChildren, + children, + void 0, + void 0 + ); + if (0 === children.length) { + var parentHostInstance = getPublicInstanceFromHostFiber(parentHostFiber); + children = this._fragmentFiber; + parentHostFiber = getPublicInstanceFromHostFiber; + var parentResult = parentHostInstance.compareDocumentPosition(otherNode); + var result = parentResult; + parentHostInstance === otherNode + ? (result = Node.DOCUMENT_POSITION_CONTAINS) + : parentResult & Node.DOCUMENT_POSITION_CONTAINED_BY && + ((parentHostInstance = [null, null]), + (result = getFragmentParentInstanceOrContainerFiber(children)), + null !== result && + findFragmentInstanceOrTextInstanceSiblings( + parentHostInstance, + children, + result.child, + { foundSelf: !1 } + ), + (children = parentHostInstance[1]), + null === children + ? (result = Node.DOCUMENT_POSITION_PRECEDING) + : ((otherNode = + parentHostFiber(children).compareDocumentPosition(otherNode)), + (result = + 0 === otherNode || otherNode & Node.DOCUMENT_POSITION_FOLLOWING + ? Node.DOCUMENT_POSITION_FOLLOWING + : Node.DOCUMENT_POSITION_PRECEDING))); + return (result |= Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC); + } + parentHostFiber = getPublicInstanceFromHostFiber(children[0]); + children = getPublicInstanceFromHostFiber(children[children.length - 1]); + parentHostInstance = parentHostFiber.compareDocumentPosition(otherNode); + parentResult = children.compareDocumentPosition(otherNode); + result = + parentHostInstance & Node.DOCUMENT_POSITION_CONTAINED_BY || + parentResult & Node.DOCUMENT_POSITION_CONTAINED_BY; + parentResult = + parentHostInstance & Node.DOCUMENT_POSITION_FOLLOWING && + parentResult & Node.DOCUMENT_POSITION_PRECEDING; + return parentHostFiber === otherNode || + children === otherNode || + result || + parentResult + ? Node.DOCUMENT_POSITION_CONTAINED_BY + : parentHostInstance; +}; +function collectChildren(child, collection) { + collection.push(child); + return !1; +} +FragmentInstance.prototype.getRootNode = function (getRootNodeOptions) { + var parentHostFiber = getFragmentParentInstanceOrContainerFiber( + this._fragmentFiber + ); + return null === parentHostFiber + ? this + : getPublicInstanceFromHostFiber(parentHostFiber).getRootNode( + getRootNodeOptions + ); +}; +FragmentInstance.prototype.getClientRects = function () { + var rects = []; + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + collectClientRects, + rects, + void 0, + void 0 + ); + return rects; +}; +function collectClientRects(child, rects) { + child = getPublicInstanceFromHostFiber(child); + rects.push(child.getBoundingClientRect()); + return !1; +} +function addFragmentHandleToFiber(child, fragmentInstance) { + child = getPublicInstanceFromHostFiber(child); + null != child && addFragmentHandleToInstance(child, fragmentInstance); + return !1; +} +function addFragmentHandleToInstance(instance, fragmentInstance) { + null == instance.reactFragments && (instance.reactFragments = new Set()); + instance.reactFragments.add(fragmentInstance); +} +function commitNewChildToFragmentInstance(childInstance, fragmentInstance) { + if (null != childInstance.canonical) { + var publicInstance = getPublicInstance(childInstance); + if (null !== fragmentInstance._observers) { + if (null == publicInstance) + throw Error("Expected to find a host node. This is a bug in React."); + fragmentInstance._observers.forEach(function (observer) { + observer.observe(publicInstance); + }); + } + addFragmentHandleToInstance(publicInstance, fragmentInstance); + } +} var HostTransitionContext = { $$typeof: REACT_CONTEXT_TYPE, Provider: null, @@ -10418,9 +11670,6 @@ var HostTransitionContext = { _currentValue2: null, _threadCount: 0 }, - supportsMicrotasks = - "undefined" !== typeof RN$enableMicrotasksInReact && - !!RN$enableMicrotasksInReact, scheduleMicrotask = "function" === typeof queueMicrotask ? queueMicrotask : scheduleTimeout; getFiberCurrentPropsFromNode$1 = function (instance) { @@ -10440,14 +11689,14 @@ ResponderEventPlugin.injection.injectGlobalResponderHandler({ onChange: function (from, to, blockNativeResponder) { from && from.stateNode && - nativeFabricUIManager.setIsJSResponder( + reactPrivateInterface.fabricUIManager.setIsJSResponder( from.stateNode.node, !1, blockNativeResponder || !1 ); to && to.stateNode && - nativeFabricUIManager.setIsJSResponder( + reactPrivateInterface.fabricUIManager.setIsJSResponder( to.stateNode.node, !0, blockNativeResponder || !1 @@ -10456,14 +11705,14 @@ ResponderEventPlugin.injection.injectGlobalResponderHandler({ }); if ( "function" !== - typeof ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog + typeof reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog ) throw Error( "Expected ReactFiberErrorDialog.showErrorDialog to be a function." ); function nativeOnUncaughtError(error, errorInfo) { !1 !== - ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog({ + reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog({ errorBoundary: null, error: error, componentStack: @@ -10472,7 +11721,7 @@ function nativeOnUncaughtError(error, errorInfo) { } function nativeOnCaughtError(error, errorInfo) { !1 !== - ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog({ + reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog({ errorBoundary: errorInfo.errorBoundary, error: error, componentStack: @@ -10493,26 +11742,26 @@ batchedUpdatesImpl = function (fn, a) { } }; var roots = new Map(), - internals$jscomp$inline_1245 = { + internals$jscomp$inline_1347 = { bundleType: 0, - version: "19.2.3", + version: "19.3.0", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.3" + reconcilerVersion: "19.3.0" }; null !== extraDevToolsConfig && - (internals$jscomp$inline_1245.rendererConfig = extraDevToolsConfig); + (internals$jscomp$inline_1347.rendererConfig = extraDevToolsConfig); if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var hook$jscomp$inline_1553 = __REACT_DEVTOOLS_GLOBAL_HOOK__; + var hook$jscomp$inline_1663 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if ( - !hook$jscomp$inline_1553.isDisabled && - hook$jscomp$inline_1553.supportsFiber + !hook$jscomp$inline_1663.isDisabled && + hook$jscomp$inline_1663.supportsFiber ) try { - (rendererID = hook$jscomp$inline_1553.inject( - internals$jscomp$inline_1245 + (rendererID = hook$jscomp$inline_1663.inject( + internals$jscomp$inline_1347 )), - (injectedHook = hook$jscomp$inline_1553); + (injectedHook = hook$jscomp$inline_1663); } catch (err) {} } exports.createPortal = function (children, containerTag) { @@ -10524,51 +11773,36 @@ exports.createPortal = function (children, containerTag) { ); }; exports.dispatchCommand = function (handle, command, args) { - var nativeTag = - null != handle._nativeTag - ? handle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance(handle); - null != nativeTag && - ((handle = ReactNativePrivateInterface.getNodeFromPublicInstance(handle)), - null != handle - ? nativeFabricUIManager.dispatchCommand(handle, command, args) - : ReactNativePrivateInterface.UIManager.dispatchViewManagerCommand( - nativeTag, - command, - args - )); + handle = reactPrivateInterface.getNodeFromPublicInstance(handle); + null != handle && + reactPrivateInterface.fabricUIManager.dispatchCommand( + handle, + command, + args + ); }; exports.findHostInstance_DEPRECATED = function (componentOrHandle) { return null == componentOrHandle ? null : componentOrHandle.canonical && componentOrHandle.canonical.publicInstance ? componentOrHandle.canonical.publicInstance - : componentOrHandle._nativeTag - ? componentOrHandle - : findHostInstance(componentOrHandle); + : findHostInstance(componentOrHandle); }; exports.findNodeHandle = function (componentOrHandle) { if (null == componentOrHandle) return null; if ("number" === typeof componentOrHandle) return componentOrHandle; - if (componentOrHandle._nativeTag) return componentOrHandle._nativeTag; if ( null != componentOrHandle.canonical && null != componentOrHandle.canonical.nativeTag ) return componentOrHandle.canonical.nativeTag; var nativeTag = - ReactNativePrivateInterface.getNativeTagFromPublicInstance( - componentOrHandle - ); + reactPrivateInterface.getNativeTagFromPublicInstance(componentOrHandle); if (nativeTag) return nativeTag; componentOrHandle = findHostInstance(componentOrHandle); return null == componentOrHandle ? componentOrHandle - : null != componentOrHandle._nativeTag - ? componentOrHandle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance( - componentOrHandle - ); + : reactPrivateInterface.getNativeTagFromPublicInstance(componentOrHandle); }; exports.getNodeFromInternalInstanceHandle = function (internalInstanceHandle) { return ( @@ -10586,7 +11820,7 @@ exports.getPublicInstanceFromInternalInstanceHandle = function ( : 6 === internalInstanceHandle.tag ? (null == instance.publicInstance && (instance.publicInstance = - ReactNativePrivateInterface.createPublicTextInstance( + reactPrivateInterface.createPublicTextInstance( internalInstanceHandle )), instance.publicInstance) @@ -10623,7 +11857,7 @@ exports.render = function ( (onRecoverableError = options.onRecoverableError); options = { publicInstance: - ReactNativePrivateInterface.createPublicRootInstance(containerTag), + reactPrivateInterface.createPublicRootInstance(containerTag), containerTag: containerTag }; concurrentRoot = concurrentRoot ? 1 : 0; @@ -10672,18 +11906,12 @@ exports.render = function ( return element; }; exports.sendAccessibilityEvent = function (handle, eventType) { - var nativeTag = - null != handle._nativeTag - ? handle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance(handle); - null != nativeTag && - ((handle = ReactNativePrivateInterface.getNodeFromPublicInstance(handle)), - null != handle - ? nativeFabricUIManager.sendAccessibilityEvent(handle, eventType) - : ReactNativePrivateInterface.legacySendAccessibilityEvent( - nativeTag, - eventType - )); + handle = reactPrivateInterface.getNodeFromPublicInstance(handle); + null != handle && + reactPrivateInterface.fabricUIManager.sendAccessibilityEvent( + handle, + eventType + ); }; exports.stopSurface = function (containerTag) { var root = roots.get(containerTag); diff --git a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js index 544c75406ef2..1934f48a23dc 100644 --- a/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js +++ b/packages/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js @@ -7,7 +7,7 @@ * @noflow * @nolint * @preventMunge - * @generated SignedSource<> + * @generated SignedSource<> * * This file was sync'd from the facebook/react repository. */ @@ -17,8 +17,8 @@ "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); -require("react-native/Libraries/ReactPrivate/ReactNativePrivateInitializeCore"); -var ReactNativePrivateInterface = require("react-native/Libraries/ReactPrivate/ReactNativePrivateInterface"), +require("react-native/setup-env"); +var reactPrivateInterface = require("react-native/react-private-interface"), Scheduler = require("scheduler"), React = require("react"), isArrayImpl = Array.isArray, @@ -75,7 +75,26 @@ function describeNativeComponentFrame(fn, construct) { } catch (x$1) { control = x$1; } - fn.call(Fake.prototype); + Fake = !1; + try { + var prevProps = Object.getOwnPropertyDescriptor( + fn.prototype, + "props" + ); + Object.defineProperty(fn.prototype, "props", { + configurable: !0, + set: function () { + throw Error(); + } + }); + Fake = !0; + new fn(); + } finally { + Fake && + (void 0 !== prevProps + ? Object.defineProperty(fn.prototype, "props", prevProps) + : delete fn.prototype.props); + } } } else { try { @@ -200,6 +219,8 @@ function describeFiber(fiber, childFiber) { return describeNativeComponentFrame(fiber.type, !0); case 31: return describeBuiltInComponentFrame("Activity"); + case 30: + return describeBuiltInComponentFrame("ViewTransition"); default: return ""; } @@ -232,12 +253,13 @@ var REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"); Symbol.for("react.scope"); -var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"); -Symbol.for("react.legacy_hidden"); +var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"), + REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"); Symbol.for("react.tracing_marker"); -var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"); -Symbol.for("react.view_transition"); -var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; +var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"), + REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), + REACT_RECOVERABLE_TYPE = Symbol.for("react.recoverable"), + MAYBE_ITERATOR_SYMBOL = Symbol.iterator; function getIteratorFn(maybeIterable) { if (null === maybeIterable || "object" !== typeof maybeIterable) return null; maybeIterable = @@ -245,7 +267,8 @@ function getIteratorFn(maybeIterable) { maybeIterable["@@iterator"]; return "function" === typeof maybeIterable ? maybeIterable : null; } -var REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"); +var REACT_OPTIMISTIC_KEY = Symbol.for("react.optimistic_key"), + REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"); function getComponentNameFromType(type) { if (null == type) return null; if ("function" === typeof type) @@ -266,6 +289,8 @@ function getComponentNameFromType(type) { return "SuspenseList"; case REACT_ACTIVITY_TYPE: return "Activity"; + case REACT_VIEW_TRANSITION_TYPE: + return "ViewTransition"; } if ("object" === typeof type) switch (type.$$typeof) { @@ -335,7 +360,8 @@ function getComponentNameFromFiber(fiber) { case 8: return type === REACT_STRICT_MODE_TYPE ? "StrictMode" : "Mode"; case 22: - return "Offscreen"; + if (null !== fiber.return) return getComponentNameFromFiber(fiber.return); + break; case 12: return "Profiler"; case 21: @@ -347,6 +373,7 @@ function getComponentNameFromFiber(fiber) { case 25: return "TracingMarker"; case 30: + return "ViewTransition"; case 17: case 28: case 1: @@ -366,11 +393,14 @@ var hasError = !1, getNodeFromInstance$1 = null; function executeDispatch(event, listener, inst) { event.currentTarget = getNodeFromInstance$1(inst); + inst = global.event; + global.event = event; try { listener(event); } catch (error) { hasError || ((hasError = !0), (caughtError = error)); } + global.event = inst; event.currentTarget = null; } function executeDirectDispatch(event) { @@ -386,6 +416,19 @@ function executeDirectDispatch(event) { event._dispatchInstances = null; return dispatchListener; } +function currentTimeStamp() { + currentTimeStamp = + "object" === typeof performance && + null !== performance && + "function" === typeof performance.now + ? function () { + return performance.now(); + } + : function () { + return Date.now(); + }; + return currentTimeStamp(); +} function functionThatReturnsTrue() { return !0; } @@ -462,7 +505,7 @@ SyntheticEvent.Interface = { bubbles: null, cancelable: null, timeStamp: function (event) { - return event.timeStamp || Date.now(); + return event.timeStamp || event.timestamp || currentTimeStamp(); }, defaultPrevented: null, isTrusted: null @@ -1165,11 +1208,10 @@ function getListener(inst, registrationName) { return inst; } var customBubblingEventTypes = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry + reactPrivateInterface.ReactNativeViewConfigRegistry .customBubblingEventTypes, customDirectEventTypes = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry - .customDirectEventTypes; + reactPrivateInterface.ReactNativeViewConfigRegistry.customDirectEventTypes; function accumulateDirectionalDispatches(inst, phase, event) { if ( (phase = getListener( @@ -1234,7 +1276,7 @@ eventPluginOrder = Array.prototype.slice.call([ "ReactNativeBridgeEventPlugin" ]); recomputePluginOrdering(); -var injectedNamesToPlugins$jscomp$inline_320 = { +var injectedNamesToPlugins$jscomp$inline_336 = { ResponderEventPlugin: ResponderEventPlugin, ReactNativeBridgeEventPlugin: { eventTypes: {}, @@ -1280,32 +1322,32 @@ var injectedNamesToPlugins$jscomp$inline_320 = { } } }, - isOrderingDirty$jscomp$inline_321 = !1, - pluginName$jscomp$inline_322; -for (pluginName$jscomp$inline_322 in injectedNamesToPlugins$jscomp$inline_320) + isOrderingDirty$jscomp$inline_337 = !1, + pluginName$jscomp$inline_338; +for (pluginName$jscomp$inline_338 in injectedNamesToPlugins$jscomp$inline_336) if ( - injectedNamesToPlugins$jscomp$inline_320.hasOwnProperty( - pluginName$jscomp$inline_322 + injectedNamesToPlugins$jscomp$inline_336.hasOwnProperty( + pluginName$jscomp$inline_338 ) ) { - var pluginModule$jscomp$inline_323 = - injectedNamesToPlugins$jscomp$inline_320[pluginName$jscomp$inline_322]; + var pluginModule$jscomp$inline_339 = + injectedNamesToPlugins$jscomp$inline_336[pluginName$jscomp$inline_338]; if ( - !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_322) || - namesToPlugins[pluginName$jscomp$inline_322] !== - pluginModule$jscomp$inline_323 + !namesToPlugins.hasOwnProperty(pluginName$jscomp$inline_338) || + namesToPlugins[pluginName$jscomp$inline_338] !== + pluginModule$jscomp$inline_339 ) { - if (namesToPlugins[pluginName$jscomp$inline_322]) + if (namesToPlugins[pluginName$jscomp$inline_338]) throw Error( "EventPluginRegistry: Cannot inject two different event plugins using the same name, `" + - (pluginName$jscomp$inline_322 + "`.") + (pluginName$jscomp$inline_338 + "`.") ); - namesToPlugins[pluginName$jscomp$inline_322] = - pluginModule$jscomp$inline_323; - isOrderingDirty$jscomp$inline_321 = !0; + namesToPlugins[pluginName$jscomp$inline_338] = + pluginModule$jscomp$inline_339; + isOrderingDirty$jscomp$inline_337 = !0; } } -isOrderingDirty$jscomp$inline_321 && recomputePluginOrdering(); +isOrderingDirty$jscomp$inline_337 && recomputePluginOrdering(); function batchedUpdatesImpl(fn, bookkeeping) { return fn(bookkeeping); } @@ -1339,46 +1381,71 @@ function executeDispatchesAndReleaseTopLevel(e) { e.isPersistent() || e.constructor.release(e); } } -function dispatchEvent(target, topLevelType, nativeEvent) { - var eventTarget = null; - if (null != target) { - var stateNode = target.stateNode; - null != stateNode && (eventTarget = getPublicInstance(stateNode)); - } +var _enableNativeEventTargetEventDispatching = null; +function dispatchEvent(target, topLevelType, nativeEventParam) { + var nativeEvent = + null != nativeEventParam && "object" === typeof nativeEventParam + ? nativeEventParam + : {}, + eventTarget = null; + null != target && + ((nativeEventParam = target.stateNode), + null != nativeEventParam && + (eventTarget = getPublicInstance(nativeEventParam))); batchedUpdates$1(function () { var event = { eventName: topLevelType, nativeEvent: nativeEvent }; - ReactNativePrivateInterface.RawEventEmitter.emit(topLevelType, event); - ReactNativePrivateInterface.RawEventEmitter.emit("*", event); - event = eventTarget; - for ( - var events = null, legacyPlugins = plugins, i = 0; - i < legacyPlugins.length; - i++ - ) { - var possiblePlugin = legacyPlugins[i]; - possiblePlugin && - (possiblePlugin = possiblePlugin.extractEvents( + reactPrivateInterface.RawEventEmitter.emit(topLevelType, event); + reactPrivateInterface.RawEventEmitter.emit("*", event); + null == _enableNativeEventTargetEventDispatching && + ((event = + null != reactPrivateInterface.ReactNativeFeatureFlags + ? reactPrivateInterface.ReactNativeFeatureFlags + .enableNativeEventTargetEventDispatching + : null), + (_enableNativeEventTargetEventDispatching = + "function" === typeof event && event())); + if (_enableNativeEventTargetEventDispatching) + null != eventTarget && + reactPrivateInterface.dispatchNativeEvent( + eventTarget, topLevelType, - target, - nativeEvent, - event - )) && - (events = accumulateInto(events, possiblePlugin)); - } - event = events; - null !== event && (eventQueue = accumulateInto(eventQueue, event)); - event = eventQueue; - eventQueue = null; - if (event) { - forEachAccumulated(event, executeDispatchesAndReleaseTopLevel); - if (eventQueue) - throw Error( - "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." - ); - if (hasError) - throw ( - ((event = caughtError), (hasError = !1), (caughtError = null), event) + nativeEvent ); + else { + event = eventTarget; + for ( + var events = null, legacyPlugins = plugins, i = 0; + i < legacyPlugins.length; + i++ + ) { + var possiblePlugin = legacyPlugins[i]; + possiblePlugin && + (possiblePlugin = possiblePlugin.extractEvents( + topLevelType, + target, + nativeEvent, + event + )) && + (events = accumulateInto(events, possiblePlugin)); + } + event = events; + null !== event && (eventQueue = accumulateInto(eventQueue, event)); + event = eventQueue; + eventQueue = null; + if (event) { + forEachAccumulated(event, executeDispatchesAndReleaseTopLevel); + if (eventQueue) + throw Error( + "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented." + ); + if (hasError) + throw ( + ((event = caughtError), + (hasError = !1), + (caughtError = null), + event) + ); + } } }); } @@ -1443,7 +1510,7 @@ function getHighestPriorityLanes(lanes) { case 32768: case 65536: case 131072: - return lanes & 261888; + return lanes & -lanes; case 262144: case 524288: case 1048576: @@ -1516,6 +1583,22 @@ function checkIfRootIsPrerendering(root, renderLanes) { renderLanes) ); } +function getEntangledLanes(root, renderLanes) { + 0 !== (renderLanes & 8) && (renderLanes |= renderLanes & 32); + var allEntangledLanes = root.entangledLanes; + if (0 !== allEntangledLanes) + for ( + root = root.entanglements, allEntangledLanes &= renderLanes; + 0 < allEntangledLanes; + + ) { + var index$6 = 31 - clz32(allEntangledLanes), + lane = 1 << index$6; + renderLanes |= root[index$6]; + allEntangledLanes &= ~lane; + } + return renderLanes; +} function computeExpirationTime(lane, currentTime) { switch (lane) { case 1: @@ -1724,18 +1807,12 @@ function lanesToEventPriority(lanes) { : 2; } function getNearestMountedFiber(fiber) { - var node = fiber, - nearestMounted = fiber; - if (fiber.alternate) for (; node.return; ) node = node.return; - else { - fiber = node; - do - (node = fiber), - 0 !== (node.flags & 4098) && (nearestMounted = node.return), - (fiber = node.return); - while (fiber); - } - return 3 === node.tag ? nearestMounted : null; + for (var node = fiber, nextNode = node; nextNode && !nextNode.alternate; ) + (node = nextNode), + 0 !== (node.flags & 4098) && (fiber = node.return), + (nextNode = node.return); + for (; node.return; ) node = node.return; + return 3 === node.tag ? fiber : null; } function assertIsMounted(fiber) { if (getNearestMountedFiber(fiber) !== fiber) @@ -1827,6 +1904,66 @@ function findCurrentHostFiberImpl(node) { } return null; } +function traverseVisibleInstancesAndTextInstances( + child, + searchWithinHosts, + fn, + a, + b, + c +) { + for (; null !== child; ) { + if ( + ((5 === child.tag || 27 === child.tag || 6 === child.tag) && + fn(child, a, b, c)) || + ((22 !== child.tag || null === child.memoizedState) && + (searchWithinHosts || (5 !== child.tag && 27 !== child.tag)) && + traverseVisibleInstancesAndTextInstances( + child.child, + searchWithinHosts, + fn, + a, + b, + c + )) + ) + return !0; + child = child.sibling; + } + return !1; +} +function getFragmentParentInstanceOrContainerFiber(fiber) { + for (fiber = fiber.return; null !== fiber; ) { + if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) return fiber; + fiber = fiber.return; + } + return null; +} +function findFragmentInstanceOrTextInstanceSiblings( + result, + self, + child, + state +) { + for (; null !== child; ) { + if (child === self) state.foundSelf = !0; + else if (5 === child.tag || 27 === child.tag || 6 === child.tag) { + if (state.foundSelf) return (result[1] = child), !0; + result[0] = child; + } else if ( + (22 !== child.tag || null === child.memoizedState) && + findFragmentInstanceOrTextInstanceSiblings( + result, + self, + child.child, + state + ) + ) + return !0; + child = child.sibling; + } + return !1; +} var valueStack = [], index = -1; function createCursor(defaultValue) { @@ -1841,7 +1978,42 @@ function push(cursor, value) { valueStack[index] = cursor.current; cursor.current = value; } -var emptyContextObject = {}; +var emptyContextObject = {}, + globalClientIdCounter$1 = 0; +function getViewTransitionName(props, instance) { + if (null != props.name && "auto" !== props.name) return props.name; + if (null !== instance.autoName) return instance.autoName; + props = pendingEffectsRoot.identifierPrefix; + var globalClientId = globalClientIdCounter$1++; + props = "_" + props + "t_" + globalClientId.toString(32) + "_"; + return (instance.autoName = props); +} +function getClassNameByType(classByType) { + if (null == classByType || "string" === typeof classByType) + return classByType; + var className = null, + activeTypes = pendingTransitionTypes; + if (null !== activeTypes) + for (var i = 0; i < activeTypes.length; i++) { + var match = classByType[activeTypes[i]]; + if (null != match) { + if ("none" === match) return "none"; + className = null == className ? match : className + (" " + match); + } + } + return null == className ? classByType.default : className; +} +function getViewTransitionClassName(defaultClass, eventClass) { + defaultClass = getClassNameByType(defaultClass); + eventClass = getClassNameByType(eventClass); + return null == eventClass + ? "auto" === defaultClass + ? null + : defaultClass + : "auto" === eventClass + ? null + : eventClass; +} function is(x, y) { return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y); } @@ -1902,7 +2074,8 @@ function logComponentTrigger(fiber, startTime, endTime, trigger) { (reusableComponentDevToolDetails.color = "warning"), (reusableComponentDevToolDetails.tooltipText = trigger), (reusableComponentDevToolDetails.properties = null), - performance.measure(trigger, reusableComponentOptions)); + performance.measure(trigger, reusableComponentOptions), + performance.clearMeasures(trigger)); } function logComponentReappeared(fiber, startTime, endTime) { logComponentTrigger(fiber, startTime, endTime, "Reconnect"); @@ -2040,6 +2213,32 @@ function logCommitErrored(startTime, endTime) { "error" ); } +function logCommitPhase(startTime, endTime, errors, abortedViewTransition) { + null !== errors + ? logCommitErrored(startTime, endTime) + : !supportsUserTiming || + endTime <= startTime || + console.timeStamp( + abortedViewTransition ? "Commit Interrupted View Transition" : "Commit", + startTime, + endTime, + currentTrack, + "Scheduler \u269b", + abortedViewTransition ? "error" : "secondary-dark" + ); +} +function logAnimatingPhase(startTime, endTime) { + !supportsUserTiming || + endTime <= startTime || + console.timeStamp( + "Animating", + startTime, + endTime, + currentTrack, + "Scheduler \u269b", + "secondary-dark" + ); +} var CapturedStacks = new WeakMap(); function createCapturedValueAtFiber(value, source) { if ("object" === typeof value && null !== value) { @@ -2077,10 +2276,13 @@ function popHostContainer() { pop(rootInstanceStackCursor); } function pushHostContext(fiber) { - null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber); - var context = contextStackCursor.current; - context !== context && - (push(contextFiberStackCursor, fiber), push(contextStackCursor, context)); + var stateHook = fiber.memoizedState; + null !== stateHook && + ((HostTransitionContext._currentValue2 = stateHook.memoizedState), + push(hostTransitionProviderCursor, fiber)); + stateHook = contextStackCursor.current; + stateHook !== stateHook && + (push(contextFiberStackCursor, fiber), push(contextStackCursor, stateHook)); } function popHostContext(fiber) { contextFiberStackCursor.current === fiber && @@ -2168,7 +2370,21 @@ function propagateContextChanges( null !== list && (list.lanes |= renderLanes); scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress); nextFiber = null; - } else nextFiber = fiber.child; + } else + 13 === fiber.tag && + null !== fiber.memoizedState && + null === fiber.memoizedState.dehydrated + ? ((fiber.lanes |= renderLanes), + (nextFiber = fiber.alternate), + null !== nextFiber && (nextFiber.lanes |= renderLanes), + scheduleContextWorkOnParentPath( + fiber.return, + renderLanes, + workInProgress + ), + (nextFiber = fiber.child), + (nextFiber = null !== nextFiber ? nextFiber.sibling : null)) + : (nextFiber = fiber.child); if (null !== nextFiber) nextFiber.return = fiber; else for (nextFiber = fiber; null !== nextFiber; ) { @@ -2232,6 +2448,7 @@ function propagateParentContextChanges( forcePropagateEntireTree ); workInProgress.flags |= 262144; + return null !== current; } function checkIfContextChanged(currentDependencies) { for ( @@ -2319,6 +2536,22 @@ function releaseCache(cache) { cache.controller.abort(); }); } +function queueTransitionTypes(root, transitionTypes) { + if (0 !== (root.pendingLanes & 4194048)) { + var queued = root.transitionTypes; + null === queued && (queued = root.transitionTypes = []); + for (root = 0; root < transitionTypes.length; root++) { + var transitionType = transitionTypes[root]; + -1 === queued.indexOf(transitionType) && queued.push(transitionType); + } + } +} +var entangledTransitionTypes = null; +function claimQueuedTransitionTypes(root) { + var claimed = root.transitionTypes; + root.transitionTypes = null; + return claimed; +} var now = Scheduler.unstable_now, renderStartTime = -0, commitStartTime = -0, @@ -2346,6 +2579,9 @@ var now = Scheduler.unstable_now, transitionEventType = null, transitionEventRepeatTime = -1.1, transitionSuspendedTime = -1.1, + retryClampTime = -0, + idleClampTime = -0, + animatingLanes = 0, yieldReason = 0, yieldStartTime = -1.1; function startUpdateTimerByLane(lane) { @@ -2354,20 +2590,28 @@ function startUpdateTimerByLane(lane) { blockingUpdateTime = now(); 0 !== (executionContext & 6) && ((componentEffectSpawnedUpdate = !0), (blockingUpdateType = 1)); - if (-1.1 !== blockingEventRepeatTime || null !== blockingEventType) - blockingEventRepeatTime = -1.1; - blockingEventTime = -1.1; - blockingEventType = null; + lane = resolveEventTimeStamp(); + var newEventType$19 = resolveEventType(); + lane !== blockingEventRepeatTime || newEventType$19 !== blockingEventType + ? (blockingEventRepeatTime = -1.1) + : null !== newEventType$19 && (blockingUpdateType = 1); + blockingEventTime = lane; + blockingEventType = newEventType$19; } } else if ( 0 !== (lane & 4194048) && 0 > transitionUpdateTime && ((transitionUpdateTime = now()), 0 > transitionStartTime) ) { - if (-1.1 !== transitionEventRepeatTime || null !== transitionEventType) + lane = resolveEventTimeStamp(); + newEventType$19 = resolveEventType(); + if ( + lane !== transitionEventRepeatTime || + newEventType$19 !== transitionEventType + ) transitionEventRepeatTime = -1.1; - transitionEventTime = -1.1; - transitionEventType = null; + transitionEventTime = lane; + transitionEventType = newEventType$19; } } function pushNestedEffectDurations() { @@ -2522,6 +2766,7 @@ function flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) { } } function processRootScheduleInImmediateTask() { + schedulerEvent = global.event; processRootScheduleInMicrotask(); } function processRootScheduleInMicrotask() { @@ -2619,6 +2864,7 @@ function scheduleTaskForRootDuringMicrotask(root, currentTime) { } function performWorkOnRootViaSchedulerTask(root, didTimeout) { nestedUpdateScheduled = currentUpdateIsNested = !1; + schedulerEvent = global.event; if (0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus) return (root.callbackNode = null), (root.callbackPriority = 0), null; var originalCallbackNode = root.callbackNode; @@ -2645,16 +2891,14 @@ function performSyncWorkOnRoot(root, lanes) { performWorkOnRoot(root, lanes, !0); } function scheduleImmediateRootScheduleTask() { - supportsMicrotasks - ? scheduleMicrotask(function () { - 0 !== (executionContext & 6) - ? scheduleCallback$3( - ImmediatePriority, - processRootScheduleInImmediateTask - ) - : processRootScheduleInMicrotask(); - }) - : scheduleCallback$3(ImmediatePriority, processRootScheduleInImmediateTask); + scheduleMicrotask(function () { + 0 !== (executionContext & 6) + ? scheduleCallback$3( + ImmediatePriority, + processRootScheduleInImmediateTask + ) + : processRootScheduleInMicrotask(); + }); } function requestTransitionLane() { if (0 === currentEventTransitionLane) { @@ -2693,6 +2937,7 @@ function pingEngtangledActionScope() { if ( 0 === --currentEntangledPendingCount && (-1 < transitionUpdateTime || (transitionStartTime = -1.1), + (entangledTransitionTypes = null), null !== currentEntangledListeners) ) { null !== currentEntangledActionThenable && @@ -2739,13 +2984,37 @@ ReactSharedInternals.S = function (transition, returnValue) { ) { if (0 > transitionStartTime && 0 > transitionUpdateTime) { transitionStartTime = now(); - if (-1.1 !== transitionEventRepeatTime || null !== transitionEventType) + var newEventTime = resolveEventTimeStamp(), + newEventType = resolveEventType(); + if ( + newEventTime !== transitionEventRepeatTime || + newEventType !== transitionEventType + ) transitionEventRepeatTime = -1.1; - transitionEventTime = -1.1; - transitionEventType = null; + transitionEventTime = newEventTime; + transitionEventType = newEventType; } entangleAsyncAction(transition, returnValue); } + if (null !== entangledTransitionTypes) + for (newEventTime = firstScheduledRoot; null !== newEventTime; ) + queueTransitionTypes(newEventTime, entangledTransitionTypes), + (newEventTime = newEventTime.next); + newEventTime = transition.types; + if (null !== newEventTime) { + for (newEventType = firstScheduledRoot; null !== newEventType; ) + queueTransitionTypes(newEventType, newEventTime), + (newEventType = newEventType.next); + if (0 !== currentEntangledLane) { + newEventType = entangledTransitionTypes; + null === newEventType && (newEventType = entangledTransitionTypes = []); + for (var i = 0; i < newEventTime.length; i++) { + var transitionType = newEventTime[i]; + -1 === newEventType.indexOf(transitionType) && + newEventType.push(transitionType); + } + } + } null !== prevOnStartTransitionFinish && prevOnStartTransitionFinish(transition, returnValue); }; @@ -2812,11 +3081,13 @@ function trackUsedThenable(thenableState, thenable, index) { case "fulfilled": return thenable.value; case "rejected": - throw ( - ((thenableState = thenable.reason), - checkIfUseWrappedInAsyncCatch(thenableState), - thenableState) - ); + thenableState = thenable.reason; + checkIfUseWrappedInAsyncCatch(thenableState); + if (void 0 === thenableState && !("reason" in thenable)) + throw Error( + "A rejected Promise was passed to React without a `reason` property. React threw a generic error from where the Promise was used to assist in identifying the problematic Promise. Make sure that instrumented Promises correctly set the `reason` property when setting `status` to `'rejected'`." + ); + throw thenableState; default: if ("string" === typeof thenable.status) thenable.then(noop, noop); else { @@ -2931,9 +3202,9 @@ function createChildReconciler(shouldTrackSideEffects) { } function mapRemainingChildren(currentFirstChild) { for (var existingChildren = new Map(); null !== currentFirstChild; ) - null !== currentFirstChild.key - ? existingChildren.set(currentFirstChild.key, currentFirstChild) - : existingChildren.set(currentFirstChild.index, currentFirstChild), + null === currentFirstChild.key + ? existingChildren.set(currentFirstChild.index, currentFirstChild) + : existingChildren.set(currentFirstChild.key, currentFirstChild), (currentFirstChild = currentFirstChild.sibling); return existingChildren; } @@ -2952,16 +3223,16 @@ function createChildReconciler(shouldTrackSideEffects) { return ( (newIndex = newIndex.index), newIndex < lastPlacedIndex - ? ((newFiber.flags |= 67108866), lastPlacedIndex) + ? ((newFiber.flags |= 2), lastPlacedIndex) : newIndex ); - newFiber.flags |= 67108866; + newFiber.flags |= 134217730; return lastPlacedIndex; } function placeSingleChild(newFiber) { shouldTrackSideEffects && null === newFiber.alternate && - (newFiber.flags |= 67108866); + (newFiber.flags |= 134217730); return newFiber; } function updateTextNode(returnFiber, current, textContent, lanes) { @@ -2978,12 +3249,16 @@ function createChildReconciler(shouldTrackSideEffects) { function updateElement(returnFiber, current, element, lanes) { var elementType = element.type; if (elementType === REACT_FRAGMENT_TYPE) - return updateFragment( - returnFiber, - current, - element.props.children, - lanes, - element.key + return ( + (returnFiber = updateFragment( + returnFiber, + current, + element.props.children, + lanes, + element.key + )), + coerceRef(returnFiber, element), + returnFiber ); if ( null !== current && @@ -3304,10 +3579,9 @@ function createChildReconciler(shouldTrackSideEffects) { )), null !== nextOldFiber && (shouldTrackSideEffects && - null !== nextOldFiber.alternate && - oldFiber.delete( - null === nextOldFiber.key ? newIdx : nextOldFiber.key - ), + ((newFiber = nextOldFiber.alternate), + null !== newFiber && + oldFiber.delete(null === newFiber.key ? newIdx : newFiber.key)), (currentFirstChild = placeChild( nextOldFiber, currentFirstChild, @@ -3383,8 +3657,11 @@ function createChildReconciler(shouldTrackSideEffects) { (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)), null !== step && (shouldTrackSideEffects && - null !== step.alternate && - oldFiber.delete(null === step.key ? newIdx : step.key), + ((nextOldFiber = step.alternate), + null !== nextOldFiber && + oldFiber.delete( + null === nextOldFiber.key ? newIdx : nextOldFiber.key + )), (currentFirstChild = placeChild(step, currentFirstChild, newIdx)), null === previousNewFiber ? (resultingFirstChild = step) @@ -3406,6 +3683,7 @@ function createChildReconciler(shouldTrackSideEffects) { null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && + void 0 === newChild.props.ref && (newChild = newChild.props.children); if ("object" === typeof newChild && null !== newChild) { switch (newChild.$$typeof) { @@ -3424,6 +3702,7 @@ function createChildReconciler(shouldTrackSideEffects) { currentFirstChild, newChild.props.children ); + coerceRef(lanes, newChild); lanes.return = returnFiber; returnFiber = lanes; break a; @@ -3457,6 +3736,7 @@ function createChildReconciler(shouldTrackSideEffects) { lanes, newChild.key )), + coerceRef(lanes, newChild), (lanes.return = returnFiber), (returnFiber = lanes)) : ((lanes = createFiberFromTypeAndProps( @@ -3969,7 +4249,7 @@ function pushOffscreenSuspenseHandler(fiber) { ? (push(suspenseStackCursor, suspenseStackCursor.current), push(suspenseHandlerStackCursor, fiber), null === shellBoundary && (shellBoundary = fiber)) - : reuseSuspenseHandlerOnStack(fiber); + : reuseSuspenseHandlerOnStack(); } function reuseSuspenseHandlerOnStack() { push(suspenseStackCursor, suspenseStackCursor.current); @@ -3981,6 +4261,15 @@ function popSuspenseHandler(fiber) { pop(suspenseStackCursor); } var suspenseStackCursor = createCursor(0); +function pushSuspenseListContext(fiber, newContext) { + push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current); + push(suspenseStackCursor, newContext); +} +function popSuspenseListContext(fiber) { + pop(suspenseStackCursor); + pop(suspenseHandlerStackCursor); + shellBoundary === fiber && (shellBoundary = null); +} function findFirstSuspended(row) { for (var node = row; null !== node; ) { if (13 === node.tag) { @@ -3989,10 +4278,7 @@ function findFirstSuspended(row) { return node; } else if ( 19 === node.tag && - ("forwards" === node.memoizedProps.revealOrder || - "backwards" === node.memoizedProps.revealOrder || - "unstable_legacy-backwards" === node.memoizedProps.revealOrder || - "together" === node.memoizedProps.revealOrder) + "independent" !== node.memoizedProps.revealOrder ) { if (0 !== (node.flags & 128)) return node; } else if (null !== node.child) { @@ -4213,6 +4499,7 @@ function useThenable(thenable) { function use(usable) { if (null !== usable && "object" === typeof usable) { if ("function" === typeof usable.then) return useThenable(usable); + if (usable.$$typeof === REACT_RECOVERABLE_TYPE) return; if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable); } throw Error("An unsupported type was passed to use(): " + String(usable)); @@ -4283,7 +4570,7 @@ function updateReducerImpl(hook, current, reducer) { var newBaseQueueFirst = (baseFirst = null), newBaseQueueLast = null, update = current, - didReadFromEntangledAsyncAction$53 = !1; + didReadFromEntangledAsyncAction$55 = !1; do { var updateLane = update.lane & -536870913; if ( @@ -4305,11 +4592,11 @@ function updateReducerImpl(hook, current, reducer) { next: null }), updateLane === currentEntangledLane && - (didReadFromEntangledAsyncAction$53 = !0); + (didReadFromEntangledAsyncAction$55 = !0); else if ((renderLanes & revertLane) === revertLane) { update = update.next; revertLane === currentEntangledLane && - (didReadFromEntangledAsyncAction$53 = !0); + (didReadFromEntangledAsyncAction$55 = !0); continue; } else (updateLane = { @@ -4357,7 +4644,7 @@ function updateReducerImpl(hook, current, reducer) { if ( !objectIs(pendingQueue, hook.memoizedState) && ((didReceiveUpdate = !0), - didReadFromEntangledAsyncAction$53 && + didReadFromEntangledAsyncAction$55 && ((reducer = currentEntangledActionThenable), null !== reducer)) ) throw reducer; @@ -4406,18 +4693,19 @@ function updateSyncExternalStore(subscribe, getSnapshot) { updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [ subscribe ]); - if ( + subscribe = hook.getSnapshot !== getSnapshot || snapshotChanged || - (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1) - ) { + (null !== workInProgressHook && + 0 !== (workInProgressHook.memoizedState.tag & 1)); + pushSimpleEffect( + subscribe ? 9 : 8, + { destroy: void 0 }, + updateStoreInstance.bind(null, fiber, hook, nextSnapshot, getSnapshot), + null + ); + if (subscribe) { fiber.flags |= 2048; - pushSimpleEffect( - 9, - { destroy: void 0 }, - updateStoreInstance.bind(null, fiber, hook, nextSnapshot, getSnapshot), - null - ); if (null === workInProgressRoot) throw Error( "Expected a work-in-progress root. This is a bug in React. Please file an issue." @@ -4505,7 +4793,7 @@ function dispatchActionState( payload ) { if (isRenderPhaseUpdate(fiber)) - throw Error("Cannot update form state while rendering."); + throw Error("Cannot update action state while rendering."); fiber = actionQueue.action; if (null !== fiber) { var actionNode = { @@ -4540,6 +4828,8 @@ function runActionStateAction(actionQueue, node) { if (node.isTransition) { var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition.types = + null !== prevTransition ? prevTransition.types : null; ReactSharedInternals.T = currentTransition; try { var returnValue = action(prevState, payload), @@ -4559,8 +4849,8 @@ function runActionStateAction(actionQueue, node) { try { (prevTransition = action(prevState, payload)), handleActionReturnValue(actionQueue, node, prevTransition); - } catch (error$57) { - onActionError(actionQueue, node, error$57); + } catch (error$59) { + onActionError(actionQueue, node, error$59); } } function handleActionReturnValue(actionQueue, node, returnValue) { @@ -4854,7 +5144,7 @@ function updateDeferredValueImpl(hook, prevValue, value, initialValue) { hook ); if ( - 0 === (renderLanes & 42) || + 0 === (renderLanes & 106) || (0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) ) @@ -4870,6 +5160,8 @@ function startTransition(fiber, queue, pendingState, finishedState, callback) { 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8; var prevTransition = ReactSharedInternals.T, currentTransition = {}; + currentTransition.types = + null !== prevTransition ? prevTransition.types : null; ReactSharedInternals.T = currentTransition; dispatchOptimisticSetState(fiber, !1, queue, pendingState); try { @@ -5058,32 +5350,32 @@ function entangleTransitionUpdate(root, queue, lane) { } } var ContextOnlyDispatcher = { - readContext: readContext, - use: use, - useCallback: throwInvalidHookError, - useContext: throwInvalidHookError, - useEffect: throwInvalidHookError, - useImperativeHandle: throwInvalidHookError, - useLayoutEffect: throwInvalidHookError, - useInsertionEffect: throwInvalidHookError, - useMemo: throwInvalidHookError, - useReducer: throwInvalidHookError, - useRef: throwInvalidHookError, - useState: throwInvalidHookError, - useDebugValue: throwInvalidHookError, - useDeferredValue: throwInvalidHookError, - useTransition: throwInvalidHookError, - useSyncExternalStore: throwInvalidHookError, - useId: throwInvalidHookError, - useHostTransitionStatus: throwInvalidHookError, - useFormState: throwInvalidHookError, - useActionState: throwInvalidHookError, - useOptimistic: throwInvalidHookError, - useMemoCache: throwInvalidHookError, - useCacheRefresh: throwInvalidHookError -}; -ContextOnlyDispatcher.useEffectEvent = throwInvalidHookError; -var HooksDispatcherOnMount = { + readContext: readContext, + use: use, + useCallback: throwInvalidHookError, + useContext: throwInvalidHookError, + useEffect: throwInvalidHookError, + useImperativeHandle: throwInvalidHookError, + useLayoutEffect: throwInvalidHookError, + useInsertionEffect: throwInvalidHookError, + useMemo: throwInvalidHookError, + useReducer: throwInvalidHookError, + useRef: throwInvalidHookError, + useState: throwInvalidHookError, + useDebugValue: throwInvalidHookError, + useDeferredValue: throwInvalidHookError, + useTransition: throwInvalidHookError, + useSyncExternalStore: throwInvalidHookError, + useId: throwInvalidHookError, + useHostTransitionStatus: throwInvalidHookError, + useFormState: throwInvalidHookError, + useActionState: throwInvalidHookError, + useOptimistic: throwInvalidHookError, + useMemoCache: throwInvalidHookError, + useCacheRefresh: throwInvalidHookError, + useEffectEvent: throwInvalidHookError + }, + HooksDispatcherOnMount = { readContext: readContext, use: use, useCallback: function (callback, deps) { @@ -5304,62 +5596,62 @@ var HooksDispatcherOnMount = { return updateOptimisticImpl(hook, currentHook, passthrough, reducer); }, useMemoCache: useMemoCache, - useCacheRefresh: updateRefresh - }; -HooksDispatcherOnUpdate.useEffectEvent = updateEvent; -var HooksDispatcherOnRerender = { - readContext: readContext, - use: use, - useCallback: updateCallback, - useContext: readContext, - useEffect: updateEffect, - useImperativeHandle: updateImperativeHandle, - useInsertionEffect: updateInsertionEffect, - useLayoutEffect: updateLayoutEffect, - useMemo: updateMemo, - useReducer: rerenderReducer, - useRef: updateRef, - useState: function () { - return rerenderReducer(basicStateReducer); - }, - useDebugValue: mountDebugValue, - useDeferredValue: function (value, initialValue) { - var hook = updateWorkInProgressHook(); - return null === currentHook - ? mountDeferredValueImpl(hook, value, initialValue) - : updateDeferredValueImpl( - hook, - currentHook.memoizedState, - value, - initialValue - ); - }, - useTransition: function () { - var booleanOrThenable = rerenderReducer(basicStateReducer)[0], - start = updateWorkInProgressHook().memoizedState; - return [ - "boolean" === typeof booleanOrThenable - ? booleanOrThenable - : useThenable(booleanOrThenable), - start - ]; + useCacheRefresh: updateRefresh, + useEffectEvent: updateEvent }, - useSyncExternalStore: updateSyncExternalStore, - useId: updateId, - useHostTransitionStatus: useHostTransitionStatus, - useFormState: rerenderActionState, - useActionState: rerenderActionState, - useOptimistic: function (passthrough, reducer) { - var hook = updateWorkInProgressHook(); - if (null !== currentHook) - return updateOptimisticImpl(hook, currentHook, passthrough, reducer); - hook.baseState = passthrough; - return [passthrough, hook.queue.dispatch]; - }, - useMemoCache: useMemoCache, - useCacheRefresh: updateRefresh -}; -HooksDispatcherOnRerender.useEffectEvent = updateEvent; + HooksDispatcherOnRerender = { + readContext: readContext, + use: use, + useCallback: updateCallback, + useContext: readContext, + useEffect: updateEffect, + useImperativeHandle: updateImperativeHandle, + useInsertionEffect: updateInsertionEffect, + useLayoutEffect: updateLayoutEffect, + useMemo: updateMemo, + useReducer: rerenderReducer, + useRef: updateRef, + useState: function () { + return rerenderReducer(basicStateReducer); + }, + useDebugValue: mountDebugValue, + useDeferredValue: function (value, initialValue) { + var hook = updateWorkInProgressHook(); + return null === currentHook + ? mountDeferredValueImpl(hook, value, initialValue) + : updateDeferredValueImpl( + hook, + currentHook.memoizedState, + value, + initialValue + ); + }, + useTransition: function () { + var booleanOrThenable = rerenderReducer(basicStateReducer)[0], + start = updateWorkInProgressHook().memoizedState; + return [ + "boolean" === typeof booleanOrThenable + ? booleanOrThenable + : useThenable(booleanOrThenable), + start + ]; + }, + useSyncExternalStore: updateSyncExternalStore, + useId: updateId, + useHostTransitionStatus: useHostTransitionStatus, + useFormState: rerenderActionState, + useActionState: rerenderActionState, + useOptimistic: function (passthrough, reducer) { + var hook = updateWorkInProgressHook(); + if (null !== currentHook) + return updateOptimisticImpl(hook, currentHook, passthrough, reducer); + hook.baseState = passthrough; + return [passthrough, hook.queue.dispatch]; + }, + useMemoCache: useMemoCache, + useCacheRefresh: updateRefresh, + useEffectEvent: updateEvent + }; function applyDerivedStateFromProps( workInProgress, ctor, @@ -5501,9 +5793,9 @@ function resolveClassComponentProps(Component, baseProps) { } if ((Component = Component.defaultProps)) { newProps === baseProps && (newProps = assign({}, newProps)); - for (var propName$59 in Component) - void 0 === newProps[propName$59] && - (newProps[propName$59] = Component[propName$59]); + for (var propName$61 in Component) + void 0 === newProps[propName$61] && + (newProps[propName$61] = Component[propName$61]); } return newProps; } @@ -5611,6 +5903,7 @@ function throwException( switch (currentSourceFiber.tag) { case 31: case 13: + case 19: return ( sourceFiber.mode & 1 && (null === shellBoundary @@ -5710,17 +6003,17 @@ function throwException( !1 ); case 1: + sourceFiber = returnFiber.type; + currentSourceFiber = returnFiber.stateNode; if ( - ((sourceFiber = returnFiber.type), - (currentSourceFiber = returnFiber.stateNode), 0 === (returnFiber.flags & 128) && - ("function" === typeof sourceFiber.getDerivedStateFromError || - (null !== currentSourceFiber && - "function" === typeof currentSourceFiber.componentDidCatch && - (null === legacyErrorBoundariesThatAlreadyFailed || - !legacyErrorBoundariesThatAlreadyFailed.has( - currentSourceFiber - ))))) + ("function" === typeof sourceFiber.getDerivedStateFromError || + (null !== currentSourceFiber && + "function" === typeof currentSourceFiber.componentDidCatch && + (null === legacyErrorBoundariesThatAlreadyFailed || + !legacyErrorBoundariesThatAlreadyFailed.has( + currentSourceFiber + )))) ) return ( (returnFiber.flags |= 65536), @@ -5736,6 +6029,10 @@ function throwException( enqueueCapturedUpdate(returnFiber, rootRenderLanes), !1 ); + break; + case 22: + if (null !== returnFiber.memoizedState) + return (returnFiber.flags |= 65536), !1; } returnFiber = returnFiber.return; } while (null !== returnFiber); @@ -5940,11 +6237,11 @@ function updateOffscreenComponent( null !== prevState ? (pushTransition(workInProgress, prevState.cachePool), pushHiddenContext(workInProgress, prevState), - reuseSuspenseHandlerOnStack(workInProgress), + reuseSuspenseHandlerOnStack(), (workInProgress.memoizedState = null)) : (null !== current && pushTransition(workInProgress, null), reuseHiddenContextOnStack(), - reuseSuspenseHandlerOnStack(workInProgress)); + reuseSuspenseHandlerOnStack()); reconcileChildren(current, workInProgress, nextChildren, renderLanes); return workInProgress.child; } @@ -6330,182 +6627,93 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) { JSCompiler_temp = 0 !== (workInProgress.flags & 32); workInProgress.flags &= -33; if (null === current) { - var nextPrimaryChildren = nextProps.children; + didSuspend = nextProps.children; nextProps = nextProps.fallback; - if (showFallback) - return ( - reuseSuspenseHandlerOnStack(workInProgress), - (showFallback = workInProgress.mode), - (didSuspend = workInProgress.child), - (nextPrimaryChildren = { - mode: "hidden", - children: nextPrimaryChildren - }), - 0 === (showFallback & 1) && null !== didSuspend - ? ((didSuspend.childLanes = 0), - (didSuspend.pendingProps = nextPrimaryChildren), - workInProgress.mode & 2 && - ((didSuspend.actualDuration = -0), - (didSuspend.actualStartTime = -1.1), - (didSuspend.selfBaseDuration = -0), - (didSuspend.treeBaseDuration = -0))) - : (didSuspend = mountWorkInProgressOffscreenFiber( - nextPrimaryChildren, - showFallback - )), - (nextProps = createFiberFromFragment( - nextProps, - showFallback, - renderLanes, - null - )), - (didSuspend.return = workInProgress), - (nextProps.return = workInProgress), - (didSuspend.sibling = nextProps), - (workInProgress.child = didSuspend), - (nextProps = workInProgress.child), - (nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes)), - (nextProps.childLanes = getRemainingWorkInPrimaryTree( - current, - JSCompiler_temp, - renderLanes - )), - (workInProgress.memoizedState = SUSPENDED_MARKER), - bailoutOffscreenComponent(null, nextProps) + if (showFallback) { + reuseSuspenseHandlerOnStack(); + showFallback = workInProgress.mode; + var progressedPrimaryFragment = workInProgress.child; + didSuspend = { mode: "hidden", children: didSuspend }; + 0 === (showFallback & 1) && null !== progressedPrimaryFragment + ? ((progressedPrimaryFragment.childLanes = 0), + (progressedPrimaryFragment.pendingProps = didSuspend), + workInProgress.mode & 2 && + ((progressedPrimaryFragment.actualDuration = -0), + (progressedPrimaryFragment.actualStartTime = -1.1), + (progressedPrimaryFragment.selfBaseDuration = -0), + (progressedPrimaryFragment.treeBaseDuration = -0))) + : (progressedPrimaryFragment = mountWorkInProgressOffscreenFiber( + didSuspend, + showFallback + )); + nextProps = createFiberFromFragment( + nextProps, + showFallback, + renderLanes, + null + ); + progressedPrimaryFragment.return = workInProgress; + nextProps.return = workInProgress; + progressedPrimaryFragment.sibling = nextProps; + workInProgress.child = progressedPrimaryFragment; + nextProps = workInProgress.child; + nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes); + nextProps.childLanes = getRemainingWorkInPrimaryTree( + current, + JSCompiler_temp, + renderLanes ); + workInProgress.memoizedState = SUSPENDED_MARKER; + return bailoutOffscreenComponent(null, nextProps); + } pushPrimaryTreeSuspenseHandler(workInProgress); - return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren); - } - nextPrimaryChildren = current.memoizedState; - if (null !== nextPrimaryChildren && null !== nextPrimaryChildren.dehydrated) { - if (didSuspend) - workInProgress.flags & 256 - ? (pushPrimaryTreeSuspenseHandler(workInProgress), - (workInProgress.flags &= -257), - (workInProgress = retrySuspenseComponentWithoutHydrating( - current, - workInProgress, - renderLanes - ))) - : null !== workInProgress.memoizedState - ? (reuseSuspenseHandlerOnStack(workInProgress), - (workInProgress.child = current.child), - (workInProgress.flags |= 128), - (workInProgress = null)) - : (reuseSuspenseHandlerOnStack(workInProgress), - (showFallback = nextProps.fallback), - (nextPrimaryChildren = workInProgress.mode), - (nextProps = mountWorkInProgressOffscreenFiber( - { mode: "visible", children: nextProps.children }, - nextPrimaryChildren - )), - (showFallback = createFiberFromFragment( - showFallback, - nextPrimaryChildren, - renderLanes, - null - )), - (showFallback.flags |= 2), - (nextProps.return = workInProgress), - (showFallback.return = workInProgress), - (nextProps.sibling = showFallback), - (workInProgress.child = nextProps), - 0 !== (workInProgress.mode & 1) && - reconcileChildFibers( - workInProgress, - current.child, - null, - renderLanes - ), - (nextProps = workInProgress.child), - (nextProps.memoizedState = - mountSuspenseOffscreenState(renderLanes)), - (nextProps.childLanes = getRemainingWorkInPrimaryTree( - current, - JSCompiler_temp, - renderLanes - )), - (workInProgress.memoizedState = SUSPENDED_MARKER), - (workInProgress = bailoutOffscreenComponent(null, nextProps))); - else if ((pushPrimaryTreeSuspenseHandler(workInProgress), shim$1())) - (JSCompiler_temp = shim$1().digest), - (nextProps = Error( - "The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering." - )), - (nextProps.stack = ""), - (nextProps.digest = JSCompiler_temp), - (JSCompiler_temp = { value: nextProps, source: null, stack: null }), - null === hydrationErrors - ? (hydrationErrors = [JSCompiler_temp]) - : hydrationErrors.push(JSCompiler_temp), - (workInProgress = retrySuspenseComponentWithoutHydrating( - current, - workInProgress, - renderLanes - )); - else if ( - (didReceiveUpdate || - propagateParentContextChanges(current, workInProgress, renderLanes, !1), - (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)), - didReceiveUpdate || JSCompiler_temp) - ) { - JSCompiler_temp = workInProgressRoot; - if ( - null !== JSCompiler_temp && - ((nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes)), - 0 !== nextProps && nextProps !== nextPrimaryChildren.retryLane) - ) - throw ( - ((nextPrimaryChildren.retryLane = nextProps), - enqueueConcurrentRenderForLane(current, nextProps), - scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps), - SelectiveHydrationException) - ); - shim$1() || renderDidSuspendDelayIfPossible(); - workInProgress = retrySuspenseComponentWithoutHydrating( + return mountSuspensePrimaryChildren(workInProgress, didSuspend); + } + progressedPrimaryFragment = current.memoizedState; + if (null !== progressedPrimaryFragment) { + var dehydrated = progressedPrimaryFragment.dehydrated; + if (null !== dehydrated) + return updateDehydratedSuspenseComponent( current, workInProgress, + didSuspend, + JSCompiler_temp, + nextProps, + dehydrated, + progressedPrimaryFragment, renderLanes ); - } else - shim$1() - ? ((workInProgress.flags |= 192), - (workInProgress.child = current.child), - (workInProgress = null)) - : ((workInProgress = mountSuspensePrimaryChildren( - workInProgress, - nextProps.children - )), - (workInProgress.flags |= 4096)); - return workInProgress; } if (showFallback) { - reuseSuspenseHandlerOnStack(workInProgress); + reuseSuspenseHandlerOnStack(); showFallback = nextProps.fallback; - nextPrimaryChildren = workInProgress.mode; - didSuspend = current.child; - var currentFallbackChildFragment = didSuspend.sibling, - primaryChildProps = { mode: "hidden", children: nextProps.children }; - 0 === (nextPrimaryChildren & 1) && workInProgress.child !== didSuspend + didSuspend = workInProgress.mode; + progressedPrimaryFragment = current.child; + dehydrated = progressedPrimaryFragment.sibling; + var primaryChildProps = { mode: "hidden", children: nextProps.children }; + 0 === (didSuspend & 1) && workInProgress.child !== progressedPrimaryFragment ? ((nextProps = workInProgress.child), (nextProps.childLanes = 0), (nextProps.pendingProps = primaryChildProps), workInProgress.mode & 2 && ((nextProps.actualDuration = -0), (nextProps.actualStartTime = -1.1), - (nextProps.selfBaseDuration = didSuspend.selfBaseDuration), - (nextProps.treeBaseDuration = didSuspend.treeBaseDuration)), + (nextProps.selfBaseDuration = + progressedPrimaryFragment.selfBaseDuration), + (nextProps.treeBaseDuration = + progressedPrimaryFragment.treeBaseDuration)), (workInProgress.deletions = null)) - : ((nextProps = createWorkInProgress(didSuspend, primaryChildProps)), - (nextProps.subtreeFlags = didSuspend.subtreeFlags & 65011712)); - null !== currentFallbackChildFragment - ? (showFallback = createWorkInProgress( - currentFallbackChildFragment, - showFallback - )) + : ((nextProps = createWorkInProgress( + progressedPrimaryFragment, + primaryChildProps + )), + (nextProps.subtreeFlags = + progressedPrimaryFragment.subtreeFlags & 1206910976)); + null !== dehydrated + ? (showFallback = createWorkInProgress(dehydrated, showFallback)) : ((showFallback = createFiberFromFragment( showFallback, - nextPrimaryChildren, + didSuspend, renderLanes, null )), @@ -6519,17 +6727,20 @@ function updateSuspenseComponent(current, workInProgress, renderLanes) { showFallback = current.child.memoizedState; null === showFallback ? (showFallback = mountSuspenseOffscreenState(renderLanes)) - : ((nextPrimaryChildren = showFallback.cachePool), - null !== nextPrimaryChildren - ? ((didSuspend = CacheContext._currentValue2), - (nextPrimaryChildren = - nextPrimaryChildren.parent !== didSuspend - ? { parent: didSuspend, pool: didSuspend } - : nextPrimaryChildren)) - : (nextPrimaryChildren = getSuspendedCache()), + : ((didSuspend = showFallback.cachePool), + null !== didSuspend + ? ((progressedPrimaryFragment = CacheContext._currentValue2), + (didSuspend = + didSuspend.parent !== progressedPrimaryFragment + ? { + parent: progressedPrimaryFragment, + pool: progressedPrimaryFragment + } + : didSuspend)) + : (didSuspend = getSuspendedCache()), (showFallback = { baseLanes: showFallback.baseLanes | renderLanes, - cachePool: nextPrimaryChildren + cachePool: didSuspend })); nextProps.memoizedState = showFallback; nextProps.childLanes = getRemainingWorkInPrimaryTree( @@ -6586,52 +6797,201 @@ function retrySuspenseComponentWithoutHydrating( workInProgress.memoizedState = null; return current; } -function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) { - fiber.lanes |= renderLanes; - var alternate = fiber.alternate; - null !== alternate && (alternate.lanes |= renderLanes); - scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot); -} -function initSuspenseListRenderState( +function updateDehydratedSuspenseComponent( + current, workInProgress, - isBackwards, - tail, - lastContentRow, - tailMode, - treeForkCount + didSuspend, + didPrimaryChildrenDefer, + nextProps, + suspenseInstance, + suspenseState, + renderLanes ) { - var renderState = workInProgress.memoizedState; - null === renderState - ? (workInProgress.memoizedState = { - isBackwards: isBackwards, - rendering: null, - renderingStartTime: 0, - last: lastContentRow, - tail: tail, - tailMode: tailMode, - treeForkCount: treeForkCount - }) - : ((renderState.isBackwards = isBackwards), - (renderState.rendering = null), - (renderState.renderingStartTime = 0), - (renderState.last = lastContentRow), - (renderState.tail = tail), - (renderState.tailMode = tailMode), - (renderState.treeForkCount = treeForkCount)); + if (didSuspend) { + if (workInProgress.flags & 256) + return ( + pushPrimaryTreeSuspenseHandler(workInProgress), + (workInProgress.flags &= -257), + retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ) + ); + if (null !== workInProgress.memoizedState) + return ( + reuseSuspenseHandlerOnStack(), + (workInProgress.child = current.child), + (workInProgress.flags |= 128), + null + ); + reuseSuspenseHandlerOnStack(); + suspenseState = nextProps.fallback; + didSuspend = workInProgress.mode; + nextProps = mountWorkInProgressOffscreenFiber( + { mode: "visible", children: nextProps.children }, + didSuspend + ); + suspenseState = createFiberFromFragment( + suspenseState, + didSuspend, + renderLanes, + null + ); + suspenseState.flags |= 2; + nextProps.return = workInProgress; + suspenseState.return = workInProgress; + nextProps.sibling = suspenseState; + workInProgress.child = nextProps; + 0 !== (workInProgress.mode & 1) && + reconcileChildFibers(workInProgress, current.child, null, renderLanes); + nextProps = workInProgress.child; + nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes); + nextProps.childLanes = getRemainingWorkInPrimaryTree( + current, + didPrimaryChildrenDefer, + renderLanes + ); + workInProgress.memoizedState = SUSPENDED_MARKER; + return bailoutOffscreenComponent(null, nextProps); + } + pushPrimaryTreeSuspenseHandler(workInProgress); + if (shim$1()) + return ( + (didPrimaryChildrenDefer = shim$1().digest), + "" !== didPrimaryChildrenDefer && + ((nextProps = Error( + "The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering." + )), + (nextProps.stack = ""), + (nextProps.digest = didPrimaryChildrenDefer), + (didPrimaryChildrenDefer = { + value: nextProps, + source: null, + stack: null + }), + null === hydrationErrors + ? (hydrationErrors = [didPrimaryChildrenDefer]) + : hydrationErrors.push(didPrimaryChildrenDefer)), + retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ) + ); + didReceiveUpdate || + propagateParentContextChanges(current, workInProgress, renderLanes, !1); + didPrimaryChildrenDefer = 0 !== (renderLanes & current.childLanes); + if (didReceiveUpdate || didPrimaryChildrenDefer) { + if (null !== currentTreeHiddenStackCursor.current) + return retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ); + didPrimaryChildrenDefer = workInProgressRoot; + if ( + null !== didPrimaryChildrenDefer && + ((nextProps = getBumpedLaneForHydration( + didPrimaryChildrenDefer, + renderLanes + )), + 0 !== nextProps && nextProps !== suspenseState.retryLane) + ) + throw ( + ((suspenseState.retryLane = nextProps), + enqueueConcurrentRenderForLane(current, nextProps), + scheduleUpdateOnFiber(didPrimaryChildrenDefer, current, nextProps), + SelectiveHydrationException) + ); + shim$1() || renderDidSuspendDelayIfPossible(); + return retrySuspenseComponentWithoutHydrating( + current, + workInProgress, + renderLanes + ); + } + if (shim$1()) + return ( + (workInProgress.flags |= 192), + (workInProgress.child = current.child), + null + ); + current = mountSuspensePrimaryChildren(workInProgress, nextProps.children); + current.flags |= 134221824; + return current; +} +function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) { + fiber.lanes |= renderLanes; + var alternate = fiber.alternate; + null !== alternate && (alternate.lanes |= renderLanes); + scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot); +} +function findLastContentRow(firstChild) { + for (var lastContentRow = null; null !== firstChild; ) { + var currentRow = firstChild.alternate; + null !== currentRow && + null === findFirstSuspended(currentRow) && + (lastContentRow = firstChild); + firstChild = firstChild.sibling; + } + return lastContentRow; +} +function initSuspenseListRenderState( + workInProgress, + isBackwards, + tail, + lastContentRow, + tailMode, + treeForkCount +) { + var renderState = workInProgress.memoizedState; + null === renderState + ? (workInProgress.memoizedState = { + isBackwards: isBackwards, + rendering: null, + renderingStartTime: 0, + last: lastContentRow, + tail: tail, + tailMode: tailMode, + treeForkCount: treeForkCount + }) + : ((renderState.isBackwards = isBackwards), + (renderState.rendering = null), + (renderState.renderingStartTime = 0), + (renderState.last = lastContentRow), + (renderState.tail = tail), + (renderState.tailMode = tailMode), + (renderState.treeForkCount = treeForkCount)); +} +function reverseChildren(fiber) { + var row = fiber.child; + for (fiber.child = null; null !== row; ) { + var nextRow = row.sibling; + row.sibling = fiber.child; + fiber.child = row; + row = nextRow; + } } function updateSuspenseListComponent(current, workInProgress, renderLanes) { var nextProps = workInProgress.pendingProps, revealOrder = nextProps.revealOrder, tailMode = nextProps.tail; nextProps = nextProps.children; - var suspenseContext = suspenseStackCursor.current, - shouldForceFallback = 0 !== (suspenseContext & 2); + var suspenseContext = suspenseStackCursor.current; + if (workInProgress.flags & 128) + return pushSuspenseListContext(workInProgress, suspenseContext), null; + var shouldForceFallback = 0 !== (suspenseContext & 2); shouldForceFallback ? ((suspenseContext = (suspenseContext & 1) | 2), (workInProgress.flags |= 128)) : (suspenseContext &= 1); - push(suspenseStackCursor, suspenseContext); - reconcileChildren(current, workInProgress, nextProps, renderLanes); + pushSuspenseListContext(workInProgress, suspenseContext); + "backwards" === revealOrder && null !== current + ? (reverseChildren(current), + reconcileChildren(current, workInProgress, nextProps, renderLanes), + reverseChildren(current)) + : reconcileChildren(current, workInProgress, nextProps, renderLanes); if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128)) a: for (current = workInProgress.child; null !== current; ) { if (13 === current.tag) @@ -6656,29 +7016,23 @@ function updateSuspenseListComponent(current, workInProgress, renderLanes) { if (0 === (workInProgress.mode & 1)) workInProgress.memoizedState = null; else switch (revealOrder) { - case "forwards": - renderLanes = workInProgress.child; - for (revealOrder = null; null !== renderLanes; ) - (current = renderLanes.alternate), - null !== current && - null === findFirstSuspended(current) && - (revealOrder = renderLanes), - (renderLanes = renderLanes.sibling); - renderLanes = revealOrder; + case "backwards": + renderLanes = findLastContentRow(workInProgress.child); null === renderLanes ? ((revealOrder = workInProgress.child), (workInProgress.child = null)) - : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null)); + : ((revealOrder = renderLanes.sibling), + (renderLanes.sibling = null), + reverseChildren(workInProgress)); initSuspenseListRenderState( workInProgress, - !1, + !0, revealOrder, - renderLanes, + null, tailMode, 0 ); break; - case "backwards": case "unstable_legacy-backwards": renderLanes = null; revealOrder = workInProgress.child; @@ -6705,11 +7059,33 @@ function updateSuspenseListComponent(current, workInProgress, renderLanes) { case "together": initSuspenseListRenderState(workInProgress, !1, null, null, void 0, 0); break; - default: + case "independent": workInProgress.memoizedState = null; + break; + default: + (renderLanes = findLastContentRow(workInProgress.child)), + null === renderLanes + ? ((revealOrder = workInProgress.child), + (workInProgress.child = null)) + : ((revealOrder = renderLanes.sibling), + (renderLanes.sibling = null)), + initSuspenseListRenderState( + workInProgress, + !1, + revealOrder, + renderLanes, + tailMode, + 0 + ); } return workInProgress.child; } +function updateContextProvider(current, workInProgress, renderLanes) { + var newProps = workInProgress.pendingProps; + pushProvider(workInProgress, workInProgress.type, newProps.value); + reconcileChildren(current, workInProgress, newProps.children, renderLanes); + return workInProgress.child; +} function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) { 0 === (workInProgress.mode & 1) && null !== current && @@ -6803,7 +7179,14 @@ function attemptEarlyBailoutIfNoScheduledUpdate( (workInProgress.flags |= 128), null ); - if (0 !== (renderLanes & workInProgress.child.childLanes)) + stateNode = propagateParentContextChanges( + current, + workInProgress, + renderLanes, + !1 + ); + var primaryChildLanes = workInProgress.child.childLanes; + if (stateNode || 0 !== (renderLanes & primaryChildLanes)) return updateSuspenseComponent(current, workInProgress, renderLanes); pushPrimaryTreeSuspenseHandler(workInProgress); current = bailoutOnAlreadyFinishedWork( @@ -6816,7 +7199,13 @@ function attemptEarlyBailoutIfNoScheduledUpdate( pushPrimaryTreeSuspenseHandler(workInProgress); break; case 19: - var didSuspendBefore = 0 !== (current.flags & 128); + if (workInProgress.flags & 128) + return updateSuspenseListComponent( + current, + workInProgress, + renderLanes + ); + primaryChildLanes = 0 !== (current.flags & 128); stateNode = 0 !== (renderLanes & workInProgress.childLanes); stateNode || (propagateParentContextChanges( @@ -6826,7 +7215,7 @@ function attemptEarlyBailoutIfNoScheduledUpdate( !1 ), (stateNode = 0 !== (renderLanes & workInProgress.childLanes))); - if (didSuspendBefore) { + if (primaryChildLanes) { if (stateNode) return updateSuspenseListComponent( current, @@ -6835,12 +7224,12 @@ function attemptEarlyBailoutIfNoScheduledUpdate( ); workInProgress.flags |= 128; } - didSuspendBefore = workInProgress.memoizedState; - null !== didSuspendBefore && - ((didSuspendBefore.rendering = null), - (didSuspendBefore.tail = null), - (didSuspendBefore.lastEffect = null)); - push(suspenseStackCursor, suspenseStackCursor.current); + primaryChildLanes = workInProgress.memoizedState; + null !== primaryChildLanes && + ((primaryChildLanes.rendering = null), + (primaryChildLanes.tail = null), + (primaryChildLanes.lastEffect = null)); + pushSuspenseListContext(workInProgress, suspenseStackCursor.current); if (stateNode) break; else return null; case 22: @@ -6930,6 +7319,15 @@ function beginWork(current, workInProgress, renderLanes) { renderLanes ); break a; + } else if ($$typeof === REACT_CONTEXT_TYPE) { + workInProgress.tag = 10; + workInProgress.type = elementType; + workInProgress = updateContextProvider( + null, + workInProgress, + renderLanes + ); + break a; } } workInProgress = getComponentNameFromType(elementType) || elementType; @@ -7049,12 +7447,9 @@ function beginWork(current, workInProgress, renderLanes) { ); case 7: return ( - reconcileChildren( - current, - workInProgress, - workInProgress.pendingProps, - renderLanes - ), + (elementType = workInProgress.pendingProps), + markRef(current, workInProgress), + reconcileChildren(current, workInProgress, elementType, renderLanes), workInProgress.child ); case 8: @@ -7083,17 +7478,7 @@ function beginWork(current, workInProgress, renderLanes) { workInProgress.child ); case 10: - return ( - (elementType = workInProgress.pendingProps), - pushProvider(workInProgress, workInProgress.type, elementType.value), - reconcileChildren( - current, - workInProgress, - elementType.children, - renderLanes - ), - workInProgress.child - ); + return updateContextProvider(current, workInProgress, renderLanes); case 9: return ( ($$typeof = workInProgress.type._context), @@ -7199,19 +7584,21 @@ function beginWork(current, workInProgress, renderLanes) { ); nextProps = 0 !== (renderLanes & current.childLanes); if (didReceiveUpdate || nextProps) { - $$typeof = workInProgressRoot; - if ( - null !== $$typeof && - ((nextProps = getBumpedLaneForHydration($$typeof, renderLanes)), - 0 !== nextProps && nextProps !== elementType.retryLane) - ) - throw ( - ((elementType.retryLane = nextProps), - enqueueConcurrentRenderForLane(current, nextProps), - scheduleUpdateOnFiber($$typeof, current, nextProps), - SelectiveHydrationException) - ); - renderDidSuspendDelayIfPossible(); + if (null === currentTreeHiddenStackCursor.current) { + $$typeof = workInProgressRoot; + if ( + null !== $$typeof && + ((nextProps = getBumpedLaneForHydration($$typeof, renderLanes)), + 0 !== nextProps && nextProps !== elementType.retryLane) + ) + throw ( + ((elementType.retryLane = nextProps), + enqueueConcurrentRenderForLane(current, nextProps), + scheduleUpdateOnFiber($$typeof, current, nextProps), + SelectiveHydrationException) + ); + renderDidSuspendDelayIfPossible(); + } workInProgress = retryActivityComponentWithoutHydrating( current, workInProgress, @@ -7219,7 +7606,7 @@ function beginWork(current, workInProgress, renderLanes) { ); } else (workInProgress = mountActivityChildren(workInProgress, $$typeof)), - (workInProgress.flags |= 4096); + (workInProgress.flags |= 134221824); } else (renderLanes = createWorkInProgress(current.child, { @@ -7288,6 +7675,30 @@ function beginWork(current, workInProgress, renderLanes) { ), workInProgress.child ); + case 30: + return ( + null === workInProgress.stateNode && + (workInProgress.stateNode = { + autoName: null, + paired: null, + clones: null, + ref: null + }), + (elementType = workInProgress.pendingProps), + null != elementType.name && + "auto" !== elementType.name && + (workInProgress.flags |= null === current ? 18882560 : 18874368), + null !== current && current.memoizedProps.name !== elementType.name + ? (workInProgress.flags |= 4194816) + : markRef(current, workInProgress), + reconcileChildren( + current, + workInProgress, + elementType.children, + renderLanes + ), + workInProgress.child + ); case 29: throw workInProgress.pendingProps; } @@ -7408,26 +7819,29 @@ function scheduleRetryEffect(workInProgress, retryQueue) { } function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { switch (renderState.tailMode) { - case "hidden": - hasRenderedATailFallback = renderState.tail; - for (var lastTailNode = null; null !== hasRenderedATailFallback; ) - null !== hasRenderedATailFallback.alternate && - (lastTailNode = hasRenderedATailFallback), - (hasRenderedATailFallback = hasRenderedATailFallback.sibling); - null === lastTailNode - ? (renderState.tail = null) - : (lastTailNode.sibling = null); + case "visible": break; case "collapsed": - lastTailNode = renderState.tail; - for (var lastTailNode$92 = null; null !== lastTailNode; ) - null !== lastTailNode.alternate && (lastTailNode$92 = lastTailNode), - (lastTailNode = lastTailNode.sibling); - null === lastTailNode$92 + for ( + var tailNode = renderState.tail, lastTailNode = null; + null !== tailNode; + + ) + null !== tailNode.alternate && (lastTailNode = tailNode), + (tailNode = tailNode.sibling); + null === lastTailNode ? hasRenderedATailFallback || null === renderState.tail ? (renderState.tail = null) : (renderState.tail.sibling = null) - : (lastTailNode$92.sibling = null); + : (lastTailNode.sibling = null); + break; + default: + hasRenderedATailFallback = renderState.tail; + for (tailNode = null; null !== hasRenderedATailFallback; ) + null !== hasRenderedATailFallback.alternate && + (tailNode = hasRenderedATailFallback), + (hasRenderedATailFallback = hasRenderedATailFallback.sibling); + null === tailNode ? (renderState.tail = null) : (tailNode.sibling = null); } } function bubbleProperties(completedWork) { @@ -7439,53 +7853,53 @@ function bubbleProperties(completedWork) { if (didBailout) if (0 !== (completedWork.mode & 2)) { for ( - var treeBaseDuration$94 = completedWork.selfBaseDuration, - child$95 = completedWork.child; - null !== child$95; + var treeBaseDuration$98 = completedWork.selfBaseDuration, + child$99 = completedWork.child; + null !== child$99; ) - (newChildLanes |= child$95.lanes | child$95.childLanes), - (subtreeFlags |= child$95.subtreeFlags & 65011712), - (subtreeFlags |= child$95.flags & 65011712), - (treeBaseDuration$94 += child$95.treeBaseDuration), - (child$95 = child$95.sibling); - completedWork.treeBaseDuration = treeBaseDuration$94; + (newChildLanes |= child$99.lanes | child$99.childLanes), + (subtreeFlags |= child$99.subtreeFlags & 1206910976), + (subtreeFlags |= child$99.flags & 1206910976), + (treeBaseDuration$98 += child$99.treeBaseDuration), + (child$99 = child$99.sibling); + completedWork.treeBaseDuration = treeBaseDuration$98; } else for ( - treeBaseDuration$94 = completedWork.child; - null !== treeBaseDuration$94; + treeBaseDuration$98 = completedWork.child; + null !== treeBaseDuration$98; ) (newChildLanes |= - treeBaseDuration$94.lanes | treeBaseDuration$94.childLanes), - (subtreeFlags |= treeBaseDuration$94.subtreeFlags & 65011712), - (subtreeFlags |= treeBaseDuration$94.flags & 65011712), - (treeBaseDuration$94.return = completedWork), - (treeBaseDuration$94 = treeBaseDuration$94.sibling); + treeBaseDuration$98.lanes | treeBaseDuration$98.childLanes), + (subtreeFlags |= treeBaseDuration$98.subtreeFlags & 1206910976), + (subtreeFlags |= treeBaseDuration$98.flags & 1206910976), + (treeBaseDuration$98.return = completedWork), + (treeBaseDuration$98 = treeBaseDuration$98.sibling); else if (0 !== (completedWork.mode & 2)) { - treeBaseDuration$94 = completedWork.actualDuration; - child$95 = completedWork.selfBaseDuration; + treeBaseDuration$98 = completedWork.actualDuration; + child$99 = completedWork.selfBaseDuration; for (var child = completedWork.child; null !== child; ) (newChildLanes |= child.lanes | child.childLanes), (subtreeFlags |= child.subtreeFlags), (subtreeFlags |= child.flags), - (treeBaseDuration$94 += child.actualDuration), - (child$95 += child.treeBaseDuration), + (treeBaseDuration$98 += child.actualDuration), + (child$99 += child.treeBaseDuration), (child = child.sibling); - completedWork.actualDuration = treeBaseDuration$94; - completedWork.treeBaseDuration = child$95; + completedWork.actualDuration = treeBaseDuration$98; + completedWork.treeBaseDuration = child$99; } else for ( - treeBaseDuration$94 = completedWork.child; - null !== treeBaseDuration$94; + treeBaseDuration$98 = completedWork.child; + null !== treeBaseDuration$98; ) (newChildLanes |= - treeBaseDuration$94.lanes | treeBaseDuration$94.childLanes), - (subtreeFlags |= treeBaseDuration$94.subtreeFlags), - (subtreeFlags |= treeBaseDuration$94.flags), - (treeBaseDuration$94.return = completedWork), - (treeBaseDuration$94 = treeBaseDuration$94.sibling); + treeBaseDuration$98.lanes | treeBaseDuration$98.childLanes), + (subtreeFlags |= treeBaseDuration$98.subtreeFlags), + (subtreeFlags |= treeBaseDuration$98.flags), + (treeBaseDuration$98.return = completedWork), + (treeBaseDuration$98 = treeBaseDuration$98.sibling); completedWork.subtreeFlags |= subtreeFlags; completedWork.childLanes = newChildLanes; return didBailout; @@ -7541,7 +7955,7 @@ function completeWork(current, workInProgress, renderLanes) { type !== newProps) ) { b: { - type = ReactNativePrivateInterface.diffAttributePayloads( + type = reactPrivateInterface.diffAttributePayloads( type, newProps, renderLanes.canonical.viewConfig.validAttributes @@ -7574,13 +7988,13 @@ function completeWork(current, workInProgress, renderLanes) { "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); bubbleProperties(workInProgress); + workInProgress.subtreeFlags &= -33554433; return null; } current = rootInstanceStackCursor.current; - renderLanes = nextReactTag; - nextReactTag += 2; + renderLanes = allocateTag(); type = getViewConfigForType(type); - var updatePayload = ReactNativePrivateInterface.createAttributePayload( + var updatePayload = reactPrivateInterface.createAttributePayload( newProps, type.validAttributes ); @@ -7606,6 +8020,7 @@ function completeWork(current, workInProgress, renderLanes) { workInProgress.stateNode = current; } bubbleProperties(workInProgress); + workInProgress.subtreeFlags &= -33554433; workInProgress.flags &= -16777217; return null; case 6: @@ -7756,6 +8171,7 @@ function completeWork(current, workInProgress, renderLanes) { return ( popHostContainer(), updateHostContainer(current, workInProgress), + (workInProgress.flags |= 67108864), bubbleProperties(workInProgress), null ); @@ -7766,13 +8182,13 @@ function completeWork(current, workInProgress, renderLanes) { case 17: return bubbleProperties(workInProgress), null; case 19: - pop(suspenseStackCursor); - type = workInProgress.memoizedState; - if (null === type) return bubbleProperties(workInProgress), null; - newProps = 0 !== (workInProgress.flags & 128); - updatePayload = type.rendering; + popSuspenseListContext(workInProgress); + newProps = workInProgress.memoizedState; + if (null === newProps) return bubbleProperties(workInProgress), null; + type = 0 !== (workInProgress.flags & 128); + updatePayload = newProps.rendering; if (null === updatePayload) - if (newProps) cutOffTailIfNeeded(type, !1); + if (type) cutOffTailIfNeeded(newProps, !1); else { if ( 0 !== workInProgressRootExitStatus || @@ -7782,7 +8198,7 @@ function completeWork(current, workInProgress, renderLanes) { updatePayload = findFirstSuspended(current); if (null !== updatePayload) { workInProgress.flags |= 128; - cutOffTailIfNeeded(type, !1); + cutOffTailIfNeeded(newProps, !1); current = updatePayload.updateQueue; workInProgress.updateQueue = current; scheduleRetryEffect(workInProgress, current); @@ -7791,66 +8207,84 @@ function completeWork(current, workInProgress, renderLanes) { for (renderLanes = workInProgress.child; null !== renderLanes; ) resetWorkInProgress(renderLanes, current), (renderLanes = renderLanes.sibling); - push( - suspenseStackCursor, + pushSuspenseListContext( + workInProgress, (suspenseStackCursor.current & 1) | 2 ); return workInProgress.child; } current = current.sibling; } - null !== type.tail && + null !== newProps.tail && now$1() > workInProgressRootRenderTargetTime && ((workInProgress.flags |= 128), - (newProps = !0), - cutOffTailIfNeeded(type, !1), + (type = !0), + cutOffTailIfNeeded(newProps, !1), (workInProgress.lanes = 4194304)); } else { - if (!newProps) + if (!type) if ( ((current = findFirstSuspended(updatePayload)), null !== current) ) { if ( ((workInProgress.flags |= 128), - (newProps = !0), + (type = !0), (current = current.updateQueue), (workInProgress.updateQueue = current), scheduleRetryEffect(workInProgress, current), - cutOffTailIfNeeded(type, !0), - null === type.tail && - "hidden" === type.tailMode && + cutOffTailIfNeeded(newProps, !0), + null === newProps.tail && + "collapsed" !== newProps.tailMode && + "visible" !== newProps.tailMode && !updatePayload.alternate) ) return bubbleProperties(workInProgress), null; } else - 2 * now$1() - type.renderingStartTime > + 2 * now$1() - newProps.renderingStartTime > workInProgressRootRenderTargetTime && 536870912 !== renderLanes && ((workInProgress.flags |= 128), - (newProps = !0), - cutOffTailIfNeeded(type, !1), + (type = !0), + cutOffTailIfNeeded(newProps, !1), (workInProgress.lanes = 4194304)); - type.isBackwards + newProps.isBackwards ? ((updatePayload.sibling = workInProgress.child), (workInProgress.child = updatePayload)) - : ((current = type.last), + : ((current = newProps.last), null !== current ? (current.sibling = updatePayload) : (workInProgress.child = updatePayload), - (type.last = updatePayload)); + (newProps.last = updatePayload)); + } + if (null !== newProps.tail) { + current = newProps.tail; + a: { + for (renderLanes = current; null !== renderLanes; ) { + if (null !== renderLanes.alternate) { + renderLanes = !1; + break a; + } + renderLanes = renderLanes.sibling; + } + renderLanes = !0; + } + newProps.rendering = current; + newProps.tail = current.sibling; + newProps.renderingStartTime = now$1(); + current.sibling = null; + updatePayload = suspenseStackCursor.current; + updatePayload = type ? (updatePayload & 1) | 2 : updatePayload & 1; + "visible" !== newProps.tailMode && + "collapsed" !== newProps.tailMode && + renderLanes + ? ((renderLanes = updatePayload), + push(suspenseHandlerStackCursor, workInProgress), + push(suspenseStackCursor, renderLanes), + null === shellBoundary && (shellBoundary = workInProgress)) + : pushSuspenseListContext(workInProgress, updatePayload); + return current; } - if (null !== type.tail) - return ( - (workInProgress = type.tail), - (type.rendering = workInProgress), - (type.tail = workInProgress.sibling), - (type.renderingStartTime = now$1()), - (workInProgress.sibling = null), - (current = suspenseStackCursor.current), - push(suspenseStackCursor, newProps ? (current & 1) | 2 : current & 1), - workInProgress - ); bubbleProperties(workInProgress); return null; case 22: @@ -7898,7 +8332,11 @@ function completeWork(current, workInProgress, renderLanes) { case 25: return null; case 30: - return null; + return ( + (workInProgress.flags |= 33554432), + bubbleProperties(workInProgress), + null + ); case 29: return null; } @@ -7967,7 +8405,18 @@ function unwindWork(current, workInProgress) { workInProgress) : null; case 19: - return pop(suspenseStackCursor), null; + return ( + popSuspenseListContext(workInProgress), + (current = workInProgress.flags), + current & 65536 + ? ((workInProgress.flags = (current & -65537) | 128), + (current = workInProgress.memoizedState), + null !== current && + ((current.rendering = null), (current.tail = null)), + (workInProgress.flags |= 4), + workInProgress) + : null + ); case 4: return popHostContainer(), null; case 10: @@ -8016,7 +8465,7 @@ function unwindInterruptedWork(current, interruptedWork) { popSuspenseHandler(interruptedWork); break; case 19: - pop(suspenseStackCursor); + popSuspenseListContext(interruptedWork); break; case 10: popProvider(interruptedWork.type); @@ -8178,8 +8627,8 @@ function safelyCallComponentWillUnmount( } else try { instance.componentWillUnmount(); - } catch (error$128) { - captureCommitPhaseError(current, nearestMountedAncestor, error$128); + } catch (error$133) { + captureCommitPhaseError(current, nearestMountedAncestor, error$133); } } function safelyAttachRef(current, nearestMountedAncestor) { @@ -8193,6 +8642,25 @@ function safelyAttachRef(current, nearestMountedAncestor) { var instanceToUse = getPublicInstance(current.stateNode); break; case 30: + var instance = current.stateNode, + name = getViewTransitionName(current.memoizedProps, instance); + if (null === instance.ref || instance.ref.name !== name) + instance.ref = createViewTransitionInstance(name); + instanceToUse = instance.ref; + break; + case 7: + if (null === current.stateNode) { + var fragmentInstance = new FragmentInstance(current); + traverseVisibleInstancesAndTextInstances( + current.child, + !1, + addFragmentHandleToFiber, + fragmentInstance, + void 0, + void 0 + ); + current.stateNode = fragmentInstance; + } instanceToUse = current.stateNode; break; default: @@ -8241,8 +8709,8 @@ function safelyDetachRef(current, nearestMountedAncestor) { recordEffectDuration(current); } else ref(null); - } catch (error$129) { - captureCommitPhaseError(current, nearestMountedAncestor, error$129); + } catch (error$135) { + captureCommitPhaseError(current, nearestMountedAncestor, error$135); } else ref.current = null; } @@ -8274,6 +8742,40 @@ function commitProfilerUpdate( captureCommitPhaseError(finishedWork, finishedWork.return, error); } } +var viewTransitionMutationContext = !1; +function pushMutationContext() { + var prev = viewTransitionMutationContext; + viewTransitionMutationContext = !1; + return prev; +} +function commitFragmentInstanceInsertionEffects(fiber) { + for (var parent = fiber.return; null !== parent; ) { + isFragmentInstanceParent(parent) && + commitNewChildToFragmentInstance(fiber.stateNode, parent.stateNode); + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } +} +function commitFragmentInstanceDeletionEffects(fiber) { + for (var parent = fiber.return; null !== parent; ) { + if (isFragmentInstanceParent(parent)) { + var fragmentInstance = parent.stateNode; + var childInstance = fiber.stateNode; + null != childInstance.canonical && + ((childInstance = getPublicInstance(childInstance)), + null != childInstance.reactFragments && + childInstance.reactFragments.delete(fragmentInstance)); + } + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } +} +function isFragmentInstanceHostBoundary(fiber) { + return 5 === fiber.tag || 3 === fiber.tag || !1; +} +function isFragmentInstanceParent(fiber) { + return fiber && 7 === fiber.tag && null !== fiber.stateNode; +} function commitHostMount(finishedWork) { try { throw Error( @@ -8283,6 +8785,42 @@ function commitHostMount(finishedWork) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } +function commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances +) { + if (5 === finishedWork.tag) { + if ( + (5 === finishedWork.tag || + 27 === finishedWork.tag || + 6 === finishedWork.tag) && + null === finishedWork.alternate && + null !== parentFragmentInstances + ) + for (var i = 0; i < parentFragmentInstances.length; i++) + commitNewChildToFragmentInstance( + finishedWork.stateNode, + parentFragmentInstances[i] + ); + } else if ( + 4 !== finishedWork.tag && + ((finishedWork = finishedWork.child), null !== finishedWork) + ) + for ( + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ), + finishedWork = finishedWork.sibling; + null !== finishedWork; + + ) + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ), + (finishedWork = finishedWork.sibling); +} function commitHostPortalContainerChildren( portal, finishedWork, @@ -8295,12 +8833,200 @@ function commitHostPortalContainerChildren( captureCommitPhaseError(finishedWork, finishedWork.return, error); } } +var shouldStartViewTransition = !1, + appearingViewTransitions = null; +function trackEnterViewTransitions(placement) { + if (30 === placement.tag || 0 !== (placement.subtreeFlags & 33554432)) + shouldStartViewTransition = !0; +} +var viewTransitionCancelableChildren = null; +function pushViewTransitionCancelableScope() { + var prevChildren = viewTransitionCancelableChildren; + viewTransitionCancelableChildren = null; + return prevChildren; +} +var viewTransitionHostInstanceIdx = 0; +function applyViewTransitionToHostInstances() { + viewTransitionHostInstanceIdx = 0; + return !1; +} +function commitAppearingPairViewTransitions(placement) { + if (0 !== (placement.subtreeFlags & 18874368)) + for (placement = placement.child; null !== placement; ) { + if (22 !== placement.tag || null === placement.memoizedState) + if ( + (commitAppearingPairViewTransitions(placement), + 30 === placement.tag && + 0 !== (placement.flags & 18874368) && + placement.stateNode.paired) + ) { + var props = placement.memoizedProps; + if (null == props.name || "auto" === props.name) + throw Error( + "Found a pair with an auto name. This is a bug in React." + ); + "none" !== getViewTransitionClassName(props.default, props.share) && + applyViewTransitionToHostInstances(); + } + placement = placement.sibling; + } +} +function commitEnterViewTransitions(placement, gesture) { + if (30 === placement.tag) { + var state = placement.stateNode, + props = placement.memoizedProps; + getViewTransitionName(props, state); + "none" !== + getViewTransitionClassName( + props.default, + state.paired ? props.share : props.enter + ) + ? applyViewTransitionToHostInstances() && + (commitAppearingPairViewTransitions(placement), + state.paired || + gesture || + scheduleViewTransitionEvent(placement, props.onEnter)) + : commitAppearingPairViewTransitions(placement); + } else if (0 !== (placement.subtreeFlags & 33554432)) + for (placement = placement.child; null !== placement; ) + commitEnterViewTransitions(placement, gesture), + (placement = placement.sibling); + else commitAppearingPairViewTransitions(placement); +} +function commitDeletedPairViewTransitions(deletion) { + if ( + null !== appearingViewTransitions && + 0 !== appearingViewTransitions.size + ) { + var pairs = appearingViewTransitions; + if (0 !== (deletion.subtreeFlags & 18874368)) + for (deletion = deletion.child; null !== deletion; ) { + if (22 !== deletion.tag || null === deletion.memoizedState) { + if (30 === deletion.tag && 0 !== (deletion.flags & 18874368)) { + var props = deletion.memoizedProps, + name = props.name; + if (null != name && "auto" !== name) { + var pair = pairs.get(name); + if (void 0 !== pair) { + if ( + "none" !== + getViewTransitionClassName(props.default, props.share) && + applyViewTransitionToHostInstances() + ) { + var oldInstance = deletion.stateNode; + pair.paired = oldInstance; + oldInstance.paired = pair; + scheduleViewTransitionEvent(deletion, props.onShare); + } + pairs.delete(name); + if (0 === pairs.size) break; + } + } + } + commitDeletedPairViewTransitions(deletion); + } + deletion = deletion.sibling; + } + } +} +function commitExitViewTransitions(deletion) { + if (30 === deletion.tag) { + var props = deletion.memoizedProps, + name = getViewTransitionName(props, deletion.stateNode), + pair = + null !== appearingViewTransitions + ? appearingViewTransitions.get(name) + : void 0; + if ( + "none" !== + getViewTransitionClassName( + props.default, + void 0 !== pair ? props.share : props.exit + ) && + applyViewTransitionToHostInstances() + ) + if (void 0 !== pair) { + var oldInstance = deletion.stateNode; + pair.paired = oldInstance; + oldInstance.paired = pair; + appearingViewTransitions.delete(name); + scheduleViewTransitionEvent(deletion, props.onShare); + } else scheduleViewTransitionEvent(deletion, props.onExit); + null !== appearingViewTransitions && + commitDeletedPairViewTransitions(deletion); + } else if (0 !== (deletion.subtreeFlags & 33554432)) + for (deletion = deletion.child; null !== deletion; ) + commitExitViewTransitions(deletion), (deletion = deletion.sibling); + else + null !== appearingViewTransitions && + commitDeletedPairViewTransitions(deletion); +} +function commitNestedViewTransitions(changedParent) { + for (changedParent = changedParent.child; null !== changedParent; ) { + if (30 === changedParent.tag) { + var props = changedParent.memoizedProps, + name = getViewTransitionName(props, changedParent.stateNode); + props = getViewTransitionClassName(props.default, props.update); + changedParent.flags &= -5; + "none" !== props && + applyViewTransitionToHostInstances( + changedParent, + name, + props, + (changedParent.memoizedState = []) + ); + } else + 0 !== (changedParent.subtreeFlags & 33554432) && + commitNestedViewTransitions(changedParent); + changedParent = changedParent.sibling; + } +} +function restorePairedViewTransitions(parent) { + if (0 !== (parent.subtreeFlags & 18874368)) + for (parent = parent.child; null !== parent; ) { + if (22 !== parent.tag || null === parent.memoizedState) { + if (30 === parent.tag && 0 !== (parent.flags & 18874368)) { + var instance = parent.stateNode; + null !== instance.paired && (instance.paired = null); + } + restorePairedViewTransitions(parent); + } + parent = parent.sibling; + } +} +function restoreEnterOrExitViewTransitions(fiber) { + if (30 === fiber.tag) + (fiber.stateNode.paired = null), restorePairedViewTransitions(fiber); + else if (0 !== (fiber.subtreeFlags & 33554432)) + for (fiber = fiber.child; null !== fiber; ) + restoreEnterOrExitViewTransitions(fiber), (fiber = fiber.sibling); + else restorePairedViewTransitions(fiber); +} +function measureNestedViewTransitions(changedParent, gesture) { + for (changedParent = changedParent.child; null !== changedParent; ) { + if (30 === changedParent.tag) { + var props = changedParent.memoizedProps, + state = changedParent.stateNode; + getViewTransitionName(props, state); + getViewTransitionClassName(props.default, props.update); + gesture + ? ((props = state.clones), + null !== props && props.map(measureClonedInstance)) + : (changedParent.memoizedState = null); + viewTransitionHostInstanceIdx = 0; + } else + 0 !== (changedParent.subtreeFlags & 33554432) && + measureNestedViewTransitions(changedParent, gesture); + changedParent = changedParent.sibling; + } +} var offscreenSubtreeIsHidden = !1, offscreenSubtreeWasHidden = !1, PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, nextEffect = null, inProgressLanes = null, - inProgressRoot = null; + inProgressRoot = null, + viewTransitionContextChanged = !1; function isHydratingParent(current, finishedWork) { return 31 === finishedWork.tag ? ((finishedWork = finishedWork.memoizedState), @@ -8315,80 +9041,121 @@ function isHydratingParent(current, finishedWork) { ? current.memoizedState.isDehydrated && 0 === (finishedWork.flags & 256) : !1; } -function commitBeforeMutationEffects(root, firstChild) { - for (nextEffect = firstChild; null !== nextEffect; ) - if ( - ((root = nextEffect), - (firstChild = root.child), - 0 !== (root.subtreeFlags & 1028) && null !== firstChild) - ) - (firstChild.return = root), (nextEffect = firstChild); - else - for (; null !== nextEffect; ) { - root = nextEffect; - var current = root.alternate; - firstChild = root.flags; - switch (root.tag) { - case 0: - if ( - 0 !== (firstChild & 4) && - ((firstChild = root.updateQueue), - (firstChild = null !== firstChild ? firstChild.events : null), - null !== firstChild) - ) - for (var ii = 0; ii < firstChild.length; ii++) { - var _eventPayloads$ii = firstChild[ii]; - _eventPayloads$ii.ref.impl = _eventPayloads$ii.nextImpl; - } - break; - case 11: - case 15: - break; - case 1: - if (0 !== (firstChild & 1024) && null !== current) { - firstChild = void 0; - ii = root; - _eventPayloads$ii = current.memoizedProps; - current = current.memoizedState; - var instance = ii.stateNode; - try { - var resolvedPrevProps = resolveClassComponentProps( - ii.type, - _eventPayloads$ii - ); - firstChild = instance.getSnapshotBeforeUpdate( - resolvedPrevProps, - current - ); - instance.__reactInternalSnapshotBeforeUpdate = firstChild; - } catch (error) { - captureCommitPhaseError(ii, ii.return, error); - } - } - break; - case 3: - break; - case 5: - case 26: - case 27: - case 6: - case 4: - case 17: - break; - default: - if (0 !== (firstChild & 1024)) - throw Error( - "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." - ); +function commitBeforeMutationEffects(root, firstChild, committedLanes) { + root = (committedLanes & 335544064) === committedLanes; + nextEffect = firstChild; + for (firstChild = root ? 9270 : 1024; null !== nextEffect; ) { + committedLanes = nextEffect; + if (root) { + var deletions = committedLanes.deletions; + if (null !== deletions) + for (var i = 0; i < deletions.length; i++) + root && commitExitViewTransitions(deletions[i]); + } + if (null === committedLanes.alternate && 0 !== (committedLanes.flags & 2)) + root && trackEnterViewTransitions(committedLanes), + commitBeforeMutationEffects_complete(root); + else { + if (22 === committedLanes.tag && 0 !== (committedLanes.mode & 1)) + if ( + ((deletions = committedLanes.alternate), + null !== committedLanes.memoizedState) + ) { + null !== deletions && + null === deletions.memoizedState && + root && + commitExitViewTransitions(deletions); + commitBeforeMutationEffects_complete(root); + continue; + } else if (null !== deletions && null !== deletions.memoizedState) { + root && trackEnterViewTransitions(committedLanes); + commitBeforeMutationEffects_complete(root); + continue; } - firstChild = root.sibling; - if (null !== firstChild) { - firstChild.return = root.return; - nextEffect = firstChild; - break; + deletions = committedLanes.child; + 0 !== (committedLanes.subtreeFlags & firstChild) && null !== deletions + ? ((deletions.return = committedLanes), (nextEffect = deletions)) + : (root && commitNestedViewTransitions(committedLanes), + commitBeforeMutationEffects_complete(root)); + } + } + appearingViewTransitions = null; +} +function commitBeforeMutationEffects_complete( + isViewTransitionEligible$jscomp$0 +) { + for (; null !== nextEffect; ) { + var fiber = nextEffect, + isViewTransitionEligible = isViewTransitionEligible$jscomp$0, + current = fiber.alternate, + flags = fiber.flags; + switch (fiber.tag) { + case 0: + case 11: + case 15: + break; + case 1: + if (0 !== (flags & 1024) && null !== current) { + isViewTransitionEligible = void 0; + flags = current.memoizedProps; + current = current.memoizedState; + var instance = fiber.stateNode; + try { + var resolvedPrevProps = resolveClassComponentProps( + fiber.type, + flags + ); + isViewTransitionEligible = instance.getSnapshotBeforeUpdate( + resolvedPrevProps, + current + ); + instance.__reactInternalSnapshotBeforeUpdate = + isViewTransitionEligible; + } catch (error) { + captureCommitPhaseError(fiber, fiber.return, error); + } } - nextEffect = root.return; - } + break; + case 3: + break; + case 5: + case 26: + case 27: + case 6: + case 4: + case 17: + break; + case 30: + isViewTransitionEligible && + null !== current && + ((isViewTransitionEligible = getViewTransitionName( + current.memoizedProps, + current.stateNode + )), + (flags = fiber.memoizedProps), + (flags = getViewTransitionClassName(flags.default, flags.update)), + "none" !== flags && + applyViewTransitionToHostInstances( + current, + isViewTransitionEligible, + flags, + (current.memoizedState = []) + )); + break; + default: + if (0 !== (flags & 1024)) + throw Error( + "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." + ); + } + current = fiber.sibling; + if (null !== current) { + current.return = fiber.return; + nextEffect = current; + break; + } + nextEffect = fiber.return; + } } function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { var prevEffectStart = pushComponentEffectStart(), @@ -8418,11 +9185,11 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { } else try { finishedRoot.componentDidMount(); - } catch (error$125) { + } catch (error$130) { captureCommitPhaseError( finishedWork, finishedWork.return, - error$125 + error$130 ); } else { @@ -8439,11 +9206,11 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { current, finishedRoot.__reactInternalSnapshotBeforeUpdate ); - } catch (error$126) { + } catch (error$131) { captureCommitPhaseError( finishedWork, finishedWork.return, - error$126 + error$131 ); } recordEffectDuration(); @@ -8454,11 +9221,11 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { current, finishedRoot.__reactInternalSnapshotBeforeUpdate ); - } catch (error$127) { + } catch (error$132) { captureCommitPhaseError( finishedWork, finishedWork.return, - error$127 + error$132 ); } } @@ -8537,18 +9304,20 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { null !== finishedWork.memoizedState || offscreenSubtreeIsHidden), !flags) ) { - current = + var newOffscreenSubtreeWasHidden = (null !== current && null !== current.memoizedState) || offscreenSubtreeWasHidden; - prevProps = offscreenSubtreeIsHidden; - var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; + current = offscreenSubtreeIsHidden; + prevProps = offscreenSubtreeWasHidden; offscreenSubtreeIsHidden = flags; - (offscreenSubtreeWasHidden = current) && - !prevOffscreenSubtreeWasHidden - ? (recursivelyTraverseReappearLayoutEffects( + (offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden) && + !prevProps + ? ((flags = 0), + 0 !== (finishedWork.subtreeFlags & 8772) && (flags |= 1), + recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - 0 !== (finishedWork.subtreeFlags & 8772) + flags ), 0 !== (finishedWork.mode & 2) && 0 <= componentEffectStartTime && @@ -8560,13 +9329,17 @@ function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { componentEffectEndTime )) : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); - offscreenSubtreeIsHidden = prevProps; - offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; + offscreenSubtreeIsHidden = current; + offscreenSubtreeWasHidden = prevProps; } } else recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); break; case 30: + recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); + flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); break; + case 7: + flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); default: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); } @@ -8640,8 +9413,11 @@ function commitDeletionEffectsOnFiber( case 27: case 5: offscreenSubtreeWasHidden || - safelyDetachRef(deletedFiber, nearestMountedAncestor); + safelyDetachRef(deletedFiber, nearestMountedAncestor), + commitFragmentInstanceDeletionEffects(deletedFiber); case 6: + 6 === deletedFiber.tag && + commitFragmentInstanceDeletionEffects(deletedFiber); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, @@ -8666,8 +9442,7 @@ function commitDeletionEffectsOnFiber( case 11: case 14: case 15: - offscreenSubtreeWasHidden || - commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); + commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); offscreenSubtreeWasHidden || commitHookLayoutUnmountEffects(deletedFiber, nearestMountedAncestor, 4); recursivelyTraverseDeletionEffects( @@ -8717,6 +9492,23 @@ function commitDeletionEffectsOnFiber( deletedFiber ); break; + case 30: + safelyDetachRef(deletedFiber, nearestMountedAncestor); + recursivelyTraverseDeletionEffects( + finishedRoot, + nearestMountedAncestor, + deletedFiber + ); + break; + case 7: + offscreenSubtreeWasHidden || + safelyDetachRef(deletedFiber, nearestMountedAncestor); + recursivelyTraverseDeletionEffects( + finishedRoot, + nearestMountedAncestor, + deletedFiber + ); + break; default: recursivelyTraverseDeletionEffects( finishedRoot, @@ -8782,7 +9574,7 @@ function attachSuspenseRetryListeners(finishedWork, wakeables) { } }); } -function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) { +function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber, lanes) { var deletions = parentFiber.deletions; if (null !== deletions) for (var i = 0; i < deletions.length; i++) { @@ -8808,10 +9600,10 @@ function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) { } if (parentFiber.subtreeFlags & 13886) for (parentFiber = parentFiber.child; null !== parentFiber; ) - commitMutationEffectsOnFiber(parentFiber, root$jscomp$0), + commitMutationEffectsOnFiber(parentFiber, root$jscomp$0, lanes), (parentFiber = parentFiber.sibling); } -function commitMutationEffectsOnFiber(finishedWork, root) { +function commitMutationEffectsOnFiber(finishedWork, root, lanes) { var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), @@ -8823,7 +9615,17 @@ function commitMutationEffectsOnFiber(finishedWork, root) { case 11: case 14: case 15: - recursivelyTraverseMutationEffects(root, finishedWork); + if ( + flags & 4 && + ((current = finishedWork.updateQueue), + (current = null !== current ? current.events : null), + null !== current) + ) + for (var ii = 0; ii < current.length; ii++) { + var _eventPayloads$ii2 = current[ii]; + _eventPayloads$ii2.ref.impl = _eventPayloads$ii2.nextImpl; + } + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && (commitHookEffectListUnmount(3, finishedWork, finishedWork.return), @@ -8831,7 +9633,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { commitHookLayoutUnmountEffects(finishedWork, finishedWork.return, 5)); break; case 1: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || @@ -8843,14 +9645,14 @@ function commitMutationEffectsOnFiber(finishedWork, root) { null !== root && ((flags = root.callbacks), null !== flags && - ((current = root.shared.hiddenCallbacks), + ((lanes = root.shared.hiddenCallbacks), (root.shared.hiddenCallbacks = - null === current ? flags : current.concat(flags))))); + null === lanes ? flags : lanes.concat(flags))))); break; case 26: case 27: case 5: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || @@ -8860,27 +9662,32 @@ function commitMutationEffectsOnFiber(finishedWork, root) { (finishedWork.alternate.stateNode = finishedWork.stateNode); break; case 6: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); break; case 3: current = pushNestedEffectDurations(); - recursivelyTraverseMutationEffects(root, finishedWork); + viewTransitionMutationContext = !1; + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); if (flags & 4) { flags = root.containerInfo; - var pendingChildren = root.pendingChildren; + lanes = root.pendingChildren; try { - completeRoot(flags.containerTag, pendingChildren); + completeRoot(flags.containerTag, lanes), + (viewTransitionMutationContext = !0); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } root.effectDuration += popNestedEffectDurations(current); + viewTransitionMutationContext = !1; break; case 4: - recursivelyTraverseMutationEffects(root, finishedWork); + current = pushMutationContext(); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); + viewTransitionMutationContext = current; flags & 4 && commitHostPortalContainerChildren( finishedWork.stateNode, @@ -8890,13 +9697,13 @@ function commitMutationEffectsOnFiber(finishedWork, root) { break; case 12: flags = pushNestedEffectDurations(); - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); finishedWork.stateNode.effectDuration += bubbleNestedEffectDurations(flags); break; case 31: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && ((root = finishedWork.updateQueue), @@ -8905,7 +9712,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, root))); break; case 13: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); finishedWork.child.flags & 8192 && ((root = null !== current && null !== current.memoizedState), @@ -8919,19 +9726,19 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, root))); break; case 22: - pendingChildren = null !== finishedWork.memoizedState; - var wasHidden = null !== current && null !== current.memoizedState; + ii = null !== finishedWork.memoizedState; + _eventPayloads$ii2 = null !== current && null !== current.memoizedState; if (finishedWork.mode & 1) { var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden, prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; - offscreenSubtreeIsHidden = - prevOffscreenSubtreeIsHidden || pendingChildren; - offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || wasHidden; - recursivelyTraverseMutationEffects(root, finishedWork); + offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || ii; + offscreenSubtreeWasHidden = + prevOffscreenSubtreeWasHidden || _eventPayloads$ii2; + recursivelyTraverseMutationEffects(root, finishedWork, lanes); offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden; - wasHidden && - !pendingChildren && + _eventPayloads$ii2 && + !ii && !prevOffscreenSubtreeIsHidden && !prevOffscreenSubtreeWasHidden && 0 !== (finishedWork.mode & 2) && @@ -8943,20 +9750,23 @@ function commitMutationEffectsOnFiber(finishedWork, root) { componentEffectStartTime, componentEffectEndTime ); - } else recursivelyTraverseMutationEffects(root, finishedWork); + } else recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 8192 && ((root = finishedWork.stateNode), - (root._visibility = pendingChildren - ? root._visibility & -2 - : root._visibility | 1), - !pendingChildren || + (root._visibility = ii ? root._visibility & -2 : root._visibility | 1), + !ii || null === current || - wasHidden || + _eventPayloads$ii2 || offscreenSubtreeIsHidden || offscreenSubtreeWasHidden || 0 === (finishedWork.mode & 1) || - (recursivelyTraverseDisappearLayoutEffects(finishedWork), + ((root = _eventPayloads$ii2 || offscreenSubtreeWasHidden), + (lanes = offscreenSubtreeIsHidden), + (current = offscreenSubtreeWasHidden), + (offscreenSubtreeIsHidden = ii || offscreenSubtreeIsHidden), + (offscreenSubtreeWasHidden = root), + recursivelyTraverseDisappearLayoutEffects(finishedWork), 0 !== (finishedWork.mode & 2) && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && @@ -8966,7 +9776,9 @@ function commitMutationEffectsOnFiber(finishedWork, root) { componentEffectStartTime, componentEffectEndTime, "Disconnect" - ))); + ), + (offscreenSubtreeIsHidden = lanes), + (offscreenSubtreeWasHidden = current))); flags & 4 && ((root = finishedWork.updateQueue), null !== root && @@ -8976,7 +9788,7 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, flags)))); break; case 19: - recursivelyTraverseMutationEffects(root, finishedWork); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); commitReconciliationEffects(finishedWork); flags & 4 && ((root = finishedWork.updateQueue), @@ -8985,11 +9797,39 @@ function commitMutationEffectsOnFiber(finishedWork, root) { attachSuspenseRetryListeners(finishedWork, root))); break; case 30: + flags & 512 && + (offscreenSubtreeWasHidden || + null === current || + safelyDetachRef(current, current.return)); + flags = pushMutationContext(); + ii = (lanes & 335544064) === lanes; + _eventPayloads$ii2 = finishedWork.memoizedProps; + ii && + "none" !== + getViewTransitionClassName( + _eventPayloads$ii2.default, + _eventPayloads$ii2.update + ); + recursivelyTraverseMutationEffects(root, finishedWork, lanes); + commitReconciliationEffects(finishedWork); + ii && + null !== current && + viewTransitionMutationContext && + (finishedWork.flags |= 4); + viewTransitionMutationContext = flags; break; case 21: break; + case 7: + flags & 512 && + (offscreenSubtreeWasHidden || + null === current || + safelyDetachRef(current, current.return)), + current && + null !== current.stateNode && + (current.stateNode._fragmentFiber = finishedWork); default: - recursivelyTraverseMutationEffects(root, finishedWork), + recursivelyTraverseMutationEffects(root, finishedWork, lanes), commitReconciliationEffects(finishedWork); } 0 !== (finishedWork.mode & 2) && @@ -9021,9 +9861,97 @@ function commitMutationEffectsOnFiber(finishedWork, root) { } function commitReconciliationEffects(finishedWork) { var flags = finishedWork.flags; - flags & 2 && (finishedWork.flags &= -3); + if (flags & 2) { + try { + for ( + var parentFragmentInstances = null, parent = finishedWork.return; + null !== parent; + + ) { + if (isFragmentInstanceParent(parent)) { + var fragmentInstance = parent.stateNode; + null === parentFragmentInstances + ? (parentFragmentInstances = [fragmentInstance]) + : parentFragmentInstances.push(fragmentInstance); + } + if (isFragmentInstanceHostBoundary(parent)) break; + parent = parent.return; + } + commitImmutablePlacementNodeToFragmentInstances( + finishedWork, + parentFragmentInstances + ); + } catch (error) { + captureCommitPhaseError(finishedWork, finishedWork.return, error); + } + finishedWork.flags &= -3; + } flags & 4096 && (finishedWork.flags &= -4097); } +function recursivelyTraverseAfterMutationEffects(root, parentFiber) { + if (parentFiber.subtreeFlags & 9270) + for (parentFiber = parentFiber.child; null !== parentFiber; ) + commitAfterMutationEffectsOnFiber(parentFiber, root), + (parentFiber = parentFiber.sibling); + else measureNestedViewTransitions(parentFiber, !1); +} +function commitAfterMutationEffectsOnFiber(finishedWork, root) { + var current = finishedWork.alternate; + if (null === current) commitEnterViewTransitions(finishedWork, !1); + else + switch (finishedWork.tag) { + case 3: + viewTransitionContextChanged = !1; + pushViewTransitionCancelableScope(); + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionCancelableChildren = null; + break; + case 5: + recursivelyTraverseAfterMutationEffects(root, finishedWork); + break; + case 4: + current = viewTransitionContextChanged; + viewTransitionContextChanged = !1; + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionContextChanged = current; + break; + case 22: + 0 !== (finishedWork.mode & 1) + ? null === finishedWork.memoizedState && + (null !== current.memoizedState + ? commitEnterViewTransitions(finishedWork, !1) + : recursivelyTraverseAfterMutationEffects(root, finishedWork)) + : recursivelyTraverseAfterMutationEffects(root, finishedWork); + break; + case 30: + var prevContextChanged$148 = viewTransitionContextChanged, + prevCancelableChildren = pushViewTransitionCancelableScope(); + viewTransitionContextChanged = !1; + recursivelyTraverseAfterMutationEffects(root, finishedWork); + viewTransitionContextChanged && (finishedWork.flags |= 4); + root = finishedWork.memoizedProps; + var state = finishedWork.stateNode; + getViewTransitionName(root, state); + getViewTransitionName(current.memoizedProps, state); + "none" !== getViewTransitionClassName(root.default, root.update) && + ((root = current.memoizedState), + (current.memoizedState = null), + (viewTransitionHostInstanceIdx = 0), + viewTransitionHostInstanceIdx !== (null === root ? 0 : root.length) && + (finishedWork.flags |= 32)); + null !== prevCancelableChildren && + (prevCancelableChildren.push.apply( + prevCancelableChildren, + viewTransitionCancelableChildren + ), + (viewTransitionCancelableChildren = prevCancelableChildren)); + viewTransitionContextChanged = + 0 !== (finishedWork.flags & 32) ? !0 : prevContextChanged$148; + break; + default: + recursivelyTraverseAfterMutationEffects(root, finishedWork); + } +} function recursivelyTraverseLayoutEffects(root, parentFiber) { if (parentFiber.subtreeFlags & 8772) for (parentFiber = parentFiber.child; null !== parentFiber; ) @@ -9057,8 +9985,16 @@ function recursivelyTraverseDisappearLayoutEffects(parentFiber) { recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 27: - case 26: case 5: + safelyDetachRef(finishedWork, finishedWork.return); + (5 !== finishedWork.tag && 27 !== finishedWork.tag) || + commitFragmentInstanceDeletionEffects(finishedWork); + recursivelyTraverseDisappearLayoutEffects(finishedWork); + break; + case 6: + commitFragmentInstanceDeletionEffects(finishedWork); + break; + case 26: safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; @@ -9067,8 +10003,11 @@ function recursivelyTraverseDisappearLayoutEffects(parentFiber) { recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 30: + safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; + case 7: + safelyDetachRef(finishedWork, finishedWork.return); default: recursivelyTraverseDisappearLayoutEffects(finishedWork); } @@ -9093,10 +10032,12 @@ function recursivelyTraverseDisappearLayoutEffects(parentFiber) { function recursivelyTraverseReappearLayoutEffects( finishedRoot$jscomp$0, parentFiber, - includeWorkInProgressEffects + layoutEffectTraversalFlags ) { - includeWorkInProgressEffects = - includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772); + layoutEffectTraversalFlags = + 0 !== (parentFiber.subtreeFlags & 8772) + ? layoutEffectTraversalFlags + : layoutEffectTraversalFlags & -2; for (parentFiber = parentFiber.child; null !== parentFiber; ) { var current = parentFiber.alternate, finishedRoot = finishedRoot$jscomp$0, @@ -9105,7 +10046,8 @@ function recursivelyTraverseReappearLayoutEffects( prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), - flags = finishedWork.flags; + flags = finishedWork.flags, + includeWorkInProgressEffects = 0 !== (layoutEffectTraversalFlags & 1); switch (finishedWork.tag) { case 0: case 11: @@ -9113,7 +10055,7 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); commitHookLayoutEffects(finishedWork, 4); break; @@ -9121,7 +10063,7 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); current = finishedWork; finishedRoot = current.stateNode; @@ -9154,12 +10096,28 @@ function recursivelyTraverseReappearLayoutEffects( safelyAttachRef(finishedWork, finishedWork.return); break; case 27: - case 26: case 5: + (5 !== finishedWork.tag && 27 !== finishedWork.tag) || + commitFragmentInstanceInsertionEffects(finishedWork); + recursivelyTraverseReappearLayoutEffects( + finishedRoot, + finishedWork, + layoutEffectTraversalFlags + ); + includeWorkInProgressEffects && + null === current && + flags & 4 && + commitHostMount(finishedWork); + safelyAttachRef(finishedWork, finishedWork.return); + break; + case 6: + commitFragmentInstanceInsertionEffects(finishedWork); + break; + case 26: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); includeWorkInProgressEffects && null === current && @@ -9173,34 +10131,35 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ), - (finishedRoot = finishedWork.stateNode), - (finishedRoot.effectDuration += bubbleNestedEffectDurations(flags)), + (includeWorkInProgressEffects = finishedWork.stateNode), + (includeWorkInProgressEffects.effectDuration += + bubbleNestedEffectDurations(flags)), commitProfilerUpdate( finishedWork, current, commitStartTime, - finishedRoot.effectDuration + includeWorkInProgressEffects.effectDuration )) : recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 31: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 13: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); break; case 22: @@ -9208,17 +10167,25 @@ function recursivelyTraverseReappearLayoutEffects( recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); safelyAttachRef(finishedWork, finishedWork.return); break; case 30: + recursivelyTraverseReappearLayoutEffects( + finishedRoot, + finishedWork, + layoutEffectTraversalFlags + ); + safelyAttachRef(finishedWork, finishedWork.return); break; + case 7: + safelyAttachRef(finishedWork, finishedWork.return); default: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, - includeWorkInProgressEffects + layoutEffectTraversalFlags ); } 0 !== (finishedWork.mode & 2) && @@ -9269,7 +10236,8 @@ function recursivelyTraversePassiveMountEffects( endTime ) { if ( - parentFiber.subtreeFlags & 10256 || + parentFiber.subtreeFlags & + ((committedLanes & 335544064) === committedLanes ? 10262 : 10256) || (0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)) @@ -9298,7 +10266,13 @@ function commitPassiveMountOnFiber( prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), - flags = finishedWork.flags; + isViewTransitionEligible = (committedLanes & 335544064) === committedLanes; + isViewTransitionEligible && + null === finishedWork.alternate && + null !== finishedWork.return && + null !== finishedWork.return.alternate && + restoreEnterOrExitViewTransitions(finishedWork); + var flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: @@ -9346,8 +10320,8 @@ function commitPassiveMountOnFiber( ); break; case 3: - var prevProfilerEffectDuration = pushNestedEffectDurations(), - wasInHydratedSubtree = inHydratedSubtree; + isViewTransitionEligible = pushNestedEffectDurations(); + var wasInHydratedSubtree = inHydratedSubtree; inHydratedSubtree = null !== finishedWork.alternate && finishedWork.alternate.memoizedState.isDehydrated && @@ -9369,7 +10343,7 @@ function commitPassiveMountOnFiber( (committedTransitions.refCount++, null != committedLanes && releaseCache(committedLanes))); finishedRoot.passiveEffectDuration += popNestedEffectDurations( - prevProfilerEffectDuration + isViewTransitionEligible ); break; case 12: @@ -9386,14 +10360,14 @@ function commitPassiveMountOnFiber( finishedRoot.passiveEffectDuration += bubbleNestedEffectDurations(flags); try { - prevProfilerEffectDuration = finishedWork.memoizedProps; - wasInHydratedSubtree = prevProfilerEffectDuration.id; - var onPostCommit = prevProfilerEffectDuration.onPostCommit, + wasInHydratedSubtree = finishedWork.memoizedProps; + var id = wasInHydratedSubtree.id, + onPostCommit = wasInHydratedSubtree.onPostCommit, phase = null === finishedWork.alternate ? "mount" : "update"; currentUpdateIsNested && (phase = "nested-update"); "function" === typeof onPostCommit && onPostCommit( - wasInHydratedSubtree, + id, phase, finishedRoot.passiveEffectDuration, commitStartTime @@ -9412,18 +10386,18 @@ function commitPassiveMountOnFiber( break; case 31: flags = inHydratedSubtree; - prevProfilerEffectDuration = + isViewTransitionEligible = null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null; wasInHydratedSubtree = finishedWork.memoizedState; - null !== prevProfilerEffectDuration && null === wasInHydratedSubtree + null !== isViewTransitionEligible && null === wasInHydratedSubtree ? ((wasInHydratedSubtree = finishedWork.deletions), null !== wasInHydratedSubtree && 0 < wasInHydratedSubtree.length && 18 === wasInHydratedSubtree[0].tag ? ((inHydratedSubtree = !1), - null !== prevProfilerEffectDuration.hydrationErrors && + null !== isViewTransitionEligible.hydrationErrors && logComponentErrored( finishedWork, finishedWork.actualStartTime, @@ -9442,13 +10416,13 @@ function commitPassiveMountOnFiber( break; case 13: flags = inHydratedSubtree; - prevProfilerEffectDuration = + isViewTransitionEligible = null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null; wasInHydratedSubtree = finishedWork.memoizedState; - null === prevProfilerEffectDuration || - null === prevProfilerEffectDuration.dehydrated || + null === isViewTransitionEligible || + null === isViewTransitionEligible.dehydrated || (null !== wasInHydratedSubtree && null !== wasInHydratedSubtree.dehydrated) ? (inHydratedSubtree = !1) @@ -9457,7 +10431,7 @@ function commitPassiveMountOnFiber( 0 < wasInHydratedSubtree.length && 18 === wasInHydratedSubtree[0].tag ? ((inHydratedSubtree = !1), - null !== prevProfilerEffectDuration.hydrationErrors && + null !== isViewTransitionEligible.hydrationErrors && logComponentErrored( finishedWork, finishedWork.actualStartTime, @@ -9476,72 +10450,77 @@ function commitPassiveMountOnFiber( case 23: break; case 22: - wasInHydratedSubtree = finishedWork.stateNode; - prevProfilerEffectDuration = finishedWork.alternate; + id = finishedWork.stateNode; + wasInHydratedSubtree = finishedWork.alternate; null !== finishedWork.memoizedState - ? wasInHydratedSubtree._visibility & 2 - ? recursivelyTraversePassiveMountEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - endTime - ) - : finishedWork.mode & 1 - ? recursivelyTraverseAtomicPassiveEffects( + ? (isViewTransitionEligible && + null !== wasInHydratedSubtree && + null === wasInHydratedSubtree.memoizedState && + restoreEnterOrExitViewTransitions(wasInHydratedSubtree), + id._visibility & 2 + ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, endTime ) - : ((wasInHydratedSubtree._visibility |= 2), - recursivelyTraversePassiveMountEffects( + : finishedWork.mode & 1 + ? recursivelyTraverseAtomicPassiveEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + endTime + ) + : ((id._visibility |= 2), + recursivelyTraversePassiveMountEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + endTime + ))) + : (isViewTransitionEligible && + null !== wasInHydratedSubtree && + null !== wasInHydratedSubtree.memoizedState && + restoreEnterOrExitViewTransitions(finishedWork), + id._visibility & 2 + ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, endTime - )) - : wasInHydratedSubtree._visibility & 2 - ? recursivelyTraversePassiveMountEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - endTime - ) - : ((wasInHydratedSubtree._visibility |= 2), - recursivelyTraverseReconnectPassiveEffects( - finishedRoot, - finishedWork, - committedLanes, - committedTransitions, - 0 !== (finishedWork.subtreeFlags & 10256) || - (0 !== finishedWork.actualDuration && - (null === finishedWork.alternate || - finishedWork.alternate.child !== finishedWork.child)), - endTime - ), - 0 === (finishedWork.mode & 2) || - inHydratedSubtree || - ((finishedRoot = finishedWork.actualStartTime), - 0 <= finishedRoot && - 0.05 < endTime - finishedRoot && - logComponentReappeared(finishedWork, finishedRoot, endTime), - 0 <= componentEffectStartTime && - 0 <= componentEffectEndTime && - 0.05 < componentEffectEndTime - componentEffectStartTime && - logComponentReappeared( - finishedWork, - componentEffectStartTime, - componentEffectEndTime - ))); + ) + : ((id._visibility |= 2), + recursivelyTraverseReconnectPassiveEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + 0 !== (finishedWork.subtreeFlags & 10256) || + (0 !== finishedWork.actualDuration && + (null === finishedWork.alternate || + finishedWork.alternate.child !== finishedWork.child)), + endTime + ), + 0 === (finishedWork.mode & 2) || + inHydratedSubtree || + ((finishedRoot = finishedWork.actualStartTime), + 0 <= finishedRoot && + 0.05 < endTime - finishedRoot && + logComponentReappeared(finishedWork, finishedRoot, endTime), + 0 <= componentEffectStartTime && + 0 <= componentEffectEndTime && + 0.05 < componentEffectEndTime - componentEffectStartTime && + logComponentReappeared( + finishedWork, + componentEffectStartTime, + componentEffectEndTime + )))); flags & 2048 && - commitOffscreenPassiveMountEffects( - prevProfilerEffectDuration, - finishedWork - ); + commitOffscreenPassiveMountEffects(wasInHydratedSubtree, finishedWork); break; case 24: recursivelyTraversePassiveMountEffects( @@ -9554,6 +10533,15 @@ function commitPassiveMountOnFiber( flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); break; + case 30: + recursivelyTraversePassiveMountEffects( + finishedRoot, + finishedWork, + committedLanes, + committedTransitions, + endTime + ); + break; default: recursivelyTraversePassiveMountEffects( finishedRoot, @@ -9831,6 +10819,20 @@ function accumulateSuspenseyCommitOnFiber(fiber) { : recursivelyAccumulateSuspenseyCommit(fiber); } break; + case 30: + if ( + 0 !== (fiber.flags & suspenseyCommitFlag) && + ((current = fiber.memoizedProps.name), + null != current && "auto" !== current) + ) { + var state = fiber.stateNode; + state.paired = null; + null === appearingViewTransitions && + (appearingViewTransitions = new Map()); + appearingViewTransitions.set(current, state); + } + recursivelyAccumulateSuspenseyCommit(fiber); + break; default: recursivelyAccumulateSuspenseyCommit(fiber); } @@ -10120,6 +11122,9 @@ var DefaultAsyncDispatcher = { pendingEffectsRenderEndTime = -0, pendingPassiveTransitions = null, pendingRecoverableErrors = null, + pendingViewTransition = null, + pendingViewTransitionEvents = null, + pendingTransitionTypes = null, pendingSuspendedCommitReason = null, pendingDelayedCommitReason = 0, pendingSuspendedViewTransitionReason = null, @@ -10149,6 +11154,19 @@ function requestDeferredLane() { null !== lane && (lane.flags |= 32); return workInProgressDeferredLane; } +function scheduleViewTransitionEvent(fiber, callback) { + if (null != callback) { + var state = fiber.stateNode, + instance = state.ref; + null === instance && + (instance = state.ref = + createViewTransitionInstance( + getViewTransitionName(fiber.memoizedProps, state) + )); + null === pendingViewTransitionEvents && (pendingViewTransitionEvents = []); + pendingViewTransitionEvents.push(callback.bind(null, instance)); + } +} function scheduleUpdateOnFiber(root, fiber, lane) { if ( (root === workInProgressRoot && @@ -10294,6 +11312,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { yieldDuration = workInProgressRootConcurrentErrors; exitStatus = renderRootSync(root, JSCompiler_inline_result, !1); 2 !== exitStatus && + 6 !== exitStatus && (workInProgressRootDidAttachPingListener ? ((root.errorRecoveryDisabledLanes |= renderWasConcurrent), (workInProgressRootInterleavedUpdatedLanes |= @@ -10330,7 +11349,8 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { case 1: throw Error("Root did not complete. This is a bug in React."); case 4: - if ((lanes & 4194048) !== lanes) break; + if ((lanes & 4194048) !== lanes && (lanes & 62914560) !== lanes) + break; case 6: setCurrentTrackFromLanes(lanes); logSuspendedRenderPhase(renderStartTime, yieldDuration, lanes); @@ -10371,7 +11391,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { if (0 !== getNextLanes(yieldEndTime, 0, !0)) break a; pendingEffectsLanes = lanes; yieldEndTime.timeoutHandle = scheduleTimeout( - commitRootWhenReady.bind( + completeRootWhenReady.bind( null, yieldEndTime, forceSync, @@ -10392,7 +11412,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { ); break a; } - commitRootWhenReady( + completeRootWhenReady( yieldEndTime, forceSync, workInProgressRootRecoverableErrors, @@ -10414,7 +11434,7 @@ function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { } while (1); ensureRootIsScheduled(root$jscomp$0); } -function commitRootWhenReady( +function completeRootWhenReady( root, finishedWork, recoverableErrors, @@ -10431,35 +11451,87 @@ function commitRootWhenReady( completedRenderEndTime ) { root.timeoutHandle = -1; - didSkipSuspendedSiblings = finishedWork.subtreeFlags; + didIncludeRenderPhaseUpdate = finishedWork.subtreeFlags; + didSkipSuspendedSiblings = (lanes & 335544064) === lanes; var suspendedState = null; if ( - didSkipSuspendedSiblings & 8192 || - 16785408 === (didSkipSuspendedSiblings & 16785408) + didSkipSuspendedSiblings || + didIncludeRenderPhaseUpdate & 8192 || + 16785408 === (didIncludeRenderPhaseUpdate & 16785408) ) - (suspendedState = null), + (appearingViewTransitions = suspendedState = null), accumulateSuspenseyCommitOnFiber(finishedWork), + didSkipSuspendedSiblings && + null != fabricSuspendOnActiveViewTransition && + fabricSuspendOnActiveViewTransition(), (lanes & 62914560) === lanes ? globalMostRecentFallbackTime - now$1() : (lanes & 4194048) === lanes ? globalMostRecentTransitionTime - now$1() : 0; - commitRoot( - root, - finishedWork, - lanes, - recoverableErrors, - transitions, - didIncludeRenderPhaseUpdate, - spawnedLane, - updatedLanes, - suspendedRetryLanes, - exitStatus, - suspendedState, - suspendedCommitReason, - completedRenderStartTime, - completedRenderEndTime - ); + didIncludeRenderPhaseUpdate = suspendedState; + root.cancelPendingCommit = null; + do flushPendingEffects(); + while (0 !== pendingEffectsStatus); + if (0 !== (executionContext & 6)) + throw Error("Should not already be working."); + setCurrentTrackFromLanes(lanes); + 2 === exitStatus + ? logErroredRenderPhase(completedRenderStartTime, completedRenderEndTime) + : null !== recoverableErrors + ? !supportsUserTiming || + completedRenderEndTime <= completedRenderStartTime || + console.timeStamp( + "Recovered", + completedRenderStartTime, + completedRenderEndTime, + currentTrack, + "Scheduler \u269b", + "error" + ) + : !supportsUserTiming || + completedRenderEndTime <= completedRenderStartTime || + console.timeStamp( + (lanes & 536870912) === lanes + ? "Prepared" + : (lanes & 201326741) === lanes + ? "Hydrated" + : "Render", + completedRenderStartTime, + completedRenderEndTime, + currentTrack, + "Scheduler \u269b", + (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark" + ); + if (null !== finishedWork) { + if (finishedWork === root.current) + throw Error( + "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." + ); + root === workInProgressRoot && + ((workInProgress = workInProgressRoot = null), + (workInProgressRootRenderLanes = 0)); + pendingFinishedWork = finishedWork; + pendingEffectsRoot = root; + pendingEffectsLanes = lanes; + pendingPassiveTransitions = transitions; + pendingRecoverableErrors = recoverableErrors; + pendingEffectsRenderEndTime = completedRenderEndTime; + pendingSuspendedCommitReason = suspendedCommitReason; + pendingDelayedCommitReason = 0; + pendingSuspendedViewTransitionReason = null; + commitRoot( + root, + finishedWork, + lanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes, + didIncludeRenderPhaseUpdate, + suspendedCommitReason, + completedRenderEndTime + ); + } } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { @@ -10501,6 +11573,7 @@ function markRootSuspended( spawnedLane, didAttemptEntireTree ) { + suspendedLanes = getEntangledLanes(root, suspendedLanes); suspendedLanes &= ~workInProgressRootPingedLanes; suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root.suspendedLanes |= suspendedLanes; @@ -10536,6 +11609,8 @@ function resetWorkInProgressStack() { function finalizeRender(lanes, finalizationTime) { 0 !== (lanes & 127) && (blockingClampTime = finalizationTime); 0 !== (lanes & 4194048) && (transitionClampTime = finalizationTime); + 0 !== (lanes & 62914560) && (retryClampTime = finalizationTime); + 0 !== (lanes & 2080374784) && (idleClampTime = finalizationTime); } function prepareFreshStack(root, lanes) { supportsUserTiming && @@ -10608,20 +11683,23 @@ function prepareFreshStack(root, lanes) { 0 <= blockingEventTime && blockingEventTime < blockingClampTime ? blockingClampTime : blockingEventTime; - var clampedRenderStartTime$160 = + var clampedRenderStartTime$171 = 0 <= endTime ? endTime : 0 <= previousRenderStartTime ? previousRenderStartTime : renderStartTime; - 0 <= blockingSuspendedTime && - (setCurrentTrackFromLanes(2), - logSuspendedWithDelayPhase( - blockingSuspendedTime, - clampedRenderStartTime$160, - lanes - )); - clampedRenderStartTime$160 = blockingEventType; + 0 <= blockingSuspendedTime + ? (setCurrentTrackFromLanes(2), + logSuspendedWithDelayPhase( + blockingSuspendedTime, + clampedRenderStartTime$171, + lanes + )) + : 0 !== (animatingLanes & 127) && + (setCurrentTrackFromLanes(2), + logAnimatingPhase(blockingClampTime, clampedRenderStartTime$171)); + clampedRenderStartTime$171 = blockingEventType; var eventIsRepeat = 0 < blockingEventRepeatTime, isSpawnedUpdate = 1 === blockingUpdateType, isPingedUpdate = 2 === blockingUpdateType, @@ -10636,12 +11714,12 @@ function prepareFreshStack(root, lanes) { ? endTime > previousRenderStartTime && (endTime = previousRenderStartTime) : (endTime = previousRenderStartTime), - null !== clampedRenderStartTime$160 && + null !== clampedRenderStartTime$171 && previousRenderStartTime > endTime && console.timeStamp( eventIsRepeat ? "Consecutive" - : "Event: " + clampedRenderStartTime$160, + : "Event: " + clampedRenderStartTime$171, endTime, previousRenderStartTime, currentTrack, @@ -10683,23 +11761,26 @@ function prepareFreshStack(root, lanes) { 0 <= transitionUpdateTime && transitionUpdateTime < transitionClampTime ? transitionClampTime : transitionUpdateTime), - (clampedRenderStartTime$160 = + (clampedRenderStartTime$171 = 0 <= transitionEventTime && transitionEventTime < transitionClampTime ? transitionClampTime : transitionEventTime), (eventIsRepeat = - 0 <= clampedRenderStartTime$160 - ? clampedRenderStartTime$160 + 0 <= clampedRenderStartTime$171 + ? clampedRenderStartTime$171 : 0 <= endTime ? endTime : renderStartTime), - 0 <= transitionSuspendedTime && - (setCurrentTrackFromLanes(256), - logSuspendedWithDelayPhase( - transitionSuspendedTime, - eventIsRepeat, - lanes - )), + 0 <= transitionSuspendedTime + ? (setCurrentTrackFromLanes(256), + logSuspendedWithDelayPhase( + transitionSuspendedTime, + eventIsRepeat, + lanes + )) + : 0 !== (animatingLanes & 4194048) && + (setCurrentTrackFromLanes(256), + logAnimatingPhase(transitionClampTime, eventIsRepeat)), (eventIsRepeat = transitionEventType), (isSpawnedUpdate = 0 < transitionEventRepeatTime), (isPingedUpdate = 2 === transitionUpdateType), @@ -10714,15 +11795,15 @@ function prepareFreshStack(root, lanes) { ? previousRenderStartTime > endTime && (previousRenderStartTime = endTime) : (previousRenderStartTime = endTime), - 0 < clampedRenderStartTime$160 - ? clampedRenderStartTime$160 > previousRenderStartTime && - (clampedRenderStartTime$160 = previousRenderStartTime) - : (clampedRenderStartTime$160 = previousRenderStartTime), - previousRenderStartTime > clampedRenderStartTime$160 && + 0 < clampedRenderStartTime$171 + ? clampedRenderStartTime$171 > previousRenderStartTime && + (clampedRenderStartTime$171 = previousRenderStartTime) + : (clampedRenderStartTime$171 = previousRenderStartTime), + previousRenderStartTime > clampedRenderStartTime$171 && null !== eventIsRepeat && console.timeStamp( isSpawnedUpdate ? "Consecutive" : "Event: " + eventIsRepeat, - clampedRenderStartTime$160, + clampedRenderStartTime$171, previousRenderStartTime, currentTrack, "Scheduler \u269b", @@ -10756,6 +11837,14 @@ function prepareFreshStack(root, lanes) { (transitionEventRepeatTime = transitionEventTime), (transitionEventTime = -1.1), (transitionClampTime = now())); + 0 !== (lanes & 62914560) && + 0 !== (animatingLanes & 62914560) && + (setCurrentTrackFromLanes(4194304), + logAnimatingPhase(retryClampTime, renderStartTime)); + 0 !== (lanes & 2080374784) && + 0 !== (animatingLanes & 2080374784) && + (setCurrentTrackFromLanes(268435456), + logAnimatingPhase(idleClampTime, renderStartTime)); previousRenderStartTime = root.timeoutHandle; -1 !== previousRenderStartTime && ((root.timeoutHandle = -1), cancelTimeout(previousRenderStartTime)); @@ -10785,15 +11874,7 @@ function prepareFreshStack(root, lanes) { workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors = null; workInProgressRootDidIncludeRecursiveRenderUpdate = !1; - 0 !== (lanes & 8) && (lanes |= lanes & 32); - endTime = root.entangledLanes; - if (0 !== endTime) - for (root = root.entanglements, endTime &= lanes; 0 < endTime; ) - (clampedRenderStartTime$160 = 31 - clz32(endTime)), - (eventIsRepeat = 1 << clampedRenderStartTime$160), - (lanes |= root[clampedRenderStartTime$160]), - (endTime &= ~eventIsRepeat); - entangledRenderLanes = lanes; + entangledRenderLanes = getEntangledLanes(root, lanes); finishQueueingConcurrentUpdates(); return previousRenderStartTime; } @@ -10907,8 +11988,8 @@ function renderRootSync(root, lanes, shouldYieldForPrerendering) { workLoopSync(); memoizedUpdaters = workInProgressRootExitStatus; break; - } catch (thrownValue$165) { - handleThrow(root, thrownValue$165); + } catch (thrownValue$176) { + handleThrow(root, thrownValue$176); } while (1); lanes && root.shellSuspendCounter++; @@ -11029,8 +12110,8 @@ function renderRootConcurrent(root, lanes) { } workLoopConcurrentByScheduler(); break; - } catch (thrownValue$167) { - handleThrow(root, thrownValue$167); + } catch (thrownValue$178) { + handleThrow(root, thrownValue$178); } while (1); lastContextDependency = currentlyRenderingFiber$1 = null; @@ -11222,124 +12303,131 @@ function commitRoot( root, finishedWork, lanes, - recoverableErrors, - transitions, - didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, - exitStatus, suspendedState, suspendedCommitReason, - completedRenderStartTime, completedRenderEndTime ) { - root.cancelPendingCommit = null; - do flushPendingEffects(); - while (0 !== pendingEffectsStatus); - if (0 !== (executionContext & 6)) - throw Error("Should not already be working."); - setCurrentTrackFromLanes(lanes); - 2 === exitStatus - ? logErroredRenderPhase(completedRenderStartTime, completedRenderEndTime) - : null !== recoverableErrors - ? !supportsUserTiming || - completedRenderEndTime <= completedRenderStartTime || - console.timeStamp( - "Recovered", - completedRenderStartTime, - completedRenderEndTime, - currentTrack, - "Scheduler \u269b", - "error" - ) - : !supportsUserTiming || - completedRenderEndTime <= completedRenderStartTime || - console.timeStamp( - (lanes & 536870912) === lanes - ? "Prepared" - : (lanes & 201326741) === lanes - ? "Hydrated" - : "Render", - completedRenderStartTime, - completedRenderEndTime, - currentTrack, - "Scheduler \u269b", - (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark" - ); - if (null !== finishedWork) { - if (finishedWork === root.current) - throw Error( - "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." - ); - didIncludeRenderPhaseUpdate = finishedWork.lanes | finishedWork.childLanes; - didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes; - markRootFinished( - root, - lanes, - didIncludeRenderPhaseUpdate, - spawnedLane, - updatedLanes, - suspendedRetryLanes - ); - root === workInProgressRoot && - ((workInProgress = workInProgressRoot = null), - (workInProgressRootRenderLanes = 0)); - pendingFinishedWork = finishedWork; - pendingEffectsRoot = root; - pendingEffectsLanes = lanes; - pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate; - pendingPassiveTransitions = transitions; - pendingRecoverableErrors = recoverableErrors; - pendingEffectsRenderEndTime = completedRenderEndTime; - pendingSuspendedCommitReason = suspendedCommitReason; - pendingDelayedCommitReason = 0; - pendingSuspendedViewTransitionReason = null; - 0 !== finishedWork.actualDuration || - 0 !== (finishedWork.subtreeFlags & 10256) || - 0 !== (finishedWork.flags & 10256) - ? ((root.callbackNode = null), - (root.callbackPriority = 0), - scheduleCallback(NormalPriority$1, function () { - 0 === pendingDelayedCommitReason && (pendingDelayedCommitReason = 2); - flushPassiveEffects(); - return null; - })) - : ((root.callbackNode = null), (root.callbackPriority = 0)); - commitErrors = null; - commitStartTime = now(); - null !== suspendedCommitReason && - (!supportsUserTiming || - commitStartTime <= completedRenderEndTime || - console.timeStamp( - suspendedCommitReason, - completedRenderEndTime, - commitStartTime, - currentTrack, - "Scheduler \u269b", - "secondary-light" - )); - recoverableErrors = 0 !== (finishedWork.flags & 13878); - if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) { - recoverableErrors = ReactSharedInternals.T; - ReactSharedInternals.T = null; - transitions = currentUpdatePriority; - currentUpdatePriority = 2; - spawnedLane = executionContext; - executionContext |= 4; - try { - commitBeforeMutationEffects(root, finishedWork, lanes); - } finally { - (executionContext = spawnedLane), - (currentUpdatePriority = transitions), - (ReactSharedInternals.T = recoverableErrors); - } + var remainingLanes = finishedWork.lanes | finishedWork.childLanes; + pendingEffectsRemainingLanes = remainingLanes; + remainingLanes |= concurrentlyUpdatedLanes; + markRootFinished( + root, + lanes, + remainingLanes, + spawnedLane, + updatedLanes, + suspendedRetryLanes + ); + pendingViewTransitionEvents = null; + (lanes & 335544064) === lanes + ? ((pendingTransitionTypes = claimQueuedTransitionTypes(root)), + (spawnedLane = 10262)) + : ((pendingTransitionTypes = null), (spawnedLane = 10256)); + 0 !== finishedWork.actualDuration || + 0 !== (finishedWork.subtreeFlags & spawnedLane) || + 0 !== (finishedWork.flags & spawnedLane) + ? ((root.callbackNode = null), + (root.callbackPriority = 0), + scheduleCallback(NormalPriority$1, function () { + schedulerEvent = global.event; + 0 === pendingDelayedCommitReason && (pendingDelayedCommitReason = 2); + flushPassiveEffects(); + return null; + })) + : ((root.callbackNode = null), (root.callbackPriority = 0)); + commitErrors = null; + commitStartTime = now(); + null !== suspendedCommitReason && + (!supportsUserTiming || + commitStartTime <= completedRenderEndTime || + console.timeStamp( + suspendedCommitReason, + completedRenderEndTime, + commitStartTime, + currentTrack, + "Scheduler \u269b", + "secondary-light" + )); + shouldStartViewTransition = !1; + suspendedCommitReason = 0 !== (finishedWork.flags & 13878); + if (0 !== (finishedWork.subtreeFlags & 13878) || suspendedCommitReason) { + suspendedCommitReason = ReactSharedInternals.T; + ReactSharedInternals.T = null; + completedRenderEndTime = currentUpdatePriority; + currentUpdatePriority = 2; + spawnedLane = executionContext; + executionContext |= 4; + try { + commitBeforeMutationEffects(root, finishedWork, lanes); + } finally { + (executionContext = spawnedLane), + (currentUpdatePriority = completedRenderEndTime), + (ReactSharedInternals.T = suspendedCommitReason); } - pendingEffectsStatus = 1; - flushMutationEffects(); - flushLayoutEffects(); - flushSpawnedWork(); } + pendingEffectsStatus = 1; + shouldStartViewTransition + ? ((animatingLanes |= lanes), + (pendingViewTransition = startViewTransition( + suspendedState, + root.containerInfo, + pendingTransitionTypes, + flushMutationEffects, + flushLayoutEffects, + flushAfterMutationEffects, + flushSpawnedWork, + flushPassiveEffects, + reportViewTransitionError, + suspendedViewTransition, + finishedViewTransition.bind(null, lanes) + ))) + : (flushMutationEffects(), flushLayoutEffects(), flushSpawnedWork()); +} +function reportViewTransitionError(error) { + if (0 !== pendingEffectsStatus) { + var onRecoverableError = pendingEffectsRoot.onRecoverableError; + onRecoverableError(error, { componentStack: null }); + } +} +function suspendedViewTransition(reason) { + commitEndTime = now(); + logCommitPhase( + null === pendingSuspendedCommitReason + ? pendingEffectsRenderEndTime + : commitStartTime, + commitEndTime, + commitErrors, + 1 === pendingDelayedCommitReason + ); + pendingSuspendedCommitReason = pendingSuspendedViewTransitionReason = reason; +} +function finishedViewTransition(lanes) { + 0 !== (animatingLanes & lanes) && + ((animatingLanes &= ~lanes), + 0 !== (lanes & 4194048) && + 0 === (workInProgressRootRenderLanes & 4194048) && + 0 === (pendingEffectsLanes & 4194048) && + (setCurrentTrackFromLanes(256), + logAnimatingPhase(transitionClampTime, now$1())), + 0 !== (lanes & 62914560) && + 0 === (workInProgressRootRenderLanes & 62914560) && + 0 === (pendingEffectsLanes & 62914560) && + (setCurrentTrackFromLanes(4194304), + logAnimatingPhase(retryClampTime, now$1())), + 0 !== (lanes & 2080374784) && + 0 === (workInProgressRootRenderLanes & 2080374784) && + 0 === (pendingEffectsLanes & 2080374784) && + (setCurrentTrackFromLanes(268435456), + logAnimatingPhase(idleClampTime, now$1()))); +} +function flushAfterMutationEffects() { + 3 === pendingEffectsStatus && + ((pendingEffectsStatus = 0), + commitAfterMutationEffectsOnFiber(pendingFinishedWork, pendingEffectsRoot), + (pendingEffectsStatus = 4)); } function flushMutationEffects() { if (1 === pendingEffectsStatus) { @@ -11359,7 +12447,7 @@ function flushMutationEffects() { (inProgressLanes = lanes), (inProgressRoot = root), resetComponentEffectTimers(), - commitMutationEffectsOnFiber(finishedWork, root), + commitMutationEffectsOnFiber(finishedWork, root, lanes), (inProgressRoot = inProgressLanes = null); } finally { (executionContext = prevExecutionContext), @@ -11417,22 +12505,12 @@ function flushLayoutEffects() { suspendedViewTransitionReason = pendingEffectsRenderEndTime; finishedWork = pendingSuspendedCommitReason; commitEndTime = now(); - suspendedViewTransitionReason = - null === finishedWork ? suspendedViewTransitionReason : commitStartTime; - finishedWork = commitEndTime; - lanes = 1 === pendingDelayedCommitReason; - null !== commitErrors - ? logCommitErrored(suspendedViewTransitionReason, finishedWork) - : !supportsUserTiming || - finishedWork <= suspendedViewTransitionReason || - console.timeStamp( - lanes ? "Commit Interrupted View Transition" : "Commit", - suspendedViewTransitionReason, - finishedWork, - currentTrack, - "Scheduler \u269b", - lanes ? "error" : "secondary-dark" - ); + logCommitPhase( + null === finishedWork ? suspendedViewTransitionReason : commitStartTime, + commitEndTime, + commitErrors, + 1 === pendingDelayedCommitReason + ); pendingEffectsStatus = 3; } } @@ -11457,26 +12535,28 @@ function flushSpawnedWork() { 1 !== pendingDelayedCommitReason && (pendingDelayedCommitReason = 3); } pendingEffectsStatus = 0; + startViewTransitionStartTime = pendingViewTransition; + pendingViewTransition = null; requestPaint(); - startViewTransitionStartTime = pendingEffectsRoot; - var finishedWork = pendingFinishedWork; - abortedViewTransition = pendingEffectsLanes; - var recoverableErrors = pendingRecoverableErrors, - rootDidHavePassiveEffects = - 0 !== finishedWork.actualDuration || - 0 !== (finishedWork.subtreeFlags & 10256) || - 0 !== (finishedWork.flags & 10256); - rootDidHavePassiveEffects + abortedViewTransition = pendingEffectsRoot; + var finishedWork = pendingFinishedWork, + lanes = pendingEffectsLanes, + recoverableErrors = pendingRecoverableErrors, + passiveSubtreeMask = (lanes & 335544064) === lanes ? 10262 : 10256; + (passiveSubtreeMask = + 0 !== finishedWork.actualDuration || + 0 !== (finishedWork.subtreeFlags & passiveSubtreeMask) || + 0 !== (finishedWork.flags & passiveSubtreeMask)) ? (pendingEffectsStatus = 5) : ((pendingEffectsStatus = 0), (pendingFinishedWork = pendingEffectsRoot = null), releaseRootPooledCache( - startViewTransitionStartTime, - startViewTransitionStartTime.pendingLanes + abortedViewTransition, + abortedViewTransition.pendingLanes )); - var remainingLanes = startViewTransitionStartTime.pendingLanes; + var remainingLanes = abortedViewTransition.pendingLanes; 0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null); - remainingLanes = lanesToEventPriority(abortedViewTransition); + remainingLanes = lanesToEventPriority(lanes); finishedWork = finishedWork.stateNode; if (injectedHook && "function" === typeof injectedHook.onCommitFiberRoot) try { @@ -11504,15 +12584,14 @@ function flushSpawnedWork() { didError ); } catch (err) {} - isDevToolsPresent && startViewTransitionStartTime.memoizedUpdaters.clear(); + isDevToolsPresent && abortedViewTransition.memoizedUpdaters.clear(); if (null !== recoverableErrors) { didError = ReactSharedInternals.T; schedulerPriority = currentUpdatePriority; currentUpdatePriority = 2; ReactSharedInternals.T = null; try { - var onRecoverableError = - startViewTransitionStartTime.onRecoverableError; + var onRecoverableError = abortedViewTransition.onRecoverableError; for ( finishedWork = 0; finishedWork < recoverableErrors.length; @@ -11528,20 +12607,38 @@ function flushSpawnedWork() { (currentUpdatePriority = schedulerPriority); } } + onRecoverableError = pendingViewTransitionEvents; + recoverableError = pendingTransitionTypes; + pendingTransitionTypes = null; + if ( + null !== onRecoverableError && + ((pendingViewTransitionEvents = null), + null === recoverableError && (recoverableError = []), + null !== startViewTransitionStartTime) + ) + for ( + recoverableErrors = 0; + recoverableErrors < onRecoverableError.length; + recoverableErrors++ + ) + (didError = (0, onRecoverableError[recoverableErrors])( + recoverableError + )), + void 0 !== didError && + startViewTransitionStartTime.finished.finally(didError); 0 !== (pendingEffectsLanes & 3) && - 0 !== startViewTransitionStartTime.tag && + 0 !== abortedViewTransition.tag && flushPendingEffects(); - ensureRootIsScheduled(startViewTransitionStartTime); - remainingLanes = startViewTransitionStartTime.pendingLanes; - 0 !== (abortedViewTransition & 261930) && 0 !== (remainingLanes & 42) + ensureRootIsScheduled(abortedViewTransition); + remainingLanes = abortedViewTransition.pendingLanes; + 0 !== (lanes & 261930) && 0 !== (remainingLanes & 42) ? ((nestedUpdateScheduled = !0), - startViewTransitionStartTime === rootWithNestedUpdates + abortedViewTransition === rootWithNestedUpdates ? nestedUpdateCount++ : ((nestedUpdateCount = 0), - (rootWithNestedUpdates = startViewTransitionStartTime))) - : (nestedUpdateCount = 0); - rootDidHavePassiveEffects || - finalizeRender(abortedViewTransition, commitEndTime); + (rootWithNestedUpdates = abortedViewTransition))) + : ((nestedUpdateCount = 0), (rootWithNestedUpdates = null)); + passiveSubtreeMask || finalizeRender(lanes, commitEndTime); flushSyncWorkAcrossRoots_impl(0, !1); } } @@ -11552,6 +12649,8 @@ function releaseRootPooledCache(root, remainingLanes) { ((root.pooledCache = null), releaseCache(remainingLanes))); } function flushPendingEffects() { + null !== pendingViewTransition && + ((pendingViewTransition = null), (pendingDelayedCommitReason = 1)); flushMutationEffects(); flushLayoutEffects(); flushSpawnedWork(); @@ -11582,16 +12681,7 @@ function flushPassiveEffects() { commitErrors = null; passiveEffectStartTime = now$1(); 3 === pendingDelayedCommitReason - ? !supportsUserTiming || - passiveEffectStartTime <= commitEndTime || - console.timeStamp( - "Animating", - commitEndTime, - passiveEffectStartTime, - currentTrack, - "Scheduler \u269b", - "secondary-dark" - ) + ? logAnimatingPhase(commitEndTime, passiveEffectStartTime) : !supportsUserTiming || passiveEffectStartTime <= commitEndTime || console.timeStamp( @@ -11736,7 +12826,9 @@ function pingSuspendedRoot(root, wakeable, pingedLanes) { (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes && 300 > now$1() - globalMostRecentFallbackTime) - ? 0 === (executionContext & 2) && prepareFreshStack(root, 0) + ? 0 === (executionContext & 2) + ? prepareFreshStack(root, 0) + : (workInProgressRootPingedLanes |= pingedLanes) : (workInProgressRootPingedLanes |= pingedLanes), workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes && (workInProgressSuspendedRetryLanes = 0)); @@ -11843,7 +12935,7 @@ function createWorkInProgress(current, pendingProps) { (workInProgress.deletions = null), (workInProgress.actualDuration = -0), (workInProgress.actualStartTime = -1.1)); - workInProgress.flags = current.flags & 65011712; + workInProgress.flags = current.flags & 1206910976; workInProgress.childLanes = current.childLanes; workInProgress.lanes = current.lanes; workInProgress.child = current.child; @@ -11864,7 +12956,7 @@ function createWorkInProgress(current, pendingProps) { return workInProgress; } function resetWorkInProgress(workInProgress, renderLanes) { - workInProgress.flags &= 65011714; + workInProgress.flags &= 1206910978; var current = workInProgress.alternate; null === current ? ((workInProgress.childLanes = 0), @@ -11909,10 +13001,10 @@ function createFiberFromTypeAndProps( ) { var fiberTag = 0; owner = type; - if ("function" === typeof type) shouldConstruct(type) && (fiberTag = 1); - else if ("string" === typeof type) fiberTag = 5; + if ("function" === typeof owner) shouldConstruct(owner) && (fiberTag = 1); + else if ("string" === typeof owner) fiberTag = 5; else - a: switch (type) { + a: switch (owner) { case REACT_ACTIVITY_TYPE: return ( (type = createFiberImplClass(31, pendingProps, key, mode)), @@ -11949,9 +13041,24 @@ function createFiberFromTypeAndProps( (type.lanes = lanes), type ); + case REACT_LEGACY_HIDDEN_TYPE: + case REACT_VIEW_TRANSITION_TYPE: + return ( + (type = mode | 32), + (type = createFiberImplClass(30, pendingProps, key, type)), + (type.elementType = REACT_VIEW_TRANSITION_TYPE), + (type.lanes = lanes), + (type.stateNode = { + autoName: null, + paired: null, + clones: null, + ref: null + }), + type + ); default: - if ("object" === typeof type && null !== type) - switch (type.$$typeof) { + if ("object" === typeof owner && null !== owner) + switch (owner.$$typeof) { case REACT_CONTEXT_TYPE: fiberTag = 10; break a; @@ -12048,6 +13155,7 @@ function FiberRootNode( this.pooledCache = null; this.pooledCacheLanes = 0; this.formState = formState; + this.transitionTypes = null; this.incompleteTransitions = new Map(); this.passiveEffectDuration = this.effectDuration = -0; this.memoizedUpdaters = new Set(); @@ -12059,7 +13167,12 @@ function createPortal$1(children, containerInfo, implementation) { 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; return { $$typeof: REACT_PORTAL_TYPE, - key: null == key ? null : "" + key, + key: + null == key + ? null + : key === REACT_OPTIMISTIC_KEY + ? REACT_OPTIMISTIC_KEY + : "" + key, children: children, containerInfo: containerInfo, implementation: implementation @@ -12106,30 +13219,84 @@ function shim() { "The current renderer does not support Resources. This error is likely caused by a bug in React. Please file an issue." ); } -var _nativeFabricUIManage = nativeFabricUIManager, - createNode = _nativeFabricUIManage.createNode, - cloneNodeWithNewChildren = _nativeFabricUIManage.cloneNodeWithNewChildren, +var fabricCreateViewTransitionInstance = + reactPrivateInterface.fabricUIManager.createViewTransitionInstance, + fabricStartViewTransition = + reactPrivateInterface.fabricUIManager.startViewTransition, + fabricStartViewTransitionReadyFinished = + reactPrivateInterface.fabricUIManager.startViewTransitionReadyFinished; +function ViewTransitionPseudoElement(pseudo, name) { + this._pseudo = pseudo; + this._name = name; +} +function measureClonedInstance() { + return { + rect: { x: 0, y: 0, width: 0, height: 0 }, + abs: !1, + clip: !1, + view: !0 + }; +} +function createViewTransitionInstance(name) { + var tag = allocateTag(); + fabricCreateViewTransitionInstance(name, tag); + return { + name: name, + old: new ViewTransitionPseudoElement("old", name), + new: new ViewTransitionPseudoElement("new", name) + }; +} +function startViewTransition( + suspendedState, + rootContainer, + transitionTypes, + mutationCallback, + layoutCallback, + afterMutationCallback, + spawnedWorkCallback, + passiveCallback +) { + suspendedState = fabricStartViewTransition(function () { + mutationCallback(); + layoutCallback(); + afterMutationCallback(); + }); + if (null == suspendedState) + return mutationCallback(), layoutCallback(), spawnedWorkCallback(), null; + suspendedState.ready.then(function () { + spawnedWorkCallback(); + fabricStartViewTransitionReadyFinished(); + }); + suspendedState.finished.finally(function () { + passiveCallback(); + }); + return suspendedState; +} +var createNode = reactPrivateInterface.fabricUIManager.createNode, + cloneNodeWithNewChildren = + reactPrivateInterface.fabricUIManager.cloneNodeWithNewChildren, cloneNodeWithNewChildrenAndProps = - _nativeFabricUIManage.cloneNodeWithNewChildrenAndProps, - cloneNodeWithNewProps = _nativeFabricUIManage.cloneNodeWithNewProps, - createChildNodeSet = _nativeFabricUIManage.createChildSet, - appendChildNode = _nativeFabricUIManage.appendChild, - appendChildNodeToSet = _nativeFabricUIManage.appendChildToSet, - completeRoot = _nativeFabricUIManage.completeRoot, - registerEventHandler = _nativeFabricUIManage.registerEventHandler, - FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority, + reactPrivateInterface.fabricUIManager.cloneNodeWithNewChildrenAndProps, + cloneNodeWithNewProps = + reactPrivateInterface.fabricUIManager.cloneNodeWithNewProps, + createChildNodeSet = reactPrivateInterface.fabricUIManager.createChildSet, + appendChildNode = reactPrivateInterface.fabricUIManager.appendChild, + appendChildNodeToSet = reactPrivateInterface.fabricUIManager.appendChildToSet, + completeRoot = reactPrivateInterface.fabricUIManager.completeRoot, + registerEventHandler = + reactPrivateInterface.fabricUIManager.registerEventHandler, + FabricDiscretePriority = + reactPrivateInterface.fabricUIManager.unstable_DiscreteEventPriority, FabricContinuousPriority = - _nativeFabricUIManage.unstable_ContinuousEventPriority, - FabricIdlePriority = _nativeFabricUIManage.unstable_IdleEventPriority, + reactPrivateInterface.fabricUIManager.unstable_ContinuousEventPriority, + FabricIdlePriority = + reactPrivateInterface.fabricUIManager.unstable_IdleEventPriority, fabricGetCurrentEventPriority = - _nativeFabricUIManage.unstable_getCurrentEventPriority, + reactPrivateInterface.fabricUIManager.unstable_getCurrentEventPriority, + fabricSuspendOnActiveViewTransition = + reactPrivateInterface.fabricUIManager.suspendOnActiveViewTransition, extraDevToolsConfig = { getInspectorDataForInstance: void 0, - getInspectorDataForViewTag: function () { - throw Error( - "getInspectorDataForViewTag() is not available in production" - ); - }, getInspectorDataForViewAtPoint: function () { throw Error( "getInspectorDataForViewAtPoint() is not available in production." @@ -12137,8 +13304,13 @@ var _nativeFabricUIManage = nativeFabricUIManager, } }, getViewConfigForType = - ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get, + reactPrivateInterface.ReactNativeViewConfigRegistry.get, nextReactTag = 2; +function allocateTag() { + var tag = nextReactTag; + nextReactTag += 2; + return tag; +} registerEventHandler && registerEventHandler(dispatchEvent); var PROD_HOST_CONTEXT = { isInAParentText: !0 }; function createTextInstance( @@ -12147,8 +13319,7 @@ function createTextInstance( hostContext, internalInstanceHandle ) { - hostContext = nextReactTag; - nextReactTag += 2; + hostContext = allocateTag(); return { node: createNode( hostContext, @@ -12164,7 +13335,7 @@ function getPublicInstance(instance) { if (null == instance.canonical.publicInstance) { var $jscomp$nullish$tmp0; instance.canonical.publicInstance = - ReactNativePrivateInterface.createPublicInstance( + reactPrivateInterface.createPublicInstance( instance.canonical.nativeTag, instance.canonical.viewConfig, instance.canonical.internalInstanceHandle, @@ -12176,12 +13347,15 @@ function getPublicInstance(instance) { } return instance.canonical.publicInstance; } - return null != instance.containerInfo && - null != instance.containerInfo.publicInstance + return null != instance.containerInfo ? instance.containerInfo.publicInstance - : null != instance._nativeTag - ? instance - : null; + : null; +} +function getPublicInstanceFromHostFiber(fiber) { + fiber = getPublicInstance(fiber.stateNode); + if (null === fiber) + throw Error("Expected to find a host node. This is a bug in React."); + return fiber; } var currentUpdatePriority = 0; function resolveUpdatePriority() { @@ -12200,11 +13374,35 @@ function resolveUpdatePriority() { } return 32; } +var schedulerEvent = void 0; +function resolveEventType() { + var event = global.event; + event && event !== schedulerEvent + ? event.type + ? (event = event.type) + : ((event = event.dispatchConfig), + (event = + null == event || null == event.phasedRegistrationNames + ? null + : (event = + event.phasedRegistrationNames.bubbled || + event.phasedRegistrationNames.captured) + ? event.startsWith("on") + ? event.slice(2).toLowerCase() + : event.toLowerCase() + : null)) + : (event = null); + return event; +} +function resolveEventTimeStamp() { + var event = global.event; + return event && event !== schedulerEvent ? event.timeStamp : -1.1; +} var scheduleTimeout = setTimeout, cancelTimeout = clearTimeout; function cloneHiddenInstance(instance) { var node = instance.node, - updatePayload = ReactNativePrivateInterface.createAttributePayload( + updatePayload = reactPrivateInterface.createAttributePayload( { style: { display: "none" } }, instance.canonical.viewConfig.validAttributes ); @@ -12213,6 +13411,159 @@ function cloneHiddenInstance(instance) { canonical: instance.canonical }; } +function FragmentInstance(fragmentFiber) { + this._fragmentFiber = fragmentFiber; + this._observers = null; +} +FragmentInstance.prototype.observeUsing = function (observer) { + null === this._observers && (this._observers = new Set()); + this._observers.add(observer); + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + observeChild, + observer, + void 0, + void 0 + ); +}; +function observeChild(child, observer) { + child = getPublicInstanceFromHostFiber(child); + observer.observe(child); + return !1; +} +FragmentInstance.prototype.unobserveUsing = function (observer) { + var observers = this._observers; + null !== observers && + observers.has(observer) && + (observers.delete(observer), + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + unobserveChild, + observer, + void 0, + void 0 + )); +}; +function unobserveChild(child, observer) { + child = getPublicInstanceFromHostFiber(child); + observer.unobserve(child); + return !1; +} +FragmentInstance.prototype.compareDocumentPosition = function (otherNode) { + var parentHostFiber = getFragmentParentInstanceOrContainerFiber( + this._fragmentFiber + ); + if (null === parentHostFiber) return Node.DOCUMENT_POSITION_DISCONNECTED; + var children = []; + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + collectChildren, + children, + void 0, + void 0 + ); + if (0 === children.length) { + var parentHostInstance = getPublicInstanceFromHostFiber(parentHostFiber); + children = this._fragmentFiber; + parentHostFiber = getPublicInstanceFromHostFiber; + var parentResult = parentHostInstance.compareDocumentPosition(otherNode); + var result = parentResult; + parentHostInstance === otherNode + ? (result = Node.DOCUMENT_POSITION_CONTAINS) + : parentResult & Node.DOCUMENT_POSITION_CONTAINED_BY && + ((parentHostInstance = [null, null]), + (result = getFragmentParentInstanceOrContainerFiber(children)), + null !== result && + findFragmentInstanceOrTextInstanceSiblings( + parentHostInstance, + children, + result.child, + { foundSelf: !1 } + ), + (children = parentHostInstance[1]), + null === children + ? (result = Node.DOCUMENT_POSITION_PRECEDING) + : ((otherNode = + parentHostFiber(children).compareDocumentPosition(otherNode)), + (result = + 0 === otherNode || otherNode & Node.DOCUMENT_POSITION_FOLLOWING + ? Node.DOCUMENT_POSITION_FOLLOWING + : Node.DOCUMENT_POSITION_PRECEDING))); + return (result |= Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC); + } + parentHostFiber = getPublicInstanceFromHostFiber(children[0]); + children = getPublicInstanceFromHostFiber(children[children.length - 1]); + parentHostInstance = parentHostFiber.compareDocumentPosition(otherNode); + parentResult = children.compareDocumentPosition(otherNode); + result = + parentHostInstance & Node.DOCUMENT_POSITION_CONTAINED_BY || + parentResult & Node.DOCUMENT_POSITION_CONTAINED_BY; + parentResult = + parentHostInstance & Node.DOCUMENT_POSITION_FOLLOWING && + parentResult & Node.DOCUMENT_POSITION_PRECEDING; + return parentHostFiber === otherNode || + children === otherNode || + result || + parentResult + ? Node.DOCUMENT_POSITION_CONTAINED_BY + : parentHostInstance; +}; +function collectChildren(child, collection) { + collection.push(child); + return !1; +} +FragmentInstance.prototype.getRootNode = function (getRootNodeOptions) { + var parentHostFiber = getFragmentParentInstanceOrContainerFiber( + this._fragmentFiber + ); + return null === parentHostFiber + ? this + : getPublicInstanceFromHostFiber(parentHostFiber).getRootNode( + getRootNodeOptions + ); +}; +FragmentInstance.prototype.getClientRects = function () { + var rects = []; + traverseVisibleInstancesAndTextInstances( + this._fragmentFiber.child, + !1, + collectClientRects, + rects, + void 0, + void 0 + ); + return rects; +}; +function collectClientRects(child, rects) { + child = getPublicInstanceFromHostFiber(child); + rects.push(child.getBoundingClientRect()); + return !1; +} +function addFragmentHandleToFiber(child, fragmentInstance) { + child = getPublicInstanceFromHostFiber(child); + null != child && addFragmentHandleToInstance(child, fragmentInstance); + return !1; +} +function addFragmentHandleToInstance(instance, fragmentInstance) { + null == instance.reactFragments && (instance.reactFragments = new Set()); + instance.reactFragments.add(fragmentInstance); +} +function commitNewChildToFragmentInstance(childInstance, fragmentInstance) { + if (null != childInstance.canonical) { + var publicInstance = getPublicInstance(childInstance); + if (null !== fragmentInstance._observers) { + if (null == publicInstance) + throw Error("Expected to find a host node. This is a bug in React."); + fragmentInstance._observers.forEach(function (observer) { + observer.observe(publicInstance); + }); + } + addFragmentHandleToInstance(publicInstance, fragmentInstance); + } +} var HostTransitionContext = { $$typeof: REACT_CONTEXT_TYPE, Provider: null, @@ -12221,9 +13572,6 @@ var HostTransitionContext = { _currentValue2: null, _threadCount: 0 }, - supportsMicrotasks = - "undefined" !== typeof RN$enableMicrotasksInReact && - !!RN$enableMicrotasksInReact, scheduleMicrotask = "function" === typeof queueMicrotask ? queueMicrotask : scheduleTimeout; getFiberCurrentPropsFromNode$1 = function (instance) { @@ -12243,14 +13591,14 @@ ResponderEventPlugin.injection.injectGlobalResponderHandler({ onChange: function (from, to, blockNativeResponder) { from && from.stateNode && - nativeFabricUIManager.setIsJSResponder( + reactPrivateInterface.fabricUIManager.setIsJSResponder( from.stateNode.node, !1, blockNativeResponder || !1 ); to && to.stateNode && - nativeFabricUIManager.setIsJSResponder( + reactPrivateInterface.fabricUIManager.setIsJSResponder( to.stateNode.node, !0, blockNativeResponder || !1 @@ -12259,14 +13607,14 @@ ResponderEventPlugin.injection.injectGlobalResponderHandler({ }); if ( "function" !== - typeof ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog + typeof reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog ) throw Error( "Expected ReactFiberErrorDialog.showErrorDialog to be a function." ); function nativeOnUncaughtError(error, errorInfo) { !1 !== - ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog({ + reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog({ errorBoundary: null, error: error, componentStack: @@ -12275,7 +13623,7 @@ function nativeOnUncaughtError(error, errorInfo) { } function nativeOnCaughtError(error, errorInfo) { !1 !== - ReactNativePrivateInterface.ReactFiberErrorDialog.showErrorDialog({ + reactPrivateInterface.ReactFiberErrorDialog.showErrorDialog({ errorBoundary: errorInfo.errorBoundary, error: error, componentStack: @@ -12296,26 +13644,26 @@ batchedUpdatesImpl = function (fn, a) { } }; var roots = new Map(), - internals$jscomp$inline_1537 = { + internals$jscomp$inline_1630 = { bundleType: 0, - version: "19.2.3", + version: "19.3.0", rendererPackageName: "react-native-renderer", currentDispatcherRef: ReactSharedInternals, - reconcilerVersion: "19.2.3" + reconcilerVersion: "19.3.0" }; null !== extraDevToolsConfig && - (internals$jscomp$inline_1537.rendererConfig = extraDevToolsConfig); + (internals$jscomp$inline_1630.rendererConfig = extraDevToolsConfig); if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var hook$jscomp$inline_1855 = __REACT_DEVTOOLS_GLOBAL_HOOK__; + var hook$jscomp$inline_1972 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if ( - !hook$jscomp$inline_1855.isDisabled && - hook$jscomp$inline_1855.supportsFiber + !hook$jscomp$inline_1972.isDisabled && + hook$jscomp$inline_1972.supportsFiber ) try { - (rendererID = hook$jscomp$inline_1855.inject( - internals$jscomp$inline_1537 + (rendererID = hook$jscomp$inline_1972.inject( + internals$jscomp$inline_1630 )), - (injectedHook = hook$jscomp$inline_1855); + (injectedHook = hook$jscomp$inline_1972); } catch (err) {} } exports.createPortal = function (children, containerTag) { @@ -12327,51 +13675,36 @@ exports.createPortal = function (children, containerTag) { ); }; exports.dispatchCommand = function (handle, command, args) { - var nativeTag = - null != handle._nativeTag - ? handle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance(handle); - null != nativeTag && - ((handle = ReactNativePrivateInterface.getNodeFromPublicInstance(handle)), - null != handle - ? nativeFabricUIManager.dispatchCommand(handle, command, args) - : ReactNativePrivateInterface.UIManager.dispatchViewManagerCommand( - nativeTag, - command, - args - )); + handle = reactPrivateInterface.getNodeFromPublicInstance(handle); + null != handle && + reactPrivateInterface.fabricUIManager.dispatchCommand( + handle, + command, + args + ); }; exports.findHostInstance_DEPRECATED = function (componentOrHandle) { return null == componentOrHandle ? null : componentOrHandle.canonical && componentOrHandle.canonical.publicInstance ? componentOrHandle.canonical.publicInstance - : componentOrHandle._nativeTag - ? componentOrHandle - : findHostInstance(componentOrHandle); + : findHostInstance(componentOrHandle); }; exports.findNodeHandle = function (componentOrHandle) { if (null == componentOrHandle) return null; if ("number" === typeof componentOrHandle) return componentOrHandle; - if (componentOrHandle._nativeTag) return componentOrHandle._nativeTag; if ( null != componentOrHandle.canonical && null != componentOrHandle.canonical.nativeTag ) return componentOrHandle.canonical.nativeTag; var nativeTag = - ReactNativePrivateInterface.getNativeTagFromPublicInstance( - componentOrHandle - ); + reactPrivateInterface.getNativeTagFromPublicInstance(componentOrHandle); if (nativeTag) return nativeTag; componentOrHandle = findHostInstance(componentOrHandle); return null == componentOrHandle ? componentOrHandle - : null != componentOrHandle._nativeTag - ? componentOrHandle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance( - componentOrHandle - ); + : reactPrivateInterface.getNativeTagFromPublicInstance(componentOrHandle); }; exports.getNodeFromInternalInstanceHandle = function (internalInstanceHandle) { return ( @@ -12389,7 +13722,7 @@ exports.getPublicInstanceFromInternalInstanceHandle = function ( : 6 === internalInstanceHandle.tag ? (null == instance.publicInstance && (instance.publicInstance = - ReactNativePrivateInterface.createPublicTextInstance( + reactPrivateInterface.createPublicTextInstance( internalInstanceHandle )), instance.publicInstance) @@ -12426,7 +13759,7 @@ exports.render = function ( (onRecoverableError = options.onRecoverableError); options = { publicInstance: - ReactNativePrivateInterface.createPublicRootInstance(containerTag), + reactPrivateInterface.createPublicRootInstance(containerTag), containerTag: containerTag }; concurrentRoot = concurrentRoot ? 1 : 0; @@ -12472,18 +13805,12 @@ exports.render = function ( return element; }; exports.sendAccessibilityEvent = function (handle, eventType) { - var nativeTag = - null != handle._nativeTag - ? handle._nativeTag - : ReactNativePrivateInterface.getNativeTagFromPublicInstance(handle); - null != nativeTag && - ((handle = ReactNativePrivateInterface.getNodeFromPublicInstance(handle)), - null != handle - ? nativeFabricUIManager.sendAccessibilityEvent(handle, eventType) - : ReactNativePrivateInterface.legacySendAccessibilityEvent( - nativeTag, - eventType - )); + handle = reactPrivateInterface.getNodeFromPublicInstance(handle); + null != handle && + reactPrivateInterface.fabricUIManager.sendAccessibilityEvent( + handle, + eventType + ); }; exports.stopSurface = function (containerTag) { var root = roots.get(containerTag); diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 161dd02d4172..8a0c2450a11c 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -143,7 +143,7 @@ }, "peerDependencies": { "@types/react": "^19.1.1", - "react": "^19.2.3" + "react": "^19.3.0" }, "peerDependenciesMeta": { "@types/react": { @@ -173,7 +173,7 @@ "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.27.0", + "scheduler": "0.28.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.15", diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index 569ceaffe327..3cc5bd708c6a 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -35,7 +35,7 @@ "react-native-test-library-common": "0.87.0-main" }, "peerDependencies": { - "react": "19.2.3", + "react": "19.3.0", "react-native": "0.88.0-rc.0" }, "codegenConfig": { diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index 2db2390c32a2..610bcf90bd9b 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -48,7 +48,7 @@ "nullthrows": "^1.1.1" }, "devDependencies": { - "react-test-renderer": "19.2.3" + "react-test-renderer": "19.3.0" }, "peerDependencies": { "@types/react": "^19.2.0", diff --git a/private/helloworld/package.json b/private/helloworld/package.json index b9e7845c2145..3c6cf9156c2a 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -12,7 +12,7 @@ "test": "jest" }, "dependencies": { - "react": "19.2.3", + "react": "19.3.0", "react-native": "0.88.0-rc.0" }, "devDependencies": { @@ -30,7 +30,7 @@ "eslint": "^8.19.0", "jest": "^29.7.0", "listr2": "^8.2.1", - "react-test-renderer": "19.2.3", + "react-test-renderer": "19.3.0", "rxjs": "^7.8.1" }, "engines": { diff --git a/yarn.lock b/yarn.lock index 813888ae07f9..183603a019e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7876,28 +7876,28 @@ react-devtools-core@^6.1.5: shell-quote "^1.6.1" ws "^7" -react-is@19.2.3, react-is@^16.13.1, react-is@^18.0.0, react-is@^19.2.3: - version "19.2.3" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.3.tgz#eec2feb69c7fb31f77d0b5c08c10ae1c88886b29" - integrity sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA== +react-is@19.3.0, react-is@^16.13.1, react-is@^18.0.0, react-is@^19.3.0: + version "19.3.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.3.0.tgz#716028d67e9993d23a2d353c6d08a3c1ef2bbeb4" + integrity sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA== react-refresh@^0.14.0: version "0.14.2" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-test-renderer@19.2.3: - version "19.2.3" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.2.3.tgz#d20f5193867c98b2df9e13b4e72bb83f311f6a43" - integrity sha512-TMR1LnSFiWZMJkCgNf5ATSvAheTT2NvKIwiVwdBPHxjBI7n/JbWd4gaZ16DVd9foAXdvDz+sB5yxZTwMjPRxpw== +react-test-renderer@19.3.0: + version "19.3.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-19.3.0.tgz#ee5aa54edb563245649f1143aa33f05a48f8de0c" + integrity sha512-AUxgv+hRbqjRgx4xVwiWL6cvDDKPAva1VWLXQIMoevqQn9us//C5TX9LEnBGH47D0zvJpjwjxb1umzgOMvE8Wg== dependencies: - react-is "^19.2.3" - scheduler "^0.27.0" + react-is "^19.3.0" + scheduler "^0.28.0" -react@19.2.3: - version "19.2.3" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.3.tgz#d83e5e8e7a258cf6b4fe28640515f99b87cd19b8" - integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== +react@19.3.0: + version "19.3.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.3.0.tgz#e20aa3a14687075ce863351b5878b0608c3fbfb2" + integrity sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog== readable-stream@^3.4.0: version "3.6.2" @@ -8232,10 +8232,10 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@0.27.0, scheduler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" - integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== +scheduler@0.28.0, scheduler@^0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.28.0.tgz#03d3ca348aeaf8b7502f64468f217b27523f9695" + integrity sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw== selfsigned@^5.5.0: version "5.5.0" From 760b5daf5f9e6d4927c3f4e62d1abfa88a522721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Thu, 10 Sep 2026 17:03:25 -0700 Subject: [PATCH 07/35] Ship enableNativeEventTargetEventDispatching by default (#58450) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58450 The renderer can dispatch events either through the legacy plugin-based system or through the W3C EventTarget API (addEventListener/dispatchEvent), gated behind the enableNativeEventTargetEventDispatching feature flag. Enabling it by default was previously blocked on the renderer, which did not carry the necessary changes until React 19.3.0. That sync has now landed, so flip the flag's default value to true and drop the TODO that tracked the blocker. Fully removing the flag and the legacy dispatch path is left for a follow-up. Changelog: [General][Changed] - Enabled Web-based event dispatching refactor Reviewed By: javache Differential Revision: D119495069 fbshipit-source-id: 53ad5b88c8b5cdd11c3fd1ee27d0f147b83c41a9 (cherry picked from commit 31d33ce91b127b434228c8d912810563afdede54) --- .../scripts/featureflags/ReactNativeFeatureFlags.config.js | 3 +-- .../src/private/featureflags/ReactNativeFeatureFlags.js | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 2166f296602a..0cc13465858c 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -1033,9 +1033,8 @@ const definitions: FeatureFlagDefinitions = { // TODO: This should be "canary" now but the OSS renderer cannot be upgraded with the necessary changes until React 19.3.0 is released. ossReleaseStage: 'none', }, - // TODO: This feature flag should be shipped and clean up now, but the OSS renderer cannot be upgraded with the necessary changes until React 19.3.0 is released. enableNativeEventTargetEventDispatching: { - defaultValue: false, + defaultValue: true, metadata: { dateAdded: '2026-04-13', description: diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index e9e97cc712a9..dc800cc0bf01 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<51d7012509e3e0f2fe1caef5dc1060a0>> * @flow strict * @noformat */ @@ -175,7 +175,7 @@ export const enableImperativeEvents: Getter = createJavaScriptFlagGette /** * When enabled, the React Native renderer dispatches events through the W3C EventTarget API (addEventListener/dispatchEvent) instead of the legacy plugin-based system. */ -export const enableNativeEventTargetEventDispatching: Getter = createJavaScriptFlagGetter('enableNativeEventTargetEventDispatching', false); +export const enableNativeEventTargetEventDispatching: Getter = createJavaScriptFlagGetter('enableNativeEventTargetEventDispatching', true); /** * Enable the external inspection API for DevTools to communicate with the Inspector overlay. From a855c0431f18881e5c320e2519555cb8929d8809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Fri, 11 Sep 2026 05:08:33 -0700 Subject: [PATCH 08/35] Enable the imperative EventTarget API in canary (#58479) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58479 `enableImperativeEvents` was defined as a JS-only feature flag, but OSS release stages are only applied to common flags: `ossReleaseStage` is consumed exclusively by the generators that produce the native override classes, so setting it on a JS-only flag is silently a no-op. The feature could therefore never be shipped through the canary channel. This defines `enableImperativeEvents` as a common flag at release stage `canary`, and renames the JS-only flag to `enableImperativeEvents_DEPRECATED`. The deprecated flag is kept because the common flag is read through the native module: a JS bundle delivered to a native build that predates this change finds no such method and falls back to the default, which would silently turn the feature off. The gate in `ReactNativeElement` and `ReadOnlyText` now keeps the public EventTarget methods when either flag is enabled. Changelog: [General][Added] - Enable the imperative EventTarget API (`addEventListener`, `removeEventListener`, `dispatchEvent`) on native view refs in canary Reviewed By: javache Differential Revision: D119645412 fbshipit-source-id: 4fd33dfaff1640fd5d40b5bc9c3f657ea7b3bb86 (cherry picked from commit 8480b86820b4535c9bec2967a0f16afed5292a0e) --- .../featureflags/ReactNativeFeatureFlags.kt | 8 +- .../ReactNativeFeatureFlagsCxxAccessor.kt | 12 +- .../ReactNativeFeatureFlagsCxxInterop.kt | 4 +- .../ReactNativeFeatureFlagsDefaults.kt | 4 +- .../ReactNativeFeatureFlagsLocalAccessor.kt | 13 +- ...tureFlagsOverrides_RNOSS_Canary_Android.kt | 4 +- .../ReactNativeFeatureFlagsProvider.kt | 4 +- .../JReactNativeFeatureFlagsCxxInterop.cpp | 16 ++- .../JReactNativeFeatureFlagsCxxInterop.h | 5 +- .../featureflags/ReactNativeFeatureFlags.cpp | 6 +- .../featureflags/ReactNativeFeatureFlags.h | 7 +- .../ReactNativeFeatureFlagsAccessor.cpp | 130 ++++++++++-------- .../ReactNativeFeatureFlagsAccessor.h | 6 +- .../ReactNativeFeatureFlagsDefaults.h | 6 +- .../ReactNativeFeatureFlagsDynamicProvider.h | 11 +- ...eactNativeFeatureFlagsOverridesOSSCanary.h | 6 +- .../ReactNativeFeatureFlagsProvider.h | 3 +- .../NativeReactNativeFeatureFlags.cpp | 7 +- .../NativeReactNativeFeatureFlags.h | 4 +- .../ReactNativeFeatureFlags.config.js | 15 +- .../featureflags/ReactNativeFeatureFlags.js | 13 +- .../specs/NativeReactNativeFeatureFlags.js | 3 +- .../webapis/dom/nodes/ReactNativeElement.js | 10 +- .../private/webapis/dom/nodes/ReadOnlyText.js | 10 +- 24 files changed, 216 insertions(+), 91 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index 8a3a0f464bf9..3408b7721a92 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -216,6 +216,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = accessor.enableImmediateUpdateModeForContentOffsetChanges() + /** + * When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes. + */ + @JvmStatic + public fun enableImperativeEvents(): Boolean = accessor.enableImperativeEvents() + /** * Enable ref.focus() and ref.blur() for all views, not just TextInput. */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index eeef92fa9bdb..625d122b102d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<68aefd0293540d56f57e8badc0de04c8>> + * @generated SignedSource<> */ /** @@ -51,6 +51,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces private var enableImagePrefetchingAndroidCache: Boolean? = null private var enableImageTransparentTintColorCache: Boolean? = null private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null + private var enableImperativeEventsCache: Boolean? = null private var enableImperativeFocusCache: Boolean? = null private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null private var enableIntersectionObserverByDefaultCache: Boolean? = null @@ -386,6 +387,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun enableImperativeEvents(): Boolean { + var cached = enableImperativeEventsCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableImperativeEvents() + enableImperativeEventsCache = cached + } + return cached + } + override fun enableImperativeFocus(): Boolean { var cached = enableImperativeFocusCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index 5858d3e1cf1b..6ab4e2b8e8f6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<247f721796621af8615014477518bcd9>> + * @generated SignedSource<<8a0d1f134b175ada7550499896c09203>> */ /** @@ -90,6 +90,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean + @DoNotStrip @JvmStatic public external fun enableImperativeEvents(): Boolean + @DoNotStrip @JvmStatic public external fun enableImperativeFocus(): Boolean @DoNotStrip @JvmStatic public external fun enableInteropViewManagerClassLookUpOptimizationIOS(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index cbddf085960a..c1c81a8d4109 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<33071257f9c96a8664c9af429e387061>> + * @generated SignedSource<<891abee69433c105d062b45ed357fd5c>> */ /** @@ -85,6 +85,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean = false + override fun enableImperativeEvents(): Boolean = false + override fun enableImperativeFocus(): Boolean = false override fun enableInteropViewManagerClassLookUpOptimizationIOS(): Boolean = false diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 2c4b30b0e025..209ec0d5defb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<4c62625780d9f767714f8481c7496342>> */ /** @@ -55,6 +55,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc private var enableImagePrefetchingAndroidCache: Boolean? = null private var enableImageTransparentTintColorCache: Boolean? = null private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null + private var enableImperativeEventsCache: Boolean? = null private var enableImperativeFocusCache: Boolean? = null private var enableInteropViewManagerClassLookUpOptimizationIOSCache: Boolean? = null private var enableIntersectionObserverByDefaultCache: Boolean? = null @@ -421,6 +422,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc return cached } + override fun enableImperativeEvents(): Boolean { + var cached = enableImperativeEventsCache + if (cached == null) { + cached = currentProvider.enableImperativeEvents() + accessedFeatureFlags.add("enableImperativeEvents") + enableImperativeEventsCache = cached + } + return cached + } + override fun enableImperativeFocus(): Boolean { var cached = enableImperativeFocusCache if (cached == null) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt index 68858e30399b..7d945676704d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<22ab94c6b0cc8f7ee39d546d9b93540a>> + * @generated SignedSource<<843b2fa7e358dd73c9db083e42b93be6>> */ /** @@ -27,6 +27,8 @@ public open class ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android : ReactN override fun enableAccessibilityOrder(): Boolean = true + override fun enableImperativeEvents(): Boolean = true + override fun enableIntersectionObserverByDefault(): Boolean = true override fun enableSwiftUIBasedFilters(): Boolean = true diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index d7d75f50493b..05fc4e0b2bef 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<915bf918212b9898319de61d4cadaa13>> + * @generated SignedSource<> */ /** @@ -85,6 +85,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean + @DoNotStrip public fun enableImperativeEvents(): Boolean + @DoNotStrip public fun enableImperativeFocus(): Boolean @DoNotStrip public fun enableInteropViewManagerClassLookUpOptimizationIOS(): Boolean diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index baa669d6b96b..6aa1c470cb25 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<177c5cc7f6e970a2d4454c32d7f777ef>> + * @generated SignedSource<> */ /** @@ -225,6 +225,12 @@ class ReactNativeFeatureFlagsJavaProvider return method(javaProvider_); } + bool enableImperativeEvents() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableImperativeEvents"); + return method(javaProvider_); + } + bool enableImperativeFocus() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableImperativeFocus"); @@ -714,6 +720,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffs return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges(); } +bool JReactNativeFeatureFlagsCxxInterop::enableImperativeEvents( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableImperativeEvents(); +} + bool JReactNativeFeatureFlagsCxxInterop::enableImperativeFocus( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableImperativeFocus(); @@ -1113,6 +1124,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableImmediateUpdateModeForContentOffsetChanges", JReactNativeFeatureFlagsCxxInterop::enableImmediateUpdateModeForContentOffsetChanges), + makeNativeMethod( + "enableImperativeEvents", + JReactNativeFeatureFlagsCxxInterop::enableImperativeEvents), makeNativeMethod( "enableImperativeFocus", JReactNativeFeatureFlagsCxxInterop::enableImperativeFocus), diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index 73a8b8bfe5c3..ddf10b023732 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -123,6 +123,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableImmediateUpdateModeForContentOffsetChanges( facebook::jni::alias_ref); + static bool enableImperativeEvents( + facebook::jni::alias_ref); + static bool enableImperativeFocus( facebook::jni::alias_ref); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index e2adeca46391..0b8ecc17507c 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<7b726d7483bb35062b79e582323f0d7e>> + * @generated SignedSource<<023b0be9315450130aac118c65ac53eb>> */ /** @@ -150,6 +150,10 @@ bool ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges() return getAccessor().enableImmediateUpdateModeForContentOffsetChanges(); } +bool ReactNativeFeatureFlags::enableImperativeEvents() { + return getAccessor().enableImperativeEvents(); +} + bool ReactNativeFeatureFlags::enableImperativeFocus() { return getAccessor().enableImperativeFocus(); } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index 49079da65ebf..6e383bdda111 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<1e9009301b79f977132c4fa5599aebdd>> + * @generated SignedSource<<0537b7ab2bf0250ddd0cfaec6c52111b>> */ /** @@ -196,6 +196,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableImmediateUpdateModeForContentOffsetChanges(); + /** + * When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes. + */ + RN_EXPORT static bool enableImperativeEvents(); + /** * Enable ref.focus() and ref.blur() for all views, not just TextInput. */ diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index 24db6caafcd3..5a315e512cec 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<7b2f18c94d995b2108f91248fdfecb0c>> + * @generated SignedSource<> */ /** @@ -587,6 +587,24 @@ bool ReactNativeFeatureFlagsAccessor::enableImmediateUpdateModeForContentOffsetC return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::enableImperativeEvents() { + auto flagValue = enableImperativeEvents_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(31, "enableImperativeEvents"); + + flagValue = currentProvider_->enableImperativeEvents(); + enableImperativeEvents_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::enableImperativeFocus() { auto flagValue = enableImperativeFocus_.load(); @@ -596,7 +614,7 @@ bool ReactNativeFeatureFlagsAccessor::enableImperativeFocus() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(31, "enableImperativeFocus"); + markFlagAsAccessed(32, "enableImperativeFocus"); flagValue = currentProvider_->enableImperativeFocus(); enableImperativeFocus_ = flagValue; @@ -614,7 +632,7 @@ bool ReactNativeFeatureFlagsAccessor::enableInteropViewManagerClassLookUpOptimiz // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(32, "enableInteropViewManagerClassLookUpOptimizationIOS"); + markFlagAsAccessed(33, "enableInteropViewManagerClassLookUpOptimizationIOS"); flagValue = currentProvider_->enableInteropViewManagerClassLookUpOptimizationIOS(); enableInteropViewManagerClassLookUpOptimizationIOS_ = flagValue; @@ -632,7 +650,7 @@ bool ReactNativeFeatureFlagsAccessor::enableIntersectionObserverByDefault() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(33, "enableIntersectionObserverByDefault"); + markFlagAsAccessed(34, "enableIntersectionObserverByDefault"); flagValue = currentProvider_->enableIntersectionObserverByDefault(); enableIntersectionObserverByDefault_ = flagValue; @@ -650,7 +668,7 @@ bool ReactNativeFeatureFlagsAccessor::enableKeyEvents() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(34, "enableKeyEvents"); + markFlagAsAccessed(35, "enableKeyEvents"); flagValue = currentProvider_->enableKeyEvents(); enableKeyEvents_ = flagValue; @@ -668,7 +686,7 @@ bool ReactNativeFeatureFlagsAccessor::enableLayoutAnimationsOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(35, "enableLayoutAnimationsOnAndroid"); + markFlagAsAccessed(36, "enableLayoutAnimationsOnAndroid"); flagValue = currentProvider_->enableLayoutAnimationsOnAndroid(); enableLayoutAnimationsOnAndroid_ = flagValue; @@ -686,7 +704,7 @@ bool ReactNativeFeatureFlagsAccessor::enableLayoutAnimationsOnIOS() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(36, "enableLayoutAnimationsOnIOS"); + markFlagAsAccessed(37, "enableLayoutAnimationsOnIOS"); flagValue = currentProvider_->enableLayoutAnimationsOnIOS(); enableLayoutAnimationsOnIOS_ = flagValue; @@ -704,7 +722,7 @@ bool ReactNativeFeatureFlagsAccessor::enableModuleArgumentNSNullConversionIOS() // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(37, "enableModuleArgumentNSNullConversionIOS"); + markFlagAsAccessed(38, "enableModuleArgumentNSNullConversionIOS"); flagValue = currentProvider_->enableModuleArgumentNSNullConversionIOS(); enableModuleArgumentNSNullConversionIOS_ = flagValue; @@ -722,7 +740,7 @@ bool ReactNativeFeatureFlagsAccessor::enableMountingCoordinatorPullModelAndroid( // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(38, "enableMountingCoordinatorPullModelAndroid"); + markFlagAsAccessed(39, "enableMountingCoordinatorPullModelAndroid"); flagValue = currentProvider_->enableMountingCoordinatorPullModelAndroid(); enableMountingCoordinatorPullModelAndroid_ = flagValue; @@ -740,7 +758,7 @@ bool ReactNativeFeatureFlagsAccessor::enableMutationObserverByDefault() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(39, "enableMutationObserverByDefault"); + markFlagAsAccessed(40, "enableMutationObserverByDefault"); flagValue = currentProvider_->enableMutationObserverByDefault(); enableMutationObserverByDefault_ = flagValue; @@ -758,7 +776,7 @@ bool ReactNativeFeatureFlagsAccessor::enableNativeCSSParsing() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(40, "enableNativeCSSParsing"); + markFlagAsAccessed(41, "enableNativeCSSParsing"); flagValue = currentProvider_->enableNativeCSSParsing(); enableNativeCSSParsing_ = flagValue; @@ -776,7 +794,7 @@ bool ReactNativeFeatureFlagsAccessor::enablePreparedTextLayout() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(41, "enablePreparedTextLayout"); + markFlagAsAccessed(42, "enablePreparedTextLayout"); flagValue = currentProvider_->enablePreparedTextLayout(); enablePreparedTextLayout_ = flagValue; @@ -794,7 +812,7 @@ bool ReactNativeFeatureFlagsAccessor::enablePropsUpdateReconciliationAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(42, "enablePropsUpdateReconciliationAndroid"); + markFlagAsAccessed(43, "enablePropsUpdateReconciliationAndroid"); flagValue = currentProvider_->enablePropsUpdateReconciliationAndroid(); enablePropsUpdateReconciliationAndroid_ = flagValue; @@ -812,7 +830,7 @@ bool ReactNativeFeatureFlagsAccessor::enableResizeObserverByDefault() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(43, "enableResizeObserverByDefault"); + markFlagAsAccessed(44, "enableResizeObserverByDefault"); flagValue = currentProvider_->enableResizeObserverByDefault(); enableResizeObserverByDefault_ = flagValue; @@ -830,7 +848,7 @@ bool ReactNativeFeatureFlagsAccessor::enableSwiftUIBasedFilters() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(44, "enableSwiftUIBasedFilters"); + markFlagAsAccessed(45, "enableSwiftUIBasedFilters"); flagValue = currentProvider_->enableSwiftUIBasedFilters(); enableSwiftUIBasedFilters_ = flagValue; @@ -848,7 +866,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewCulling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(45, "enableViewCulling"); + markFlagAsAccessed(46, "enableViewCulling"); flagValue = currentProvider_->enableViewCulling(); enableViewCulling_ = flagValue; @@ -866,7 +884,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecycling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(46, "enableViewRecycling"); + markFlagAsAccessed(47, "enableViewRecycling"); flagValue = currentProvider_->enableViewRecycling(); enableViewRecycling_ = flagValue; @@ -884,7 +902,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForImage() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(47, "enableViewRecyclingForImage"); + markFlagAsAccessed(48, "enableViewRecyclingForImage"); flagValue = currentProvider_->enableViewRecyclingForImage(); enableViewRecyclingForImage_ = flagValue; @@ -902,7 +920,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForScrollView() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(48, "enableViewRecyclingForScrollView"); + markFlagAsAccessed(49, "enableViewRecyclingForScrollView"); flagValue = currentProvider_->enableViewRecyclingForScrollView(); enableViewRecyclingForScrollView_ = flagValue; @@ -920,7 +938,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForText() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(49, "enableViewRecyclingForText"); + markFlagAsAccessed(50, "enableViewRecyclingForText"); flagValue = currentProvider_->enableViewRecyclingForText(); enableViewRecyclingForText_ = flagValue; @@ -938,7 +956,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecyclingForView() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(50, "enableViewRecyclingForView"); + markFlagAsAccessed(51, "enableViewRecyclingForView"); flagValue = currentProvider_->enableViewRecyclingForView(); enableViewRecyclingForView_ = flagValue; @@ -956,7 +974,7 @@ bool ReactNativeFeatureFlagsAccessor::enableVirtualViewContainerStateExperimenta // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(51, "enableVirtualViewContainerStateExperimental"); + markFlagAsAccessed(52, "enableVirtualViewContainerStateExperimental"); flagValue = currentProvider_->enableVirtualViewContainerStateExperimental(); enableVirtualViewContainerStateExperimental_ = flagValue; @@ -974,7 +992,7 @@ bool ReactNativeFeatureFlagsAccessor::fixDifferentiatorParentTagForUnflattenCase // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(52, "fixDifferentiatorParentTagForUnflattenCase"); + markFlagAsAccessed(53, "fixDifferentiatorParentTagForUnflattenCase"); flagValue = currentProvider_->fixDifferentiatorParentTagForUnflattenCase(); fixDifferentiatorParentTagForUnflattenCase_ = flagValue; @@ -992,7 +1010,7 @@ bool ReactNativeFeatureFlagsAccessor::fixMappingOfEventPrioritiesBetweenFabricAn // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(53, "fixMappingOfEventPrioritiesBetweenFabricAndReact"); + markFlagAsAccessed(54, "fixMappingOfEventPrioritiesBetweenFabricAndReact"); flagValue = currentProvider_->fixMappingOfEventPrioritiesBetweenFabricAndReact(); fixMappingOfEventPrioritiesBetweenFabricAndReact_ = flagValue; @@ -1010,7 +1028,7 @@ bool ReactNativeFeatureFlagsAccessor::fixYogaFlexBasisFitContentInMainAxis() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(54, "fixYogaFlexBasisFitContentInMainAxis"); + markFlagAsAccessed(55, "fixYogaFlexBasisFitContentInMainAxis"); flagValue = currentProvider_->fixYogaFlexBasisFitContentInMainAxis(); fixYogaFlexBasisFitContentInMainAxis_ = flagValue; @@ -1028,7 +1046,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxAssertSingleHostState() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(55, "fuseboxAssertSingleHostState"); + markFlagAsAccessed(56, "fuseboxAssertSingleHostState"); flagValue = currentProvider_->fuseboxAssertSingleHostState(); fuseboxAssertSingleHostState_ = flagValue; @@ -1046,7 +1064,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledRelease() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(56, "fuseboxEnabledRelease"); + markFlagAsAccessed(57, "fuseboxEnabledRelease"); flagValue = currentProvider_->fuseboxEnabledRelease(); fuseboxEnabledRelease_ = flagValue; @@ -1064,7 +1082,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxFrameRecordingEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(57, "fuseboxFrameRecordingEnabled"); + markFlagAsAccessed(58, "fuseboxFrameRecordingEnabled"); flagValue = currentProvider_->fuseboxFrameRecordingEnabled(); fuseboxFrameRecordingEnabled_ = flagValue; @@ -1082,7 +1100,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxScreenshotCaptureEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(58, "fuseboxScreenshotCaptureEnabled"); + markFlagAsAccessed(59, "fuseboxScreenshotCaptureEnabled"); flagValue = currentProvider_->fuseboxScreenshotCaptureEnabled(); fuseboxScreenshotCaptureEnabled_ = flagValue; @@ -1100,7 +1118,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxWebSocketEventsEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(59, "fuseboxWebSocketEventsEnabled"); + markFlagAsAccessed(60, "fuseboxWebSocketEventsEnabled"); flagValue = currentProvider_->fuseboxWebSocketEventsEnabled(); fuseboxWebSocketEventsEnabled_ = flagValue; @@ -1118,7 +1136,7 @@ bool ReactNativeFeatureFlagsAccessor::optimizedAnimatedPropUpdates() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(60, "optimizedAnimatedPropUpdates"); + markFlagAsAccessed(61, "optimizedAnimatedPropUpdates"); flagValue = currentProvider_->optimizedAnimatedPropUpdates(); optimizedAnimatedPropUpdates_ = flagValue; @@ -1136,7 +1154,7 @@ bool ReactNativeFeatureFlagsAccessor::overrideBySynchronousMountPropsAtMountingA // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(61, "overrideBySynchronousMountPropsAtMountingAndroid"); + markFlagAsAccessed(62, "overrideBySynchronousMountPropsAtMountingAndroid"); flagValue = currentProvider_->overrideBySynchronousMountPropsAtMountingAndroid(); overrideBySynchronousMountPropsAtMountingAndroid_ = flagValue; @@ -1154,7 +1172,7 @@ bool ReactNativeFeatureFlagsAccessor::perfIssuesEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(62, "perfIssuesEnabled"); + markFlagAsAccessed(63, "perfIssuesEnabled"); flagValue = currentProvider_->perfIssuesEnabled(); perfIssuesEnabled_ = flagValue; @@ -1172,7 +1190,7 @@ bool ReactNativeFeatureFlagsAccessor::perfMonitorV2Enabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(63, "perfMonitorV2Enabled"); + markFlagAsAccessed(64, "perfMonitorV2Enabled"); flagValue = currentProvider_->perfMonitorV2Enabled(); perfMonitorV2Enabled_ = flagValue; @@ -1190,7 +1208,7 @@ double ReactNativeFeatureFlagsAccessor::preparedTextCacheSize() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(64, "preparedTextCacheSize"); + markFlagAsAccessed(65, "preparedTextCacheSize"); flagValue = currentProvider_->preparedTextCacheSize(); preparedTextCacheSize_ = flagValue; @@ -1208,7 +1226,7 @@ bool ReactNativeFeatureFlagsAccessor::preventShadowTreeCommitExhaustion() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(65, "preventShadowTreeCommitExhaustion"); + markFlagAsAccessed(66, "preventShadowTreeCommitExhaustion"); flagValue = currentProvider_->preventShadowTreeCommitExhaustion(); preventShadowTreeCommitExhaustion_ = flagValue; @@ -1226,7 +1244,7 @@ bool ReactNativeFeatureFlagsAccessor::redBoxV2Android() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(66, "redBoxV2Android"); + markFlagAsAccessed(67, "redBoxV2Android"); flagValue = currentProvider_->redBoxV2Android(); redBoxV2Android_ = flagValue; @@ -1244,7 +1262,7 @@ bool ReactNativeFeatureFlagsAccessor::redBoxV2IOS() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(67, "redBoxV2IOS"); + markFlagAsAccessed(68, "redBoxV2IOS"); flagValue = currentProvider_->redBoxV2IOS(); redBoxV2IOS_ = flagValue; @@ -1262,7 +1280,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldPressibilityUseW3CPointerEventsForHo // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(68, "shouldPressibilityUseW3CPointerEventsForHover"); + markFlagAsAccessed(69, "shouldPressibilityUseW3CPointerEventsForHover"); flagValue = currentProvider_->shouldPressibilityUseW3CPointerEventsForHover(); shouldPressibilityUseW3CPointerEventsForHover_ = flagValue; @@ -1280,7 +1298,7 @@ bool ReactNativeFeatureFlagsAccessor::shouldTriggerResponderTransferOnScrollAndr // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(69, "shouldTriggerResponderTransferOnScrollAndroid"); + markFlagAsAccessed(70, "shouldTriggerResponderTransferOnScrollAndroid"); flagValue = currentProvider_->shouldTriggerResponderTransferOnScrollAndroid(); shouldTriggerResponderTransferOnScrollAndroid_ = flagValue; @@ -1298,7 +1316,7 @@ bool ReactNativeFeatureFlagsAccessor::skipActivityIdentityAssertionOnHostPause() // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(70, "skipActivityIdentityAssertionOnHostPause"); + markFlagAsAccessed(71, "skipActivityIdentityAssertionOnHostPause"); flagValue = currentProvider_->skipActivityIdentityAssertionOnHostPause(); skipActivityIdentityAssertionOnHostPause_ = flagValue; @@ -1316,7 +1334,7 @@ bool ReactNativeFeatureFlagsAccessor::syncAndroidClipBoundsWithOverflow() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(71, "syncAndroidClipBoundsWithOverflow"); + markFlagAsAccessed(72, "syncAndroidClipBoundsWithOverflow"); flagValue = currentProvider_->syncAndroidClipBoundsWithOverflow(); syncAndroidClipBoundsWithOverflow_ = flagValue; @@ -1334,7 +1352,7 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(72, "traceTurboModulePromiseRejectionsOnAndroid"); + markFlagAsAccessed(73, "traceTurboModulePromiseRejectionsOnAndroid"); flagValue = currentProvider_->traceTurboModulePromiseRejectionsOnAndroid(); traceTurboModulePromiseRejectionsOnAndroid_ = flagValue; @@ -1352,7 +1370,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommit( // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(73, "updateRuntimeShadowNodeReferencesOnCommit"); + markFlagAsAccessed(74, "updateRuntimeShadowNodeReferencesOnCommit"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommit(); updateRuntimeShadowNodeReferencesOnCommit_ = flagValue; @@ -1370,7 +1388,7 @@ bool ReactNativeFeatureFlagsAccessor::updateRuntimeShadowNodeReferencesOnCommitT // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(74, "updateRuntimeShadowNodeReferencesOnCommitThread"); + markFlagAsAccessed(75, "updateRuntimeShadowNodeReferencesOnCommitThread"); flagValue = currentProvider_->updateRuntimeShadowNodeReferencesOnCommitThread(); updateRuntimeShadowNodeReferencesOnCommitThread_ = flagValue; @@ -1388,7 +1406,7 @@ bool ReactNativeFeatureFlagsAccessor::useAlwaysAvailableJSErrorHandling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(75, "useAlwaysAvailableJSErrorHandling"); + markFlagAsAccessed(76, "useAlwaysAvailableJSErrorHandling"); flagValue = currentProvider_->useAlwaysAvailableJSErrorHandling(); useAlwaysAvailableJSErrorHandling_ = flagValue; @@ -1406,7 +1424,7 @@ bool ReactNativeFeatureFlagsAccessor::useFabricInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(76, "useFabricInterop"); + markFlagAsAccessed(77, "useFabricInterop"); flagValue = currentProvider_->useFabricInterop(); useFabricInterop_ = flagValue; @@ -1424,7 +1442,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeViewConfigsInBridgelessMode() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(77, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(78, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; @@ -1442,7 +1460,7 @@ bool ReactNativeFeatureFlagsAccessor::useNestedScrollViewAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(78, "useNestedScrollViewAndroid"); + markFlagAsAccessed(79, "useNestedScrollViewAndroid"); flagValue = currentProvider_->useNestedScrollViewAndroid(); useNestedScrollViewAndroid_ = flagValue; @@ -1460,7 +1478,7 @@ bool ReactNativeFeatureFlagsAccessor::useSharedAnimatedBackend() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(79, "useSharedAnimatedBackend"); + markFlagAsAccessed(80, "useSharedAnimatedBackend"); flagValue = currentProvider_->useSharedAnimatedBackend(); useSharedAnimatedBackend_ = flagValue; @@ -1478,7 +1496,7 @@ bool ReactNativeFeatureFlagsAccessor::useTraitHiddenOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(80, "useTraitHiddenOnAndroid"); + markFlagAsAccessed(81, "useTraitHiddenOnAndroid"); flagValue = currentProvider_->useTraitHiddenOnAndroid(); useTraitHiddenOnAndroid_ = flagValue; @@ -1496,7 +1514,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(81, "useTurboModuleInterop"); + markFlagAsAccessed(82, "useTurboModuleInterop"); flagValue = currentProvider_->useTurboModuleInterop(); useTurboModuleInterop_ = flagValue; @@ -1514,7 +1532,7 @@ double ReactNativeFeatureFlagsAccessor::viewCullingOutsetRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(82, "viewCullingOutsetRatio"); + markFlagAsAccessed(83, "viewCullingOutsetRatio"); flagValue = currentProvider_->viewCullingOutsetRatio(); viewCullingOutsetRatio_ = flagValue; @@ -1532,7 +1550,7 @@ bool ReactNativeFeatureFlagsAccessor::viewTransitionEnabled() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(83, "viewTransitionEnabled"); + markFlagAsAccessed(84, "viewTransitionEnabled"); flagValue = currentProvider_->viewTransitionEnabled(); viewTransitionEnabled_ = flagValue; @@ -1550,7 +1568,7 @@ bool ReactNativeFeatureFlagsAccessor::viewTransitionUseHardwareBitmapAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(84, "viewTransitionUseHardwareBitmapAndroid"); + markFlagAsAccessed(85, "viewTransitionUseHardwareBitmapAndroid"); flagValue = currentProvider_->viewTransitionUseHardwareBitmapAndroid(); viewTransitionUseHardwareBitmapAndroid_ = flagValue; @@ -1568,7 +1586,7 @@ double ReactNativeFeatureFlagsAccessor::virtualViewPrerenderRatio() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(85, "virtualViewPrerenderRatio"); + markFlagAsAccessed(86, "virtualViewPrerenderRatio"); flagValue = currentProvider_->virtualViewPrerenderRatio(); virtualViewPrerenderRatio_ = flagValue; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index c0716136aeb7..f8a58a3e5428 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -65,6 +65,7 @@ class ReactNativeFeatureFlagsAccessor { bool enableImagePrefetchingAndroid(); bool enableImageTransparentTintColor(); bool enableImmediateUpdateModeForContentOffsetChanges(); + bool enableImperativeEvents(); bool enableImperativeFocus(); bool enableInteropViewManagerClassLookUpOptimizationIOS(); bool enableIntersectionObserverByDefault(); @@ -131,7 +132,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 86> accessedFeatureFlags_; + std::array, 87> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> cdpInteractionMetricsEnabled_; @@ -164,6 +165,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> enableImagePrefetchingAndroid_; std::atomic> enableImageTransparentTintColor_; std::atomic> enableImmediateUpdateModeForContentOffsetChanges_; + std::atomic> enableImperativeEvents_; std::atomic> enableImperativeFocus_; std::atomic> enableInteropViewManagerClassLookUpOptimizationIOS_; std::atomic> enableIntersectionObserverByDefault_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 0b167dc52b96..39bf7e4e6b25 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<2a5f641d6506566cc26cb76f62300bbb>> + * @generated SignedSource<> */ /** @@ -153,6 +153,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool enableImperativeEvents() override { + return false; + } + bool enableImperativeFocus() override { return false; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h index a296d81dd673..a29d9360ec56 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<570eb4a5cab112e5f8ea0b4fb1fa205c>> + * @generated SignedSource<> */ /** @@ -326,6 +326,15 @@ class ReactNativeFeatureFlagsDynamicProvider : public ReactNativeFeatureFlagsDef return ReactNativeFeatureFlagsDefaults::enableImmediateUpdateModeForContentOffsetChanges(); } + bool enableImperativeEvents() override { + auto value = values_["enableImperativeEvents"]; + if (!value.isNull()) { + return value.getBool(); + } + + return ReactNativeFeatureFlagsDefaults::enableImperativeEvents(); + } + bool enableImperativeFocus() override { auto value = values_["enableImperativeFocus"]; if (!value.isNull()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h index 03bc1b4e775d..00e5f1bf0dae 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<650cb266846c66577dde6d7c7a703af1>> + * @generated SignedSource<> */ /** @@ -37,6 +37,10 @@ class ReactNativeFeatureFlagsOverridesOSSCanary : public ReactNativeFeatureFlags return true; } + bool enableImperativeEvents() override { + return true; + } + bool enableIntersectionObserverByDefault() override { return true; } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index 1fe8ae4c5de5..215a8d846bf9 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<0bbf1352906bbe1642cab3d2b92173e6>> + * @generated SignedSource<> */ /** @@ -58,6 +58,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool enableImagePrefetchingAndroid() = 0; virtual bool enableImageTransparentTintColor() = 0; virtual bool enableImmediateUpdateModeForContentOffsetChanges() = 0; + virtual bool enableImperativeEvents() = 0; virtual bool enableImperativeFocus() = 0; virtual bool enableInteropViewManagerClassLookUpOptimizationIOS() = 0; virtual bool enableIntersectionObserverByDefault() = 0; diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index fe848aff41dc..a0fd7464f0b1 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<7505981b27be5298787edef4d80527e8>> + * @generated SignedSource<<909f4afa6f96b4e77577432e4d98ba76>> */ /** @@ -199,6 +199,11 @@ bool NativeReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetCha return ReactNativeFeatureFlags::enableImmediateUpdateModeForContentOffsetChanges(); } +bool NativeReactNativeFeatureFlags::enableImperativeEvents( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableImperativeEvents(); +} + bool NativeReactNativeFeatureFlags::enableImperativeFocus( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableImperativeFocus(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 33154de77629..1a4b411746df 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<88f2554b7033d38f5b275eac1d52ae6e>> */ /** @@ -100,6 +100,8 @@ class NativeReactNativeFeatureFlags bool enableImmediateUpdateModeForContentOffsetChanges(jsi::Runtime& runtime); + bool enableImperativeEvents(jsi::Runtime& runtime); + bool enableImperativeFocus(jsi::Runtime& runtime); bool enableInteropViewManagerClassLookUpOptimizationIOS(jsi::Runtime& runtime); diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index 0cc13465858c..a28164193d10 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -381,6 +381,16 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'none', }, + enableImperativeEvents: { + defaultValue: false, + metadata: { + description: + 'When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes.', + expectedReleaseValue: true, + purpose: 'release', + }, + ossReleaseStage: 'canary', + }, enableImperativeFocus: { defaultValue: false, metadata: { @@ -1022,15 +1032,14 @@ const definitions: FeatureFlagDefinitions = { }, ossReleaseStage: 'none', }, - enableImperativeEvents: { + enableImperativeEvents_DEPRECATED: { defaultValue: false, metadata: { description: - 'When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes.', + 'Deprecated in favor of the common flag with the same name, which is the one that can be configured by OSS release stage. This is only kept so JS bundles delivered to older native builds, where the common flag is unavailable, can still enable the feature.', expectedReleaseValue: true, purpose: 'release', }, - // TODO: This should be "canary" now but the OSS renderer cannot be upgraded with the necessary changes until React 19.3.0 is released. ossReleaseStage: 'none', }, enableNativeEventTargetEventDispatching: { diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index dc800cc0bf01..dc80a6d559c7 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<51d7012509e3e0f2fe1caef5dc1060a0>> + * @generated SignedSource<<52d39a196023796eed43d419c5a0b855>> * @flow strict * @noformat */ @@ -34,7 +34,7 @@ export type ReactNativeFeatureFlagsJsOnly = Readonly<{ animatedKeepListenersOnDetach: Getter, animatedShouldSyncValueBeforeStartCallback: Getter, deferFlatListFocusChangeRenderUpdate: Getter, - enableImperativeEvents: Getter, + enableImperativeEvents_DEPRECATED: Getter, enableNativeEventTargetEventDispatching: Getter, externalElementInspectionEnabled: Getter, fixVirtualizeListCollapseWindowSize: Getter, @@ -80,6 +80,7 @@ export type ReactNativeFeatureFlags = Readonly<{ enableImagePrefetchingAndroid: Getter, enableImageTransparentTintColor: Getter, enableImmediateUpdateModeForContentOffsetChanges: Getter, + enableImperativeEvents: Getter, enableImperativeFocus: Getter, enableInteropViewManagerClassLookUpOptimizationIOS: Getter, enableIntersectionObserverByDefault: Getter, @@ -168,9 +169,9 @@ export const animatedShouldSyncValueBeforeStartCallback: Getter = creat export const deferFlatListFocusChangeRenderUpdate: Getter = createJavaScriptFlagGetter('deferFlatListFocusChangeRenderUpdate', false); /** - * When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes. + * Deprecated in favor of the common flag with the same name, which is the one that can be configured by OSS release stage. This is only kept so JS bundles delivered to older native builds, where the common flag is unavailable, can still enable the feature. */ -export const enableImperativeEvents: Getter = createJavaScriptFlagGetter('enableImperativeEvents', false); +export const enableImperativeEvents_DEPRECATED: Getter = createJavaScriptFlagGetter('enableImperativeEvents_DEPRECATED', false); /** * When enabled, the React Native renderer dispatches events through the W3C EventTarget API (addEventListener/dispatchEvent) instead of the legacy plugin-based system. @@ -335,6 +336,10 @@ export const enableImageTransparentTintColor: Getter = createNativeFlag * Dispatches state updates for content offset changes synchronously on the main thread. */ export const enableImmediateUpdateModeForContentOffsetChanges: Getter = createNativeFlagGetter('enableImmediateUpdateModeForContentOffsetChanges', false); +/** + * When enabled, ReactNativeElement and ReadOnlyText expose the public EventTarget API (addEventListener, removeEventListener, dispatchEvent). When disabled, those methods are removed from those final classes. + */ +export const enableImperativeEvents: Getter = createNativeFlagGetter('enableImperativeEvents', false); /** * Enable ref.focus() and ref.blur() for all views, not just TextInput. */ diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index 32be0cf9d394..5f1739e3cf29 100644 --- a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * @flow strict * @noformat */ @@ -56,6 +56,7 @@ export interface Spec extends TurboModule { readonly enableImagePrefetchingAndroid?: () => boolean; readonly enableImageTransparentTintColor?: () => boolean; readonly enableImmediateUpdateModeForContentOffsetChanges?: () => boolean; + readonly enableImperativeEvents?: () => boolean; readonly enableImperativeFocus?: () => boolean; readonly enableInteropViewManagerClassLookUpOptimizationIOS?: () => boolean; readonly enableIntersectionObserverByDefault?: () => boolean; diff --git a/packages/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js b/packages/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js index 0d2d66fef2d7..6e236da106a2 100644 --- a/packages/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js +++ b/packages/react-native/src/private/webapis/dom/nodes/ReactNativeElement.js @@ -360,12 +360,14 @@ ReactNativeElement_public.prototype = ReactNativeElement.prototype; // `removeEventListener`, `dispatchEvent`) is only inherited by this final class // when `enableNativeEventTargetEventDispatching` is enabled (which makes // `ReadOnlyNode` extend `EventTarget`). Until that public API is finalized, it -// is gated behind `enableImperativeEvents`: when that flag is off we remove -// those methods from this final class. Native/internal event dispatch does not -// rely on these public methods, so removing them is safe. +// is gated behind `enableImperativeEvents` (or its deprecated JS-only +// counterpart, `enableImperativeEvents_DEPRECATED`): when both flags are off we +// remove those methods from this final class. Native/internal event dispatch +// does not rely on these public methods, so removing them is safe. if ( ReactNativeFeatureFlags.enableNativeEventTargetEventDispatching() && - !ReactNativeFeatureFlags.enableImperativeEvents() + !ReactNativeFeatureFlags.enableImperativeEvents() && + !ReactNativeFeatureFlags.enableImperativeEvents_DEPRECATED() ) { const prototype: interface { addEventListener?: unknown, diff --git a/packages/react-native/src/private/webapis/dom/nodes/ReadOnlyText.js b/packages/react-native/src/private/webapis/dom/nodes/ReadOnlyText.js index 278b227964f6..1c0b819401e2 100644 --- a/packages/react-native/src/private/webapis/dom/nodes/ReadOnlyText.js +++ b/packages/react-native/src/private/webapis/dom/nodes/ReadOnlyText.js @@ -45,12 +45,14 @@ ReadOnlyText_public.prototype = ReadOnlyText.prototype; // `removeEventListener`, `dispatchEvent`) is only inherited by this final class // when `enableNativeEventTargetEventDispatching` is enabled (which makes // `ReadOnlyNode` extend `EventTarget`). Until that public API is finalized, it -// is gated behind `enableImperativeEvents`: when that flag is off we remove -// those methods from this final class. Native/internal event dispatch does not -// rely on these public methods, so removing them is safe. +// is gated behind `enableImperativeEvents` (or its deprecated JS-only +// counterpart, `enableImperativeEvents_DEPRECATED`): when both flags are off we +// remove those methods from this final class. Native/internal event dispatch +// does not rely on these public methods, so removing them is safe. if ( ReactNativeFeatureFlags.enableNativeEventTargetEventDispatching() && - !ReactNativeFeatureFlags.enableImperativeEvents() + !ReactNativeFeatureFlags.enableImperativeEvents() && + !ReactNativeFeatureFlags.enableImperativeEvents_DEPRECATED() ) { const prototype: interface { addEventListener?: unknown, From 79024f7c590446d3ef13bc1288faedb736957654 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Tue, 15 Sep 2026 15:01:55 +0100 Subject: [PATCH 09/35] Bump Hermes to 260318099.0.3 --- packages/react-native/package.json | 2 +- packages/react-native/sdks/hermes-engine/version.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 8a0c2450a11c..bc61a8c4abaf 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -162,7 +162,7 @@ "flow-parser": "0.327.0", "base64-js": "^1.5.1", "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "260318099.0.2", + "hermes-compiler": "260318099.0.3", "invariant": "^2.2.4", "memoize-one": "^5.0.0", "metro-runtime": "^0.87.0", diff --git a/packages/react-native/sdks/hermes-engine/version.properties b/packages/react-native/sdks/hermes-engine/version.properties index 0d44251f4c11..30373000a504 100644 --- a/packages/react-native/sdks/hermes-engine/version.properties +++ b/packages/react-native/sdks/hermes-engine/version.properties @@ -1 +1 @@ -HERMES_VERSION_NAME=260318099.0.2 +HERMES_VERSION_NAME=260318099.0.3 From a07219cbcc78ed01a66971a1c09801d25ede4310 Mon Sep 17 00:00:00 2001 From: Gabriel Donadel Date: Tue, 15 Sep 2026 05:27:04 -0700 Subject: [PATCH 10/35] fix(codegen): skip node_modules and symlinks when crawling for components (#58518) Summary: `findFilesWithExtension` walks a library's directory looking for `.mm` files that declare a Fabric component. The walk descends into every subdirectory, `node_modules` included, resolves symlinks through `statSync`, and keeps no visited set. This got broken after https://github.com/react/react-native/issues/57790 because `parseiOSAnnotations` now enters every library that declares a `codegenConfig` without an `ios` key into its map with an empty `components` object, so nothing removes it from `librariesToCrawl`. Previously such libraries were filtered before crawling. An app that declares `codegenConfig` with `"type": "all"` and no `ios` key now gets treated as a component library, so the walk covers the entire project. What we notice in the [expo repo](https://github.com/expo/expo/pull/50134) is that under pnpm, the traversal never terminates. Workspace packages link into each other's `node_modules` and form cycles. Because symlinks are followed, the walk only stops once paths hit the 1023 byte limit. CocoaPods progress stops right after the "Using React Native Core and React Native Dependencies prebuilt versions" line while a `generate-codegen-artifacts.js` child sits at 100% CPU. Under npm and yarn, the walk completes but with the wrong result. In those cases, `node_modules` holds real directories, but the walk covers the whole dependency tree. Crawling one app of roughly 1100 packages turned up 382 `.mm` files, 43 of which declare a component, among them React core views such as `RCTImageComponentView` and `RCTScrollViewComponentView` from `react-native-macos`. Each one is written into the app's entry in `RCTThirdPartyComponentsProvider.mm`. The existing `/react-native/` path filter does not exclude them, since it requires a trailing separator and `react-native-macos` has none. ## Changelog: [IOS] [FIXED] - Codegen no longer crawls `node_modules` or follows symlinks when discovering components Pull Request resolved: https://github.com/react/react-native/pull/58518 Test Plan: Two cases added to `packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js`. The three existing `findFilesWithExtension` mocks move from `statSync` to `lstatSync`. The symlink case builds a link pointing back at its own parent, so the pre-fix walk never terminates. **Negative control:** with the `generateRCTThirdPartyComponents.js` change reverted and the tests left in place, both new cases fail. All 24 existing snapshots pass unchanged, so the change is additive for projects that already declare an `ios` config. Measured by crawling the app directory of two real projects: | Project | Before | After | | --- | --- | --- | | `apps/bare-expo`, pnpm | 116,800 reads in 30s, still running | 34 files, 1.1s | | yarn app, ~1100 packages | 382 files, 5.8s | 8 files, 0.3s | Reviewed By: fabriziocucci Differential Revision: D120122552 Pulled By: vzaidman fbshipit-source-id: 233b8dc338b92372a34a0855f12a549e52513200 (cherry picked from commit 39751d864dd340bbdaf59d7999ba4d787fba6dbc) --- .../generate-artifacts-executor-test.js | 70 ++++++++++++++++++- .../generateRCTThirdPartyComponents.js | 22 ++++-- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js b/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js index 085f79b5cbcf..c7cfb5474c51 100644 --- a/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js +++ b/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js @@ -475,8 +475,9 @@ describe('findFilesWithExtension', () => { return []; }, existsSync: () => true, - statSync: () => ({ + lstatSync: () => ({ isDirectory: () => false, + isSymbolicLink: () => false, }), readFileSync: () => packageJson, })); @@ -508,11 +509,12 @@ describe('findFilesWithExtension', () => { return []; }, existsSync: () => true, - statSync: filePath => ({ + lstatSync: filePath => ({ isDirectory: () => filePath === pnpmFolder || filePath === packageFolder || filePath === path.join(targetFolder, '.hidden'), + isSymbolicLink: () => false, }), readFileSync: () => packageJson, })); @@ -541,8 +543,9 @@ describe('findFilesWithExtension', () => { return []; }, existsSync: () => true, - statSync: filePath => ({ + lstatSync: filePath => ({ isDirectory: () => filePath === path.join(targetFolder, 'Components'), + isSymbolicLink: () => false, }), readFileSync: () => packageJson, })); @@ -557,6 +560,67 @@ describe('findFilesWithExtension', () => { path.join(targetFolder, 'Components', 'MyComponent.mm'), ]); }); + + it('skips nested node_modules folders', () => { + const targetFolder = '/project/my-library'; + const nodeModules = path.join(targetFolder, 'node_modules'); + + jest.mock('node:fs', () => ({ + readdirSync: dirPath => { + if (dirPath === targetFolder) { + return ['node_modules', 'Component.mm']; + } + if (dirPath === nodeModules) { + return ['Dependency.mm']; + } + return []; + }, + existsSync: () => true, + lstatSync: filePath => ({ + isDirectory: () => filePath === nodeModules, + isSymbolicLink: () => false, + }), + readFileSync: () => packageJson, + })); + + const { + findFilesWithExtension: findFiles, + } = require('../generate-artifacts-executor/generateRCTThirdPartyComponents'); + + const result = findFiles(targetFolder, '.mm'); + expect(result).toEqual([path.join(targetFolder, 'Component.mm')]); + }); + + it('does not follow symlinked folders', () => { + const targetFolder = '/project/my-library'; + const symlinkedFolder = path.join(targetFolder, 'linked'); + + jest.mock('node:fs', () => ({ + readdirSync: dirPath => { + if (dirPath === targetFolder) { + return ['linked', 'Component.mm']; + } + // A symlink pointing back at its parent: following it never terminates. + if (dirPath === symlinkedFolder) { + return ['linked', 'Component.mm']; + } + return []; + }, + existsSync: () => true, + lstatSync: filePath => ({ + isDirectory: () => filePath.endsWith('linked'), + isSymbolicLink: () => filePath.endsWith('linked'), + }), + readFileSync: () => packageJson, + })); + + const { + findFilesWithExtension: findFiles, + } = require('../generate-artifacts-executor/generateRCTThirdPartyComponents'); + + const result = findFiles(targetFolder, '.mm'); + expect(result).toEqual([path.join(targetFolder, 'Component.mm')]); + }); }); describe('generateSchemaInfos', () => { diff --git a/packages/react-native/scripts/codegen/generate-artifacts-executor/generateRCTThirdPartyComponents.js b/packages/react-native/scripts/codegen/generate-artifacts-executor/generateRCTThirdPartyComponents.js index 03abb392090f..84857672fa0f 100644 --- a/packages/react-native/scripts/codegen/generate-artifacts-executor/generateRCTThirdPartyComponents.js +++ b/packages/react-native/scripts/codegen/generate-artifacts-executor/generateRCTThirdPartyComponents.js @@ -177,10 +177,24 @@ function findFilesWithExtension( return null; } - if ( - fs.existsSync(absolutePath) && - fs.statSync(absolutePath).isDirectory() - ) { + // A library's own sources never live in its dependencies, and crawling them + // is what makes this walk explode on large projects. + if (file === 'node_modules') { + return null; + } + + if (!fs.existsSync(absolutePath)) { + return null; + } + + // `lstatSync` does not resolve symlinks: following them can loop forever, + // e.g. workspace packages that link into each other under pnpm. + const stats = fs.lstatSync(absolutePath); + if (stats.isSymbolicLink()) { + return null; + } + + if (stats.isDirectory()) { files.push(...findFilesWithExtension(absolutePath, extension)); } else if (file.endsWith(extension)) { files.push(absolutePath); From 38302c95345d69b9e61350c0f30a4ee7c3e5ea95 Mon Sep 17 00:00:00 2001 From: Christian Falch Date: Wed, 9 Sep 2026 10:22:46 -0700 Subject: [PATCH 11/35] Derive an SPM library's Swift name from its podspec (#58290) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: An autolinked library's SwiftPM target name is also its header import prefix, so deriving it from the npm package name was wrong for most of the ecosystem (`react-native-svg` publishes `RNSVG`, not `ReactNativeSvg`) and wrong silently — no error, just headers nobody can import under the expected name. ## How: This PR reads the podspec file on scaffolding, and will use the name from the podspec if available. In addition it deprecates the react-native.config.js `spm` section in favor of the library's `package.json` file. ### Configuration A package's SwiftPM settings now live in `swiftpmConfig` in its `package.json`, following `codegenConfig`'s conventions: `name`, `dependencies`, `autolinkingPlugin` and `scaffold` for a library, `modules` and `denyPlugins` for an app. The `spm` block in react-native.config.js is deprecated — still read, so nothing breaks, but it warns once per file and package.json wins field by field. ### Resolving A name resolves from `swiftpmConfig.name`, then the deprecated `spm.name`, then the podspec's `header_dir` or name, then the npm name. The podspec is thereby transitional rather than permanent: `spm scaffold` records the name it derived as `swiftpmConfig.name` in the library's package.json, so the next run needs no podspec to name it. It never overwrites a name the library already declares, never records a name guessed from the npm name, and reports what it did. ### Failsafety A prefix Swift cannot spell is normalized to the identifier SwiftPM would compile it as, with a warning. A reserved name or two deps landing on one name is a hard error naming swiftpmConfig.name as the fix; the scope-borrowing that auto-corrected collisions is removed, since a name the build invents is a name no #import can predict. Collision checks key on SwiftPM's c99 name, so react-native-svg and react_native_svg no longer pass and then compile as one module. ### Implementation Name resolution reads the two podspec fields it needs with the regex parser, so it adds no `pod ipc spec` spawn, and the full read is memoized on the resolved path so one run reads a podspec once across name resolution, header search paths and scaffolding. `rn-tester` and the Apple test library move to the new location. ## Changelog: [IOS] [FIXED] - Read SwiftPM name from podspec and store in package.json when scaffolding Pull Request resolved: https://github.com/react/react-native/pull/58290 Test Plan: ✅ Unit tests Reviewed By: cortinico Differential Revision: D119159904 Pulled By: cipolleschi fbshipit-source-id: 59a7c62ecb601498060a5721f362dae8c5cc92de (cherry picked from commit 1cfc5f29a00f7a2c5d7f842f4e99eae170e06422) --- .../apple/TestLibraryApple.mm | 2 +- .../apple/TestLibraryApple.podspec | 8 +- .../apple/package.json | 6 + .../apple/react-native.config.js | 3 - .../common/package.json | 5 +- .../react-native/scripts/setup-apple-spm.js | 16 +- .../spm/__docs__/spm-autolinking-plugins.md | 38 +- .../scripts/spm/__docs__/spm-scripts.md | 159 +++- .../spm/__tests__/autolinking-plugins-test.js | 45 +- .../__tests__/expand-spm-dependencies-test.js | 786 +++++++++++------- .../generate-spm-autolinking-test.js | 500 +++++++---- .../__tests__/in-repo-library-names-test.js | 157 ++++ .../spm/__tests__/read-podspec-test.js | 473 ++++++++++- .../__tests__/scaffold-package-swift-test.js | 368 +++++++- .../scripts/spm/__tests__/spm-utils-test.js | 55 ++ .../spm/__tests__/swiftpm-config-test.js | 414 +++++++++ .../scripts/spm/autolinking-plugins.js | 13 +- .../scripts/spm/expand-spm-dependencies.js | 373 +++++---- .../scripts/spm/generate-spm-autolinking.js | 181 ++-- .../react-native/scripts/spm/read-podspec.js | 164 +++- .../scripts/spm/scaffold-package-swift.js | 178 ++-- .../react-native/scripts/spm/spm-types.js | 29 +- .../react-native/scripts/spm/spm-utils.js | 26 + .../scripts/spm/swiftpm-config.js | 245 ++++++ packages/rn-tester/package.json | 27 + packages/rn-tester/react-native.config.js | 27 - 26 files changed, 3386 insertions(+), 912 deletions(-) create mode 100644 packages/react-native/scripts/spm/__tests__/in-repo-library-names-test.js create mode 100644 packages/react-native/scripts/spm/__tests__/swiftpm-config-test.js create mode 100644 packages/react-native/scripts/spm/swiftpm-config.js diff --git a/packages/react-native-test-library/apple/TestLibraryApple.mm b/packages/react-native-test-library/apple/TestLibraryApple.mm index 2fa7f1fcefb1..bf7bb29a77a1 100644 --- a/packages/react-native-test-library/apple/TestLibraryApple.mm +++ b/packages/react-native-test-library/apple/TestLibraryApple.mm @@ -11,7 +11,7 @@ // wraps each autolinked dep as a Foo.framework under PackageFrameworks/. That // gives angle-bracket imports the standard resolution path, // matching how most React Native libraries already organize their headers. -#import +#import @implementation TestLibraryApple diff --git a/packages/react-native-test-library/apple/TestLibraryApple.podspec b/packages/react-native-test-library/apple/TestLibraryApple.podspec index 02cef6573b26..3175f4594049 100644 --- a/packages/react-native-test-library/apple/TestLibraryApple.podspec +++ b/packages/react-native-test-library/apple/TestLibraryApple.podspec @@ -19,10 +19,10 @@ Pod::Spec.new do |s| s.source_files = "*.{h,m,mm,swift}" s.requires_arc = true - # TestLibraryApple.mm imports . - # CocoaPods resolves it leniently through the shared Public headers dir, but the - # dependency edge must be declared for SwiftPM (the scaffolder wires sibling - # packages from podspec dependencies). + # TestLibraryApple.mm imports — the + # prefix the pod name gives it under CocoaPods and SwiftPM alike. CocoaPods + # resolves it leniently through the shared Public headers dir; SwiftPM needs + # the dependency edge declared (the scaffolder wires siblings from it). s.dependency "TestLibraryCommon" install_modules_dependencies(s) diff --git a/packages/react-native-test-library/apple/package.json b/packages/react-native-test-library/apple/package.json index 8dda511cbefa..593e18aefe4d 100644 --- a/packages/react-native-test-library/apple/package.json +++ b/packages/react-native-test-library/apple/package.json @@ -27,5 +27,11 @@ "peerDependencies": { "react": "*", "react-native": "1000.0.0" + }, + "swiftpmConfig": { + "name": "TestLibraryApple", + "dependencies": [ + "react-native-test-library-common" + ] } } diff --git a/packages/react-native-test-library/apple/react-native.config.js b/packages/react-native-test-library/apple/react-native.config.js index 982ed353de95..3de9a9829be7 100644 --- a/packages/react-native-test-library/apple/react-native.config.js +++ b/packages/react-native-test-library/apple/react-native.config.js @@ -16,7 +16,4 @@ module.exports = { ios: {}, }, }, - spm: { - dependencies: ['react-native-test-library-common'], - }, }; diff --git a/packages/react-native-test-library/common/package.json b/packages/react-native-test-library/common/package.json index 0a911df6a303..1611a4ffb4ac 100644 --- a/packages/react-native-test-library/common/package.json +++ b/packages/react-native-test-library/common/package.json @@ -20,5 +20,8 @@ "autolinking", "ios", "macos" - ] + ], + "swiftpmConfig": { + "name": "TestLibraryCommon" + } } diff --git a/packages/react-native/scripts/setup-apple-spm.js b/packages/react-native/scripts/setup-apple-spm.js index cfdb7f105122..a89f9f138dca 100644 --- a/packages/react-native/scripts/setup-apple-spm.js +++ b/packages/react-native/scripts/setup-apple-spm.js @@ -490,15 +490,27 @@ async function runScaffold( if (written.length > 0) { log(`Scaffolded Package.swift for ${written.length} dep(s):`); + // Silent for the outcomes that changed nothing ('already-set', 'skipped'). + const nameOutcome = (outcome /*: ?string */) /*: string */ => { + if (outcome === 'created' || outcome === 'inserted') { + return " — also recorded 'swiftpmConfig.name' in its package.json"; + } + if (outcome === 'failed') { + return " — could NOT record 'swiftpmConfig.name'; the manifest is written, the name is not"; + } + return ''; + }; for (const r of written) { - log(` • ${r.depName}`); + log(` • ${r.depName}${nameOutcome(r.swiftpmName)}`); } log(''); log( 'node_modules is NOT committed and is wiped by `npm install`. To keep\n' + 'these manifests, create and commit a patch with a tool like patch-package:\n' + ' • `npx patch-package ` for each scaffolded dep, then commit the patch.\n' + - 'Also consider asking the maintainer to ship a Package.swift upstream.\n' + + 'The patch also captures any recorded `swiftpmConfig.name`, which is what\n' + + 'lets the library be named without reading its podspec. Better still, ask the\n' + + 'maintainer to ship both upstream.\n' + 'Without a committed patch the build will hard-error again after a fresh install.', ); log(''); diff --git a/packages/react-native/scripts/spm/__docs__/spm-autolinking-plugins.md b/packages/react-native/scripts/spm/__docs__/spm-autolinking-plugins.md index 3a23c378f91e..be999741f8cd 100644 --- a/packages/react-native/scripts/spm/__docs__/spm-autolinking-plugins.md +++ b/packages/react-native/scripts/spm/__docs__/spm-autolinking-plugins.md @@ -12,8 +12,8 @@ generates. See [spm-scripts.md](./spm-scripts.md) for the base tool. The documented extension points don't cover a framework: -- `spm.modules` in `react-native.config.js` is a **static** list of simple - source modules. A framework discovers its modules **dynamically** (scanning +- `swiftpmConfig.modules` in package.json is a **static** list of simple source + modules. A framework discovers its modules **dynamically** (scanning `node_modules`), generates a **module registry**, and ships mixed Swift/ObjC/C++ modules (e.g. `ExpoModulesCore`) that `spm scaffold` can't handle. @@ -32,28 +32,28 @@ stale. ## Discovery — transitive, zero app config -A dependency opts in from its **own** `react-native.config.js`, so installing -the framework is enough (mirrors how CocoaPods pulls in `use_expo_modules!` -transitively): +A dependency opts in from its **own** package.json, so installing the framework +is enough (mirrors how CocoaPods pulls in `use_expo_modules!` transitively): -```js -// node_modules/expo/react-native.config.js -module.exports = { - spm: {autolinkingPlugin: './spm/autolinking-plugin.js'}, -}; +```json +// node_modules/expo/package.json +{ + "swiftpmConfig": {"autolinkingPlugin": "./spm/autolinking-plugin.js"} +} ``` -The autolinker already walks every dependency's `react-native.config.js`; any -that declares `spm.autolinkingPlugin` is `require`d and invoked. No app-level -registration or allowlist is required. +The autolinker reads every dependency's SwiftPM settings; any that declares +`autolinkingPlugin` is `require`d and invoked. No app-level registration or +allowlist is required. The deprecated `spm.autolinkingPlugin` in +`react-native.config.js` is still read — see +[Migrating from react-native.config.js](spm-scripts.md#where-swiftpm-settings-live). -**Opt-out escape hatch.** An app can exclude a plugin from its own -`react-native.config.js`: +**Opt-out escape hatch.** An app can exclude a plugin from its own package.json: -```js -module.exports = { - spm: {denyPlugins: ['some-framework']}, // npm names to skip -}; +```json +{ + "swiftpmConfig": {"denyPlugins": ["some-framework"]} +} ``` ## The contract diff --git a/packages/react-native/scripts/spm/__docs__/spm-scripts.md b/packages/react-native/scripts/spm/__docs__/spm-scripts.md index af1c6e8a463c..8a38007b81c5 100644 --- a/packages/react-native/scripts/spm/__docs__/spm-scripts.md +++ b/packages/react-native/scripts/spm/__docs__/spm-scripts.md @@ -331,49 +331,127 @@ build phase calls — a fine trade for not having to remember a command. ## Local Native Modules -Modules not discovered via autolinking can be declared in -`react-native.config.js`: +Modules not discovered via autolinking are declared in the app's package.json. +Each `path` is relative to the file that declares it — the project root for a +package.json there, the Xcode project directory for a config kept there: -```js -module.exports = { - spm: { - modules: [ +```json +{ + "swiftpmConfig": { + "modules": [ { - name: 'MyNativeModule', - path: 'ios/MyNativeModule', // relative to app root - exclude: ['*.podspec'], // optional - }, - ], - }, -}; + "name": "MyNativeModule", + "path": "ios/MyNativeModule", + "exclude": ["*.podspec"] + } + ] + } +} ``` Each entry becomes a target in `build/generated/autolinking/Package.swift`. Sources outside `build/generated/autolinking/` are automatically mirrored with file-level symlinks. +## Where SwiftPM settings live + +A package's SwiftPM settings live under `swiftpmConfig` in its **package.json**, +alongside `codegenConfig`. + +| Field | Set by | What it does | +| ------------------- | ------- | ----------------------------------------------------------- | +| `name` | library | Its SwiftPM target name, and so its header import prefix | +| `dependencies` | library | npm names of native libraries it builds against | +| `autolinkingPlugin` | library | Path to an [autolinking plugin](spm-autolinking-plugins.md) | +| `scaffold` | library | `false` opts the library out of `spm scaffold` | +| `modules` | app | [Local native modules](#local-native-modules) to build | +| `denyPlugins` | app | npm names whose autolinking plugin to skip | + +```json +{ + "swiftpmConfig": { + "name": "RNSVG", + "dependencies": ["react-native-worklets"] + } +} +``` + +A library's settings come from its own package.json. An **app's** are resolved +field by field, each from the directory holding its package.json — the JS root, +where codegen reads `codegenConfig` — falling back to the Xcode project +directory. An unrecognised field is ignored with a warning naming it, so a typo +does not pass silently. + +These settings used to live in an `spm` block in `react-native.config.js`. That +block is **deprecated** but still read, with the same field names, so nothing +breaks: move the keys across as they are, and package.json wins field by field. +`npx react-native spm scaffold` writes the `name` for you — see +[Community packages without a Package.swift](#community-packages-without-a-packageswift). + +## Library names + +An autolinked library's SwiftPM target name is also the prefix its headers are +imported under (`#import `), so it is not cosmetic: it has to be the +prefix the library's own sources and its dependents already use. + +It is resolved in this order: + +1. `swiftpmConfig.name` in the library's package.json +2. `spm.name` in `react-native.config.js` (deprecated) +3. podspec `header_dir` — `React-Core` → `React` +4. podspec `module_name` — a distinct declared module (`react-native-foo-bar` → + `RNFooBar`) +5. podspec name — `react-native-svg` → `RNSVG` +6. npm package name — `react-native-svg` → `ReactNativeSvg` + +Steps 3–5 are a **migration path, not the destination**. They exist so that +libraries work unchanged today, a podspec being what they already ship, and +`npx react-native spm scaffold` closes them out: it records the name it derived +as `swiftpmConfig.name` in the library's package.json, after which the podspec +is never consulted for naming again. A library that declares its own name needs +no podspec for SwiftPM at all. + +Within those three steps, `header_dir` comes first because that is what a +library sets when its import prefix differs from its pod name, then +`module_name`, what CocoaPods compiles the module as and so what Swift and +`@import` consumers write. But a `header_dir` only a **subspec** declares names +that subspec's headers, not the library, so the pod name stands +(react-native-svg is `RNSVG`, not `rnsvg`; its subspec prefix resolves through +the header search paths instead) — unless the subspec reuses the parent's block +variable (`do |s|`), which hides which scope declared what, so the podspec is +read by CocoaPods or not at all. An unreadable podspec falls through rather than +failing the build — with a warning, since a machine that can read it (one with +CocoaPods installed) may resolve a different name. A prefix Swift cannot spell +is normalized — `Some.Pod` becomes `Some_Pod`, what SwiftPM would compile it as +anyway — with a warning naming `swiftpmConfig.name`. + +Two names are refused outright: one React Native reserves (`ReactNative`, +`ReactHeaders`, `ReactNativeHeaders`, `ReactNativeDependenciesHeaders`, +`ReactAppHeaders`, `React-GeneratedCode`, `ReactCodegen`, +`ReactAppDependencyProvider`, `Autolinked`), and one another library already +took. Both are **hard errors** naming `swiftpmConfig.name` — nothing is renamed +automatically, because a name the build invented is one no `#import` in your +sources can predict. Two names must differ by more than case or punctuation to +be two targets: `worklets` and `Worklets` share a headers directory, and +`foo-bar` and `foo_bar` are one module, since SwiftPM replaces every character +C99 rejects with `_`. + ## Dependencies between libraries SwiftPM has no equivalent of a podspec's `s.dependency`, so a library that needs -another native library declares it explicitly with `spm.dependencies` in its -**own** `react-native.config.js` — a list of npm names: +another native library declares it explicitly in its **own** package.json — a +list of npm names: -```js -// react-native-reanimated/react-native.config.js -module.exports = { - dependency: {platforms: {ios: {}}}, - spm: {dependencies: ['react-native-worklets']}, -}; +```json +// react-native-reanimated/package.json +{ + "swiftpmConfig": {"dependencies": ["react-native-worklets"]} +} ``` -The autolinker starts from the directly-autolinked deps, follows each one's -`spm.dependencies` **recursively**, and dedupes the result, so a transitive -dependency is pulled into the package graph even when the app never depends on -it directly. Declared names are mapped to Swift target names, so the dependent -library's target can import it. - -This is a **library-author** surface, like the podspec dependency it replaces — -apps don't normally set it. +The autolinker follows these **recursively** from the directly-autolinked deps +and dedupes, so a transitive dependency joins the package graph even when the +app never depends on it directly. ### Config module format @@ -385,11 +463,11 @@ an async one that takes only the default export. For maximum compatibility, prefer the one-line CommonJS form: ```js -module.exports = {dependency: {platforms: {ios: {}}}, spm: {name: 'worklets'}}; +module.exports = {dependency: {platforms: {ios: {}}}}; ``` -If the config fails to load, a warning names the file and the reason — the `spm` -settings in it are ignored rather than silently applied. +If the config fails to load, a warning names the file and the reason — any +deprecated `spm` settings in it are ignored rather than silently applied. ## Self-managed community packages @@ -427,7 +505,15 @@ npx react-native spm # then inject/update as usual does not inject into the `.xcodeproj` — so on a first-time setup you still follow it with `npx react-native spm`.) -Because `node_modules/` isn't committed, persist it so it survives the next +`scaffold` also records the name it derived from the podspec as +`swiftpmConfig.name` in the library's package.json — the one step that lets the +library be named without reading a podspec at all. It never overwrites a name +the library already declares, and it says which packages it edited. Every +library it scaffolds gets a line naming the SwiftPM name it chose and where that +name came from, plus a note when a podspec's `header_dir` and `module_name` +disagree about it and only one can win. + +Because `node_modules/` isn't committed, persist both so they survive the next install: ```bash @@ -445,7 +531,9 @@ workaround keeps your app building. > A library whose sources mix Swift **and** Objective-C/C++ in one target, or > that ships neither a `Package.swift` nor a podspec, can't be scaffolded > automatically — the error says so. Opt it out via `react-native.config.js` -> (`platforms.ios = null`) or ask the maintainer for a prebuilt xcframework. +> (`platforms.ios = null`) or ask the maintainer for a prebuilt xcframework. A +> library can also opt out of scaffolding alone with +> `"swiftpmConfig": {"scaffold": false}`. ## Framework plugins (Preview) @@ -490,6 +578,7 @@ across apps; refresh it with `react-native spm update --download force`. | `spm add` fails: "no .xcodeproj found" | Create an app first (`npx @react-native-community/cli init`) or make a project in Xcode, then `spm add`. | | `spm add` fails: "multiple .xcodeproj found" | Pass `--xcodeproj ` (and `--product-name ` if multiple app targets). | | `Package.swift is missing for library ""` (exit 2) | The dep ships no SwiftPM support. `npx react-native spm scaffold`, then re-run setup; persist with `patch-package`. See [Community packages without a Package.swift](#community-packages-without-a-packageswift) | +| `SPM Swift name collision` | Two libraries resolved to one Swift name, or one took a name React Native reserves. Set `swiftpmConfig.name` in the library's package.json — see [Library names](#library-names) | | Missing headers | Re-run `react-native spm` | | "not contained in target" | Re-run setup (regenerates file-level symlinks) | | Codegen fails | Use `--skipCodegen` to iterate on other parts | @@ -596,7 +685,7 @@ _existing_ set of generated packages current; they do not create the first one. 1. Compares timestamps of staleness inputs against `build/generated/autolinking/.spm-sync-stamp`: - `package.json` — dependency declarations - - `react-native.config.js` — `spm.modules` config + - `react-native.config.js` — autolinking config - `node_modules/` directory mtime — updated by any package manager (npm, yarn, pnpm, bun); also checks parent `node_modules` for monorepo setups - a missing `build/xcframeworks/` (e.g. after a manual clean) also marks diff --git a/packages/react-native/scripts/spm/__tests__/autolinking-plugins-test.js b/packages/react-native/scripts/spm/__tests__/autolinking-plugins-test.js index a219daa3e868..7ee863b17dd3 100644 --- a/packages/react-native/scripts/spm/__tests__/autolinking-plugins-test.js +++ b/packages/react-native/scripts/spm/__tests__/autolinking-plugins-test.js @@ -34,20 +34,45 @@ describe('discoverPlugins', () => { return {name, root}; } - // readConfig fake: a dep opts in when opted[name] is truthy. + // A dep opts in through its package.json; `noConfig` stands in for the + // react-native.config.js the caller loads (absent for these cases). + const declarePlugin = dep => + fs.writeFileSync( + path.join(dep.root, 'package.json'), + JSON.stringify({ + name: dep.name, + swiftpmConfig: {autolinkingPlugin: './plugin.js'}, + }), + ); + const noConfig = () => null; + + // The deprecated home, which Expo still ships. const readConfigFor = opted => root => { const name = path.basename(root); return opted[name] ? {spm: {autolinkingPlugin: './plugin.js'}} : null; }; - it('discovers a plugin declared via react-native.config.js', () => { + it('discovers a plugin declared in package.json', () => { const dep = makeDep('expo', 'module.exports = () => ({});'); - const found = discoverPlugins([dep], readConfigFor({expo: true})); + declarePlugin(dep); + const found = discoverPlugins([dep], noConfig); expect(found).toHaveLength(1); expect(found[0].depName).toBe('expo'); expect(typeof found[0].plugin).toBe('function'); }); + it('still discovers a plugin declared the deprecated way', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const dep = makeDep('expo', 'module.exports = () => ({});'); + const found = discoverPlugins([dep], readConfigFor({expo: true})); + expect(found).toHaveLength(1); + expect(warnSpy).toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } + }); + it('skips deps that do not declare a plugin', () => { const dep = makeDep('react-native-svg', null); expect(discoverPlugins([dep], readConfigFor({}))).toHaveLength(0); @@ -55,27 +80,31 @@ describe('discoverPlugins', () => { it('honors the app deny-list (opt-out, no allowlist needed)', () => { const dep = makeDep('expo', 'module.exports = () => ({});'); - const found = discoverPlugins([dep], readConfigFor({expo: true}), ['expo']); - expect(found).toHaveLength(0); + declarePlugin(dep); + expect(discoverPlugins([dep], noConfig, ['expo'])).toHaveLength(0); }); it('accepts default/plugin export interop', () => { const a = makeDep('a', 'module.exports.default = () => ({});'); const b = makeDep('b', 'module.exports.plugin = () => ({});'); - const found = discoverPlugins([a, b], readConfigFor({a: true, b: true})); + declarePlugin(a); + declarePlugin(b); + const found = discoverPlugins([a, b], noConfig); expect(found.map(f => f.depName).sort()).toEqual(['a', 'b']); }); it('fails closed when the plugin module is missing', () => { const dep = makeDep('expo', null); // opted in below but no plugin.js - expect(() => discoverPlugins([dep], readConfigFor({expo: true}))).toThrow( + declarePlugin(dep); + expect(() => discoverPlugins([dep], noConfig)).toThrow( /failed to load the autolinking plugin for 'expo'/, ); }); it('fails closed when the module does not export a function', () => { const dep = makeDep('expo', 'module.exports = {nope: 1};'); - expect(() => discoverPlugins([dep], readConfigFor({expo: true}))).toThrow( + declarePlugin(dep); + expect(() => discoverPlugins([dep], noConfig)).toThrow( /does not export a function/, ); }); diff --git a/packages/react-native/scripts/spm/__tests__/expand-spm-dependencies-test.js b/packages/react-native/scripts/spm/__tests__/expand-spm-dependencies-test.js index 1e4848930ca1..a7af15259b0a 100644 --- a/packages/react-native/scripts/spm/__tests__/expand-spm-dependencies-test.js +++ b/packages/react-native/scripts/spm/__tests__/expand-spm-dependencies-test.js @@ -36,8 +36,8 @@ const { SpmNameCollisionError, defaultReadConfig, + defaultReadPodspec, expandSpmDependencies, - isValidSwiftName, resolveSwiftName, } = require('../expand-spm-dependencies'); const { @@ -54,8 +54,12 @@ function makeReadConfig(configs /*: {[string]: ?Object} */) { Object.prototype.hasOwnProperty.call(configs, root) ? configs[root] : null; } -// The reserved map its caller builds; these cases only exercise `spm.name`. -const NONE = new Map(); +// The two config readers, from one set of fixtures. Injected so these cases stay +// pure; readSwiftpmConfig itself is covered in swiftpm-config-test.js. +function fixtures(configs /*: {[string]: ?Object} */) { + const readConfig = makeReadConfig(configs); + return {readConfig, readSwiftpmConfig: root => readConfig(root)?.spm ?? null}; +} function makeResolveDep(resolutions /*: {[string]: ?string} */) { return (name /*: string */) => @@ -64,6 +68,14 @@ function makeResolveDep(resolutions /*: {[string]: ?string} */) { : null; } +// Keyed by dep root, valued with the podspec facts the reader would return. +function makeReadPodspec(podspecs /*: {[string]: ?Object} */) { + return (root /*: string */) => + Object.prototype.hasOwnProperty.call(podspecs, root) + ? podspecs[root] + : null; +} + // --------------------------------------------------------------------------- // expandSpmDependencies // --------------------------------------------------------------------------- @@ -72,18 +84,23 @@ describe('expandSpmDependencies', () => { it('returns direct deps with auto-derived swiftName when none declare spm.dependencies', () => { const direct = [{name: 'a', root: '/a', platforms: {ios: {}}}]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({'/a': {}}), + ...fixtures({'/a': {}}), resolveDep: makeResolveDep({}), }); expect(result).toEqual([ - {...direct[0], swiftName: toSwiftName('a'), spmDependencies: []}, + { + ...direct[0], + swiftName: toSwiftName('a'), + swiftNameSource: 'npm', + spmDependencies: [], + }, ]); }); it('pulls in one transitive dep declared by a direct dep', () => { const direct = [{name: 'apple', root: '/apple', platforms: {ios: {}}}]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['common']}}, '/common': {dependency: {platforms: {ios: {}}}}, }), @@ -97,7 +114,7 @@ describe('expandSpmDependencies', () => { it('recurses through a chain (A → B → C)', () => { const direct = [{name: 'a', root: '/a', platforms: {ios: {}}}]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/a': {spm: {dependencies: ['b']}}, '/b': { dependency: {platforms: {ios: {}}}, @@ -113,7 +130,7 @@ describe('expandSpmDependencies', () => { it('handles cycles without infinite recursion (A → B → A)', () => { const direct = [{name: 'a', root: '/a', platforms: {ios: {}}}]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/a': { dependency: {platforms: {ios: {}}}, spm: {dependencies: ['b']}, @@ -134,7 +151,7 @@ describe('expandSpmDependencies', () => { {name: 'b', root: '/b', platforms: {ios: {}}}, ]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/a': {spm: {dependencies: ['x']}}, '/b': {spm: {dependencies: ['x']}}, '/x': {dependency: {platforms: {ios: {}}}}, @@ -149,7 +166,7 @@ describe('expandSpmDependencies', () => { const direct = [{name: 'apple', root: '/apple', platforms: {ios: {}}}]; expect(() => expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['ghost']}}, }), resolveDep: makeResolveDep({}), @@ -160,7 +177,7 @@ describe('expandSpmDependencies', () => { it('silently skips transitives that have no iOS native code (matches autolinkingDepToSpmTarget behavior)', () => { const direct = [{name: 'apple', root: '/apple', platforms: {ios: {}}}]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['js-only']}}, // js-only has no dependency.platforms.ios — pure JS package '/js-only': {}, @@ -176,7 +193,7 @@ describe('expandSpmDependencies', () => { {name: 'common', root: '/common-direct', platforms: {ios: {}}}, ]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['common']}}, '/common-other': {dependency: {platforms: {ios: {}}}}, }), @@ -196,7 +213,7 @@ describe('expandSpmDependencies', () => { it('attaches spmDependencies: [] when the dep declares none', () => { const direct = [{name: 'a', root: '/a', platforms: {ios: {}}}]; const [a] = expandSpmDependencies(direct, { - readConfig: makeReadConfig({'/a': {}}), + ...fixtures({'/a': {}}), resolveDep: makeResolveDep({}), }); expect(a.spmDependencies).toEqual([]); @@ -205,7 +222,7 @@ describe('expandSpmDependencies', () => { it('attaches spmDependencies with the declared transitive names (preserving declaration order)', () => { const direct = [{name: 'apple', root: '/apple', platforms: {ios: {}}}]; const [apple, common] = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['common', 'extra']}}, '/common': {dependency: {platforms: {ios: {}}}}, '/extra': {dependency: {platforms: {ios: {}}}}, @@ -219,7 +236,7 @@ describe('expandSpmDependencies', () => { it('omits JS-only transitives from spmDependencies (only iOS-native names appear)', () => { const direct = [{name: 'apple', root: '/apple', platforms: {ios: {}}}]; const [apple] = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['js-only', 'common']}}, '/js-only': {}, '/common': {dependency: {platforms: {ios: {}}}}, @@ -235,7 +252,7 @@ describe('expandSpmDependencies', () => { {name: 'b', root: '/b', platforms: {ios: {}}}, ]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/a': {spm: {dependencies: ['x']}}, '/b': {spm: {dependencies: ['x']}}, '/x': {dependency: {platforms: {ios: {}}}}, @@ -252,7 +269,7 @@ describe('expandSpmDependencies', () => { const direct = [{name: 'apple', root: '/apple', platforms: {ios: {}}}]; let receivedFromRoot /*: ?string */ = null; expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/apple': {spm: {dependencies: ['common']}}, '/common': {dependency: {platforms: {ios: {}}}}, }), @@ -280,7 +297,7 @@ describe('expandSpmDependencies', () => { {name: 'react-native-foo', root: '/foo', platforms: {ios: {}}}, ]; const [foo] = expandSpmDependencies(direct, { - readConfig: makeReadConfig({'/foo': {}}), + ...fixtures({'/foo': {}}), resolveDep: makeResolveDep({}), }); expect(foo.swiftName).toBe(toSwiftName('react-native-foo')); @@ -292,7 +309,7 @@ describe('expandSpmDependencies', () => { {name: 'react-native-worklets', root: '/w', platforms: {ios: {}}}, ]; const [w] = expandSpmDependencies(direct, { - readConfig: makeReadConfig({'/w': {spm: {name: 'worklets'}}}), + ...fixtures({'/w': {spm: {name: 'worklets'}}}), resolveDep: makeResolveDep({}), }); expect(w.swiftName).toBe('worklets'); @@ -303,7 +320,7 @@ describe('expandSpmDependencies', () => { {name: 'react-native-reanimated', root: '/r', platforms: {ios: {}}}, ]; const result = expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/r': { dependency: {platforms: {ios: {}}}, spm: {name: 'reanimated', dependencies: ['react-native-worklets']}, @@ -330,7 +347,7 @@ describe('expandSpmDependencies', () => { ]; expect(() => expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/w': {}, '/o': {spm: {name: 'ReactNativeWorklets'}}, }), @@ -346,7 +363,7 @@ describe('expandSpmDependencies', () => { ]; expect(() => expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/w': {}, '/o': {spm: {name: 'ReactNativeWorklets'}}, }), @@ -364,7 +381,7 @@ describe('expandSpmDependencies', () => { ]; expect(() => expandSpmDependencies(direct, { - readConfig: makeReadConfig({ + ...fixtures({ '/w': {spm: {name: 'worklets'}}, '/o': {spm: {name: 'Worklets'}}, }), @@ -373,35 +390,35 @@ describe('expandSpmDependencies', () => { ).toThrow(/case/i); }); - it('rejects empty-string spm.name with a clear error citing the npm name', () => { + it('rejects an empty declared name with a clear error citing the npm name', () => { const direct = [{name: 'a', root: '/a', platforms: {ios: {}}}]; expect(() => expandSpmDependencies(direct, { - readConfig: makeReadConfig({'/a': {spm: {name: ''}}}), + ...fixtures({'/a': {spm: {name: ''}}}), resolveDep: makeResolveDep({}), }), - ).toThrow(/'a' has an invalid 'spm.name'/); + ).toThrow(/'a' declares an invalid SwiftPM name/); }); - it('rejects non-string spm.name (e.g. number, object) with a clear error', () => { + it('rejects a non-string declared name (e.g. number, object) with a clear error', () => { const direct = [{name: 'a', root: '/a', platforms: {ios: {}}}]; expect(() => expandSpmDependencies(direct, { - readConfig: makeReadConfig({'/a': {spm: {name: 42}}}), + ...fixtures({'/a': {spm: {name: 42}}}), resolveDep: makeResolveDep({}), }), - ).toThrow(/invalid 'spm.name'/); + ).toThrow(/declares an invalid SwiftPM name/); }); - it('rejects spm.name with disallowed characters (spaces, slashes, dots)', () => { - const resolve = name => () => resolveSwiftName('a', {spm: {name}}, NONE); - expect(resolve('foo bar')).toThrow(/invalid 'spm.name'/); - expect(resolve('foo/bar')).toThrow(/invalid 'spm.name'/); - expect(resolve('foo.bar')).toThrow(/invalid 'spm.name'/); + it('rejects a declared name with disallowed characters (spaces, slashes, dots)', () => { + const resolve = name => () => resolveSwiftName('a', {name}, null); + expect(resolve('foo bar')).toThrow(/declares an invalid SwiftPM name/); + expect(resolve('foo/bar')).toThrow(/declares an invalid SwiftPM name/); + expect(resolve('foo.bar')).toThrow(/declares an invalid SwiftPM name/); }); - it('accepts lowercase-with-hyphen and CamelCase spm.name values', () => { - const resolve = name => resolveSwiftName('a', {spm: {name}}, NONE); + it('accepts lowercase-with-hyphen and CamelCase declared names', () => { + const resolve = name => resolveSwiftName('a', {name}, null).name; expect(resolve('reanimated')).toBe('reanimated'); expect(resolve('hermes-engine')).toBe('hermes-engine'); expect(resolve('RNWorklets')).toBe('RNWorklets'); @@ -410,298 +427,323 @@ describe('expandSpmDependencies', () => { }); // --------------------------------------------------------------------------- -// Scope disambiguation: a derived name that lands on one React Native reserves. +// Podspec-derived names. A dep's Swift name is also its header prefix +// (`#import `), and the podspec is where that prefix is +// declared: `spm.name` → `header_dir` → `module_name` → podspec name → +// toSwiftName(npm name). // --------------------------------------------------------------------------- -describe('expandSpmDependencies (scope disambiguation)', () => { - function expand(direct, configs, options) { +describe('expandSpmDependencies (podspec-derived names)', () => { + function expand(direct, {configs, podspecs, ...options} = {}) { return expandSpmDependencies(direct, { - readConfig: makeReadConfig(configs), + ...fixtures(configs ?? {}), resolveDep: makeResolveDep({}), + readPodspec: makeReadPodspec(podspecs ?? {}), ...options, }); } - it('prepends the scope when the derived name is reserved', () => { - const [dep] = expand( - [{name: '@powersync/react-native', root: '/ps', platforms: {ios: {}}}], - {'/ps': {}}, - ); - expect(dep.swiftName).toBe('PowersyncReactNative'); + const dep = (name, root) => ({name, root, platforms: {ios: {}}}); + + it("prefers the podspec's header_dir over its name", () => { + const [core] = expand([dep('react-native-core-thing', '/rc')], { + podspecs: {'/rc': {name: 'React-Core', headerDir: 'React'}}, + }); + expect(core.swiftName).toBe('React'); }); - it('logs one line naming the package, the reserved name and the name it got', () => { - const log = jest.fn(); - expand( - [{name: '@powersync/react-native', root: '/ps', platforms: {ios: {}}}], - {'/ps': {}}, - {log}, - ); - expect(log).toHaveBeenCalledTimes(1); - const [line] = log.mock.calls[0]; - expect(line).toContain('@powersync/react-native'); - expect(line).toContain("'ReactNative'"); - expect(line).toContain("'PowersyncReactNative'"); + it('uses the podspec name when it declares no header_dir', () => { + const [svg] = expand([dep('react-native-svg', '/svg')], { + podspecs: {'/svg': {name: 'RNSVG', headerDir: null}}, + }); + expect(svg.swiftName).toBe('RNSVG'); + }); + + it("uses the podspec's module_name when it differs from its pod name", () => { + // A podspec whose module_name differs from its pod name must resolve to the + // module_name even though the pod name is already a legal SwiftPM name. + const [fooBar] = expand([dep('react-native-foo-bar', '/foo-bar')], { + podspecs: { + '/foo-bar': { + name: 'react-native-foo-bar', + moduleName: 'RNFooBar', + headerDir: null, + }, + }, + }); + expect(fooBar.swiftName).toBe('RNFooBar'); + expect(fooBar.swiftNameSource).toBe('podspec'); }); - it('says nothing when no disambiguation happens', () => { - const log = jest.fn(); - const [dep] = expand( - [{name: '@powersync/common', root: '/c', platforms: {ios: {}}}], - {'/c': {}}, - {log}, - ); - expect(dep.swiftName).toBe('Common'); - expect(log).not.toHaveBeenCalled(); + it("prefers the podspec's header_dir over its module_name", () => { + const [core] = expand([dep('react-native-core-thing', '/rc')], { + podspecs: { + '/rc': { + name: 'React-Core', + moduleName: 'ReactCore', + headerDir: 'React', + }, + }, + }); + expect(core.swiftName).toBe('React'); }); - it('title-cases a hyphenated scope', () => { - const [dep] = expand( - [{name: '@my-org/react-native', root: '/o', platforms: {ios: {}}}], - {'/o': {}}, - ); - expect(dep.swiftName).toBe('MyOrgReactNative'); + it('takes a lowercase header_dir verbatim (worklets ships )', () => { + const [worklets] = expand([dep('react-native-worklets', '/w')], { + podspecs: {'/w': {name: 'RNWorklets', headerDir: 'worklets'}}, + }); + expect(worklets.swiftName).toBe('worklets'); }); - it('disambiguates a name that matches a reserved one only in case', () => { - // toSwiftName('@scope/reactcodegen') === 'Reactcodegen' — distinct from - // 'ReactCodegen' as a string, the same directory on a case-insensitive - // filesystem. - const [dep] = expand( - [{name: '@scope/reactcodegen', root: '/s', platforms: {ios: {}}}], - {'/s': {}}, - ); - expect(dep.swiftName).toBe('ScopeReactcodegen'); + it.each([ + ['header_dir', {name: 'React-Core', headerDir: 'React'}, 'React'], + [ + 'module_name', + {name: 'react-native-foo-bar', moduleName: 'RNFooBar'}, + 'RNFooBar', + ], + ['name', {name: 'RNSVG'}, 'RNSVG'], + ])('reports %s as the podspec key the name came from', (key, facts, name) => { + // `spm scaffold` persists the winner as the library's name, so which key + // won is part of the decision it has to be able to report. + expect(resolveSwiftName('react-native-thing', null, facts)).toEqual({ + name, + source: 'podspec', + podspecKey: key, + }); }); - it('disambiguates a transitive dep too', () => { - const result = expandSpmDependencies( - [{name: 'top', root: '/top', platforms: {ios: {}}}], - { - readConfig: makeReadConfig({ - '/top': {spm: {dependencies: ['@scope/react-native']}}, - '/s': {dependency: {platforms: {ios: {}}}}, - }), - resolveDep: makeResolveDep({'@scope/react-native': '/s'}), - }, + it('reports no podspec key for a declared or guessed name', () => { + expect(resolveSwiftName('react-native-foo', {name: 'RNFoo'}, null)).toEqual( + {name: 'RNFoo', source: 'config'}, ); - expect(result.map(d => d.swiftName)).toEqual(['Top', 'ScopeReactNative']); + expect(resolveSwiftName('react-native-foo', null, null)).toEqual({ + name: 'ReactNativeFoo', + source: 'npm', + }); }); - it('disambiguates against a caller-supplied reserved name (remote identity)', () => { - const [dep] = expand( - [{name: '@acme/my-fork', root: '/f', platforms: {ios: {}}}], - {'/f': {}}, - {extraReservedNames: ['MyFork']}, - ); - expect(dep.swiftName).toBe('AcmeMyFork'); + it('carries the podspec key onto every expanded dep', () => { + const [fooBar] = expand([dep('react-native-foo-bar', '/foo-bar')], { + podspecs: { + '/foo-bar': {name: 'react-native-foo-bar', moduleName: 'RNFooBar'}, + }, + }); + expect(fooBar.swiftNamePodspecKey).toBe('module_name'); }); - it("leaves an explicit 'spm.name' alone on a package that would have collided", () => { - const log = jest.fn(); - const [dep] = expand( - [{name: '@powersync/react-native', root: '/ps', platforms: {ios: {}}}], - {'/ps': {spm: {name: 'PowerSync'}}}, - {log}, - ); - expect(dep.swiftName).toBe('PowerSync'); - expect(log).not.toHaveBeenCalled(); + it('lets spm.name beat both', () => { + const [svg] = expand([dep('react-native-svg', '/svg')], { + configs: {'/svg': {spm: {name: 'MySvg'}}}, + podspecs: {'/svg': {name: 'RNSVG', headerDir: 'rnsvg'}}, + }); + expect(svg.swiftName).toBe('MySvg'); }); - it('throws when the disambiguated name is reserved as well', () => { - const run = () => - expand( - [{name: '@powersync/react-native', root: '/ps', platforms: {ios: {}}}], - {'/ps': {}}, - {extraReservedNames: ['PowersyncReactNative']}, - ); - expect(run).toThrow(SpmNameCollisionError); - expect(run).toThrow(/React Native reserves/); + it('falls back to the npm name when the dep ships no podspec (self-managed libraries)', () => { + const [svg] = expand([dep('react-native-svg', '/svg')]); + expect(svg.swiftName).toBe('ReactNativeSvg'); }); - it('gives two scoped packages that would take the same reserved name distinct names', () => { - const result = expand( - [ - {name: '@a/react-native', root: '/a', platforms: {ios: {}}}, - {name: '@b/react-native', root: '/b', platforms: {ios: {}}}, - ], - {'/a': {}, '/b': {}}, - ); - expect(result.map(d => d.swiftName)).toEqual([ - 'AReactNative', - 'BReactNative', - ]); + it('falls through to the npm name when reading the podspec throws', () => { + const [svg] = expand([dep('react-native-svg', '/svg')], { + readPodspec: () => { + throw new Error('unparseable'); + }, + }); + expect(svg.swiftName).toBe('ReactNativeSvg'); }); -}); -// --------------------------------------------------------------------------- -// Scope disambiguation across deps: two libraries deriving one name. -// --------------------------------------------------------------------------- + it('falls through when the podspec yields no name (partial parse)', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const [svg] = expand([dep('react-native-svg', '/svg')], { + podspecs: {'/svg': {name: '', headerDir: null}}, + }); + expect(svg.swiftName).toBe('ReactNativeSvg'); + } finally { + warnSpy.mockRestore(); + } + }); -describe('expandSpmDependencies (scope disambiguation across deps)', () => { - function expand(direct, configs, options) { - return expandSpmDependencies(direct, { - readConfig: makeReadConfig(configs), - resolveDep: makeResolveDep({}), - ...options, - }); - } + it('warns that a podspec it could not read makes the name machine-dependent', () => { + // The shape create-react-native-library generates: `s.name = package["name"]` + // reads as nothing without CocoaPods, so the npm name answers here and the + // pod name would answer on a machine that has `pod`. + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const [foo] = expand([dep('react-native-foo', '/foo')], { + podspecs: {'/foo': {name: '', headerDir: null}}, + }); + expect(foo.swiftName).toBe('ReactNativeFoo'); + expect(foo.swiftNameSource).toBe('npm'); + const message = warnSpy.mock.calls.map(call => call.join(' ')).join('\n'); + expect(message).toContain('react-native-foo'); + expect(message).toContain('CocoaPods'); + expect(message).toContain('swiftpmConfig.name'); + } finally { + warnSpy.mockRestore(); + } + }); - const scoped = (name, root) => ({name, root, platforms: {ios: {}}}); + it('says nothing when the dep ships no podspec at all', () => { + // Nothing is machine-dependent about a self-managed library: there is no + // podspec for another machine to read differently. + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + expand([dep('react-native-svg', '/svg')]); + expect(warnSpy).not.toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } + }); - it('pulls two scoped deps apart with their scopes', () => { - const result = expand([scoped('@a/foo', '/a'), scoped('@b/foo', '/b')], { - '/a': {}, - '/b': {}, - }); - expect(result.map(d => d.swiftName)).toEqual(['AFoo', 'BFoo']); + it('normalizes a podspec name Swift cannot spell, and says what it did', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const [svg] = expand([dep('react-native-svg', '/svg')], { + podspecs: {'/svg': {name: 'Some.Pod', headerDir: null}}, + }); + expect(svg.swiftName).toBe('Some_Pod'); + const message = warnSpy.mock.calls.map(call => call.join(' ')).join('\n'); + expect(message).toContain('react-native-svg'); + expect(message).toContain('Some.Pod'); + expect(message).toContain('Some_Pod'); + expect(message).toContain('swiftpmConfig.name'); + } finally { + warnSpy.mockRestore(); + } }); - it('logs one line per rewritten dep, naming the shared name and the new one', () => { - const log = jest.fn(); - expand( - [scoped('@a/foo', '/a'), scoped('@b/foo', '/b')], - { - '/a': {}, - '/b': {}, - }, - {log}, - ); - expect(log).toHaveBeenCalledTimes(2); - const lines = log.mock.calls.map(([line]) => line); - expect(lines[0]).toContain('@a/foo'); - expect(lines[0]).toContain("'Foo'"); - expect(lines[0]).toContain("'AFoo'"); - expect(lines[1]).toContain('@b/foo'); - expect(lines[1]).toContain("'BFoo'"); - }); - - it('leaves an unscoped member alone — it has no scope to borrow', () => { - const result = expand([scoped('@a/foo', '/a'), scoped('foo', '/f')], { - '/a': {}, - '/f': {}, - }); - expect(result.map(d => d.swiftName)).toEqual(['AFoo', 'Foo']); + it('refuses to name a library from a header_dir Ruby has not evaluated', () => { + // Without CocoaPods the regex parser hands back the template verbatim. + // Naming from it would freeze `__s_name_Headers` into the header prefix — + // and, being podspec-derived, into the library's package.json. + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const [svg] = expand([dep('react-native-svg', '/svg')], { + podspecs: {'/svg': {name: 'RNSVG', headerDir: '#{s.name}Headers'}}, + }); + expect(svg.swiftName).toBe('ReactNativeSvg'); + expect(svg.swiftNameSource).toBe('npm'); + } finally { + warnSpy.mockRestore(); + } }); - it("leaves a member's explicit 'spm.name' alone and moves the others around it", () => { - const log = jest.fn(); - const result = expand( - [scoped('@a/foo', '/a'), scoped('@b/foo', '/b')], - {'/a': {spm: {name: 'Foo'}}, '/b': {}}, - {log}, - ); - expect(result.map(d => d.swiftName)).toEqual(['Foo', 'BFoo']); - expect(log).toHaveBeenCalledTimes(1); - expect(log.mock.calls[0][0]).toContain('@b/foo'); + it('normalizes an unspellable header_dir rather than falling back to the podspec name', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const [svg] = expand([dep('react-native-svg', '/svg')], { + podspecs: {'/svg': {name: 'RNSVG', headerDir: 'rn.svg'}}, + }); + expect(svg.swiftName).toBe('rn_svg'); + } finally { + warnSpy.mockRestore(); + } }); - it('groups case-insensitively, so a lowercase override still moves the others', () => { - const result = expand([scoped('@a/foo', '/a'), scoped('@b/foo', '/b')], { - '/a': {spm: {name: 'foo'}}, - '/b': {}, - }); - expect(result.map(d => d.swiftName)).toEqual(['foo', 'BFoo']); + it('says nothing when the podspec name needs no normalizing', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + expand([dep('react-native-svg', '/svg')], { + podspecs: {'/svg': {name: 'RNSVG'}}, + }); + expect(warnSpy).not.toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } }); - it('rewrites every scoped member of a three-way collision', () => { - const result = expand( - [scoped('@a/foo', '/a'), scoped('@b/foo', '/b'), scoped('@c/foo', '/c')], - {'/a': {}, '/b': {}, '/c': {}}, + it('reads the podspec autolinking.json recorded for the dep', () => { + const readPodspec = jest.fn(() => ({name: 'RNSVG'})); + expandSpmDependencies( + [ + { + name: 'react-native-svg', + root: '/svg', + platforms: {ios: {podspecPath: '/svg/apple/RNSVG.podspec'}}, + }, + ], + { + ...fixtures({}), + resolveDep: makeResolveDep({}), + readPodspec, + }, + ); + expect(readPodspec).toHaveBeenCalledWith( + '/svg', + '/svg/apple/RNSVG.podspec', ); - expect(result.map(d => d.swiftName)).toEqual(['AFoo', 'BFoo', 'CFoo']); }); - it('rewrites the scoped members of a three-way collision and keeps the unscoped one', () => { - const result = expand( - [scoped('@a/foo', '/a'), scoped('@b/foo', '/b'), scoped('foo', '/f')], - {'/a': {}, '/b': {}, '/f': {}}, + it('names a transitive dep from its own podspec', () => { + const result = expandSpmDependencies( + [dep('react-native-reanimated', '/r')], + { + ...fixtures({ + '/r': {spm: {dependencies: ['react-native-worklets']}}, + '/w': {dependency: {platforms: {ios: {}}}}, + }), + resolveDep: makeResolveDep({'react-native-worklets': '/w'}), + readPodspec: makeReadPodspec({ + '/r': {name: 'RNReanimated', headerDir: 'reanimated'}, + '/w': {name: 'RNWorklets', headerDir: 'worklets'}, + }), + }, ); - expect(result.map(d => d.swiftName)).toEqual(['AFoo', 'BFoo', 'Foo']); + expect(result.map(d => d.swiftName)).toEqual(['reanimated', 'worklets']); }); - it('throws when a borrowed scope lands on a third package instead of producing two of the same name', () => { - // 'a-foo' already derives 'AFoo', the name '@a/foo' borrows. + it('throws instead of correcting a podspec name React Native reserves', () => { const run = () => - expand( - [ - scoped('@a/foo', '/a'), - scoped('@b/foo', '/b'), - scoped('a-foo', '/af'), - ], - {'/a': {}, '/b': {}, '/af': {}}, - ); + expand([dep('some-lib', '/s')], { + podspecs: {'/s': {name: 'ReactHeaders'}}, + }); expect(run).toThrow(SpmNameCollisionError); - expect(run).toThrow(/both resolve to 'AFoo'/); + expect(run).toThrow( + /'some-lib' resolves to 'ReactHeaders', which React Native reserves/, + ); + expect(run).toThrow(/Set a different 'swiftpmConfig\.name'/); }); - it('throws when a borrowed scope lands on a name React Native reserves', () => { - // Both derive 'Native'; the borrow takes '@react/native' to 'ReactNative'. - const run = () => - expand([scoped('@react/native', '/r'), scoped('@other/native', '/o')], { - '/r': {}, - '/o': {}, - }); + it('throws instead of borrowing the npm scope when the derived name is reserved', () => { + const run = () => expand([dep('@powersync/react-native', '/ps')]); expect(run).toThrow(SpmNameCollisionError); expect(run).toThrow(/React Native reserves/); }); - it('still throws for two unscoped deps deriving the same name', () => { + it('throws when two deps land on the same podspec name', () => { const run = () => - expand( - [scoped('react-native-foo', '/a'), scoped('react_native_foo', '/b')], - {'/a': {}, '/b': {}}, - ); + expand([dep('@a/svg', '/a'), dep('@b/svg', '/b')], { + podspecs: {'/a': {name: 'RNSVG'}, '/b': {name: 'RNSVG'}}, + }); expect(run).toThrow(SpmNameCollisionError); - expect(run).toThrow( - /'react-native-foo' \('ReactNativeFoo'\) and 'react_native_foo' \('ReactNativeFoo'\) both resolve to 'ReactNativeFoo'\./, - ); - expect(run).toThrow(/Set a distinct 'spm\.name'/); - }); - - it('changes nothing, and says nothing, for a set with no collisions', () => { - const log = jest.fn(); - const result = expand( - [scoped('@a/foo', '/a'), scoped('@b/bar', '/b'), scoped('baz', '/c')], - {'/a': {}, '/b': {}, '/c': {}}, - {log}, - ); - expect(result.map(d => d.swiftName)).toEqual(['Foo', 'Bar', 'Baz']); - expect(log).not.toHaveBeenCalled(); - }); - - it('borrows a second time when an already-borrowed name collides, and the incumbent keeps its name', () => { - // Both land on 'AReactNative': one by borrowing, one by derivation. - const result = expand( - [scoped('@a/react-native', '/a'), scoped('a-react-native', '/b')], - {'/a': {}, '/b': {}}, - ); - expect(result.map(d => d.swiftName)).toEqual([ - 'AAReactNative', - 'AReactNative', - ]); + expect(run).toThrow(/both resolve to 'RNSVG'/); + expect(run).toThrow(/Set a distinct 'swiftpmConfig\.name'/); }); - it('disambiguates a transitive dep against a direct one', () => { - const result = expandSpmDependencies([scoped('@a/foo', '/a')], { - readConfig: makeReadConfig({ - '/a': {spm: {dependencies: ['@b/foo']}}, - '/b': {dependency: {platforms: {ios: {}}}}, - }), - resolveDep: makeResolveDep({'@b/foo': '/b'}), - }); - expect(result.map(d => d.swiftName)).toEqual(['AFoo', 'BFoo']); + it('throws when two podspec names differ only in punctuation — SwiftPM compiles one module', () => { + const run = () => + expand([dep('@a/foo', '/a'), dep('@b/foo', '/b')], { + podspecs: {'/a': {name: 'foo-bar'}, '/b': {name: 'foo_bar'}}, + }); + expect(run).toThrow(SpmNameCollisionError); + // Both spellings the authors wrote, plus the module they share. + expect(run).toThrow(/'foo-bar'/); + expect(run).toThrow(/'foo_bar'/); + expect(run).toThrow(/module 'foo_bar'/); }); }); // --------------------------------------------------------------------------- -// Reserved React Native names — the backstop for what a scope cannot resolve. +// Reserved React Native names — terminal, whatever the name was resolved from. // --------------------------------------------------------------------------- describe('expandSpmDependencies (reserved React Native names)', () => { function expand(direct, configs, options) { return expandSpmDependencies(direct, { - readConfig: makeReadConfig(configs), + ...fixtures(configs), resolveDep: makeResolveDep({}), ...options, }); @@ -717,7 +759,7 @@ describe('expandSpmDependencies (reserved React Native names)', () => { /'react-headers' resolves to 'ReactHeaders', which React Native reserves/, ); expect(run).toThrow( - /Set a different 'spm\.name' in react-headers's react-native\.config\.js\./, + /Set a different 'swiftpmConfig\.name' in react-headers's package\.json\./, ); }); @@ -736,7 +778,7 @@ describe('expandSpmDependencies (reserved React Native names)', () => { expandSpmDependencies( [{name: 'top', root: '/top', platforms: {ios: {}}}], { - readConfig: makeReadConfig({ + ...fixtures({ '/top': {spm: {dependencies: ['react-native-headers']}}, '/rnh': {dependency: {platforms: {ios: {}}}}, }), @@ -818,6 +860,24 @@ describe('expandSpmDependencies (reserved React Native names)', () => { expect(dep.swiftName).toBe(REACT_HEADERS_TARGET_DIR); }); + it('reports a punctuation-only match against a reserved name, naming both spellings', () => { + // 'React_GeneratedCode' and RN's 'React-GeneratedCode' are distinct strings + // and distinct directories, but SwiftPM compiles them as one module. + const run = () => + expand( + [{name: 'some-lib', root: '/s', platforms: {ios: {}}}], + {'/s': {}}, + { + readPodspec: () => ({name: 'React_GeneratedCode'}), + }, + ); + expect(run).toThrow(SpmNameCollisionError); + expect(run).toThrow( + /'some-lib' resolves to 'React_GeneratedCode', which compiles as the same module as React Native's reserved 'React-GeneratedCode'/, + ); + expect(run).toThrow(/swiftpmConfig\.name/); + }); + it('reports a case-only match against a reserved name, naming both spellings', () => { const run = () => expand([{name: 'some-lib', root: '/s', platforms: {ios: {}}}], { @@ -827,29 +887,197 @@ describe('expandSpmDependencies (reserved React Native names)', () => { expect(run).toThrow( /'some-lib' resolves to 'reactnative', which differs from React Native's reserved 'ReactNative' only in case/, ); - expect(run).toThrow(/spm\.name/); + expect(run).toThrow(/swiftpmConfig\.name/); + }); +}); + +// --------------------------------------------------------------------------- +// swiftpmConfig — the declared home for a library's SwiftPM settings, and the +// step of the precedence that lets a library stop shipping a podspec. +// --------------------------------------------------------------------------- + +describe('expandSpmDependencies (swiftpmConfig)', () => { + let tmpRoot; + let roots = 0; + + beforeAll(() => { + tmpRoot = fs.mkdtempSync( + path.join(fs.realpathSync(os.tmpdir()), 'spm-expand-config-'), + ); + }); + + afterAll(() => { + fs.rmSync(tmpRoot, {recursive: true, force: true}); + }); + + function makeRoot(pkgJson) { + const root = path.join(tmpRoot, `pkg-${roots++}`); + fs.mkdirSync(root, {recursive: true}); + fs.writeFileSync( + path.join(root, 'package.json'), + JSON.stringify(pkgJson, null, 2), + ); + return root; + } + + function expand(direct, {configs, podspecs} = {}) { + return expandSpmDependencies(direct, { + readConfig: makeReadConfig(configs ?? {}), + resolveDep: makeResolveDep({}), + readPodspec: makeReadPodspec(podspecs ?? {}), + }); + } + + it('takes the name from package.json, ahead of the podspec', () => { + const root = makeRoot({ + name: 'react-native-svg', + swiftpmConfig: {name: 'MySvg'}, + }); + const [svg] = expand( + [{name: 'react-native-svg', root, platforms: {ios: {}}}], + {podspecs: {[root]: {name: 'RNSVG'}}}, + ); + expect(svg.swiftName).toBe('MySvg'); + }); + + it('records where each name came from, so the scaffolder can tell a derived name from a declared one', () => { + const declared = makeRoot({ + name: 'react-native-svg', + swiftpmConfig: {name: 'MySvg'}, + }); + const derived = makeRoot({name: 'react-native-screens'}); + const guessed = makeRoot({name: 'react-native-fizz-buzz'}); + const result = expand( + [ + {name: 'react-native-svg', root: declared, platforms: {ios: {}}}, + {name: 'react-native-screens', root: derived, platforms: {ios: {}}}, + {name: 'react-native-fizz-buzz', root: guessed, platforms: {ios: {}}}, + ], + {podspecs: {[derived]: {name: 'RNScreens'}}}, + ); + expect(result.map(d => d.swiftNameSource)).toEqual([ + 'config', + 'podspec', + 'npm', + ]); + }); + + it('expands dependencies declared in package.json', () => { + const root = makeRoot({ + name: 'react-native-reanimated', + swiftpmConfig: {dependencies: ['react-native-worklets']}, + }); + const result = expandSpmDependencies( + [{name: 'react-native-reanimated', root, platforms: {ios: {}}}], + { + readConfig: makeReadConfig({ + '/w': {dependency: {platforms: {ios: {}}}}, + }), + resolveDep: makeResolveDep({'react-native-worklets': '/w'}), + }, + ); + expect(result.map(d => d.name)).toEqual([ + 'react-native-reanimated', + 'react-native-worklets', + ]); + }); + + it('still honours a name in the deprecated spm block', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'react-native-svg'}); + const [svg] = expand( + [{name: 'react-native-svg', root, platforms: {ios: {}}}], + {configs: {[root]: {spm: {name: 'MySvg'}}}}, + ); + expect(svg.swiftName).toBe('MySvg'); + expect(warnSpy).toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } }); }); // --------------------------------------------------------------------------- -// isValidSwiftName — the charset rule `spm.name` enforces. +// defaultReadPodspec — only autolinking.json records a podspecPath, so deps +// synthesized from `spm.dependencies` rely on the dep-root search. // --------------------------------------------------------------------------- -describe('isValidSwiftName', () => { - it.each(['worklets', 'ReactNativeFoo', 'hermes-engine', 'react_native_foo'])( - 'accepts %j', - name => { - expect(isValidSwiftName(name)).toBe(true); - }, - ); - - it.each(['', 'foo bar', 'foo/bar', 'foo.bar', '9lives', 42, null])( - 'rejects %j', - name => { - expect(isValidSwiftName(name)).toBe(false); - }, - ); +describe('defaultReadPodspec', () => { + let root; + + beforeEach(() => { + root = fs.mkdtempSync( + path.join(fs.realpathSync(os.tmpdir()), 'spm-read-podspec-'), + ); + }); + + afterEach(() => { + fs.rmSync(root, {recursive: true, force: true}); + }); + + function writePodspec(name, body) { + fs.writeFileSync( + path.join(root, `${name}.podspec`), + ['Pod::Spec.new do |s|', ` s.name = "${name}"`, ...body, 'end', ''].join( + '\n', + ), + ); + } + + it('finds the podspec at the dep root when no path was recorded', () => { + writePodspec('RNSVG', [ + ' s.version = "1.0.0"', + ' s.header_dir = "rnsvg"', + ]); + const model = defaultReadPodspec(root, null); + expect(model?.name).toBe('RNSVG'); + expect(model?.headerDir).toBe('rnsvg'); + }); + + it('names a screens-shaped library from its pod name, not its subspec prefix', () => { + // react-native-screens and react-native-svg both declare their C++ prefix + // on a subspec; the library's ObjC headers are imported under the pod name, + // and the subspec prefix resolves through the header search paths instead. + writePodspec('RNScreens', [ + ' s.version = "4.0.0"', + ' s.subspec "common" do |ss|', + ' ss.header_mappings_dir = "common/cpp"', + ' ss.header_dir = "rnscreens"', + ' end', + ]); + const [screens] = expandSpmDependencies( + [{name: 'react-native-screens', root, platforms: {ios: {}}}], + { + readConfig: () => null, + resolveDep: makeResolveDep({}), + readPodspec: defaultReadPodspec, + }, + ); + expect(screens.swiftName).toBe('RNScreens'); + expect(screens.swiftNameSource).toBe('podspec'); + }); + + it("skips a crashed run's leftover patched copy", () => { + writePodspec('RNSVG', [' s.version = "1.0.0"']); + fs.writeFileSync( + path.join(root, '.spm-scaffold-1-Leftover.podspec'), + 'Pod::Spec.new do |s|\n s.name = "Leftover"\nend\n', + ); + expect(defaultReadPodspec(root, null)?.name).toBe('RNSVG'); + }); + + it('returns null when the dep ships no podspec', () => { + expect(defaultReadPodspec(root, null)).toBeNull(); + }); + + it('returns null when the recorded path is gone', () => { + expect( + defaultReadPodspec(root, path.join(root, 'Gone.podspec')), + ).toBeNull(); + }); }); + // defaultReadConfig // // The community CLI's own loaders disagree — sync reads named exports, async diff --git a/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js b/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js index 7c1644fbc745..baa0a8fa20ba 100644 --- a/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js +++ b/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js @@ -25,6 +25,7 @@ const { linkHeaderTree, main, reactDescriptor, + readDenyPluginsFromConfig, reportMissingManifests, } = require('../generate-spm-autolinking'); const fs = require('node:fs'); @@ -1051,6 +1052,28 @@ describe('hasMixedLanguageSources', () => { }); }); +// Every main() case silences the [generate-spm-autolinking] logger and removes +// the temp app dirs it appends to `created`. +function useTempApps() { + const created = []; + const spies = []; + + beforeEach(() => { + for (const m of ['log', 'warn', 'error']) { + spies.push(jest.spyOn(console, m).mockImplementation(() => {})); + } + }); + + afterEach(() => { + for (const s of spies) s.mockRestore(); + spies.length = 0; + for (const d of created) fs.rmSync(d, {recursive: true, force: true}); + created.length = 0; + }); + + return {created, spies}; +} + // --------------------------------------------------------------------------- // main() — autolinking plugin host exemption // @@ -1064,27 +1087,16 @@ describe('hasMixedLanguageSources', () => { // --------------------------------------------------------------------------- describe('main() — autolinking plugin host exemption', () => { - let created = []; - let spies = []; - - beforeEach(() => { - // Silence the [generate-spm-autolinking] logger (console.log/warn/error). - for (const m of ['log', 'warn', 'error']) { - spies.push(jest.spyOn(console, m).mockImplementation(() => {})); - } - }); - - afterEach(() => { - for (const s of spies) s.mockRestore(); - spies = []; - for (const d of created) fs.rmSync(d, {recursive: true, force: true}); - created = []; - }); + const {created} = useTempApps(); // Builds a minimal app fixture whose ONLY autolinked iOS dep is `expo`, which // ships NO Package.swift. When `withPlugin` is set, expo declares an // autolinking plugin in its own react-native.config.js (transitive opt-in). - function buildFixture({withPlugin, depName = 'expo'}) { + function buildFixture({ + withPlugin, + depName = 'expo', + declareIn = 'package.json', + }) { const appRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'spm-plugin-host-')); created.push(appRoot); // rnRoot only needs to exist (main() existence-checks it, then passes it @@ -1104,10 +1116,20 @@ describe('main() — autolinking plugin host exemption', () => { '// native source\n', ); if (withPlugin) { - fs.writeFileSync( - path.join(expoDir, 'react-native.config.js'), - "module.exports = { spm: { autolinkingPlugin: './spm-plugin.js' } };\n", - ); + if (declareIn === 'react-native.config.js') { + fs.writeFileSync( + path.join(expoDir, 'react-native.config.js'), + "module.exports = { spm: { autolinkingPlugin: './spm-plugin.js' } };\n", + ); + } else { + fs.writeFileSync( + path.join(expoDir, 'package.json'), + JSON.stringify({ + name: depName, + swiftpmConfig: {autolinkingPlugin: './spm-plugin.js'}, + }), + ); + } fs.writeFileSync( path.join(expoDir, 'spm-plugin.js'), 'module.exports = function () {\n' + @@ -1195,7 +1217,7 @@ describe('main() — autolinking plugin host exemption', () => { expect(run).toThrow(/'react-native-y'/); expect(run).toThrow(/'expo'/); expect(run).toThrow(/autolinking plugin/); - expect(run).toThrow(/spm\.dependencies/); + expect(run).toThrow(/declared as a SwiftPM dependency/); }); it('leaves a self-managed dependent alone — its own Package.swift declares its package references, so RN emits none', () => { @@ -1243,22 +1265,8 @@ describe('main() — autolinking plugin host exemption', () => { // of React Native's reserved names, and unique across modules and deps. // --------------------------------------------------------------------------- -describe('main() — spm.modules names', () => { - let created = []; - let spies = []; - - beforeEach(() => { - for (const m of ['log', 'warn', 'error']) { - spies.push(jest.spyOn(console, m).mockImplementation(() => {})); - } - }); - - afterEach(() => { - for (const s of spies) s.mockRestore(); - spies = []; - for (const d of created) fs.rmSync(d, {recursive: true, force: true}); - created = []; - }); +describe('main() — swiftpmConfig.modules names', () => { + const {created, spies} = useTempApps(); // App fixture whose react-native.config.js declares `spm.modules`, plus an // optional autolinked dep (for the module-vs-dep collision case). @@ -1269,17 +1277,13 @@ describe('main() — spm.modules names', () => { fs.mkdirSync(rnRoot, {recursive: true}); fs.writeFileSync( path.join(appRoot, 'package.json'), - JSON.stringify({name: 'app'}), + JSON.stringify({name: 'app', swiftpmConfig: {modules}}), ); for (const mod of modules) { const modDir = path.join(appRoot, mod.path); fs.mkdirSync(modDir, {recursive: true}); fs.writeFileSync(path.join(modDir, 'Module.mm'), '// native source\n'); } - fs.writeFileSync( - path.join(appRoot, 'react-native.config.js'), - `module.exports = ${JSON.stringify({spm: {modules}})};\n`, - ); const dependencies = {}; if (dep != null) { const depDir = path.join(appRoot, 'node_modules', dep.name); @@ -1292,7 +1296,15 @@ describe('main() — spm.modules names', () => { path.join(depDir, 'Package.swift'), '// swift-tools-version: 6.0\n', ); - dependencies[dep.name] = {root: depDir, platforms: {ios: {}}}; + const ios = {}; + if (dep.podName != null) { + ios.podspecPath = path.join(depDir, `${dep.podName}.podspec`); + fs.writeFileSync( + ios.podspecPath, + `Pod::Spec.new do |s|\n s.name = "${dep.podName}"\n s.version = "1.0.0"\nend\n`, + ); + } + dependencies[dep.name] = {root: depDir, platforms: {ios}}; } const autolinkDir = path.join(appRoot, 'build', 'generated', 'autolinking'); fs.mkdirSync(autolinkDir, {recursive: true}); @@ -1306,11 +1318,17 @@ describe('main() — spm.modules names', () => { const run = ({appRoot, rnRoot}) => main(['--app-root', appRoot, '--react-native-root', rnRoot]); - it('accepts a normal module name', () => { + it('emits a module the app declares', () => { const app = buildApp({ modules: [{name: 'MyNativeModule', path: 'ios/MyNativeModule'}], }); - expect(() => run(app)).not.toThrow(); + run(app); + expect( + fs.readFileSync( + path.join(app.appRoot, 'build/generated/autolinking/Package.swift'), + 'utf8', + ), + ).toContain('"MyNativeModule"'); }); it('rejects a module named after a reserved React Native name', () => { @@ -1319,9 +1337,9 @@ describe('main() — spm.modules names', () => { }); expect(() => run(app)).toThrow(SpmNameCollisionError); expect(() => run(app)).toThrow( - /the 'spm.modules' entry 'ReactNative' resolves to 'ReactNative', which React Native reserves/, + /the 'swiftpmConfig.modules' entry 'ReactNative' resolves to 'ReactNative', which React Native reserves/, ); - expect(() => run(app)).toThrow(/'spm\.modules'\.$/); + expect(() => run(app)).toThrow(/'swiftpmConfig\.modules'\.$/); }); it('rejects a reserved product name in any casing', () => { @@ -1330,7 +1348,7 @@ describe('main() — spm.modules names', () => { }); expect(() => run(app)).toThrow(SpmNameCollisionError); expect(() => run(app)).toThrow( - /the 'spm\.modules' entry 'reactheaders' resolves to 'reactheaders', which differs from React Native's reserved 'ReactHeaders' only in case/, + /the 'swiftpmConfig\.modules' entry 'reactheaders' resolves to 'reactheaders', which differs from React Native's reserved 'ReactHeaders' only in case/, ); }); @@ -1338,7 +1356,9 @@ describe('main() — spm.modules names', () => { const app = buildApp({ modules: [{name: 'My Module', path: 'ios/MyNativeModule'}], }); - expect(() => run(app)).toThrow(/invalid 'spm.modules' name "My Module"/); + expect(() => run(app)).toThrow( + /invalid 'swiftpmConfig.modules' name "My Module"/, + ); }); it('rejects two modules resolving to the same name', () => { @@ -1350,7 +1370,31 @@ describe('main() — spm.modules names', () => { }); expect(() => run(app)).toThrow(SpmNameCollisionError); expect(() => run(app)).toThrow( - /the 'spm.modules' entry 'shared' differs from the existing target 'Shared' only in case/, + /the 'swiftpmConfig.modules' entry 'shared' differs from the existing target 'Shared' only in case/, + ); + }); + + it('rejects two modules whose names differ only in punctuation', () => { + const app = buildApp({ + modules: [ + {name: 'foo-bar', path: 'ios/one'}, + {name: 'foo_bar', path: 'ios/two'}, + ], + }); + expect(() => run(app)).toThrow(SpmNameCollisionError); + expect(() => run(app)).toThrow( + /the 'swiftpmConfig.modules' entry 'foo_bar' compiles as the same module as the existing target 'foo-bar'/, + ); + }); + + it('rejects a module colliding with an autolinked dep through SwiftPM normalization', () => { + const app = buildApp({ + modules: [{name: 'foo_bar', path: 'ios/MyNativeModule'}], + dep: {name: 'react-native-foo-bar', podName: 'foo-bar'}, + }); + expect(() => run(app)).toThrow(SpmNameCollisionError); + expect(() => run(app)).toThrow( + /the 'swiftpmConfig.modules' entry 'foo_bar' compiles as the same module as the existing target 'foo-bar'/, ); }); @@ -1361,9 +1405,150 @@ describe('main() — spm.modules names', () => { }); expect(() => run(app)).toThrow(SpmNameCollisionError); expect(() => run(app)).toThrow( - /the 'spm.modules' entry 'ReactNativeFoo' is already the name of another autolinked target/, + /the 'swiftpmConfig.modules' entry 'ReactNativeFoo' is already the name of another autolinked target/, ); }); + + // `appRoot` is the Xcode project dir (`ios/`) in a standard app, so the + // app's settings live one level up, with its package.json — the directory + // codegen already calls the project root. + describe('found at the project root or the Xcode dir', () => { + // A standard app: JS root with package.json, Xcode project in ios/. + function buildStandardApp({atProjectRoot, atAppRoot}) { + const projectRoot = fs.realpathSync( + fs.mkdtempSync(path.join(os.tmpdir(), 'spm-config-root-')), + ); + created.push(projectRoot); + const appRoot = path.join(projectRoot, 'ios'); + const rnRoot = path.join(projectRoot, 'rn'); + fs.mkdirSync(rnRoot, {recursive: true}); + fs.mkdirSync(appRoot, {recursive: true}); + fs.writeFileSync( + path.join(projectRoot, 'package.json'), + JSON.stringify({ + name: 'app', + swiftpmConfig: atProjectRoot ?? undefined, + }), + ); + // The Xcode-dir layout that predates `swiftpmConfig`: a config file next to + // the project. It has no package.json, so the project root is still above. + if (atAppRoot != null) { + fs.writeFileSync( + path.join(appRoot, 'react-native.config.js'), + `module.exports = ${JSON.stringify({spm: atAppRoot})};\n`, + ); + } + const stageModules = (root, modules) => { + for (const mod of modules ?? []) { + const modDir = path.resolve(root, mod.path); + fs.mkdirSync(modDir, {recursive: true}); + fs.writeFileSync( + path.join(modDir, 'Module.mm'), + '// native source\n', + ); + } + }; + stageModules(projectRoot, atProjectRoot?.modules); + stageModules(appRoot, atAppRoot?.modules); + const autolinkDir = path.join( + appRoot, + 'build', + 'generated', + 'autolinking', + ); + fs.mkdirSync(autolinkDir, {recursive: true}); + fs.writeFileSync( + path.join(autolinkDir, 'autolinking.json'), + JSON.stringify({dependencies: {}}), + ); + return {appRoot, rnRoot, autolinkDir}; + } + + const manifestOf = ({autolinkDir}) => + fs.readFileSync(path.join(autolinkDir, 'Package.swift'), 'utf8'); + + it('finds modules declared at the project root, above the Xcode dir', () => { + const app = buildStandardApp({ + atProjectRoot: {modules: [{name: 'FromProjectRoot', path: 'MyModule'}]}, + }); + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]); + expect(manifestOf(app)).toContain('"FromProjectRoot"'); + }); + + it('still finds a config that sits in the Xcode dir, as it did before', () => { + const app = buildStandardApp({ + atAppRoot: {modules: [{name: 'FromAppRoot', path: 'MyModule'}]}, + }); + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]); + expect(manifestOf(app)).toContain('"FromAppRoot"'); + }); + + it('prefers the project root when both declare settings', () => { + const app = buildStandardApp({ + atProjectRoot: {modules: [{name: 'FromProjectRoot', path: 'MyModule'}]}, + atAppRoot: {modules: [{name: 'FromAppRoot', path: 'Other'}]}, + }); + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]); + const manifest = manifestOf(app); + expect(manifest).toContain('"FromProjectRoot"'); + expect(manifest).not.toContain('"FromAppRoot"'); + }); + + it('keeps a Xcode-dir field the project root does not declare', () => { + // The drop this guards: one unrelated key at the project root used to hide + // a working `modules` set in the Xcode dir. + const app = buildStandardApp({ + atProjectRoot: {denyPlugins: ['some-framework']}, + atAppRoot: {modules: [{name: 'FromAppRoot', path: 'MyModule'}]}, + }); + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]); + expect(manifestOf(app)).toContain('"FromAppRoot"'); + }); + + it('says which field it took from the Xcode dir', () => { + const app = buildStandardApp({ + atProjectRoot: {denyPlugins: []}, + atAppRoot: {modules: [{name: 'FromAppRoot', path: 'MyModule'}]}, + }); + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]); + const warned = spies + .flatMap(spy => spy.mock.calls) + .map(call => call.join(' ')) + .join('\n'); + expect(warned).toContain('modules'); + expect(warned).toContain(app.appRoot); + }); + + it('resolves a module path against the root that declared it', () => { + // A path written next to the JS-root package.json reads from there; one in + // the Xcode dir keeps reading from there. + const app = buildStandardApp({ + atProjectRoot: {modules: [{name: 'FromProjectRoot', path: 'ios/Deep'}]}, + }); + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]); + // The source only mirrors if the declared path was found on disk. + expect( + fs.existsSync( + path.join(app.autolinkDir, 'packages/FromProjectRoot/root/Module.mm'), + ), + ).toBe(true); + }); + + it('reads denyPlugins from the project root too', () => { + const app = buildStandardApp({ + atProjectRoot: {denyPlugins: ['some-framework']}, + }); + expect(() => + main(['--app-root', app.appRoot, '--react-native-root', app.rnRoot]), + ).not.toThrow(); + expect(readDenyPluginsFromConfig(path.dirname(app.appRoot))).toEqual([ + 'some-framework', + ]); + expect(readDenyPluginsFromConfig(app.appRoot)).toEqual([ + 'some-framework', + ]); + }); + }); }); // --------------------------------------------------------------------------- @@ -1376,20 +1561,7 @@ describe('main() — spm.modules names', () => { // --------------------------------------------------------------------------- describe('main() — flavoredFrameworks sidecar', () => { - let created = []; - let spies = []; - - beforeEach(() => { - for (const m of ['log', 'warn', 'error']) { - spies.push(jest.spyOn(console, m).mockImplementation(() => {})); - } - }); - afterEach(() => { - for (const s of spies) s.mockRestore(); - spies = []; - for (const d of created) fs.rmSync(d, {recursive: true, force: true}); - created = []; - }); + const {created} = useTempApps(); const sidecarPath = appRoot => path.join( @@ -1511,20 +1683,7 @@ describe('main() — flavoredFrameworks sidecar', () => { // --------------------------------------------------------------------------- describe('main() — scriptPhases sidecar', () => { - let created = []; - let spies = []; - - beforeEach(() => { - for (const m of ['log', 'warn', 'error']) { - spies.push(jest.spyOn(console, m).mockImplementation(() => {})); - } - }); - afterEach(() => { - for (const s of spies) s.mockRestore(); - spies = []; - for (const d of created) fs.rmSync(d, {recursive: true, force: true}); - created = []; - }); + const {created} = useTempApps(); const sidecarPath = appRoot => path.join( @@ -1631,20 +1790,7 @@ describe('main() — scriptPhases sidecar', () => { // --------------------------------------------------------------------------- describe('main() — .spm-sync-watch-paths emission', () => { - let created = []; - let spies = []; - - beforeEach(() => { - for (const m of ['log', 'warn', 'error']) { - spies.push(jest.spyOn(console, m).mockImplementation(() => {})); - } - }); - afterEach(() => { - for (const s of spies) s.mockRestore(); - spies = []; - for (const d of created) fs.rmSync(d, {recursive: true, force: true}); - created = []; - }); + const {created} = useTempApps(); function readWatchLines(appRoot) { const contents = fs.readFileSync( @@ -1744,33 +1890,17 @@ describe('main() — .spm-sync-watch-paths emission', () => { }); // --------------------------------------------------------------------------- -// main() — scope disambiguation: the borrowed name reaching a real manifest. +// main() — the name a dep's podspec declares reaching a real manifest. // --------------------------------------------------------------------------- -describe('main() — scope disambiguation', () => { - let created = []; - let spies = []; - let logSpy; - - beforeEach(() => { - logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); - spies.push(logSpy); - for (const m of ['warn', 'error']) { - spies.push(jest.spyOn(console, m).mockImplementation(() => {})); - } - }); - - afterEach(() => { - for (const s of spies) s.mockRestore(); - spies = []; - for (const d of created) fs.rmSync(d, {recursive: true, force: true}); - created = []; - }); +describe('main() — podspec-derived names', () => { + const {created} = useTempApps(); - // Each dep ships a Package.swift, so it reaches the aggregator as self-managed. - function buildFixture(...depNames) { + // Each dep ships a Package.swift, so it reaches the aggregator as + // self-managed, plus the podspec its name is meant to come from. + function buildFixture(...deps) { const appRoot = fs.realpathSync( - fs.mkdtempSync(path.join(os.tmpdir(), 'spm-scope-disambig-')), + fs.mkdtempSync(path.join(os.tmpdir(), 'spm-podspec-name-')), ); created.push(appRoot); const rnRoot = path.join(appRoot, 'rn'); @@ -1780,16 +1910,39 @@ describe('main() — scope disambiguation', () => { JSON.stringify({name: 'app'}), ); const dependencies = {}; - for (const depName of depNames) { - const depDir = path.join(appRoot, 'node_modules', ...depName.split('/')); + for (const {npmName, podName, headerDir, swiftpmConfig} of deps) { + const depDir = path.join(appRoot, 'node_modules', ...npmName.split('/')); fs.mkdirSync(path.join(depDir, 'ios'), {recursive: true}); + if (swiftpmConfig != null) { + fs.writeFileSync( + path.join(depDir, 'package.json'), + JSON.stringify({name: npmName, swiftpmConfig}), + ); + } fs.writeFileSync( path.join(depDir, 'Package.swift'), '// swift-tools-version:6.0\n// hand-authored\n', ); fs.writeFileSync(path.join(depDir, 'ios', 'Lib.h'), '// header\n'); fs.writeFileSync(path.join(depDir, 'ios', 'Lib.mm'), '// src\n'); - dependencies[depName] = {root: depDir, platforms: {ios: {}}}; + const ios = {}; + if (podName != null) { + const podspecPath = path.join(depDir, `${podName}.podspec`); + fs.writeFileSync( + podspecPath, + [ + 'Pod::Spec.new do |s|', + ` s.name = "${podName}"`, + ' s.version = "1.0.0"', + ...(headerDir != null ? [` s.header_dir = "${headerDir}"`] : []), + ' s.source_files = "ios/**/*.{h,m,mm}"', + 'end', + '', + ].join('\n'), + ); + ios.podspecPath = podspecPath; + } + dependencies[npmName] = {root: depDir, platforms: {ios}}; } const autolinkDir = path.join(appRoot, 'build', 'generated', 'autolinking'); fs.mkdirSync(autolinkDir, {recursive: true}); @@ -1800,77 +1953,64 @@ describe('main() — scope disambiguation', () => { return {appRoot, rnRoot}; } - it('emits the disambiguated name as the package ref, the product ref and the header slice', () => { - const {appRoot, rnRoot} = buildFixture('@powersync/react-native'); + function run(appRoot, rnRoot) { main(['--app-root', appRoot, '--react-native-root', rnRoot]); - const outDir = path.join(appRoot, 'build/generated/autolinking'); - const pkg = fs.readFileSync(path.join(outDir, 'Package.swift'), 'utf8'); - expect(pkg).toContain( - '.package(name: "PowersyncReactNative", path: "libs/PowersyncReactNative")', - ); - expect(pkg).toContain( - '.product(name: "PowersyncReactNative", package: "PowersyncReactNative")', - ); - // Nothing is referenced under the name the derivation would have taken. - expect(pkg).not.toContain('"ReactNative", path: "libs/'); - expect(pkg).not.toContain('package: "ReactNative"'); + return { + outDir, + manifest: fs.readFileSync(path.join(outDir, 'Package.swift'), 'utf8'), + }; + } - // So `#import ` resolves for consumers. - expect( - fs.existsSync( - path.join(outDir, 'headers/PowersyncReactNative/ios/Lib.h'), - ), - ).toBe(true); - expect(fs.existsSync(path.join(outDir, 'libs/PowersyncReactNative'))).toBe( - true, + it('emits every step of the precedence as the package ref, the product ref and the header slice', () => { + const {appRoot, rnRoot} = buildFixture( + {npmName: 'react-native-svg', podName: 'RNSVG'}, + { + npmName: 'react-native-reanimated', + podName: 'RNReanimated', + headerDir: 'reanimated', + }, + { + npmName: 'react-native-svg-fork', + podName: 'RNSVGFork', + swiftpmConfig: {name: 'MySvg'}, + }, + {npmName: 'react-native-screens'}, ); - expect(fs.existsSync(path.join(outDir, 'headers/ReactNative'))).toBe(false); - }); - - it('tells the developer which name it took and why', () => { - const {appRoot, rnRoot} = buildFixture('@powersync/react-native'); - main(['--app-root', appRoot, '--react-native-root', rnRoot]); - - const line = logSpy.mock.calls - .map(call => call.join(' ')) - .find(l => l.includes('PowersyncReactNative')); - expect(line).toBeDefined(); - expect(line).toContain('@powersync/react-native'); - expect(line).toContain("'ReactNative'"); - }); - - it('still rejects an unscoped dep deriving a reserved name — it has no scope to borrow', () => { - const {appRoot, rnRoot} = buildFixture('react-headers'); - expect(() => - main(['--app-root', appRoot, '--react-native-root', rnRoot]), - ).toThrow(SpmNameCollisionError); - }); + const {outDir, manifest} = run(appRoot, rnRoot); - it('emits both names of a dep-vs-dep collision as package refs, product refs and header slices', () => { - const {appRoot, rnRoot} = buildFixture('@a/foo', '@b/foo'); - main(['--app-root', appRoot, '--react-native-root', rnRoot]); - - const outDir = path.join(appRoot, 'build/generated/autolinking'); - const pkg = fs.readFileSync(path.join(outDir, 'Package.swift'), 'utf8'); - for (const name of ['AFoo', 'BFoo']) { - expect(pkg).toContain(`.package(name: "${name}", path: "libs/${name}")`); - expect(pkg).toContain(`.product(name: "${name}", package: "${name}")`); + // swiftpmConfig.name, header_dir, the podspec name, the npm name. + for (const name of ['MySvg', 'reanimated', 'RNSVG', 'ReactNativeScreens']) { + expect(manifest).toContain( + `.package(name: "${name}", path: "libs/${name}")`, + ); + expect(manifest).toContain( + `.product(name: "${name}", package: "${name}")`, + ); + // So `#import ` resolves for consumers. expect( fs.existsSync(path.join(outDir, `headers/${name}/ios/Lib.h`)), ).toBe(true); + expect(fs.existsSync(path.join(outDir, `libs/${name}`))).toBe(true); + } + + // Nothing is referenced under a name an earlier step outranked. + for (const outranked of [ + 'RNSVGFork', + 'RNReanimated', + 'ReactNativeSvg', + 'ReactNativeReanimated', + ]) { + expect(manifest).not.toContain(outranked); + expect(fs.existsSync(path.join(outDir, `headers/${outranked}`))).toBe( + false, + ); } - expect(pkg).not.toContain('"Foo", path: "libs/'); - expect(pkg).not.toContain('package: "Foo"'); - expect(fs.existsSync(path.join(outDir, 'headers/Foo'))).toBe(false); }); - it('still rejects a collision the scopes cannot resolve', () => { - // 'a-foo' already derives 'AFoo', the name '@a/foo' borrows. - const {appRoot, rnRoot} = buildFixture('@a/foo', '@b/foo', 'a-foo'); - expect(() => - main(['--app-root', appRoot, '--react-native-root', rnRoot]), - ).toThrow(SpmNameCollisionError); + it('refuses an unscoped dep deriving a reserved name', () => { + const {appRoot, rnRoot} = buildFixture({npmName: 'react-headers'}); + expect(() => run(appRoot, rnRoot)).toThrow(SpmNameCollisionError); }); }); diff --git a/packages/react-native/scripts/spm/__tests__/in-repo-library-names-test.js b/packages/react-native/scripts/spm/__tests__/in-repo-library-names-test.js new file mode 100644 index 000000000000..8027c5087055 --- /dev/null +++ b/packages/react-native/scripts/spm/__tests__/in-repo-library-names-test.js @@ -0,0 +1,157 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @noflow + */ + +'use strict'; + +/** + * The in-repo libraries the SwiftPM autolinker names, checked against the + * includes their sources hand-write. + * + * A library's Swift name is its header import prefix, so renaming one breaks + * every `#import ` written against the old name. rn-tester + * depends on both fixtures, so its SwiftPM job does catch that — as an Xcode + * build failure on a macOS runner. This catches it in `test_js` instead, and + * says which prefix went stale and what the library is called now. + */ + +const { + defaultReadPodspec, + resolveSwiftName, +} = require('../expand-spm-dependencies'); +const {toSwiftName} = require('../spm-utils'); +const {readSwiftpmConfig, writeSwiftpmName} = require('../swiftpm-config'); +const fs = require('node:fs'); +const path = require('node:path'); + +const REPO_ROOT = path.resolve(__dirname, '../../../../..'); + +const LIBRARIES = [ + { + npmName: 'react-native-test-library-apple', + dir: 'packages/react-native-test-library/apple', + }, + { + npmName: 'react-native-test-library-common', + dir: 'packages/react-native-test-library/common', + }, +]; + +const SOURCE_SUFFIXES = ['.h', '.m', '.mm', '.c', '.cpp', '.swift']; + +// What the autolinker resolves, exactly as it does it. +function resolve(library) { + const root = path.join(REPO_ROOT, library.dir); + return resolveSwiftName( + library.npmName, + readSwiftpmConfig(root, null), + defaultReadPodspec(root, null), + ); +} + +// The same, ignoring the declared name — what the podspec on its own says. +function resolveFromPodspec(library) { + const root = path.join(REPO_ROOT, library.dir); + return resolveSwiftName( + library.npmName, + null, + defaultReadPodspec(root, null), + ); +} + +function sourceFiles(dir) { + return fs + .readdirSync(path.join(REPO_ROOT, dir), {recursive: true}) + .map(entry => path.join(dir, String(entry))) + .filter(file => SOURCE_SUFFIXES.includes(path.extname(file))) + .filter(file => fs.statSync(path.join(REPO_ROOT, file)).isFile()); +} + +// Every `#import ` in the libraries' own sources. +function angleIncludes() { + const found = []; + for (const library of LIBRARIES) { + for (const file of sourceFiles(library.dir)) { + const source = fs.readFileSync(path.join(REPO_ROOT, file), 'utf8'); + const re = /^\s*#(?:import|include)\s+<([^/>]+)\/[^>]+>/gm; + let match; + while ((match = re.exec(source)) != null) { + found.push({file, prefix: match[1]}); + } + } + } + return found; +} + +describe('in-repo SwiftPM library names', () => { + const resolved = new Map( + LIBRARIES.map(library => [library.npmName, resolve(library).name]), + ); + + it('names each library from its declared name, not its npm package name', () => { + expect(resolved.get('react-native-test-library-common')).toBe( + 'TestLibraryCommon', + ); + expect(resolved.get('react-native-test-library-apple')).toBe( + 'TestLibraryApple', + ); + }); + + it('declares each name in package.json, so `spm scaffold` writes nothing', () => { + // scaffold records a podspec-derived name in the library's package.json. + // These two are tracked files, so a name they do not already declare makes + // every scaffold run — CI's included — dirty the checkout. + for (const library of LIBRARIES) { + const root = path.join(REPO_ROOT, library.dir); + expect(resolve(library).source).toBe('config'); + expect( + writeSwiftpmName(root, resolved.get(library.npmName), {dryRun: true}), + ).toBe('already-set'); + } + }); + + it('declares the same name its podspec derives, so CocoaPods agrees', () => { + for (const library of LIBRARIES) { + expect(resolveFromPodspec(library).name).toBe( + resolved.get(library.npmName), + ); + } + }); + + it('imports each sibling under the name the autolinker resolves for it', () => { + // Any prefix that names an in-repo library — under a name it no longer has — + // is a build failure waiting for whichever app links these fixtures. + const stale = new Map(); + for (const library of LIBRARIES) { + const name = resolved.get(library.npmName); + for (const alias of [toSwiftName(library.npmName), library.npmName]) { + if (alias !== name) { + stale.set(alias, {name, npmName: library.npmName}); + } + } + } + + const offenders = angleIncludes() + .filter(include => stale.has(include.prefix)) + .map( + include => + `${include.file} imports <${include.prefix}/…>, but '${stale.get(include.prefix).npmName}' resolves to '${stale.get(include.prefix).name}'`, + ); + expect(offenders).toEqual([]); + }); + + it('wires the one cross-library import in these fixtures', () => { + const prefixes = angleIncludes() + .filter(include => include.file.endsWith('TestLibraryApple.mm')) + .map(include => include.prefix); + expect(prefixes).toContain( + resolved.get('react-native-test-library-common'), + ); + }); +}); diff --git a/packages/react-native/scripts/spm/__tests__/read-podspec-test.js b/packages/react-native/scripts/spm/__tests__/read-podspec-test.js index acbad0d06681..bfc28b63176a 100644 --- a/packages/react-native/scripts/spm/__tests__/read-podspec-test.js +++ b/packages/react-native/scripts/spm/__tests__/read-podspec-test.js @@ -10,7 +10,12 @@ 'use strict'; -const {flattenSubspecs, readPodspec, regexPodspec} = require('../read-podspec'); +const { + flattenSubspecs, + readPodspec, + readPodspecNames, + regexPodspec, +} = require('../read-podspec'); const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); @@ -51,6 +56,33 @@ Pod::Spec.new do |s| end `; +const SCREENS_LIKE_PODSPEC = ` +Pod::Spec.new do |s| + s.name = "RNScreens" + s.version = "4.0.0" + s.source_files = ["ios/**/*.{h,m,mm}"] + + s.subspec "common" do |ss| + ss.source_files = ["common/cpp/**/*.{cpp,h}"] + ss.header_mappings_dir = "common/cpp" + ss.header_dir = "rnscreens" + end +end +`; + +const SVG_LIKE_PODSPEC = ` +Pod::Spec.new do |s| + s.name = "RNSVG" + s.version = "15.0.0" + s.source_files = "apple/**/*.{h,m,mm}" + + s.subspec "common" do |ss| + ss.source_files = "common/cpp/**/*.{cpp,h}" + ss.header_dir = "rnsvg" + end +end +`; + const REANIMATED_LIKE_PODSPEC = ` Pod::Spec.new do |s| s.name = "RNReanimated" @@ -69,6 +101,50 @@ Pod::Spec.new do |s| end `; +const DISTINCT_MODULE_NAME_PODSPEC = ` +Pod::Spec.new do |s| + s.name = "react-native-foo-bar" + s.module_name = 'RNFooBar' + s.version = "1.20.0" + s.source_files = "ios/**/*.{h,m,mm}" +end +`; + +// A subspec that reuses the parent's block variable instead of taking its own: +// inside the block, `s` is the CHILD, so a regex anchored on the receiver +// spelling reads the child's fields as the library's. +const SHADOWING_SUBSPEC_PODSPEC = ` +Pod::Spec.new do |s| + s.name = "ParentPod" + s.module_name = "ParentModule" + s.version = "1.0.0" + s.source_files = "ios/**/*.{h,m,mm}" + + s.subspec "common" do |s| + s.source_files = "common/cpp/**/*.{cpp,h}" + s.header_mappings_dir = "common/cpp" + s.header_dir = "child_prefix" + end +end +`; + +// The same library with the subspec taking its own variable — the unambiguous +// shape, which must keep naming the parent. +const OWN_VARIABLE_SUBSPEC_PODSPEC = ` +Pod::Spec.new do |s| + s.name = "ParentPod" + s.module_name = "ParentModule" + s.version = "1.0.0" + s.source_files = "ios/**/*.{h,m,mm}" + + s.subspec "common" do |ss| + ss.source_files = "common/cpp/**/*.{cpp,h}" + ss.header_mappings_dir = "common/cpp" + ss.header_dir = "child_prefix" + end +end +`; + const HEADER_SEARCH_PATHS_PODSPEC = ` Pod::Spec.new do |s| s.name = "react-native-thing" @@ -95,6 +171,153 @@ function writeFixture(name, content) { // --------------------------------------------------------------------------- describe('regexPodspec', () => { + it('reads past comments: a commented-out field never wins, a `#` in a string is not one', () => { + const {file, dir} = writeFixture( + 'commented.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = "RNSVG" # the pod everyone imports', + ' s.summary = "# not a comment"', + ' # s.header_dir = "OldPrefix"', + ' s.header_dir = "rnsvg"', + ' # s.header_mappings_dir = "Old/Mappings"', + 'end', + '', + ].join('\n'), + ); + try { + const raw = regexPodspec(file); + expect(raw.name).toBe('RNSVG'); + expect(raw.header_dir).toBe('rnsvg'); + // Commented out with no live counterpart: absent, not "Old/Mappings". + expect(raw.header_mappings_dir).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it.each([ + ['RNScreens', () => SCREENS_LIKE_PODSPEC], + ['RNSVG', () => SVG_LIKE_PODSPEC], + ])( + 'reads no spec-level header_dir when only a subspec declares one (%s)', + (podName, source) => { + const {file, dir} = writeFixture(`${podName}.podspec`, source()); + try { + const raw = regexPodspec(file); + expect(raw.name).toBe(podName); + // `ss.header_dir` belongs to that subspec, not to the library. + expect(raw.header_dir).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }, + ); + + it('reports no identity fields when a subspec rebinds the spec variable', () => { + const {file, dir} = writeFixture( + 'shadowing.podspec', + SHADOWING_SUBSPEC_PODSPEC, + ); + try { + const raw = regexPodspec(file); + // The child's `header_dir` is what a receiver-anchored regex would read + // as the library's own — and the parent's literal fields are no more + // trustworthy, since the same shadowing hides which scope declared them. + expect(raw.header_dir).toBeNull(); + expect(raw.module_name).toBeNull(); + expect(raw.name).toBeNull(); + // The fields subspecs are MEANT to contribute to still merge. + expect(raw.source_files).toEqual(['ios/**/*.{h,m,mm}']); + expect(raw.header_mappings_dir).toBe('common/cpp'); + expect(raw.__warnings__.join('\n')).toMatch( + /subspec rebinds the spec variable/, + ); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('leaves the flattened model without an identity to name the library by', () => { + // The pod-unavailable path: these three fields are what the name resolver + // reads, so nulling them is what makes it fall back to the npm name. + const {file, dir} = writeFixture( + 'shadowing.podspec', + SHADOWING_SUBSPEC_PODSPEC, + ); + try { + const model = flattenSubspecs(regexPodspec(file)); + expect(model.name).toBe(''); + expect(model.moduleName).toBeNull(); + expect(model.headerDir).toBeNull(); + expect(model.sourceFiles).toEqual(['ios/**/*.{h,m,mm}']); + expect(model.headerMappingsDirs).toEqual(['common/cpp']); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reads the parent identity when a subspec takes its own variable', () => { + const {file, dir} = writeFixture( + 'own-variable.podspec', + OWN_VARIABLE_SUBSPEC_PODSPEC, + ); + try { + const raw = regexPodspec(file); + expect(raw.name).toBe('ParentPod'); + expect(raw.module_name).toBe('ParentModule'); + expect(raw.header_dir).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it("still reads a subspec's header_mappings_dir, which feeds the search paths", () => { + const {file, dir} = writeFixture('RNScreens.podspec', SCREENS_LIKE_PODSPEC); + try { + const raw = regexPodspec(file); + expect(raw.header_mappings_dir).toBe('common/cpp'); + expect(raw.source_files).toEqual(['ios/**/*.{h,m,mm}']); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reads a spec-level header_dir even when a subspec declares its own', () => { + const {file, dir} = writeFixture( + 'core.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = "React-Core"', + ' s.header_dir = "React"', + ' s.subspec "cxx" do |ss|', + ' ss.header_dir = "reactcxx"', + ' end', + 'end', + '', + ].join('\n'), + ); + try { + expect(regexPodspec(file).header_dir).toBe('React'); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reads a spec-level field written on the block-argument line', () => { + const {file, dir} = writeFixture( + 'oneline.podspec', + 'Pod::Spec.new do |spec| spec.name = "OneLine"\n spec.header_dir = "oneline"\nend\n', + ); + try { + const raw = regexPodspec(file); + expect(raw.name).toBe('OneLine'); + expect(raw.header_dir).toBe('oneline'); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + it('extracts name, version, source_files, dependency from a real-world simple podspec', () => { const {file, dir} = writeFixture( 'react-native-safe-area-context.podspec', @@ -460,6 +683,254 @@ describe('flattenSubspecs', () => { // regex parser kicks in transparently. // --------------------------------------------------------------------------- +describe('flattenSubspecs (spec-level identity)', () => { + it("does not take a subspec's header_dir as the library's", () => { + const model = flattenSubspecs({ + name: 'RNScreens', + version: '4.0.0', + subspecs: [ + { + name: 'RNScreens/common', + header_dir: 'rnscreens', + header_mappings_dir: 'common/cpp', + source_files: ['common/cpp/**/*.{cpp,h}'], + }, + ], + }); + expect(model.name).toBe('RNScreens'); + expect(model.headerDir).toBeNull(); + // Still merged: these drive the header search paths, not the target name. + expect(model.headerMappingsDirs).toEqual(['common/cpp']); + expect(model.sourceFiles).toEqual(['common/cpp/**/*.{cpp,h}']); + }); + + it("keeps the spec's own module_name, not a subspec's", () => { + const model = flattenSubspecs({ + name: 'react-native-foo-bar', + version: '1.20.0', + module_name: 'RNFooBar', + subspecs: [{name: 'react-native-foo-bar/cxx', module_name: 'FooBarCxx'}], + }); + expect(model.moduleName).toBe('RNFooBar'); + }); + + it('reports a missing module_name as null', () => { + const model = flattenSubspecs({name: 'RNSVG', version: '15.0.0'}); + expect(model.moduleName).toBeNull(); + }); + + it('keeps a spec-level header_dir', () => { + const model = flattenSubspecs({ + name: 'React-Core', + version: '1000.0.0', + header_dir: 'React', + subspecs: [{name: 'React-Core/cxx', header_dir: 'reactcxx'}], + }); + expect(model.headerDir).toBe('React'); + }); +}); + +describe('readPodspecNames', () => { + it('reads the pod name, and no header_dir the subspecs kept to themselves', () => { + const {file, dir} = writeFixture( + 'reanimated.podspec', + REANIMATED_LIKE_PODSPEC, + ); + try { + expect(readPodspecNames(file)).toEqual({ + name: 'RNReanimated', + moduleName: null, + headerDir: null, + }); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it.each([ + ['RNScreens', () => SCREENS_LIKE_PODSPEC], + ['RNSVG', () => SVG_LIKE_PODSPEC], + ])( + 'names %s from its pod name when only a subspec declares a header_dir', + (podName, source) => { + const {file, dir} = writeFixture(`${podName}.podspec`, source()); + try { + expect(readPodspecNames(file)).toEqual({ + name: podName, + moduleName: null, + headerDir: null, + }); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }, + ); + + it('declines when a subspec rebinds the spec variable', () => { + // `do |s|` puts the child's `header_dir` where the parent's would be, and a + // regex over flat text cannot see the block scope — so `pod ipc spec`, which + // evaluates the real Ruby, has to answer instead. + const {file, dir} = writeFixture( + 'shadowing.podspec', + SHADOWING_SUBSPEC_PODSPEC, + ); + try { + expect(readPodspecNames(file)).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('names the parent when a subspec takes its own variable', () => { + const {file, dir} = writeFixture( + 'own-variable.podspec', + OWN_VARIABLE_SUBSPEC_PODSPEC, + ); + try { + expect(readPodspecNames(file)).toEqual({ + name: 'ParentPod', + moduleName: 'ParentModule', + headerDir: null, + }); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reports a missing header_dir as null', () => { + const {file, dir} = writeFixture('simple.podspec', SIMPLE_LIB_PODSPEC); + try { + expect(readPodspecNames(file)).toEqual({ + name: 'react-native-foo', + moduleName: null, + headerDir: null, + }); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reads a module_name that differs from the pod name', () => { + // Without this field the fast path answers with the dashed pod name and + // `pod ipc spec` never runs, so nothing downstream can see `module_name`. + const {file, dir} = writeFixture( + 'distinct-module-name.podspec', + DISTINCT_MODULE_NAME_PODSPEC, + ); + try { + expect(readPodspecNames(file)).toEqual({ + name: 'react-native-foo-bar', + moduleName: 'RNFooBar', + headerDir: null, + }); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it.each([ + ['interpolation', 's.module_name = "#{package[\'name\']}"'], + ['a Ruby call', 's.module_name = File.basename(__dir__)'], + ])( + 'reports nothing when the podspec computes its module_name with %s', + (_label, declaration) => { + // Same trap as a computed header_dir: the pod name is literal, but naming + // from it would ignore the module_name only Ruby can produce. + const {file, dir} = writeFixture( + 'computed-module-name.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = "react-native-foo-bar"', + ` ${declaration}`, + 'end', + '', + ].join('\n'), + ); + try { + expect(readPodspecNames(file)).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }, + ); + + it('reports nothing when the podspec computes its header_dir in Ruby', () => { + // The literal name must not satisfy the fast path: `header_dir` outranks it, + // so resolving without it would pick the wrong prefix — and the scaffolder + // would then write that wrong name into the library's package.json. + const {file, dir} = writeFixture( + 'computed-header-dir.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = "RNSVG"', + ' s.version = "1.0"', + ' s.header_dir = "#{s.name}Headers"', + 'end', + '', + ].join('\n'), + ); + try { + expect(readPodspecNames(file)).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reports nothing when header_dir is computed by a Ruby call', () => { + const {file, dir} = writeFixture( + 'ruby-header-dir.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = "RNSVG"', + ' s.header_dir = File.basename(__dir__)', + 'end', + '', + ].join('\n'), + ); + try { + expect(readPodspecNames(file)).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('treats an interpolated name as unparsed', () => { + const {file, dir} = writeFixture( + 'interpolated-name.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = "#{package[\'name\']}"', + ' s.version = "1.0"', + 'end', + '', + ].join('\n'), + ); + try { + expect(readPodspecNames(file)).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); + + it('reports nothing when the podspec computes its name in Ruby', () => { + const {file, dir} = writeFixture( + 'interpolated.podspec', + [ + 'Pod::Spec.new do |s|', + ' s.name = package["name"]', + ' s.version = "1.0"', + 'end', + '', + ].join('\n'), + ); + try { + expect(readPodspecNames(file)).toBeNull(); + } finally { + fs.rmSync(dir, {recursive: true, force: true}); + } + }); +}); + describe('readPodspec', () => { it('throws a clear error when the file does not exist', () => { expect(() => readPodspec('/no/such/file.podspec')).toThrow( diff --git a/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js b/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js index c7c402afdf36..83b34597c7fc 100644 --- a/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js +++ b/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js @@ -56,6 +56,7 @@ function autolinkedDep(overrides = {}) { return { name: 'react-native-foo', root: '/fake/node_modules/react-native-foo', + swiftName: 'ReactNativeFoo', platforms: { ios: { podspecPath: @@ -72,19 +73,29 @@ function autolinkedDep(overrides = {}) { // --------------------------------------------------------------------------- describe('translatePodspecToSpmTarget', () => { - it('always uses toSwiftName(npm-name) as the SPM target name — header_dir does NOT change the target name', () => { - // The autolinker registers every autolinked dep under toSwiftName(npmName) - // in its aggregator. The scaffolded Package.swift's product MUST match - // that or SPM resolution fails on the .product(name:, package:) lookup. - // header_dir flows through headerSearchPaths instead. + it('uses the name the autolinker resolved, never one derived here', () => { + // The autolinker registers every dep in its aggregator under the name it + // resolved; the scaffolded product MUST match or SPM resolution fails on + // the .product(name:, package:) lookup. const model = podspec({ headerDir: 'react/renderer/components/safeareacontext', }); const spec = translatePodspecToSpmTarget( model, - autolinkedDep({name: 'react-native-safe-area-context'}), + autolinkedDep({ + name: 'react-native-safe-area-context', + swiftName: 'react-native-safe-area-context', + }), + ); + expect(spec.swiftName).toBe('react-native-safe-area-context'); + }); + + it('fails loudly for a dep whose name was never resolved', () => { + const dep = autolinkedDep(); + delete dep.swiftName; + expect(() => translatePodspecToSpmTarget(podspec(), dep)).toThrow( + /expandSpmDependencies/, ); - expect(spec.swiftName).toBe('ReactNativeSafeAreaContext'); }); it('adds dirname(header_mappings_dir) as a header search path so namespaced includes resolve (reanimated/worklets pattern)', () => { @@ -294,22 +305,16 @@ describe('translatePodspecToSpmTarget', () => { } }); - it('still uses toSwiftName(npm-name) even when header_dir is a plain identifier (matches autolinker registration)', () => { + it("ignores the model's own header_dir — the resolved name already accounts for it", () => { const model = podspec({headerDir: 'reanimated'}); const spec = translatePodspecToSpmTarget( model, - autolinkedDep({name: 'react-native-reanimated'}), - ); - expect(spec.swiftName).toBe('ReactNativeReanimated'); - }); - - it('falls back cleanly when header_dir is absent', () => { - const model = podspec({headerDir: null}); - const spec = translatePodspecToSpmTarget( - model, - autolinkedDep({name: 'react-native-foo-bar'}), + autolinkedDep({ + name: 'react-native-reanimated', + swiftName: 'reanimated', + }), ); - expect(spec.swiftName).toBe('ReactNativeFooBar'); + expect(spec.swiftName).toBe('reanimated'); }); it('substitutes $(PODS_TARGET_SRCROOT) in HEADER_SEARCH_PATHS with the target-relative form', () => { @@ -623,7 +628,10 @@ describe('emitScaffoldedPackageSwift', () => { it('emits sibling .package(path: "../") + .product entries for sibling RN deps', () => { const out = emitScaffoldedPackageSwift( - baseSpec({siblingNames: ['react-native-worklets']}), + baseSpec({ + siblingNames: ['react-native-worklets'], + siblingSwiftNames: {'react-native-worklets': 'ReactNativeWorklets'}, + }), ); // Path uses the libs/ symlink name (where the autolinker places // the sibling), NOT the npm name — `../react-native-worklets` would be @@ -636,6 +644,16 @@ describe('emitScaffoldedPackageSwift', () => { ); }); + it('fails loudly for a sibling whose name was never resolved', () => { + // Deriving one here would write a name nothing in the package graph + // matches into a manifest that outlives the run. + expect(() => + emitScaffoldedPackageSwift( + baseSpec({siblingNames: ['react-native-worklets']}), + ), + ).toThrow(/expandSpmDependencies/); + }); + it('emits the sibling override name for both the package and the product', () => { const out = emitScaffoldedPackageSwift( baseSpec({ @@ -784,6 +802,7 @@ end return { name: 'react-native-foo', root: depRoot, + swiftName: 'ReactNativeFoo', platforms: {ios: {}}, ...overrides, }; @@ -1005,16 +1024,259 @@ end expect(fs.existsSync(path.join(depRoot, 'Package.swift'))).toBe(false); }); - it("honors a dep's spm: { scaffold: false } opt-out in its react-native.config.js", () => { + it("honors a dep's swiftpmConfig.scaffold = false opt-out", () => { makePodspec(); fs.writeFileSync( - path.join(depRoot, 'react-native.config.js'), - 'module.exports = { spm: { scaffold: false } };', + path.join(depRoot, 'package.json'), + JSON.stringify({ + name: 'react-native-foo', + swiftpmConfig: {scaffold: false}, + }), ); const result = scaffoldPackageSwiftForDep(makeDep(), makeCtx()); expect(result.status).toBe('skipped-opt-out'); }); + it('still honors the deprecated spm.scaffold = false opt-out', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + makePodspec(); + fs.writeFileSync( + path.join(depRoot, 'react-native.config.js'), + 'module.exports = { spm: { scaffold: false } };', + ); + const result = scaffoldPackageSwiftForDep(makeDep(), makeCtx()); + expect(result.status).toBe('skipped-opt-out'); + expect(warnSpy).toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } + }); + + // The migration step: a name derived from the podspec is recorded in the + // library's package.json, so the next run needs no podspec to find it. + describe('swiftpmConfig.name', () => { + const pkgJsonPath = () => path.join(depRoot, 'package.json'); + const writePkgJson = pkg => + fs.writeFileSync(pkgJsonPath(), JSON.stringify(pkg, null, 2) + '\n'); + const readPkgJson = () => + JSON.parse(fs.readFileSync(pkgJsonPath(), 'utf8')); + const podspecNamed = overrides => + makeDep({swiftName: 'RNFoo', swiftNameSource: 'podspec', ...overrides}); + + it('records a podspec-derived name in the package.json', () => { + makePodspec(); + writePkgJson({name: 'react-native-foo', version: '1.0.0'}); + const result = scaffoldPackageSwiftForDep(podspecNamed(), makeCtx()); + expect(result.status).toBe('written'); + expect(result.swiftpmName).toBe('created'); + expect(readPkgJson().swiftpmConfig).toEqual({name: 'RNFoo'}); + }); + + // Only a derived name is recorded: a guess would freeze into someone's + // config, and a declared one is already where it belongs. + it.each([ + ['guessed from the npm name', 'npm', {name: 'react-native-foo'}], + [ + 'declared by the library', + 'config', + {name: 'react-native-foo', swiftpmConfig: {name: 'RNFoo'}}, + ], + ])( + 'leaves the package.json alone when the name was %s', + (_, source, pkg) => { + makePodspec(); + writePkgJson(pkg); + const result = scaffoldPackageSwiftForDep( + makeDep({swiftName: 'RNFoo', swiftNameSource: source}), + makeCtx(), + ); + expect(result.swiftpmName).toBeUndefined(); + expect(readPkgJson().swiftpmConfig).toEqual(pkg.swiftpmConfig); + }, + ); + + it('writes nothing on a dry run', () => { + makePodspec(); + writePkgJson({name: 'react-native-foo'}); + const before = fs.readFileSync(pkgJsonPath(), 'utf8'); + scaffoldPackageSwiftForDep(podspecNamed(), makeCtx({dryRun: true})); + expect(fs.readFileSync(pkgJsonPath(), 'utf8')).toBe(before); + }); + + it('keeps the manifest when recording the name fails, and reports the failure', () => { + makePodspec(); + writePkgJson({name: 'react-native-foo'}); + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const realWriteFileSync = fs.writeFileSync; + const writeSpy = jest + .spyOn(fs, 'writeFileSync') + .mockImplementation((file, ...rest) => { + if (String(file).includes('package.json')) { + throw new Error('EACCES: permission denied'); + } + return realWriteFileSync(file, ...rest); + }); + let result; + try { + result = scaffoldPackageSwiftForDep(podspecNamed(), makeCtx()); + } finally { + writeSpy.mockRestore(); + warnSpy.mockRestore(); + } + // What is reported matches what is on disk: manifest yes, name no. + expect(result.status).toBe('written'); + expect(result.swiftpmName).toBe('failed'); + expect(fs.existsSync(path.join(depRoot, 'Package.swift'))).toBe(true); + expect(readPkgJson().swiftpmConfig).toBeUndefined(); + }); + + it('does not touch a package.json when the manifest was not written', () => { + writePkgJson({name: 'react-native-foo'}); + const result = scaffoldPackageSwiftForDep(podspecNamed(), makeCtx()); + expect(result.status).toBe('skipped-no-podspec'); + expect(readPkgJson().swiftpmConfig).toBeUndefined(); + }); + }); + + // The name is the header import prefix, and scaffold persists a derived one + // into the library's package.json — so the run has to say what it picked. + describe('name report', () => { + let logSpy; + let warnSpy; + + beforeEach(() => { + logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); + warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + }); + + afterEach(() => { + logSpy.mockRestore(); + warnSpy.mockRestore(); + }); + + const output = spy => spy.mock.calls.map(call => call.join(' ')).join('\n'); + + // A podspec whose identity fields are the test's subject. + function writePodspec(...identityLines) { + fs.writeFileSync( + path.join(depRoot, 'react-native-foo.podspec'), + [ + 'Pod::Spec.new do |s|', + ' s.name = "react-native-foo"', + ' s.version = "1.0"', + ' s.source_files = "ios/**/*.{h,m,mm}"', + ...identityLines.map(line => ` ${line}`), + 'end', + '', + ].join('\n'), + ); + } + + it.each([ + [ + 'a podspec header_dir', + { + swiftName: 'RNThing', + swiftNameSource: 'podspec', + swiftNamePodspecKey: 'header_dir', + }, + "'header_dir'", + ], + [ + 'a podspec module_name', + { + swiftName: 'ReactNativeFoo', + swiftNameSource: 'podspec', + swiftNamePodspecKey: 'module_name', + }, + "'module_name'", + ], + [ + 'the pod name', + { + swiftName: 'RNFoo', + swiftNameSource: 'podspec', + swiftNamePodspecKey: 'name', + }, + 'pod name', + ], + [ + 'a declared swiftpmConfig.name', + {swiftName: 'RNFoo', swiftNameSource: 'config'}, + "'swiftpmConfig.name'", + ], + [ + 'the npm package name', + {swiftName: 'ReactNativeFoo', swiftNameSource: 'npm'}, + 'npm package name', + ], + ])('reports a name that came from %s', (_label, depOverrides, origin) => { + writePodspec('s.header_dir = "RNThing"'); + const result = scaffoldPackageSwiftForDep( + makeDep(depOverrides), + makeCtx(), + ); + expect(result.status).toBe('written'); + const reported = output(logSpy); + expect(reported).toContain('react-native-foo'); + expect(reported).toContain(`'${depOverrides.swiftName}'`); + expect(reported).toContain(origin); + }); + + it('reports the name it chose on a dry run too', () => { + writePodspec('s.header_dir = "RNThing"'); + scaffoldPackageSwiftForDep( + makeDep({ + swiftName: 'RNThing', + swiftNameSource: 'podspec', + swiftNamePodspecKey: 'header_dir', + }), + makeCtx({dryRun: true}), + ); + expect(output(logSpy)).toContain("'RNThing'"); + }); + + // A podspec with two distinct namespaces declared, only one of them used. + it('notes the module_name it dropped when the podspec declares both', () => { + writePodspec( + 's.header_dir = "RNThing"', + 's.module_name = "react_native_thing"', + ); + scaffoldPackageSwiftForDep( + makeDep({ + swiftName: 'RNThing', + swiftNameSource: 'podspec', + swiftNamePodspecKey: 'header_dir', + }), + makeCtx(), + ); + const noted = output(warnSpy); + expect(noted).toContain("'RNThing'"); + expect(noted).toContain("'react_native_thing'"); + expect(noted).toContain("'swiftpmConfig.name'"); + }); + + it.each([ + ['only a header_dir is declared', ['s.header_dir = "RNThing"']], + [ + 'the two agree', + ['s.header_dir = "RNThing"', 's.module_name = "RNThing"'], + ], + ])('says nothing about a dropped namespace when %s', (_label, lines) => { + writePodspec(...lines); + scaffoldPackageSwiftForDep( + makeDep({ + swiftName: 'RNThing', + swiftNameSource: 'podspec', + swiftNamePodspecKey: 'header_dir', + }), + makeCtx(), + ); + expect(output(warnSpy)).not.toContain('module_name'); + }); + }); + it('returns skipped-is-react-native for `react-native` itself (handled by the xcframework path)', () => { const result = scaffoldPackageSwiftForDep( makeDep({name: 'react-native'}), @@ -1087,14 +1349,17 @@ describe('scaffoldAll', () => { } it('propagates a Swift name collision instead of scaffolding anyway, plugin or not', () => { - // 'react-headers' derives the reserved 'ReactHeaders', with no scope to - // borrow. Degrading to the direct deps would scaffold manifests SPM rejects - // later, and a plugin buys no exemption — `spm scaffold` has no plugin code. + // 'react-headers' derives the reserved 'ReactHeaders'. Degrading to the + // direct deps would scaffold manifests SPM rejects later, and a plugin buys + // no exemption — `spm scaffold` has no plugin code. const depRoot = path.join(appRoot, 'node_modules', 'react-headers'); fs.mkdirSync(depRoot, {recursive: true}); fs.writeFileSync( - path.join(depRoot, 'react-native.config.js'), - "module.exports = {spm: {autolinkingPlugin: './spm-plugin.js'}};\n", + path.join(depRoot, 'package.json'), + JSON.stringify({ + name: 'react-headers', + swiftpmConfig: {autolinkingPlugin: './spm-plugin.js'}, + }), ); writeAutolinkingJson({ 'react-headers': {root: depRoot, platforms: {ios: {}}}, @@ -1123,8 +1388,52 @@ describe('scaffoldAll', () => { }); expect(results.map(r => r.depName)).toEqual(['react-native-a']); expect(logSpy.mock.calls.map(call => call.join(' ')).join('\n')).toMatch( - /Transitive spm\.dependencies expansion failed/, + /Transitive dependency expansion failed/, + ); + } finally { + logSpy.mockRestore(); + } + }); + + it('names a degraded dep from its podspec, so the manifest it writes still matches the autolinker', () => { + const depRoot = path.join(appRoot, 'node_modules', 'react-native-svg'); + fs.mkdirSync(path.join(depRoot, 'ios'), {recursive: true}); + fs.writeFileSync(path.join(depRoot, 'ios', 'Lib.mm'), '// src\n'); + fs.writeFileSync( + path.join(depRoot, 'package.json'), + JSON.stringify({ + name: 'react-native-svg', + swiftpmConfig: {dependencies: ['ghost-dep-that-is-not-installed']}, + }), + ); + fs.writeFileSync( + path.join(depRoot, 'RNSVG.podspec'), + [ + 'Pod::Spec.new do |s|', + ' s.name = "RNSVG"', + ' s.version = "1.0.0"', + ' s.source_files = "ios/**/*.{h,m,mm}"', + 'end', + '', + ].join('\n'), + ); + writeAutolinkingJson({ + 'react-native-svg': {root: depRoot, platforms: {ios: {}}}, + }); + const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); + try { + const [result] = scaffoldAll({ + appRoot, + projectRoot: appRoot, + reactNativeRoot: appRoot, + }); + expect(result.status).toBe('written'); + const manifest = fs.readFileSync( + path.join(depRoot, 'Package.swift'), + 'utf8', ); + expect(manifest).toContain('name: "RNSVG"'); + expect(manifest).not.toContain('ReactNativeSvg'); } finally { logSpy.mockRestore(); } @@ -1266,6 +1575,7 @@ describe('scaffoldPackageSwiftForDep — version-based regen', () => { return { name: 'react-native-foo', root: depRoot, + swiftName: 'ReactNativeFoo', platforms: {ios: {}}, }; } diff --git a/packages/react-native/scripts/spm/__tests__/spm-utils-test.js b/packages/react-native/scripts/spm/__tests__/spm-utils-test.js index dc3d7a8e071b..d11f372a947d 100644 --- a/packages/react-native/scripts/spm/__tests__/spm-utils-test.js +++ b/packages/react-native/scripts/spm/__tests__/spm-utils-test.js @@ -27,6 +27,7 @@ const { defaultCacheDir, displayPath, isPublishableVersion, + isValidSwiftName, makeLogger, readPackageJson, remotePackageConfig, @@ -34,6 +35,8 @@ const { resolveReactNativeRoot, runCodegenAndInstallTemplate, sharedCacheDir, + swiftNameKey, + toC99Name, toSwiftName, } = require('../spm-utils'); const fs = require('node:fs'); @@ -57,6 +60,58 @@ describe('toSwiftName', () => { }); }); +// --------------------------------------------------------------------------- +// isValidSwiftName — the charset rule `spm.name` enforces. +// --------------------------------------------------------------------------- + +describe('isValidSwiftName', () => { + it.each(['worklets', 'ReactNativeFoo', 'hermes-engine', 'react_native_foo'])( + 'accepts %j', + name => { + expect(isValidSwiftName(name)).toBe(true); + }, + ); + + it.each(['', 'foo bar', 'foo/bar', 'foo.bar', '9lives', 42, null])( + 'rejects %j', + name => { + expect(isValidSwiftName(name)).toBe(false); + }, + ); +}); + +// --------------------------------------------------------------------------- +// toC99Name / swiftNameKey — what SwiftPM compiles a target name as, and the +// key two target names have to differ in to be two targets. +// --------------------------------------------------------------------------- + +describe('toC99Name', () => { + it.each([ + ['RNSVG', 'RNSVG'], + ['react-native-svg', 'react_native_svg'], + ['react_native_svg', 'react_native_svg'], + ['Some.Pod', 'Some_Pod'], + ['React-Core', 'React_Core'], + ['3d-lib', '_3d_lib'], + ])('toC99Name(%j) => %j', (input, expected) => { + expect(toC99Name(input)).toBe(expected); + }); +}); + +describe('swiftNameKey', () => { + it('collapses names that differ only in punctuation', () => { + expect(swiftNameKey('foo-bar')).toBe(swiftNameKey('foo_bar')); + }); + + it('collapses names that differ only in case', () => { + expect(swiftNameKey('worklets')).toBe(swiftNameKey('Worklets')); + }); + + it('keeps genuinely different names apart', () => { + expect(swiftNameKey('RNSVG')).not.toBe(swiftNameKey('RNScreens')); + }); +}); + // --------------------------------------------------------------------------- // Reserved Swift names — the one list the manifests and the guard both use // --------------------------------------------------------------------------- diff --git a/packages/react-native/scripts/spm/__tests__/swiftpm-config-test.js b/packages/react-native/scripts/spm/__tests__/swiftpm-config-test.js new file mode 100644 index 000000000000..b514a8adda43 --- /dev/null +++ b/packages/react-native/scripts/spm/__tests__/swiftpm-config-test.js @@ -0,0 +1,414 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @noflow + */ + +'use strict'; + +/** + * `swiftpmConfig` in package.json is the declared home for a package's SwiftPM + * settings. The `spm` block in react-native.config.js is the deprecated one: + * still read, still honoured, and warned about once per file. + */ + +const {readSwiftpmConfig, writeSwiftpmName} = require('../swiftpm-config'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); + +let tmpRoot; +let roots = 0; + +beforeAll(() => { + tmpRoot = fs.mkdtempSync( + path.join(fs.realpathSync(os.tmpdir()), 'spm-swiftpm-config-'), + ); +}); + +afterAll(() => { + fs.rmSync(tmpRoot, {recursive: true, force: true}); +}); + +// A fresh root per case: the deprecation warning is remembered per config file. +function makeRoot(pkgJson) { + const root = path.join(tmpRoot, `pkg-${roots++}`); + fs.mkdirSync(root, {recursive: true}); + if (pkgJson != null) { + fs.writeFileSync( + path.join(root, 'package.json'), + typeof pkgJson === 'string' ? pkgJson : JSON.stringify(pkgJson, null, 2), + ); + } + return root; +} + +describe('readSwiftpmConfig', () => { + it.each([ + ['name', 'RNSVG'], + ['dependencies', ['react-native-worklets']], + ['autolinkingPlugin', './spm-plugin.js'], + ['scaffold', false], + ['modules', [{name: 'MyModule', path: 'ios/MyModule'}]], + ['denyPlugins', ['some-framework']], + ])('reads swiftpmConfig.%s from package.json', (field, value) => { + const root = makeRoot({name: 'lib', swiftpmConfig: {[field]: value}}); + expect(readSwiftpmConfig(root, null)?.[field]).toEqual(value); + }); + + it.each([ + ['no swiftpmConfig at all', {name: 'lib'}], + ['no package.json', null], + [ + 'a swiftpmConfig that is not an object', + {name: 'lib', swiftpmConfig: 'nope'}, + ], + // An array's indices are not fields; treating it as one would report + // "unknown keys (0, 1)" and let the writer spread indices into it. + ['an array', {name: 'lib', swiftpmConfig: ['oops']}], + ])('reads nothing from %s', (_label, pkgJson) => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + expect(readSwiftpmConfig(makeRoot(pkgJson), null)).toBeNull(); + const message = warnSpy.mock.calls.map(call => call.join(' ')).join('\n'); + expect(message).not.toMatch(/\bfields React Native does not know\b/); + } finally { + warnSpy.mockRestore(); + } + }); + + it('falls back to the package.json-free config when package.json is malformed', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot('{ not json'); + expect(readSwiftpmConfig(root, {spm: {name: 'RNSVG'}})?.name).toBe( + 'RNSVG', + ); + } finally { + warnSpy.mockRestore(); + } + }); + + it('still honours the deprecated spm block', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib'}); + const config = readSwiftpmConfig(root, { + spm: {name: 'RNSVG', dependencies: ['react-native-worklets']}, + }); + expect(config?.name).toBe('RNSVG'); + expect(config?.dependencies).toEqual(['react-native-worklets']); + } finally { + warnSpy.mockRestore(); + } + }); + + it('lets swiftpmConfig win field by field, keeping the fields it does not set', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib', swiftpmConfig: {name: 'RNSVG'}}); + const config = readSwiftpmConfig(root, { + spm: {name: 'OldName', dependencies: ['react-native-worklets']}, + }); + expect(config?.name).toBe('RNSVG'); + expect(config?.dependencies).toEqual(['react-native-worklets']); + } finally { + warnSpy.mockRestore(); + } + }); + + it('warns once per config file, naming the fields and the new home', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib'}); + const rnConfig = {spm: {name: 'RNSVG', dependencies: ['other']}}; + readSwiftpmConfig(root, rnConfig); + readSwiftpmConfig(root, rnConfig); + expect(warnSpy).toHaveBeenCalledTimes(1); + const message = warnSpy.mock.calls[0].join(' '); + expect(message).toContain(path.join(root, 'react-native.config.js')); + expect(message).toContain('name'); + expect(message).toContain('dependencies'); + expect(message).toContain('swiftpmConfig'); + expect(message).toContain('package.json'); + } finally { + warnSpy.mockRestore(); + } + }); + + it('warns per config file, not per package sharing a shape', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + readSwiftpmConfig(makeRoot({name: 'a'}), {spm: {name: 'A'}}); + readSwiftpmConfig(makeRoot({name: 'b'}), {spm: {name: 'B'}}); + expect(warnSpy).toHaveBeenCalledTimes(2); + } finally { + warnSpy.mockRestore(); + } + }); + + it('says nothing when only the new location is used', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib', swiftpmConfig: {name: 'RNSVG'}}); + expect( + readSwiftpmConfig(root, {dependency: {platforms: {ios: {}}}}), + ).toEqual({name: 'RNSVG'}); + expect(warnSpy).not.toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } + }); + + it('says nothing about an spm block with no SPM fields in it', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + readSwiftpmConfig(makeRoot({name: 'lib'}), {spm: {}}); + expect(warnSpy).not.toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } + }); +}); + +describe('readSwiftpmConfig (unknown keys)', () => { + it('warns once per package.json, naming the keys it does not know', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({ + name: 'lib', + swiftpmConfig: {name: 'RNSVG', dependancies: [], modulez: []}, + }); + readSwiftpmConfig(root, null); + readSwiftpmConfig(root, null); + expect(warnSpy).toHaveBeenCalledTimes(1); + const message = warnSpy.mock.calls[0].join(' '); + expect(message).toContain(path.join(root, 'package.json')); + expect(message).toContain('dependancies'); + expect(message).toContain('modulez'); + expect(message).not.toContain("'name'"); + } finally { + warnSpy.mockRestore(); + } + }); + + it('still reads the keys it does know', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({ + name: 'lib', + swiftpmConfig: {name: 'RNSVG', dependancies: []}, + }); + expect(readSwiftpmConfig(root, null)?.name).toBe('RNSVG'); + } finally { + warnSpy.mockRestore(); + } + }); + + it('says nothing when every key is known', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({ + name: 'lib', + swiftpmConfig: {name: 'RNSVG', dependencies: [], scaffold: false}, + }); + readSwiftpmConfig(root, null); + expect(warnSpy).not.toHaveBeenCalled(); + } finally { + warnSpy.mockRestore(); + } + }); + + it('says nothing about unknown keys in the deprecated block, which is going away', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib'}); + readSwiftpmConfig(root, {spm: {name: 'RNSVG', dependancies: []}}); + const message = warnSpy.mock.calls.map(call => call.join(' ')).join('\n'); + expect(message).not.toContain('dependancies'); + } finally { + warnSpy.mockRestore(); + } + }); +}); + +describe('readSwiftpmConfig (malformed swiftpmConfig)', () => { + it('falls back to the deprecated block when swiftpmConfig is an array', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib', swiftpmConfig: ['oops']}); + expect(readSwiftpmConfig(root, {spm: {name: 'RNSVG'}})?.name).toBe( + 'RNSVG', + ); + } finally { + warnSpy.mockRestore(); + } + }); +}); + +describe('writeSwiftpmName', () => { + const read = root => + JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')); + + it('creates swiftpmConfig when the package has none', () => { + const root = makeRoot({name: 'react-native-svg', version: '1.0.0'}); + expect(writeSwiftpmName(root, 'RNSVG')).toBe('created'); + expect(read(root).swiftpmConfig).toEqual({name: 'RNSVG'}); + }); + + it('inserts the name into an existing swiftpmConfig', () => { + const root = makeRoot({ + name: 'react-native-svg', + swiftpmConfig: {dependencies: ['react-native-worklets']}, + }); + expect(writeSwiftpmName(root, 'RNSVG')).toBe('inserted'); + expect(read(root).swiftpmConfig).toEqual({ + dependencies: ['react-native-worklets'], + name: 'RNSVG', + }); + }); + + it('is a no-op when the same name is already there', () => { + const root = makeRoot({name: 'lib', swiftpmConfig: {name: 'RNSVG'}}); + const before = fs.readFileSync(path.join(root, 'package.json'), 'utf8'); + expect(writeSwiftpmName(root, 'RNSVG')).toBe('already-set'); + expect(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).toBe( + before, + ); + }); + + it("leaves a different name alone and says so — the author's choice wins", () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib', swiftpmConfig: {name: 'MySvg'}}); + expect(writeSwiftpmName(root, 'RNSVG')).toBe('skipped'); + expect(read(root).swiftpmConfig.name).toBe('MySvg'); + const message = warnSpy.mock.calls.map(call => call.join(' ')).join('\n'); + expect(message).toContain('MySvg'); + expect(message).toContain('RNSVG'); + } finally { + warnSpy.mockRestore(); + } + }); + + it('refuses a name Swift cannot spell, without touching the file', () => { + const root = makeRoot({name: 'lib'}); + const before = fs.readFileSync(path.join(root, 'package.json'), 'utf8'); + expect(writeSwiftpmName(root, 'Some.Pod')).toBe('skipped'); + expect(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).toBe( + before, + ); + }); + + it('skips a package with no package.json', () => { + expect(writeSwiftpmName(makeRoot(null), 'RNSVG')).toBe('skipped'); + }); + + it('never rewrites a swiftpmConfig that is not a settings object', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + try { + const root = makeRoot({name: 'lib', swiftpmConfig: ['oops']}); + const before = fs.readFileSync(path.join(root, 'package.json'), 'utf8'); + expect(writeSwiftpmName(root, 'RNSVG')).toBe('skipped'); + expect(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).toBe( + before, + ); + expect( + warnSpy.mock.calls.map(call => call.join(' ')).join('\n'), + ).toContain('swiftpmConfig'); + } finally { + warnSpy.mockRestore(); + } + }); + + it('writes nothing on a dry run', () => { + const root = makeRoot({name: 'lib'}); + const before = fs.readFileSync(path.join(root, 'package.json'), 'utf8'); + expect(writeSwiftpmName(root, 'RNSVG', {dryRun: true})).toBe('created'); + expect(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).toBe( + before, + ); + }); + + it.each([ + ['two spaces', '{\n "name": "lib"\n}\n', ' '], + ['four spaces', '{\n "name": "lib"\n}\n', ' '], + ['tabs', '{\n\t"name": "lib"\n}\n', '\t'], + ])('preserves %s of indentation', (_label, source, indent) => { + const root = makeRoot(source); + writeSwiftpmName(root, 'RNSVG'); + const written = fs.readFileSync(path.join(root, 'package.json'), 'utf8'); + expect(written).toContain(`\n${indent}"swiftpmConfig": {`); + expect(written).toContain(`\n${indent}${indent}"name": "RNSVG"`); + expect(written.endsWith('\n')).toBe(true); + }); + + it('keeps the existing keys in the order the author wrote them', () => { + const root = makeRoot({name: 'lib', version: '1.0.0', main: 'index.js'}); + writeSwiftpmName(root, 'RNSVG'); + expect(Object.keys(read(root))).toEqual([ + 'name', + 'version', + 'main', + 'swiftpmConfig', + ]); + }); + + it('reports a failed write instead of an outcome it did not achieve', () => { + const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const root = makeRoot({name: 'lib', version: '1.0.0'}); + const before = fs.readFileSync(path.join(root, 'package.json'), 'utf8'); + const writeSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => { + throw new Error('ENOSPC: no space left on device'); + }); + try { + expect(writeSwiftpmName(root, 'RNSVG')).toBe('failed'); + } finally { + writeSpy.mockRestore(); + warnSpy.mockRestore(); + } + expect(fs.readFileSync(path.join(root, 'package.json'), 'utf8')).toBe( + before, + ); + // No half-written file left behind. + expect(fs.readdirSync(root)).toEqual(['package.json']); + }); + + it('replaces the file atomically, so a reader never sees a partial one', () => { + const root = makeRoot({name: 'lib', version: '1.0.0'}); + const pkgPath = path.join(root, 'package.json'); + const renames = []; + const renameSpy = jest + .spyOn(fs, 'renameSync') + .mockImplementation((from, to) => { + renames.push([from, to]); + // Whatever was staged must already be complete JSON. + expect(JSON.parse(fs.readFileSync(from, 'utf8')).swiftpmConfig).toEqual( + { + name: 'RNSVG', + }, + ); + fs.rmSync(from); + }); + try { + writeSwiftpmName(root, 'RNSVG'); + } finally { + renameSpy.mockRestore(); + } + expect(renames).toHaveLength(1); + expect(renames[0][1]).toBe(pkgPath); + expect(renames[0][0]).not.toBe(pkgPath); + }); + + it('leaves a file with no trailing newline without one', () => { + const root = makeRoot('{"name": "lib"}'); + writeSwiftpmName(root, 'RNSVG'); + expect( + fs.readFileSync(path.join(root, 'package.json'), 'utf8').endsWith('\n'), + ).toBe(false); + }); +}); diff --git a/packages/react-native/scripts/spm/autolinking-plugins.js b/packages/react-native/scripts/spm/autolinking-plugins.js index f3777c230e08..1063267e0d5c 100644 --- a/packages/react-native/scripts/spm/autolinking-plugins.js +++ b/packages/react-native/scripts/spm/autolinking-plugins.js @@ -85,6 +85,7 @@ */ const {isValidScriptPhaseId, isValidScriptPhaseName} = require('./spm-utils'); +const {readSwiftpmConfig} = require('./swiftpm-config'); const path = require('node:path'); /*:: import type { @@ -98,8 +99,8 @@ const path = require('node:path'); /** * Discover plugins declared by autolinked deps. `readConfig(root)` returns the - * dep's parsed react-native.config.js (or null). `denyList` is the app's - * `spm.denyPlugins` (npm names to skip). Fail-closed: a declared-but-missing + * dep's parsed react-native.config.js (or null), which is one of the two homes + * the plugin may be declared in. `denyList` is the app's `denyPlugins`. Fail-closed: a declared-but-missing * or unloadable plugin throws, naming the dep — a framework silently dropping * its modules is worse than a loud stop. */ @@ -114,15 +115,17 @@ function discoverPlugins( if (denied.has(dep.name)) { continue; } - const config = readConfig(dep.root); // $FlowFixMe[incompatible-use] config has a dynamic shape - const rel = config?.spm?.autolinkingPlugin; + const rel = readSwiftpmConfig( + dep.root, + readConfig(dep.root), + )?.autolinkingPlugin; if (rel == null) { continue; } if (typeof rel !== 'string' || rel.length === 0) { throw new Error( - `react-native spm: '${dep.name}' declares an invalid spm.autolinkingPlugin ` + + `react-native spm: '${dep.name}' declares an invalid 'swiftpmConfig.autolinkingPlugin' ` + `(expected a module path string).`, ); } diff --git a/packages/react-native/scripts/spm/expand-spm-dependencies.js b/packages/react-native/scripts/spm/expand-spm-dependencies.js index 5e769745af69..872450e7494c 100644 --- a/packages/react-native/scripts/spm/expand-spm-dependencies.js +++ b/packages/react-native/scripts/spm/expand-spm-dependencies.js @@ -10,53 +10,86 @@ 'use strict'; -const {RESERVED_SWIFT_NAMES, makeLogger, toSwiftName} = require('./spm-utils'); +const { + findPodspecs, + readPodspecCached, + readPodspecNames, +} = require('./read-podspec'); +const { + RESERVED_SWIFT_NAMES, + isValidSwiftName, + makeLogger, + swiftNameKey, + toC99Name, + toSwiftName, +} = require('./spm-utils'); +const {readSwiftpmConfig, stringList} = require('./swiftpm-config'); const fs = require('node:fs'); const path = require('node:path'); const {warn} = makeLogger('expand-spm-dependencies'); /** - * expand-spm-dependencies.js — Resolves transitive native deps declared via - * `spm.dependencies` in a library's react-native.config.js. + * expand-spm-dependencies.js — Resolves transitive native deps a library + * declares in its `swiftpmConfig`. * * SPM has no equivalent of CocoaPods' podspec `s.dependency`, so library * authors declare the same relationships explicitly: * - * // react-native-reanimated/react-native.config.js - * module.exports = { - * dependency: { platforms: { ios: {} } }, - * spm: { dependencies: ['react-native-worklets'] }, - * }; + * // react-native-reanimated/package.json + * { "swiftpmConfig": { "dependencies": ["react-native-worklets"] } } * * This module reads the directly-autolinked deps (from autolinking.json), - * follows each one's spm.dependencies recursively, and returns the deduped + * follows each one's declared dependencies recursively, and returns the deduped * list with autolinking-shaped entries so the downstream pipeline can convert * each to an SPM target without further branching. * - * I/O is injected (readConfig, resolveDep, log) so the logic stays pure and - * testable. + * It also resolves each dep's Swift target name — see resolveSwiftName. + * + * I/O is injected (readConfig, resolveDep, readPodspec) so the logic stays pure + * and testable. */ /*:: import type {AutolinkedDep} from './spm-types'; +import type {SwiftpmConfig} from './swiftpm-config'; // react-native.config.js entries have a user-defined shape, so we use an // inexact object type and access properties dynamically. type RnConfig = {...}; type ReadConfig = (root: string) => ?RnConfig; type ResolveDep = (name: string, fromRoot: string) => ?string; -type Log = (message: string) => void; -// Keyed by lower case, valued with the canonical spelling: two names differing -// only in case are not distinct enough for the build to keep the two apart. +// Where a resolved name came from: what the library declared, what its podspec +// says, or the npm-name guess. `podspecKey` narrows a podspec-sourced name to +// the field it was read from — `header_dir` and `module_name` can name the same +// library differently, and only one of them wins. +type PodspecNameKey = 'header_dir' | 'module_name' | 'name'; +type ResolvedSwiftName = { + name: string, + source: 'config' | 'podspec' | 'npm', + podspecKey?: PodspecNameKey, +}; +// The podspec fields that name a library. A PodspecModel satisfies it. +type PodspecFacts = { + readonly name?: ?string, + readonly moduleName?: ?string, + readonly headerDir?: ?string, + ... +}; +type ReadPodspec = (root: string, podspecPath: ?string) => ?PodspecFacts; +type ReadSwiftpmConfig = (root: string, rnConfig: ?RnConfig) => ?SwiftpmConfig; +// Keyed by swiftNameKey, valued with the canonical spelling: a name that only +// differs from a reserved one in case or punctuation is not distinct enough for +// the build to keep the two apart. type ReservedNames = ReadonlyMap; type Options = { readConfig: ReadConfig, resolveDep: ResolveDep, + readPodspec?: ?ReadPodspec, + readSwiftpmConfig?: ?ReadSwiftpmConfig, // Names to reserve alongside RESERVED_SWIFT_NAMES, supplied by the caller // (remote mode relabels the RN package) since this module reads no config. extraReservedNames?: ?ReadonlyArray, - log?: ?Log, }; */ @@ -71,74 +104,133 @@ class SpmNameCollisionError extends Error { } } -// The charset `spm.name` must satisfy — permissive on purpose, since it has to -// admit header-dir style (lowercase with hyphens) as well as Swift identifiers. -// Shared with the app's own `spm.modules` names. -function isValidSwiftName(name /*: unknown */) /*: boolean */ { - return typeof name === 'string' && /^[A-Za-z_][A-Za-z0-9_-]*$/.test(name); -} - function reservedSwiftNames( extraReservedNames /*: ?ReadonlyArray */, ) /*: ReservedNames */ { return new Map( [...RESERVED_SWIFT_NAMES, ...(extraReservedNames ?? [])].map(name => [ - name.toLowerCase(), + swiftNameKey(name), name, ]), ); } -// The scope-borrowed form of a name: `@powersync/react-native`'s `ReactNative` -// becomes `PowersyncReactNative`. -function scopeBorrowedName( +// The prefix a podspec publishes its headers under, and the field it came from +// — or null when the podspec declares none. A prefix Swift cannot spell is +// normalized rather than abandoned: reverting to the npm name would silently +// produce a prefix nothing imports. +function podspecSwiftName( npmName /*: string */, - swiftName /*: string */, -) /*: ?string */ { - const scope = /^@([^/]+)\//.exec(npmName)?.[1]; - return scope == null ? null : `${toSwiftName(scope)}${swiftName}`; + podspec /*: ?PodspecFacts */, +) /*: ?{name: string, key: PodspecNameKey} */ { + // CocoaPods' own order is `module_name` first (specification.rb), but our + // single name is the ObjC include prefix as well as the Swift module: a + // declared `header_dir` IS the prefix a library's consumers write, so it keeps + // winning. `module_name` comes next, being what Swift and `@import` consumers + // spell, and the pod name — often dashed — is the last resort. + const candidates /*: ReadonlyArray<[PodspecNameKey, ?string]> */ = [ + ['header_dir', podspec?.headerDir], + ['module_name', podspec?.moduleName], + ['name', podspec?.name], + ]; + for (const [key, candidate] of candidates) { + if (typeof candidate !== 'string' || candidate.length === 0) { + continue; + } + // Ruby the evaluator never ran: what the prefix would be is unknowable, so + // the npm name is the honest answer — and, not being derived, it is not + // recorded in the library's package.json. + if (candidate.includes('#{')) { + return null; + } + if (isValidSwiftName(candidate)) { + return {name: candidate, key}; + } + const normalized = toC99Name(candidate); + warn( + `'${npmName}' declares the podspec prefix '${candidate}', which is not a valid Swift target name; using '${normalized}'. ` + + `Set 'swiftpmConfig.name' in ${npmName}'s package.json to choose the prefix yourself.`, + ); + return {name: normalized, key}; + } + return null; } -// The Swift target name for one dep, judged in isolation. `spm.name` is for -// libraries whose import prefix differs from the derived name: -// `react-native-worklets` ships headers as `` (podspec -// `s.header_dir`), so its target is `worklets`, not `ReactNativeWorklets`. A -// derived name that lands on a reserved one borrows the npm scope instead. +/** + * The Swift target name for one dep, which is also the prefix its headers are + * imported under (`#import `), and where it came from. The name + * a library declares wins; the podspec is the transitional source of truth + * behind it — `react-native-svg` publishes `RNSVG`, not `ReactNativeSvg` — in + * the order `header_dir` → `module_name` → pod name. The npm name is the last + * resort, for a library that ships a `Package.swift` and no podspec. + * + * The source is what tells the scaffolder which names are safe to write into a + * library's package.json: a derived one, never a guessed one. + */ function resolveSwiftName( npmName /*: string */, - config /*: ?RnConfig */, - reserved /*: ReservedNames */, - log /*:: ?: ?Log */, -) /*: string */ { - // $FlowFixMe[prop-missing] config has dynamic shape - const override = config?.spm?.name; - if (override != null) { - if (typeof override !== 'string' || override.length === 0) { + spmConfig /*: ?SwiftpmConfig */, + podspec /*: ?PodspecFacts */, +) /*: ResolvedSwiftName */ { + const declared = spmConfig?.name; + if (declared != null) { + if (typeof declared !== 'string' || declared.length === 0) { throw new Error( - `react-native autolinking: '${npmName}' has an invalid 'spm.name' override: expected a non-empty string, got ${JSON.stringify(override)}.`, + `react-native autolinking: '${npmName}' declares an invalid SwiftPM name: expected a non-empty string, got ${String(declared)}. Set 'swiftpmConfig.name' in its package.json.`, ); } - if (!isValidSwiftName(override)) { + if (!isValidSwiftName(declared)) { throw new Error( - `react-native autolinking: '${npmName}' has an invalid 'spm.name' override '${override}': must start with a letter or underscore and contain only letters, digits, underscores, or hyphens.`, + `react-native autolinking: '${npmName}' declares an invalid SwiftPM name '${declared}': must start with a letter or underscore and contain only letters, digits, underscores, or hyphens. Set 'swiftpmConfig.name' in its package.json.`, ); } - return override; + return {name: declared, source: 'config'}; } - const derived = toSwiftName(npmName); - if (!reserved.has(derived.toLowerCase())) { - return derived; + const fromPodspec = podspecSwiftName(npmName, podspec); + if (fromPodspec != null) { + return { + name: fromPodspec.name, + source: 'podspec', + podspecKey: fromPodspec.key, + }; } - const disambiguated = scopeBorrowedName(npmName, derived); - if (disambiguated == null || reserved.has(disambiguated.toLowerCase())) { - return derived; + const fromNpm = toSwiftName(npmName); + if (podspec != null) { + warn( + `'${npmName}' ships a podspec React Native could not read a name from (CocoaPods may not be installed), so it is named '${fromNpm}' after its npm package instead. ` + + `A machine that can read the podspec may resolve a different name — set 'swiftpmConfig.name' in ${npmName}'s package.json to settle it everywhere.`, + ); } - log?.( - `'${npmName}' would take React Native's reserved name '${derived}', so its npm scope is prepended: '${disambiguated}'. ` + - `Set 'spm.name' in ${npmName}'s react-native.config.js to choose the name yourself.`, - ); - return disambiguated; + return {name: fromNpm, source: 'npm'}; +} + +function collisionDiagnosis( + existing /*: string */, + swiftName /*: string */, +) /*: string */ { + if (existing === swiftName) { + return `both resolve to '${swiftName}'.`; + } + if (existing.toLowerCase() === swiftName.toLowerCase()) { + return `differ only in case, which collides on case-insensitive filesystems.`; + } + return `both compile as the module '${toC99Name(swiftName)}' — SwiftPM replaces every character C99 rejects.`; +} + +// Vaguer about the clash than the dep-vs-dep message on purpose: this set spans +// package identities and product names, which collide differently. +function reservedDiagnosis( + swiftName /*: string */, + reservedName /*: string */, +) /*: string */ { + if (reservedName === swiftName) { + return `which React Native reserves for its own SPM package and products.`; + } + if (reservedName.toLowerCase() === swiftName.toLowerCase()) { + return `which differs from React Native's reserved '${reservedName}' only in case — not distinct enough for the build to keep the two apart.`; + } + return `which compiles as the same module as React Native's reserved '${reservedName}'.`; } function assertNameNotReserved( @@ -146,24 +238,21 @@ function assertNameNotReserved( reserved /*: ReservedNames */, labels /*: {label: string, remedy: string} */, ) /*: void */ { - const reservedName = reserved.get(swiftName.toLowerCase()); + const reservedName = reserved.get(swiftNameKey(swiftName)); if (reservedName == null) { return; } - // Vaguer about the case clash than the dep-vs-dep message on purpose: this - // set spans package identities and product names, which collide differently. throw new SpmNameCollisionError( `react-native autolinking: SPM Swift name collision: ${labels.label} resolves to '${swiftName}', ` + - (reservedName === swiftName - ? `which React Native reserves for its own SPM package and products.` - : `which differs from React Native's reserved '${reservedName}' only in case — not distinct enough for the build to keep the two apart.`) + + reservedDiagnosis(swiftName, reservedName) + ` ${labels.remedy}`, ); } /** * Throws when `swiftName` is one React Native's own manifests use. `remedy` is - * the fix: a library sets `spm.name`, an app renames its `spm.modules` entry. + * the fix: a library sets `swiftpmConfig.name`, an app renames its + * `swiftpmConfig.modules` entry. */ function assertSwiftNameNotReserved( swiftName /*: string */, @@ -194,83 +283,36 @@ function assertNoReservedSwiftNames( } assertNameNotReserved(swiftName, reserved, { label: `'${dep.name}'`, - remedy: `Set a different 'spm.name' in ${dep.name}'s react-native.config.js.`, + remedy: `Set a different 'swiftpmConfig.name' in ${dep.name}'s package.json.`, }); } } -// Pulls apart deps that resolved to the same name by borrowing their npm scopes. -// Every scoped member of a colliding group moves: there is no non-arbitrary -// winner to keep. Exactly one pass — retrying would trade a diagnosable error -// for a name nobody can predict. -function disambiguateSharedSwiftNames( - deps /*: ReadonlyArray */, - autoNamed /*: ReadonlySet */, - log /*: ?Log */, -) /*: void */ { - const groups /*: Map> */ = - new Map(); - for (const dep of deps) { - const swiftName = dep.swiftName; - if (swiftName == null) { - continue; - } - const key = swiftName.toLowerCase(); - const group = groups.get(key); - if (group == null) { - groups.set(key, [{dep, swiftName}]); - } else { - group.push({dep, swiftName}); - } - } - - for (const group of groups.values()) { - if (group.length < 2) { - continue; - } - for (const {dep, swiftName} of group) { - // A name we derived can borrow a second time (`AAReactNative`); the - // member whose name we did not derive is the incumbent and keeps it. - if (!autoNamed.has(dep.name)) { - continue; - } - const borrowed = scopeBorrowedName(dep.name, swiftName); - if (borrowed == null) { - continue; - } - const others = group - .filter(other => other.dep !== dep) - .map(other => `'${other.dep.name}'`) - .join(', '); - log?.( - `'${dep.name}' would share the name '${swiftName}' with ${others}, so its npm scope is prepended: '${borrowed}'. ` + - `Set 'spm.name' in ${dep.name}'s react-native.config.js to choose the name yourself.`, - ); - dep.swiftName = borrowed; - } - } -} - function expandSpmDependencies( directDeps /*: Array */, options /*: Options */, ) /*: Array */ { - const {readConfig, resolveDep, extraReservedNames, log} = options; + const {readConfig, resolveDep, readPodspec, extraReservedNames} = options; + const spmConfigOf = options.readSwiftpmConfig ?? readSwiftpmConfig; const reserved = reservedSwiftNames(extraReservedNames); const byName /*: Map */ = new Map(); for (const dep of directDeps) { byName.set(dep.name, {...dep, spmDependencies: []}); } - const autoNamed /*: Set */ = new Set(); - const resolveName = ( - npmName /*: string */, - config /*: ?RnConfig */, - ) /*: string */ => { - // $FlowFixMe[prop-missing] config has dynamic shape - if (config?.spm?.name == null) { - autoNamed.add(npmName); + // A podspec that cannot be read leaves the name to the next precedence step, + // rather than failing a build over a file only CocoaPods needs. + const podspecFor = ( + root /*: string */, + podspecPath /*: ?string */, + ) /*: ?PodspecFacts */ => { + if (readPodspec == null) { + return null; + } + try { + return readPodspec(root, podspecPath); + } catch { + return null; } - return resolveSwiftName(npmName, config, reserved, log); }; const queue /*: Array */ = directDeps.map(d => d.name); @@ -283,14 +325,18 @@ function expandSpmDependencies( if (current == null) { continue; } - const config = readConfig(current.root); - // Resolve swiftName lazily from the same config read we already need for - // spm.dependencies — saves a duplicate readConfig call per direct dep. + const spmConfig = spmConfigOf(current.root, readConfig(current.root)); if (current.swiftName == null) { - current.swiftName = resolveName(currentName, config); + const resolved = resolveSwiftName( + currentName, + spmConfig, + podspecFor(current.root, current.platforms.ios.podspecPath), + ); + current.swiftName = resolved.name; + current.swiftNameSource = resolved.source; + current.swiftNamePodspecKey = resolved.podspecKey; } - // $FlowFixMe[prop-missing] config has dynamic shape - const transitives /*: Array */ = config?.spm?.dependencies ?? []; + const transitives = stringList(spmConfig?.dependencies); const currentSpmDeps /*: Array */ = []; for (const transitiveName of transitives) { @@ -298,7 +344,7 @@ function expandSpmDependencies( const transitiveRoot = resolveDep(transitiveName, current.root); if (transitiveRoot == null) { throw new Error( - `react-native autolinking: '${currentName}' declares an unresolvable spm.dependency '${transitiveName}'. Ensure '${transitiveName}' is installed and visible via Node module resolution from ${current.root}.`, + `react-native autolinking: '${currentName}' declares an unresolvable SwiftPM dependency '${transitiveName}'. Ensure '${transitiveName}' is installed and visible via Node module resolution from ${current.root}.`, ); } @@ -312,11 +358,18 @@ function expandSpmDependencies( continue; } + const resolved = resolveSwiftName( + transitiveName, + spmConfigOf(transitiveRoot, transitiveConfig), + podspecFor(transitiveRoot, iosPlatform.podspecPath), + ); byName.set(transitiveName, { name: transitiveName, root: transitiveRoot, platforms: {ios: iosPlatform}, - swiftName: resolveName(transitiveName, transitiveConfig), + swiftName: resolved.name, + swiftNameSource: resolved.source, + swiftNamePodspecKey: resolved.podspecKey, spmDependencies: [], }); queue.push(transitiveName); @@ -328,37 +381,26 @@ function expandSpmDependencies( const allDeps /*: Array */ = Array.from(byName.values()); - disambiguateSharedSwiftNames(allDeps, autoNamed, log); - - // Both checks below validate the FINAL set, after that pass: a borrowed scope - // can land on a reserved name, or on one another dep already holds. assertNoReservedSwiftNames(allDeps, reserved); - // Collision check: two deps mapping to the same Swift name (whether via - // override or auto-derivation) would clobber each other in the synth - // package layout and the centralized headers tree. Surface it now with a - // clear message instead of letting SPM emit a confusing duplicate-target - // error later. - // Key case-INSENSITIVELY: resolveSwiftName permits lowercase ('worklets') - // while toSwiftName produces TitleCase ('Worklets') — an exact-equality check - // passes but the two still collide as directories on the default - // case-insensitive macOS filesystem (synth package layout + headers tree). + // Collision check: two deps mapping to the same Swift name would clobber each + // other in the synth package layout and the centralized headers tree. Surface + // it now with a clear message instead of letting SPM emit a confusing + // duplicate-target error later. swiftNameKey is what makes two names two + // targets — punctuation collapses into one module, case into one directory. const seen /*: Map */ = new Map(); for (const dep of allDeps) { const swiftName = dep.swiftName; if (swiftName == null) { continue; } - const key = swiftName.toLowerCase(); + const key = swiftNameKey(swiftName); const existing = seen.get(key); if (existing != null) { - const same = existing.swiftName === swiftName; throw new SpmNameCollisionError( `react-native autolinking: SPM Swift name collision: '${existing.name}' ('${existing.swiftName}') and '${dep.name}' ('${swiftName}') ` + - (same - ? `both resolve to '${swiftName}'.` - : `differ only in case, which collides on case-insensitive filesystems.`) + - ` Set a distinct 'spm.name' in one of their react-native.config.js files.`, + collisionDiagnosis(existing.swiftName, swiftName) + + ` Set a distinct 'swiftpmConfig.name' in one of their package.json files.`, ); } seen.set(key, {name: dep.name, swiftName}); @@ -424,12 +466,31 @@ function defaultResolveDep( } } +function defaultReadPodspec( + root /*: string */, + podspecPath /*: ?string */, +) /*: ?PodspecFacts */ { + // Deps synthesized from declared dependencies carry no podspecPath — only + // autolinking.json records one — so the dep root is searched as well. + const found = podspecPath ?? findPodspecs(root)[0]; + if (found == null) { + return null; + } + try { + // Ruby-computed fields need the real evaluator; everything else is spared + // the `pod ipc spec` spawn. + return readPodspecNames(found) ?? readPodspecCached(found); + } catch { + return null; + } +} + module.exports = { SpmNameCollisionError, assertSwiftNameNotReserved, expandSpmDependencies, - isValidSwiftName, resolveSwiftName, defaultReadConfig, + defaultReadPodspec, defaultResolveDep, }; diff --git a/packages/react-native/scripts/spm/generate-spm-autolinking.js b/packages/react-native/scripts/spm/generate-spm-autolinking.js index 4f84ea3f7e4d..ecb91f8d64aa 100644 --- a/packages/react-native/scripts/spm/generate-spm-autolinking.js +++ b/packages/react-native/scripts/spm/generate-spm-autolinking.js @@ -10,7 +10,8 @@ 'use strict'; -/*:: import type { +/*:: import type {SwiftpmConfig} from './swiftpm-config'; +import type { AggregatorInput, AutolinkedDep, AutolinkingArgs, @@ -62,11 +63,11 @@ const { SpmNameCollisionError, assertSwiftNameNotReserved, defaultReadConfig, + defaultReadPodspec, defaultResolveDep, expandSpmDependencies, - isValidSwiftName, } = require('./expand-spm-dependencies'); -const {readPodspec} = require('./read-podspec'); +const {findPodspecs, readPodspecCached} = require('./read-podspec'); const { AUTOLINKED_PACKAGE_NAME, REACT_CODEGEN_PACKAGE_NAME, @@ -74,10 +75,14 @@ const { REACT_NATIVE_PACKAGE_NAME, REACT_NATIVE_PRODUCTS, RemoteVersionError, + displayPath, findProjectRoot, + isValidSwiftName, makeLogger, remotePackageConfig, + swiftNameKey, } = require('./spm-utils'); +const {readSwiftpmConfig, stringList} = require('./swiftpm-config'); const fs = require('node:fs'); const path = require('node:path'); const yargs = require('yargs'); @@ -233,92 +238,116 @@ function readAutolinkingJson( } /** - * Attempts to read react-native.config.js to find spm.modules entries. - * These are extra modules not discoverable via autolinking.json. + * One of the app's settings, and the root that declared it. Looked up field by + * field so a project-root `swiftpmConfig` cannot hide a field the Xcode dir + * still declares: the directory holding the app's package.json wins (where + * codegen reads `codegenConfig` from), and `appRoot` — the Xcode project dir, + * the settings' old home — fills the gaps. + */ +function appConfigField( + appRoot /*: string */, + field /*: 'modules' | 'denyPlugins' */, +) /*: ?{root: string, value: unknown} */ { + const projectRoot = findProjectRoot(appRoot); + const roots = projectRoot === appRoot ? [appRoot] : [projectRoot, appRoot]; + for (const root of roots) { + const value = readSwiftpmConfig(root, defaultReadConfig(root))?.[field]; + if (value === undefined) { + continue; + } + if (root !== projectRoot) { + warn( + `Read '${field}' from ${displayPath(root)}. Move it to 'swiftpmConfig' in ${displayPath(path.join(projectRoot, 'package.json'))} — an app's SwiftPM settings belong with its package.json.`, + ); + } + return {root, value}; + } + return null; +} + +/** + * The app's own native modules — the ones autolinking.json cannot discover — + * with the root that declared them, since each `path` is relative to the file + * it is written in: * - * Expected structure in react-native.config.js: - * module.exports = { - * ... - * spm: { - * modules: [ + * // /package.json + * "swiftpmConfig": { + * "modules": [ * { - * name: "MyNativeModule", - * path: "ios/MyNativeModule", // relative to appRoot - * exclude: ["*.js", "*.podspec"], // optional + * "name": "MyNativeModule", + * "path": "ios/MyNativeModule", + * "exclude": ["*.js", "*.podspec"] * } * ] * } - * } */ function readSpmModulesFromConfig( appRoot /*: string */, -) /*: Array */ { - const configPath = path.join(appRoot, 'react-native.config.js'); - if (!fs.existsSync(configPath)) { - return []; +) /*: {modules: Array, root: string} */ { + const declared = appConfigField(appRoot, 'modules'); + if (declared == null || !Array.isArray(declared.value)) { + return {modules: [], root: appRoot}; } - try { - // $FlowFixMe[unsupported-syntax] dynamic require by computed path - const config = require(configPath); - return config.spm?.modules ?? []; - } catch (e) { - // Config might use Ruby interop or other patterns – skip - return []; + // Entries stay unvalidated here: assertSpmModuleName checks each name, and + // the emission loop reads the rest defensively. + // $FlowFixMe[incompatible-type] user-authored entries + const modules /*: ReadonlyArray */ = declared.value; + return {modules: [...modules], root: declared.root}; +} + +function moduleClashDiagnosis( + moduleName /*: string */, + clash /*: string */, +) /*: string */ { + if (clash === moduleName) { + return `is already the name of another autolinked target.`; } + if (clash.toLowerCase() === moduleName.toLowerCase()) { + return `differs from the existing target '${clash}' only in case, which collides on case-insensitive filesystems.`; + } + return `compiles as the same module as the existing target '${clash}'.`; } /** * Validates one app-local `spm.modules` name against the same rules a library's * `spm.name` gets: a usable Swift identifier, not a name React Native reserves, * and not one already taken by another module or an autolinked dep. - * `taken` maps lower-cased name → the name as written. + * `taken` is keyed by swiftNameKey, valued with the name as written. */ function assertSpmModuleName( name /*: unknown */, taken /*: Map */, ) /*: void */ { const remedy = - "Rename it in this app's react-native.config.js 'spm.modules'."; + "Rename it in this app's package.json 'swiftpmConfig.modules'."; if (typeof name !== 'string' || !isValidSwiftName(name)) { throw new Error( - `react-native autolinking: invalid 'spm.modules' name ${JSON.stringify(name) ?? 'undefined'}: must start with a letter or underscore and contain only letters, digits, underscores, or hyphens.`, + `react-native autolinking: invalid 'swiftpmConfig.modules' name ${JSON.stringify(name) ?? 'undefined'}: must start with a letter or underscore and contain only letters, digits, underscores, or hyphens.`, ); } const moduleName = name; assertSwiftNameNotReserved(moduleName, { - label: `the 'spm.modules' entry '${moduleName}'`, + label: `the 'swiftpmConfig.modules' entry '${moduleName}'`, remedy, extraReservedNames: reservedNamesForRun(), }); - const clash = taken.get(moduleName.toLowerCase()); + const clash = taken.get(swiftNameKey(moduleName)); if (clash != null) { throw new SpmNameCollisionError( - `react-native autolinking: SPM Swift name collision: the 'spm.modules' entry '${moduleName}' ` + - (clash === moduleName - ? `is already the name of another autolinked target.` - : `differs from the existing target '${clash}' only in case, which collides on case-insensitive filesystems.`) + + `react-native autolinking: SPM Swift name collision: the 'swiftpmConfig.modules' entry '${moduleName}' ` + + moduleClashDiagnosis(moduleName, clash) + ` ${remedy}`, ); } } /** - * Reads the app's `spm.denyPlugins` — npm names of autolinking plugins to - * skip. The escape hatch for the transitive plugin discovery (an app opts a - * framework's plugin OUT); no allowlist is required. + * The app's `denyPlugins` — npm names of autolinking plugins to skip. The + * escape hatch for transitive plugin discovery (an app opts a framework's + * plugin OUT); no allowlist is required. */ function readDenyPluginsFromConfig(appRoot /*: string */) /*: Array */ { - const configPath = path.join(appRoot, 'react-native.config.js'); - if (!fs.existsSync(configPath)) { - return []; - } - try { - // $FlowFixMe[unsupported-syntax] dynamic require by computed path - const config = require(configPath); - return config.spm?.denyPlugins ?? []; - } catch (e) { - return []; - } + return stringList(appConfigField(appRoot, 'denyPlugins')?.value); } /** @@ -433,21 +462,9 @@ function findSelfManagedPackageDir(absSource /*: string */) /*: ?string */ { * the scaffolder translates the podspec into a Package.swift. */ function hasPodspec(absSource /*: string */) /*: boolean */ { - for (const sub of ['', 'ios']) { - const dir = sub === '' ? absSource : path.join(absSource, sub); - try { - if ( - fs - .readdirSync(dir) - .some(e => e.endsWith('.podspec') && !e.startsWith('.spm-scaffold-')) - ) { - return true; - } - } catch { - // dir does not exist; try the next candidate - } - } - return false; + return [absSource, path.join(absSource, 'ios')].some( + dir => findPodspecs(dir).length > 0, + ); } /** @@ -778,9 +795,9 @@ function expandSpmSourceGlobs( * Returns null if the dependency doesn't have iOS support. * * `swiftNameByNpm` maps each autolinked dep's npm name to its resolved Swift - * name (populated by expandSpmDependencies, honoring the dep's `spm.name` - * config and scope disambiguation). Every name this function emits comes from - * there — see requireSwiftName. + * name (populated by expandSpmDependencies from the dep's podspec and + * `spm.name`). Every name this function emits comes from there — see + * requireSwiftName. */ /** * Read the dep's podspec (if any) and extract its declared @@ -799,24 +816,12 @@ function expandSpmSourceGlobs( function extractPodspecHeaderSearchPaths( sourceDir /*: string */, ) /*: Array */ { - let podspecPath /*: ?string */ = null; - try { - const entries = fs.readdirSync(sourceDir); - // Skip a crashed run's leftover `.spm-scaffold--.podspec` copy. - const candidate = entries.find( - e => e.endsWith('.podspec') && !e.startsWith('.spm-scaffold-'), - ); - if (candidate != null) { - podspecPath = path.join(sourceDir, candidate); - } - } catch { - return []; - } + const podspecPath /*: ?string */ = findPodspecs(sourceDir)[0]; if (podspecPath == null) return []; let model; try { - model = readPodspec(podspecPath); + model = readPodspecCached(podspecPath); } catch { return []; } @@ -1312,8 +1317,8 @@ function main(argv /*:: ?: Array */) /*: void */ { const allDeps = expandSpmDependencies(directDeps, { readConfig: defaultReadConfig, resolveDep: defaultResolveDep, + readPodspec: defaultReadPodspec, extraReservedNames: reservedNamesForRun(), - log, }); // Map every autolinked npm name to its resolved Swift name so transitive @@ -1380,7 +1385,7 @@ function main(argv /*:: ?: Array */) /*: void */ { const dependents = pluginHostDependents.get(dep.name); if (dependents != null) { throw new Error( - `react-native autolinking: '${dep.name}' ships an SPM autolinking plugin, which owns its native contribution — so React Native does not build it as a sibling target for anything to depend on. It is declared in 'spm.dependencies' by ${dependents.map(name => `'${name}'`).join(', ')}. Remove it there; nothing is lost. Its plugin links its products into the app and resolves its own ecosystem's dependencies, so a library that builds against it does not declare it here.`, + `react-native autolinking: '${dep.name}' ships an SPM autolinking plugin, which owns its native contribution — so React Native does not build it as a sibling target for anything to depend on. It is declared as a SwiftPM dependency by ${dependents.map(name => `'${name}'`).join(', ')}. Remove it there; nothing is lost. Its plugin links its products into the app and resolves its own ecosystem's dependencies, so a library that builds against it does not declare it here.`, ); } log( @@ -1414,17 +1419,20 @@ function main(argv /*:: ?: Array */) /*: void */ { // If the module declares `sources: [glob, ...]` (CocoaPods-style), expand // the globs now relative to its dir and attach the file list to the target // so the emission loop below renders `sources: [...]` literally. - const configModules = readSpmModulesFromConfig(appRoot); + const {modules: configModules, root: configModulesRoot} = + readSpmModulesFromConfig(appRoot); // Module names land in the manifest exactly as written, so they get the same // checks a dep's Swift name gets. Seeded with the dep target names already // emitted so a module can't shadow an autolinked library either. const takenSwiftNames /*: Map */ = new Map( - entries.map(entry => [entry.target.name.toLowerCase(), entry.target.name]), + entries.map(entry => [swiftNameKey(entry.target.name), entry.target.name]), ); for (const mod of configModules) { assertSpmModuleName(mod.name, takenSwiftNames); - takenSwiftNames.set(mod.name.toLowerCase(), mod.name); - const absPath = path.resolve(appRoot, mod.path); + takenSwiftNames.set(swiftNameKey(mod.name), mod.name); + // Relative to the package.json (or config file) that declared it, so a + // path reads correctly from where it is written. + const absPath = path.resolve(configModulesRoot, mod.path); const relPath = path.relative(outputDir, absPath); const userSources = Array.isArray(mod.sources) && mod.sources.length > 0 @@ -1999,6 +2007,7 @@ module.exports = { findSelfManagedPackageDir, hasPodspec, hasMixedLanguageSources, + readDenyPluginsFromConfig, MissingManifestError, reportMissingManifests, AUTOGEN_MARKER, diff --git a/packages/react-native/scripts/spm/read-podspec.js b/packages/react-native/scripts/spm/read-podspec.js index 0b9a75010f8c..8fcf04bbf658 100644 --- a/packages/react-native/scripts/spm/read-podspec.js +++ b/packages/react-native/scripts/spm/read-podspec.js @@ -170,6 +170,27 @@ function cleanupPatchedPodspec(patchedPath /*: ?string */) /*: void */ { // Regex fallback // --------------------------------------------------------------------------- +// Comment-only lines are dropped so a commented-out `# s.header_dir` cannot win +// over the live one. A trailing `#` and a `#` inside a string survive: only the +// first non-whitespace character counts. +function readPodspecSource(podspecPath /*: string */) /*: string */ { + return fs + .readFileSync(podspecPath, 'utf8') + .split('\n') + .filter(line => !/^\s*#/.test(line)) + .join('\n'); +} + +// A subspec that re-binds a receiver the identity regexes trust: inside +// `s.subspec "common" do |s|`, `s` is the CHILD, and no regex over flat text +// can see that. Any other block variable (`do |ss|`) is unambiguous. +const SHADOWING_SUBSPEC_RE = + /\.subspec\s+["'][^"']*["']\s+do\s*\|\s*(?:s|spec)\s*\|/; + +function hasShadowingSubspec(source /*: string */) /*: boolean */ { + return SHADOWING_SUBSPEC_RE.test(source); +} + /** * Best-effort Ruby podspec parser. Extracts the literal-string and * literal-array fields most RN libs use. Skips subspec blocks, Ruby helper @@ -178,16 +199,39 @@ function cleanupPatchedPodspec(patchedPath /*: ?string */) /*: void */ { * user. Always returns a RawSpec; pure-JS, no Ruby dep required. */ function regexPodspec(podspecPath /*: string */) /*: RawSpec */ { - const content = fs.readFileSync(podspecPath, 'utf8'); + const content = readPodspecSource(podspecPath); const warnings /*: Array */ = []; - // Matches: s. = "value" or s. = 'value' + // Matches: s. = "value" or s. = 'value' — at ANY scope, + // so a subspec's value counts. Right for the fields flattenSubspecs merges + // (source globs, header mappings); wrong for the fields that identify the + // spec, which use getSpecStringField. function getStringField(name /*: string */) /*: string | null */ { const re = new RegExp(`(?:s|spec)\\.${name}\\s*=\\s*["']([^"']+)["']`); const m = content.match(re); return m ? m[1] : null; } + // The same, but only where the receiver starts the statement — so a subspec's + // block variable (`ss.header_dir`, the shape react-native-screens and + // react-native-svg ship) cannot answer for the spec itself. + function getSpecStringField(name /*: string */) /*: string | null */ { + const re = new RegExp( + `(?:^|[;|])\\s*(?:s|spec)\\.${name}\\s*=\\s*["']([^"']+)["']`, + 'm', + ); + const m = content.match(re); + return m ? m[1] : null; + } + + // The fields that identify the spec, and only when the receiver spelling + // still says which scope declared them: a subspec re-binding `s` puts its own + // `header_dir` exactly where the library's would be. + const shadowedIdentity = hasShadowingSubspec(content); + function getIdentityField(name /*: string */) /*: string | null */ { + return shadowedIdentity ? null : getSpecStringField(name); + } + // Matches: // s. = ["a", "b"] (array) // s. = "single" (single value treated as 1-element array) @@ -289,6 +333,11 @@ function regexPodspec(podspecPath /*: string */) /*: RawSpec */ { } // Surface known unparseable constructs so the caller can warn the user. + if (shadowedIdentity) { + warnings.push( + "A subspec rebinds the spec variable (`do |s|`), so its `name`, `module_name` and `header_dir` cannot be told from the library's own — those are left unread. Install CocoaPods (`gem install cocoapods`) to enable full `pod ipc spec` parsing.", + ); + } if (/(?:s|spec)\.subspec\s+["']/.test(content)) { warnings.push( 'Subspecs detected — regex parser only extracts top-level fields. Install CocoaPods (`gem install cocoapods`) to enable full `pod ipc spec` parsing.', @@ -306,14 +355,15 @@ function regexPodspec(podspecPath /*: string */) /*: RawSpec */ { } return { - name: getStringField('name'), - version: getStringField('version'), + name: getIdentityField('name'), + module_name: getIdentityField('module_name'), + version: getSpecStringField('version'), source_files: getArrayField('source_files'), public_header_files: getArrayField('public_header_files'), private_header_files: getArrayField('private_header_files'), exclude_files: getArrayField('exclude_files'), header_mappings_dir: getStringField('header_mappings_dir'), - header_dir: getStringField('header_dir'), + header_dir: getIdentityField('header_dir'), frameworks: getFrameworks(false), weak_frameworks: getFrameworks(true), libraries: getArrayField('libraries'), @@ -432,6 +482,14 @@ function flattenSubspecs(rawSpec /*: RawSpec */) /*: PodspecModel */ { return Array.from(new Set(out)); } + // Only the spec's own value: a subspec's `header_dir` names that subspec's + // headers, and several subspecs can disagree. + function specStringField(key /*: string */) /*: string | null */ { + // $FlowFixMe[incompatible-use] dynamic shape + const value = rawSpec[key]; + return typeof value === 'string' && value.length > 0 ? value : null; + } + function mergeStringField(key /*: string */) /*: string | null */ { for (const layer of layers) { // $FlowFixMe[incompatible-use] layer narrowed from `mixed`; runtime-validated below @@ -620,8 +678,8 @@ function flattenSubspecs(rawSpec /*: RawSpec */) /*: PodspecModel */ { : true; // RN ecosystem default return { - name: mergeStringField('name') ?? '', - version: mergeStringField('version') ?? '', + name: specStringField('name') ?? '', + version: specStringField('version') ?? '', sourceFiles: mergeArrayField('source_files'), publicHeaderFiles: mergeArrayField('public_header_files'), privateHeaderFiles: mergeArrayField('private_header_files'), @@ -634,7 +692,8 @@ function flattenSubspecs(rawSpec /*: RawSpec */) /*: PodspecModel */ { // resolve from the physical tree — CocoaPods does this via the // header_mappings_dir copy step, which SPM has no equivalent for. headerMappingsDirs: mergeArrayField('header_mappings_dir'), - headerDir: mergeStringField('header_dir'), + headerDir: specStringField('header_dir'), + moduleName: specStringField('module_name'), frameworks: mergeArrayField('frameworks'), weakFrameworks: mergeArrayField('weak_frameworks'), libraries: mergeArrayField('libraries'), @@ -687,8 +746,97 @@ function readPodspec(podspecPath /*: string */) /*: PodspecModel */ { return model; } +const podspecModels /*: Map */ = new Map(); + +/** + * readPodspec memoized on the resolved path. `pod ipc spec` costs a process + * spawn, and one autolinking run reads the same podspec from several sites + * (name resolution, header search paths, scaffolding). The model is shared, so + * callers must treat it as read-only. + */ +function readPodspecCached(podspecPath /*: string */) /*: PodspecModel */ { + const key = path.resolve(podspecPath); + const cached = podspecModels.get(key); + if (cached != null) { + return cached; + } + const model = readPodspec(podspecPath); + podspecModels.set(key, model); + return model; +} + +/** + * The three fields that name a library, read WITHOUT `pod ipc spec`'s process + * spawn — name resolution runs for every dep, including self-managed ones that + * need nothing else from the podspec. + * + * Null when the answer cannot be trusted without Ruby: an interpolated value, + * or a spec-level `header_dir`/`module_name` the regex could not read. Both + * outrank the pod name, so a literal name alone is not enough — resolving + * without them would pick the wrong prefix. A value only a subspec declares is + * not the library's, so it neither answers nor defers — unless that subspec + * re-binds `s` (or `spec`), which makes every field's scope unreadable. + */ +function readPodspecNames( + podspecPath /*: string */, +) /*: ?{name: ?string, moduleName: ?string, headerDir: ?string} */ { + const raw = regexPodspec(podspecPath); + const field = (key /*: string */) /*: ?string */ => { + // $FlowFixMe[prop-missing] RawSpec is dynamically shaped + const value = raw[key]; + return typeof value === 'string' && + value.length > 0 && + !value.includes('#{') + ? value + : null; + }; + const source = readPodspecSource(podspecPath); + if (hasShadowingSubspec(source)) { + return null; + } + const declaredUnread = ( + key /*: string */, + value /*: ?string */, + ) /*: boolean */ => + value == null && + new RegExp(`(?:^|[;|])\\s*(?:s|spec)\\.${key}\\s*=`, 'm').test(source); + + const name = field('name'); + const moduleName = field('module_name'); + const headerDir = field('header_dir'); + if ( + declaredUnread('header_dir', headerDir) || + declaredUnread('module_name', moduleName) + ) { + return null; + } + return name == null && moduleName == null && headerDir == null + ? null + : {name, moduleName, headerDir}; +} + +/** + * Every podspec in `dir`, sorted so two of them name a target the same way on + * every machine (readdir order is unspecified). Skips a crashed run's leftover + * `.spm-scaffold--.podspec` copy. + */ +function findPodspecs(dir /*: string */) /*: Array */ { + try { + return fs + .readdirSync(dir) + .filter(e => e.endsWith('.podspec') && !e.startsWith('.spm-scaffold-')) + .sort() + .map(e => path.join(dir, e)); + } catch { + return []; + } +} + module.exports = { + findPodspecs, readPodspec, + readPodspecCached, + readPodspecNames, runPodIpcSpec, regexPodspec, flattenSubspecs, diff --git a/packages/react-native/scripts/spm/scaffold-package-swift.js b/packages/react-native/scripts/spm/scaffold-package-swift.js index b6b4242d83b3..5c0e3f8325af 100644 --- a/packages/react-native/scripts/spm/scaffold-package-swift.js +++ b/packages/react-native/scripts/spm/scaffold-package-swift.js @@ -38,11 +38,13 @@ import type { const { SpmNameCollisionError, defaultReadConfig, + defaultReadPodspec, defaultResolveDep, expandSpmDependencies, + resolveSwiftName, } = require('./expand-spm-dependencies'); const {expandSpmSourceGlobs} = require('./generate-spm-autolinking'); -const {readPodspec} = require('./read-podspec'); +const {findPodspecs, readPodspecCached} = require('./read-podspec'); const { REACT_CODEGEN_PACKAGE_NAME, REACT_CODEGEN_PRODUCTS, @@ -51,12 +53,12 @@ const { SCAFFOLDER_MARKER, makeLogger, remotePackageConfig, - toSwiftName, } = require('./spm-utils'); +const {readSwiftpmConfig, writeSwiftpmName} = require('./swiftpm-config'); const fs = require('node:fs'); const path = require('node:path'); -const {log} = makeLogger('scaffold-package-swift'); +const {log, warn} = makeLogger('scaffold-package-swift'); // SCAFFOLDER_MARKER lives in spm-utils.js (shared, no import cycle). It must NOT // contain the autolinker's AUTOGEN_MARKER ('// AUTO-GENERATED by @@ -246,22 +248,16 @@ function translatePodspecToSpmTarget( ) /*: SpmScaffoldSpec */ { const warnings = [...model.warnings]; - // Swift target name: whatever the autolinker resolved for this dep — its - // `spm.name` override when set, else toSwiftName(npm-name). The autolinker - // registers the dep under that name in its aggregator (and in any sibling - // spm.dependencies refs), so the scaffolded Package.swift's product/library - // name must match it exactly — otherwise SPM resolution fails with a name - // mismatch on `.product(name: "X", package: "X")`. - // - // The podspec's `header_dir` is captured separately: when it changes the - // include surface (e.g. `` instead of ``), - // header resolution already works via the -I flags from headerSearchPaths - // (path-style includes like safe-area-context's - // `` resolve through - // `-I common/cpp/`). Module-style includes that NEED the target name to - // match (e.g. reanimated's `` via SwiftPM's auto-generated - // module map) are what `spm.name` is for. - const swiftName = dep.swiftName ?? toSwiftName(dep.name); + // Whatever the autolinker resolved (see resolveSwiftName). It registers the + // dep under that name in its aggregator and in any sibling spm.dependencies + // refs, so the scaffolded product/library name must match it exactly — + // otherwise SPM fails to resolve `.product(name: "X", package: "X")`. + const swiftName = dep.swiftName; + if (swiftName == null) { + throw new Error( + `react-native spm scaffold: no resolved Swift name for '${dep.name}'. expandSpmDependencies must resolve every dep's name before a manifest is written.`, + ); + } // Header search paths — substitute Xcode build-setting tokens against the // dep root. Anything we can't substitute is dropped + warned (avoids @@ -658,8 +654,7 @@ function emitScaffoldedPackageSwift( // Dependencies block. Always declares ReactNative if any React-core dep // was in the podspec; sibling RN deps come from autolinking's existing - // .package(path: ...) graph — we reference them by toSwiftName(npmName) - // since that's what the autolinker registers them under. + // .package(path: ...) graph, under the names the autolinker resolved. const packageDeps /*: Array */ = []; const targetDeps /*: Array */ = []; if (spec.coreReactNative) { @@ -704,8 +699,12 @@ function emitScaffoldedPackageSwift( } } for (const siblingName of spec.siblingNames) { - const swiftSibling = - spec.siblingSwiftNames?.[siblingName] ?? toSwiftName(siblingName); + const swiftSibling = spec.siblingSwiftNames?.[siblingName]; + if (swiftSibling == null) { + throw new Error( + `react-native spm scaffold: no resolved Swift name for the sibling '${siblingName}'. expandSpmDependencies must resolve every dep's name before a manifest is written.`, + ); + } // The autolinker references each self-managed (scaffolded) dep through a // `libs/` symlink, and SPM resolves a manifest's relative // package paths against that symlink location — so a sibling lives at @@ -784,6 +783,61 @@ ${packageDepsBlock} targets: [ `; } +const PODSPEC_KEY_ORIGINS = { + header_dir: "its podspec's 'header_dir'", + module_name: "its podspec's 'module_name'", + name: 'its pod name', +}; + +// Null when the caller resolved the name without recording where it came from, +// since the alternative is inventing an origin. +function swiftNameOrigin(dep /*: AutolinkedDep */) /*: ?string */ { + switch (dep.swiftNameSource) { + case 'config': + return "its declared 'swiftpmConfig.name'"; + case 'podspec': + return PODSPEC_KEY_ORIGINS[dep.swiftNamePodspecKey ?? 'name']; + case 'npm': + return 'its npm package name'; + default: + return null; + } +} + +/** + * Says which SwiftPM name the library got and where that name came from. The + * name is the prefix every `#import ` against the library has to + * spell, and a podspec-derived one is written into the library's package.json, + * so it is not a decision to make silently. + */ +function reportSwiftName( + dep /*: AutolinkedDep */, + swiftName /*: string */, + model /*: PodspecModel */, +) /*: void */ { + const origin = swiftNameOrigin(dep); + if (origin == null) { + return; + } + log(`${dep.name}: SwiftPM name '${swiftName}' (from ${origin}).`); + // Two declared namespaces, one name: CocoaPods compiles the module as + // `module_name` while consumers import through `header_dir`, so a library + // that declares both loses one of them here. + const {headerDir, moduleName} = model; + if ( + dep.swiftNamePodspecKey === 'header_dir' && + headerDir != null && + moduleName != null && + headerDir !== moduleName + ) { + warn( + `${dep.name}'s podspec declares both a 'header_dir' ('${headerDir}') and a 'module_name' ('${moduleName}'): ` + + `'${swiftName}' is the SwiftPM name, and '${moduleName}' is not used. ` + + `Set 'swiftpmConfig.name' in its package.json to override that choice.`, + ); + } +} + // --------------------------------------------------------------------------- // Per-dep orchestrator // --------------------------------------------------------------------------- @@ -806,7 +860,7 @@ type ScaffoldContext = { // `s.dependency` names (e.g. "RNWorklets") wire to the right sibling. podToNpm?: Map, // npm-name → resolved Swift name over all autolinked deps, so sibling - // references honor each sibling's `spm.name`. + // references honor each sibling's declared name. swiftNameByNpm?: Map, remote: ?{url: string, version: string, identity: string}, }; @@ -839,14 +893,14 @@ function scaffoldPackageSwiftForDep( }; } - // Dep can opt out via its own react-native.config.js. - const cfg = defaultReadConfig(dep.root); - // $FlowFixMe[prop-missing] config has dynamic shape - if (cfg != null && cfg.spm != null && cfg.spm.scaffold === false) { + // Dep can opt out in its own package.json. + if ( + readSwiftpmConfig(dep.root, defaultReadConfig(dep.root))?.scaffold === false + ) { return { depName, status: 'skipped-opt-out', - reason: 'react-native.config.js sets spm.scaffold = false.', + reason: "the library sets 'swiftpmConfig.scaffold' to false.", }; } @@ -925,25 +979,10 @@ function scaffoldPackageSwiftForDep( } } - // Find a podspec to read. autolinking.json may have provided podspecPath; - // otherwise glob for *.podspec in dep root. + // autolinking.json may have provided podspecPath; otherwise search dep.root. // $FlowFixMe[prop-missing] dynamic shape from autolinking.json - let podspecPath /*: ?string */ = dep.platforms.ios.podspecPath ?? null; - if (podspecPath == null) { - try { - const entries = fs.readdirSync(dep.root); - // Skip a crashed run's leftover patched copy (read-podspec.js stages it - // as `.spm-scaffold--.podspec` next to the original). - const candidate = entries.find( - e => e.endsWith('.podspec') && !e.startsWith('.spm-scaffold-'), - ); - if (candidate != null) { - podspecPath = path.join(dep.root, candidate); - } - } catch { - // dep.root may not exist; treat as no-podspec - } - } + const podspecPath /*: ?string */ = + dep.platforms.ios.podspecPath ?? findPodspecs(dep.root)[0]; if (podspecPath == null || !fs.existsSync(podspecPath)) { return { depName, @@ -954,7 +993,7 @@ function scaffoldPackageSwiftForDep( let model; try { - model = readPodspec(podspecPath); + model = readPodspecCached(podspecPath); } catch (e) { return { depName, @@ -1064,12 +1103,23 @@ function scaffoldPackageSwiftForDep( } } + reportSwiftName(dep, spec.swiftName, model); + + // Migration: record a name we derived from the podspec, so the library can + // drop the podspec. A declared name is already where it belongs, and a name + // guessed from the npm name would freeze a guess into someone's config. + const swiftpmName = + dep.swiftNameSource === 'podspec' + ? writeSwiftpmName(dep.root, spec.swiftName, {dryRun: ctx.dryRun}) + : undefined; + return { depName, status: 'written', packageSwiftPath: pkgSwiftPath, warnings: spec.warnings, previouslyExisted, + swiftpmName, }; } @@ -1158,17 +1208,31 @@ function scaffoldAll( allDeps = expandSpmDependencies(directDeps, { readConfig: defaultReadConfig, resolveDep: defaultResolveDep, + readPodspec: defaultReadPodspec, extraReservedNames: remote != null ? [remote.identity] : undefined, - log, }); } catch (e) { if (e instanceof SpmNameCollisionError) { throw e; } // A transitive-resolution failure shouldn't abort the whole scaffold pass; - // fall back to the direct deps so at least those get manifests. - log(`Transitive spm.dependencies expansion failed: ${e.message}`); - allDeps = directDeps; + // fall back to the direct deps so at least those get manifests. They are + // named the same way the autolinker names them — a manifest written under + // any other name outlives this error on disk and then fails to resolve. + log(`Transitive dependency expansion failed: ${e.message}`); + allDeps = directDeps.map(dep => { + const resolved = resolveSwiftName( + dep.name, + readSwiftpmConfig(dep.root, defaultReadConfig(dep.root)), + defaultReadPodspec(dep.root, dep.platforms.ios.podspecPath), + ); + return { + ...dep, + swiftName: resolved.name, + swiftNameSource: resolved.source, + swiftNamePodspecKey: resolved.podspecKey, + }; + }); } // Index every autolinked dep's podspec name → its npm name, so a dep that @@ -1187,14 +1251,8 @@ function scaffoldAll( // discover the podspec at the dep root so podspec-name sibling deps // (e.g. `s.dependency "TestLibraryCommon"`) still wire to their npm // package. - try { - for (const f of fs.readdirSync(dep.root)) { - if (f.endsWith('.podspec') && !f.startsWith('.spm-scaffold-')) { - podToNpm.set(path.basename(f, '.podspec'), dep.name); - } - } - } catch { - // unreadable dep root — sibling wiring falls back to the warning path + for (const found of findPodspecs(dep.root)) { + podToNpm.set(path.basename(found, '.podspec'), dep.name); } } } diff --git a/packages/react-native/scripts/spm/spm-types.js b/packages/react-native/scripts/spm/spm-types.js index 849fecff5637..dcda8d3addd7 100644 --- a/packages/react-native/scripts/spm/spm-types.js +++ b/packages/react-native/scripts/spm/spm-types.js @@ -9,6 +9,7 @@ */ /*:: +import type {SwiftpmNameOutcome} from './swiftpm-config'; export type SetupArgs = { action: 'add' | 'update' | 'deinit' | 'sync' | 'codegen' | 'download' | 'scaffold' | null, version: string | null, @@ -143,13 +144,19 @@ export type AutolinkedDep = { name: string, root: string, platforms: {ios: AutolinkingIosPlatform, ...}, - // Resolved Swift target / module / headers-subdir name. Defaults to - // toSwiftName(name) and is overridden by the dep's react-native.config.js - // `spm.name`. Populated by expandSpmDependencies — always present after - // expansion; optional in the type so caller-side construction stays simple. + // Resolved Swift target / module / headers-subdir name — the name the library + // declares in `swiftpmConfig`, else its podspec's (see resolveSwiftName). + // Populated by expandSpmDependencies — always present after expansion; + // optional in the type so caller-side construction stays simple. swiftName?: string, - // Populated by expandSpmDependencies from each dep's - // react-native.config.js `spm.dependencies` array. + // Where swiftName came from. Only a podspec-derived name is safe for the + // scaffolder to record in the library's package.json. + swiftNameSource?: 'config' | 'podspec' | 'npm', + // Which podspec field named it ('podspec' source only), so `spm scaffold` can + // report the choice it made between `header_dir` and `module_name`. + swiftNamePodspecKey?: 'header_dir' | 'module_name' | 'name', + // Populated by expandSpmDependencies from each dep's declared + // `dependencies` array. spmDependencies?: Array, ... }; @@ -422,6 +429,10 @@ export type PodspecModel = { // physical source tree (SPM has no header_mappings_dir copy step). headerMappingsDirs: Array, headerDir: ?string, + // What CocoaPods compiles the module as, and so what Swift and `@import` + // consumers spell (`s.module_name`). Defaults to the pod name in CocoaPods; + // null here when the podspec does not declare it. + moduleName: ?string, frameworks: Array, weakFrameworks: Array, libraries: Array, @@ -462,8 +473,7 @@ export type PodspecModel = { // Decouples podspec reading from SPM-specific shaping so each side can be // tested in isolation. export type SpmScaffoldSpec = { - // Swift target / module name. Default: toSwiftName(podspec.name); overridden - // by `header_dir` when present. + // Swift target / module name, as resolved by expandSpmDependencies. swiftName: string, // Source file paths relative to the dep root, ready for `sources: [...]` // emission after the `root/` wrapper-dir prefix is applied at emit time. @@ -522,6 +532,9 @@ export type ScaffoldResult = // changed, --force, etc.); false on first-time scaffolds. The CLI // orchestrator prompts only for first-time scaffolds. previouslyExisted: boolean, + // What became of `swiftpmConfig.name` in the library's package.json. + // Absent when the name was not podspec-derived, so nothing was attempted. + swiftpmName?: SwiftpmNameOutcome, } | { depName: string, diff --git a/packages/react-native/scripts/spm/spm-utils.js b/packages/react-native/scripts/spm/spm-utils.js index b916e3dfe921..fc5313623e71 100644 --- a/packages/react-native/scripts/spm/spm-utils.js +++ b/packages/react-native/scripts/spm/spm-utils.js @@ -171,6 +171,29 @@ function toSwiftName(name /*: string */) /*: string */ { .join(''); } +// The charset a declared SwiftPM name must satisfy — permissive on purpose, +// since it has to admit header-dir style (lowercase with hyphens) as well as +// Swift identifiers. +function isValidSwiftName(name /*: unknown */) /*: boolean */ { + return typeof name === 'string' && /^[A-Za-z_][A-Za-z0-9_-]*$/.test(name); +} + +/** + * SwiftPM's `c99name` — the identifier a target's module is compiled under, + * with every character C99 rejects replaced by `_`. `react-native-svg` and + * `react_native_svg` share one, so they cannot both be targets. + */ +function toC99Name(name /*: string */) /*: string */ { + const mangled = name.replace(/[^A-Za-z0-9_]/g, '_'); + return /^[0-9]/.test(mangled) ? `_${mangled}` : mangled; +} + +// Collision key for a Swift target name: two names that share one collide, as a +// module (punctuation) or as a headers directory (case). +function swiftNameKey(name /*: string */) /*: string */ { + return toC99Name(name).toLowerCase(); +} + /** * Derive a default app name from the raw package name and source path. * Prefers the source directory name when it's meaningful (e.g. "RNTester"), @@ -743,6 +766,9 @@ module.exports = { sharedCacheDir, defaultCacheDir, toSwiftName, + toC99Name, + swiftNameKey, + isValidSwiftName, deriveAppName, readPackageJson, findProjectRoot, diff --git a/packages/react-native/scripts/spm/swiftpm-config.js b/packages/react-native/scripts/spm/swiftpm-config.js new file mode 100644 index 000000000000..109fa3bde38c --- /dev/null +++ b/packages/react-native/scripts/spm/swiftpm-config.js @@ -0,0 +1,245 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +'use strict'; + +const {isValidSwiftName, makeLogger} = require('./spm-utils'); +const fs = require('node:fs'); +const path = require('node:path'); + +const {log, warn} = makeLogger('swiftpm-config'); + +/** + * swiftpm-config.js — one reader for a package's SwiftPM settings. + * + * They live in `swiftpmConfig` in the package's package.json: + * + * { "swiftpmConfig": { "name": "RNSVG" } } + * + * A library owns `name`, `dependencies`, `autolinkingPlugin` and `scaffold`; + * an app owns `modules` and `denyPlugins`. The `spm` block in + * react-native.config.js is the deprecated spelling of the same fields — still + * read so nothing breaks mid-migration, but package.json wins field by field. + */ + +/*:: +export type SwiftpmNameOutcome = + | 'created' + | 'inserted' + | 'already-set' + | 'skipped' + | 'failed'; +// User-authored, so values stay unknown and are validated where consumed. +export type SwiftpmConfig = { + readonly name?: unknown, + readonly dependencies?: unknown, + readonly autolinkingPlugin?: unknown, + readonly scaffold?: unknown, + readonly modules?: unknown, + readonly denyPlugins?: unknown, + ... +}; +type RnConfig = {...}; +*/ + +const SWIFTPM_FIELDS /*: ReadonlyArray */ = [ + 'name', + 'dependencies', + 'autolinkingPlugin', + 'scaffold', + 'modules', + 'denyPlugins', +]; + +// Config file paths already warned about, by kind of warning. +const deprecationsReported /*: Set */ = new Set(); +const unknownKeysReported /*: Set */ = new Set(); + +function readPackageJson( + root /*: string */, +) /*: ?{readonly [string]: unknown} */ { + const pkgPath = path.join(root, 'package.json'); + if (!fs.existsSync(pkgPath)) { + return null; + } + try { + const parsed = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); + return parsed != null && typeof parsed === 'object' ? parsed : null; + } catch (e) { + warn( + `Failed to read ${pkgPath}: ${e.message}. 'swiftpmConfig' is ignored.`, + ); + return null; + } +} + +// A settings object, or null for anything else the author may have written +// there — an array included, since its indices are not fields. +function objectField( + source /*: ?{readonly [string]: unknown} */, + key /*: string */, +) /*: ?SwiftpmConfig */ { + const value = source?.[key]; + return value != null && typeof value === 'object' && !Array.isArray(value) + ? value + : null; +} + +function declaredFields( + config /*: ?{readonly [string]: unknown} */, +) /*: Array */ { + return config == null + ? [] + : SWIFTPM_FIELDS.filter(field => config[field] !== undefined); +} + +function stringList(value /*: unknown */) /*: Array */ { + return Array.isArray(value) ? value.filter(v => typeof v === 'string') : []; +} + +function reportDeprecation( + root /*: string */, + fields /*: Array */, +) /*: void */ { + const configPath = path.join(root, 'react-native.config.js'); + if (deprecationsReported.has(configPath)) { + return; + } + deprecationsReported.add(configPath); + warn( + `${configPath} declares SwiftPM settings in the deprecated 'spm' block (${fields.join(', ')}). ` + + `Move them to 'swiftpmConfig' in the package's package.json — the 'spm' block still works, but will stop being read.`, + ); +} + +// A misspelled field would otherwise do nothing at all. Unknown keys are only +// reported, never rejected: a library may declare a field a newer React Native +// knows and this one does not. +function reportUnknownKeys( + root /*: string */, + config /*: SwiftpmConfig */, +) /*: void */ { + const pkgPath = path.join(root, 'package.json'); + const unknown = Object.keys(config).filter( + key => !SWIFTPM_FIELDS.includes(key), + ); + if (unknown.length === 0 || unknownKeysReported.has(pkgPath)) { + return; + } + unknownKeysReported.add(pkgPath); + warn( + `${pkgPath} declares 'swiftpmConfig' fields React Native does not know (${unknown.join(', ')}). ` + + `They are ignored — check the spelling against ${SWIFTPM_FIELDS.join(', ')}.`, + ); +} + +/** + * The SwiftPM settings that apply to the package at `root`: `swiftpmConfig` + * from its package.json over the deprecated `spm` block of its already-loaded + * react-native.config.js. Null when the package declares neither. + */ +function readSwiftpmConfig( + root /*: string */, + rnConfig /*: ?RnConfig */, +) /*: ?SwiftpmConfig */ { + const fromPackageJson = objectField(readPackageJson(root), 'swiftpmConfig'); + if (fromPackageJson != null) { + reportUnknownKeys(root, fromPackageJson); + } + const deprecated = objectField(rnConfig, 'spm'); + const deprecatedFields = declaredFields(deprecated); + if (deprecatedFields.length > 0) { + reportDeprecation(root, deprecatedFields); + } + if (fromPackageJson == null) { + return deprecatedFields.length > 0 ? deprecated : null; + } + return {...deprecated, ...fromPackageJson}; +} + +// The file's own indentation, so writing a field back does not reformat it. +function detectIndent(source /*: string */) /*: string */ { + return /\n([ \t]+)"/.exec(source)?.[1] ?? ' '; +} + +/** + * Records `swiftName` as `swiftpmConfig.name` in the package's package.json — + * the scaffolder's migration step, which is what lets a library stop deriving + * its SwiftPM name from a podspec. A name the author already chose is never + * overwritten. + */ +function writeSwiftpmName( + root /*: string */, + swiftName /*: string */, + options /*:: ?: {dryRun?: boolean} */, +) /*: SwiftpmNameOutcome */ { + if (!isValidSwiftName(swiftName)) { + return 'skipped'; + } + const pkgPath = path.join(root, 'package.json'); + let source; + let pkg; + try { + source = fs.readFileSync(pkgPath, 'utf8'); + pkg = JSON.parse(source); + } catch { + return 'skipped'; + } + if (pkg == null || typeof pkg !== 'object') { + return 'skipped'; + } + const existing = objectField(pkg, 'swiftpmConfig'); + if (existing == null && pkg.swiftpmConfig !== undefined) { + warn( + `${pkgPath} has a 'swiftpmConfig' that is not an object; leaving it alone. ` + + `React Native resolved the name '${swiftName}' from the podspec.`, + ); + return 'skipped'; + } + const declaredName = existing?.name; + if (declaredName === swiftName) { + return 'already-set'; + } + if (declaredName != null) { + warn( + `${pkgPath} already sets 'swiftpmConfig.name' to '${String(declaredName)}'; leaving it. ` + + `React Native resolved '${swiftName}' from the podspec — set them to the same value to silence this.`, + ); + return 'skipped'; + } + const outcome = existing == null ? 'created' : 'inserted'; + pkg.swiftpmConfig = {...existing, name: swiftName}; + if (options?.dryRun === true) { + log(`Would set 'swiftpmConfig.name' to '${swiftName}' in ${pkgPath}`); + return outcome; + } + const serialized = JSON.stringify(pkg, null, detectIndent(source)); + const content = source.endsWith('\n') ? `${serialized}\n` : serialized; + // Staged and renamed, so an interrupted or out-of-space write cannot leave a + // third-party package.json truncated. + const tmpPath = `${pkgPath}.${process.pid}.tmp`; + try { + fs.writeFileSync(tmpPath, content, 'utf8'); + fs.renameSync(tmpPath, pkgPath); + } catch (e) { + fs.rmSync(tmpPath, {force: true}); + warn( + `Could not record 'swiftpmConfig.name' in ${pkgPath}: ${e.message}. The manifest is written; the name is not.`, + ); + return 'failed'; + } + return outcome; +} + +module.exports = { + readSwiftpmConfig, + stringList, + writeSwiftpmName, +}; diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index 3cc5bd708c6a..345385e7a6ea 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -61,5 +61,32 @@ "commander": "^12.0.0", "listr2": "^6.4.1", "rxjs": "npm:@react-native-community/rxjs@6.5.4-custom" + }, + "swiftpmConfig": { + "modules": [ + { + "name": "ReactCommonSamples", + "path": "../react-native/ReactCommon/react/nativemodule/samples/platform/ios" + }, + { + "name": "ReactRCTPushNotification", + "path": "../react-native/Libraries/PushNotificationIOS", + "exclude": [ + "React-RCTPushNotification.podspec" + ] + }, + { + "name": "ScreenshotManager", + "path": "NativeModuleExample" + }, + { + "name": "MyNativeView", + "path": "NativeComponentExample/ios" + }, + { + "name": "NativeCxxModuleExample", + "path": "NativeCxxModuleExample" + } + ] } } diff --git a/packages/rn-tester/react-native.config.js b/packages/rn-tester/react-native.config.js index 7d9058c4686d..7b54b0d7d5cc 100644 --- a/packages/rn-tester/react-native.config.js +++ b/packages/rn-tester/react-native.config.js @@ -29,31 +29,4 @@ module.exports = { packageName: 'com.facebook.react.uiapp', }, }, - // SPM-only: local native modules not discoverable via autolinking.json. - // These are pods added directly in Podfile for rn-tester examples. - spm: { - modules: [ - { - name: 'ReactCommonSamples', - path: '../react-native/ReactCommon/react/nativemodule/samples/platform/ios', - }, - { - name: 'ReactRCTPushNotification', - path: '../react-native/Libraries/PushNotificationIOS', - exclude: ['React-RCTPushNotification.podspec'], - }, - { - name: 'ScreenshotManager', - path: 'NativeModuleExample', - }, - { - name: 'MyNativeView', - path: 'NativeComponentExample/ios', - }, - { - name: 'NativeCxxModuleExample', - path: 'NativeCxxModuleExample', - }, - ], - }, }; From 903c4ab7636289fd97d391b646c1068283694580 Mon Sep 17 00:00:00 2001 From: Lazizbek Ergashev Date: Fri, 11 Sep 2026 03:02:07 -0700 Subject: [PATCH 12/35] Run SPM-generated shell scripts under bash, not /bin/sh (#58362) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: SPM setup scripts start with `set -euo pipefail`, but every one of them runs under `/bin/sh`. On a machine where `/bin/sh` isn't bash (e.g. dash), that fails immediately with `set: Illegal option -o pipefail`, so no SwiftPM build gets past the first build phase. Two spots in `generate-spm-xcodeproj.js`: - `shellScriptPhase` hardcodes `shellPath: '/bin/sh'` for every `PBXShellScriptBuildPhase` it builds (Sync SPM Autolinking, Embed React Native Flavored Frameworks, plugin-contributed phases), while their bodies are bash-only. Now sets `shellPath: '/bin/bash'`, and refreshes it on an already-injected project too. - The "Sync SPM Autolinking" scheme pre-action runs the same kind of script, but a scheme pre-action ignores a build phase's `shellPath` entirely — Xcode reads the shell from the `ActionContent`'s own `shellToInvoke` attribute instead (default `/bin/sh`). Now sets `shellToInvoke = "/bin/bash"` on both scheme creation and when adding/refreshing the pre-action on an existing scheme. Fixes https://github.com/react/react-native/issues/58359 ## Changelog: [IOS] [FIXED] - SwiftPM: run generated build scripts under bash instead of /bin/sh, so they don't break on a host where /bin/sh isn't bash Pull Request resolved: https://github.com/react/react-native/pull/58362 Test Plan: `yarn test packages/react-native/scripts/spm` — 838 passed, including new cases for the refreshed `shellPath`/`shellToInvoke` on a project injected before this fix, and a scheme injected before the attribute existed. Reviewed By: cortinico Differential Revision: D119328611 Pulled By: cipolleschi fbshipit-source-id: 2039a5c3c0224ca17d096f4837380b0977f4b539 (cherry picked from commit 25f48bd72fd47799fe81689d58f4cbd1b9ddd21c) --- .../__tests__/generate-spm-xcodeproj-test.js | 50 +++++++++++ .../__tests__/inject-spm-xcodeproj-test.js | 29 +++++++ .../scripts/spm/generate-spm-xcodeproj.js | 85 ++++++++++++++----- 3 files changed, 143 insertions(+), 21 deletions(-) diff --git a/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js b/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js index 47c1326a2cf6..ec6a44d4f8a2 100644 --- a/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js +++ b/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js @@ -151,6 +151,56 @@ describe('scheme pre-action', () => { updated, ); }); + + // Xcode always runs a scheme pre-action's scriptText under the shell named + // by shellToInvoke (default /bin/sh), independent of a + // PBXShellScriptBuildPhase's own shellPath — the sync script needs bash + // (`set -o pipefail`), so pin it here too. + it('pins shellToInvoke to bash on a freshly generated scheme', () => { + const result = generateXcscheme('MyApp', 'TARGET_UUID', 'MyApp', 'SCRIPT'); + expect(result).toContain('shellToInvoke = "/bin/bash"'); + }); + + it('adds shellToInvoke to a scheme injected before this attribute existed', () => { + // Simulates a scheme written by an older RN version — no shellToInvoke. + const legacy = generateXcscheme( + 'MyApp', + 'TARGET_UUID', + 'MyApp', + 'SCRIPT', + ).replace('\n shellToInvoke = "/bin/bash">', '>'); + expect(legacy).not.toContain('shellToInvoke'); + const updated = addPreActionToScheme(legacy, 'TARGET_UUID', 'SCRIPT'); + expect(updated).toContain('shellToInvoke = "/bin/bash"'); + expect(addPreActionToScheme(updated, 'TARGET_UUID', 'SCRIPT')).toBe( + updated, + ); + }); + + it('refreshes shellToInvoke when it appears before scriptText', () => { + const reordered = generateXcscheme( + 'MyApp', + 'TARGET_UUID', + 'MyApp', + 'SCRIPT', + ).replace( + 'scriptText = "SCRIPT"\n shellToInvoke = "/bin/bash">', + 'shellToInvoke = "/bin/bash"\n scriptText = "SCRIPT">', + ); + const updated = addPreActionToScheme(reordered, 'TARGET_UUID', 'SCRIPT'); + expect(updated.match(/shellToInvoke/g)).toHaveLength(1); + }); + + it('refreshes shellToInvoke with no spaces around the equals sign', () => { + const unspaced = generateXcscheme( + 'MyApp', + 'TARGET_UUID', + 'MyApp', + 'SCRIPT', + ).replace('shellToInvoke = "/bin/bash"', 'shellToInvoke="/bin/bash"'); + const updated = addPreActionToScheme(unspaced, 'TARGET_UUID', 'SCRIPT'); + expect(updated.match(/shellToInvoke/g)).toHaveLength(1); + }); }); describe('sync scripts', () => { diff --git a/packages/react-native/scripts/spm/__tests__/inject-spm-xcodeproj-test.js b/packages/react-native/scripts/spm/__tests__/inject-spm-xcodeproj-test.js index e9786be37058..3d4093c9334c 100644 --- a/packages/react-native/scripts/spm/__tests__/inject-spm-xcodeproj-test.js +++ b/packages/react-native/scripts/spm/__tests__/inject-spm-xcodeproj-test.js @@ -297,6 +297,35 @@ describe('injectSpmIntoPbxproj — Tier 2 (build settings + phase)', () => { expect(syncIdx).toBeLessThan(sourcesIdx); }); + it('runs every injected shell-script build phase under bash, not /bin/sh', () => { + // Their bodies start with `set -euo pipefail`, which a non-bash /bin/sh + // (e.g. dash) rejects at runtime. + const {text} = inject(PLAIN); + const phaseCount = text.match(/isa = PBXShellScriptBuildPhase;/g)?.length; + const bashCount = text.match(/shellPath = \/bin\/bash;/g)?.length; + expect(phaseCount).toBeGreaterThan(0); + expect(bashCount).toBe(phaseCount); + }); + + it('upgrades an already-injected phase from /bin/sh to bash on re-run', () => { + // A project injected before this fix recorded `shellPath = /bin/sh;` on + // the Sync SPM Autolinking phase. Re-running inject (e.g. `spm update`) + // must refresh it in place, not just apply bash to newly-created phases. + const {text: firstText} = inject(PLAIN); + const downgraded = firstText.replace( + /shellPath = \/bin\/bash;/g, + 'shellPath = /bin/sh;', + ); + const {text: secondText} = inject(downgraded); + expect(secondText).not.toContain('shellPath = /bin/sh;'); + const phaseCount = secondText.match( + /isa = PBXShellScriptBuildPhase;/g, + )?.length; + expect(secondText.match(/shellPath = \/bin\/bash;/g)?.length).toBe( + phaseCount, + ); + }); + it.each([ [ '"$(inherited)"', diff --git a/packages/react-native/scripts/spm/generate-spm-xcodeproj.js b/packages/react-native/scripts/spm/generate-spm-xcodeproj.js index 0e86cff7fa53..e0a43692fc8b 100644 --- a/packages/react-native/scripts/spm/generate-spm-xcodeproj.js +++ b/packages/react-native/scripts/spm/generate-spm-xcodeproj.js @@ -319,7 +319,11 @@ function shellScriptPhase( outputFileListPaths: empty, outputPaths: pathList(options.outputPaths), runOnlyForDeploymentPostprocessing: '0', - shellPath: '/bin/sh', + // React Native's own bodies here start with `set -euo pipefail`, which + // /bin/sh rejects on a host where it isn't bash (e.g. dash's `set -o + // pipefail: Illegal option`). Run every phase under bash, including + // plugin-contributed ones, so a plugin's body can rely on it too. + shellPath: '/bin/bash', shellScript: quoteIfNeeded(script), }, }; @@ -899,7 +903,8 @@ function generateXcscheme( ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = "${escapedSync}" + shellToInvoke = "/bin/bash"> ` can't appear unescaped inside either attribute + // value, so it reliably closes the ActionContent open tag. Search the + // whole open tag (not just after scriptText) and allow any spacing + // around `=`, since attribute order and formatting aren't guaranteed. + const contentOpenIdx = xmlWithScript.lastIndexOf( + '', stIdx); + const openTag = xmlWithScript.slice(contentOpenIdx, contentCloseIdx); + const stiMatch = openTag.match(/shellToInvoke\s*=\s*"/); + if (stiMatch != null) { + const stiValueStart = + contentOpenIdx + stiMatch.index + stiMatch[0].length; + const stiValueEnd = xmlWithScript.indexOf('"', stiValueStart); + xmlWithScript = + xmlWithScript.slice(0, stiValueStart) + + '/bin/bash' + + xmlWithScript.slice(stiValueEnd); + } else { + xmlWithScript = + xmlWithScript.slice(0, contentCloseIdx) + + '\n shellToInvoke = "/bin/bash"' + + xmlWithScript.slice(contentCloseIdx); + } + return xmlWithScript; } const refMatch = xml.match( new RegExp( @@ -1907,7 +1949,8 @@ function addPreActionToScheme( ` ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">\n` + ` \n` + + ` scriptText = "${escapeXmlAttribute(syncScript)}"\n` + + ` shellToInvoke = "/bin/bash">\n` + ` \n` + ` ${cleanRef}\n` + ` \n` + From 6069149f2570a3db095747690a9b4f04fa11a113 Mon Sep 17 00:00:00 2001 From: Christian Falch Date: Tue, 15 Sep 2026 07:40:13 -0700 Subject: [PATCH 13/35] Derive the generated manifests' iOS platform floor from the app (#58379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: The SwiftPM manifests React Native generates — the `Autolinked` aggregate, the per-dependency synth packages, and the scaffolded community packages — hardcoded `platforms: [.iOS(.v15)]`. SwiftPM refuses to link a product whose minimum platform is above the depending target's, so any self-managed package with a higher floor could not be autolinked. Every Expo package declares iOS 16.4, so a stock Expo app on 0.87.1 fails at build time with: ``` error: The package product 'Expo' requires minimum platform version 16.4 for the iOS platform, but this target supports 15.0 (in target 'AutolinkedAggregate' from project 'Autolinked') ``` The app itself is correct (`IPHONEOS_DEPLOYMENT_TARGET = 16.4`); the only disagreement was the generated manifests. The floor is now the app's own `IPHONEOS_DEPLOYMENT_TARGET`, read from the injected `.xcodeproj`: - Target selection: the injection marker's `targetUuid`, else the application target named by `--product-name`, else every application target. - Per configuration: the target's own value, else the project-level configuration of the same name. The lowest value wins, since one manifest floor has to hold for every configuration. - Clamped to React Native's minimum (15.1, `min_ios_version_supported`) and emitted in string form (`.iOS("16.4")`), because the `.vNN` enum form cannot express a minor version. `setup-apple-spm.js` resolves the value once per `add`/`update`/`sync`/`scaffold` run, logs it (`iOS deployment target: 16.4 (from MyApp.xcodeproj)`), and passes it to the generator, the sync script, and the scaffolder via a new `--ios-deployment-target` flag. The flag value is sanitized at the generator boundary as well. `SCAFFOLDER_VERSION` is bumped to 20 so existing scaffolds regenerate with the new floor. A floor set in an `.xcconfig` the configuration is based on is honored, including `#include` chains (target literal → target xcconfig → project literal → project xcconfig). A floor supplied through a build-setting variable (`$(MY_FLOOR)`) is not resolved and falls back to the minimum; the log line says so. `spm add` and `spm update` also refresh the `platforms:` element of existing scaffolded manifests (those carrying the scaffolder marker, including the pre-v20 `.iOS(.v15)` form, over the same expanded dependency set the scaffolder uses, transitive SwiftPM dependencies included) without creating new scaffolds or touching anything else in them. Known limitation, documented in `scripts/spm/__docs__/spm-scripts.md`: the project file is not one of the auto-sync build phase's staleness inputs, so a deployment target changed after `spm add` takes effect on the next `spm update`. The default floor moves from 15.0 to 15.1 for apps without a readable project setting; React Native already requires 15.1 for the app target, so this is not observable. ## Changelog: [IOS] [FIXED] - SwiftPM: generated manifests derive their iOS platform floor from the app's `IPHONEOS_DEPLOYMENT_TARGET` instead of hardcoding iOS 15, so dependencies with a higher minimum (e.g. Expo, 16.4) can be autolinked Pull Request resolved: https://github.com/react/react-native/pull/58379 Test Plan: Unit tests were written first and seen failing, then made green: ``` yarn jest --no-cache -i packages/react-native/scripts/spm Test Suites: 37 passed, 37 total Tests: 1733 passed, 1733 total ``` New/updated coverage: `ios-deployment-target-test.js` (pbxproj reading: target-level, project-level fallback, xcconfig chain with `#include` and `` anchoring, minimum across configurations, marker/`--product-name`/all-targets selection, invalid values, clamping, unreadable project), `scaffold-package-swift-test.js` (emitted floor, refresh of existing scaffolded manifests), `generate-spm-autolinking-test.js` (aggregate and synth templates, `--ios-deployment-target` through `main()`), `scaffold-package-swift-test.js`, `sync-spm-autolinking-test.js` (flag forwarding), `setup-apple-spm-test.js` (resolution and log line). ESLint (`--max-warnings 0`), Prettier, and Flow are clean on the touched files. Not run here: an end-to-end Xcode build of an Expo app on this branch. The failing scenario and the fix were verified by the Expo team against 0.87.1 with the same manifest change patched in locally (build proceeds past SwiftPM resolution into compiling `Expo`). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed By: cortinico Differential Revision: D119653699 Pulled By: cipolleschi fbshipit-source-id: 7c69dd4d97bed719f7bbd28fb0832cdf2f151f55 (cherry picked from commit 92564f33fdaa8f0e9968712863e7e00f7073cdf7) --- .../react-native/scripts/setup-apple-spm.js | 70 +++- .../scripts/spm/__docs__/spm-scripts.md | 17 + .../generate-spm-autolinking-test.js | 93 +++++ .../__tests__/ios-deployment-target-test.js | 268 +++++++++++++ .../scripts/spm/__tests__/pbxproj-variants.js | 146 +++++++ .../__tests__/scaffold-package-swift-test.js | 206 ++++++++++ .../spm/__tests__/setup-apple-spm-test.js | 50 +++ .../__tests__/sync-spm-autolinking-test.js | 20 +- .../scripts/spm/generate-spm-autolinking.js | 21 +- .../scripts/spm/generate-spm-xcodeproj.js | 4 +- .../scripts/spm/ios-deployment-target.js | 378 ++++++++++++++++++ .../scripts/spm/scaffold-package-swift.js | 235 ++++++++--- .../react-native/scripts/spm/spm-pbxproj.js | 57 ++- .../react-native/scripts/spm/spm-types.js | 4 + .../scripts/spm/sync-spm-autolinking.js | 13 +- 15 files changed, 1490 insertions(+), 92 deletions(-) create mode 100644 packages/react-native/scripts/spm/__tests__/ios-deployment-target-test.js create mode 100644 packages/react-native/scripts/spm/__tests__/pbxproj-variants.js create mode 100644 packages/react-native/scripts/spm/ios-deployment-target.js diff --git a/packages/react-native/scripts/setup-apple-spm.js b/packages/react-native/scripts/setup-apple-spm.js index a89f9f138dca..0ace9683a03a 100644 --- a/packages/react-native/scripts/setup-apple-spm.js +++ b/packages/react-native/scripts/setup-apple-spm.js @@ -99,10 +99,18 @@ const { findInjectedXcodeproj, injectSpmIntoExistingXcodeproj, readArtifactsVersionOverride, + readMarker, readPinnedConfigCommand, removeSpmInjection, } = require('./spm/generate-spm-xcodeproj'); -const {scaffoldAll} = require('./spm/scaffold-package-swift'); +const { + MIN_IOS_VERSION_SUPPORTED, + resolveIosDeploymentTarget, +} = require('./spm/ios-deployment-target'); +const { + refreshScaffoldedPlatformFloors, + scaffoldAll, +} = require('./spm/scaffold-package-swift'); const { RemoteVersionError, buildPerAppHeaderTree, @@ -452,6 +460,7 @@ async function runScaffold( appRoot /*: string */, projectRoot /*: string */, reactNativeRoot /*: string */, + iosDeploymentTarget /*: string */, ) /*: Promise */ { // Resolve the cache slot identifier so the scaffolded files carry it as // a comment — that's how SPM's manifest hash bumps on slot transitions. @@ -472,6 +481,7 @@ async function runScaffold( projectRoot, reactNativeRoot, cacheSlotLabel, + iosDeploymentTarget, // Always force a re-render so re-running after editing a podspec picks // up the new content. force: true, @@ -788,6 +798,29 @@ function resolveInjectionTarget( return {path: path.join(appRoot, names[0])}; } +/** The app's own floor for every manifest this run generates, logged once. */ +function resolveAppIosDeploymentTarget( + args /*: SetupArgs */, + appRoot /*: string */, +) /*: string */ { + const target = resolveInjectionTarget(args, appRoot); + const xcodeprojPath = target.path ?? null; + const read = resolveIosDeploymentTarget({ + xcodeprojPath, + targetUuid: + xcodeprojPath != null ? readMarker(xcodeprojPath)?.targetUuid : null, + targetName: args.productName, + }); + const value = read ?? MIN_IOS_VERSION_SUPPORTED; + const origin = + read != null && xcodeprojPath != null + ? `from ${path.basename(xcodeprojPath)}` + : // `sync` and `scaffold` don't otherwise surface why no project was picked. + `react-native default${target.error != null ? `; ${target.error}` : ''}`; + log(`iOS deployment target: ${value} (${origin})`); + return value; +} + /** * Inject SPM packages into the user's existing .xcodeproj, in place — the only * xcodeproj strategy (`add` and `update` both run this; there is no @@ -1117,6 +1150,9 @@ async function main(argv /*:: ?: Array */) /*: Promise */ { } log(`Wrote ${path.relative(appRoot, autolinkingConfigResult.outputPath)}`); } + const iosDeploymentTarget /*: string */ = needsCliConfig + ? resolveAppIosDeploymentTarget(args, appRoot) + : MIN_IOS_VERSION_SUPPORTED; const reactNativeRoot = resolveReactNativeRoot( autolinkingConfigResult, projectRoot, @@ -1160,6 +1196,8 @@ async function main(argv /*:: ?: Array */) /*: Promise */ { appRoot, '--react-native-root', reactNativeRoot, + '--ios-deployment-target', + iosDeploymentTarget, ]); } catch (e) { if (e instanceof MissingManifestError) { @@ -1193,10 +1231,35 @@ async function main(argv /*:: ?: Array */) /*: Promise */ { // visible and fixed deliberately (scaffold + patch-package, or upstream). // Auto-scaffolding would silently hide that real error. if (action === 'scaffold') { - await runScaffold(args, appRoot, projectRoot, reactNativeRoot); + await runScaffold( + args, + appRoot, + projectRoot, + reactNativeRoot, + iosDeploymentTarget, + ); } runCodegenStep(projectRoot, appRoot, reactNativeRoot, args.skipCodegen); + + // A manifest scaffolded before the app's deployment target changed (or by a + // pre-v20 scaffolder) would pin a floor SwiftPM then refuses to link against. + if ( + (action === 'add' || action === 'update') && + autolinkingConfigResult != null + ) { + for (const refreshed of refreshScaffoldedPlatformFloors({ + appRoot, + autolinkingJsonPath: autolinkingConfigResult.outputPath, + iosDeploymentTarget, + })) { + log( + `Refreshed platform floor in ${path.relative(appRoot, refreshed.path)}: ` + + `${refreshed.from} → ${refreshed.to}`, + ); + } + } + log('Generating build/generated/autolinking/Package.swift...'); try { generateAutolinking([ @@ -1204,6 +1267,8 @@ async function main(argv /*:: ?: Array */) /*: Promise */ { appRoot, '--react-native-root', reactNativeRoot, + '--ios-deployment-target', + iosDeploymentTarget, ]); } catch (e) { if (e instanceof MissingManifestError) { @@ -1288,6 +1353,7 @@ module.exports = { generateAutolinkingConfigOrFailClosed, parseArgs, resolveAction, + resolveAppIosDeploymentTarget, resolveConfigCommandToPin, resolveExplicitConfigCommand, shouldAutoDeintegrate, diff --git a/packages/react-native/scripts/spm/__docs__/spm-scripts.md b/packages/react-native/scripts/spm/__docs__/spm-scripts.md index 8a38007b81c5..47059cb79da2 100644 --- a/packages/react-native/scripts/spm/__docs__/spm-scripts.md +++ b/packages/react-native/scripts/spm/__docs__/spm-scripts.md @@ -216,6 +216,23 @@ load from Metro instead of a bundled `main.jsbundle`. CocoaPods injects it at `pod install` time, so this keeps SwiftPM apps at parity. An existing value is left alone. +### iOS deployment target + +Every manifest React Native generates — the `Autolinked` aggregate, the synth +package per dependency, and each scaffolded community package — declares the +same platform floor: your app's `IPHONEOS_DEPLOYMENT_TARGET`, never below React +Native's own minimum (15.1). SwiftPM refuses to link a product whose minimum is +higher than the target depending on it, so a dependency that needs more (Expo's +packages need iOS 16.4) only resolves once the app asks for at least as much: +raise the deployment target in Xcode and re-run `react-native spm update`. + +A floor set in an `.xcconfig` your configuration is based on is honored, +`#include` chains included; one set through a build-setting variable +(`$(MY_FLOOR)`) is not, and falls back to React Native's minimum. `spm add` and +`spm update` also refresh the platform-floor line of existing scaffolded +manifests (they never create new ones) — if you persisted a scaffold with +`patch-package`, re-run `npx patch-package ` afterwards. + ## Files the tool touches Paths are relative to the Xcode project directory (`ios/`) unless noted. diff --git a/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js b/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js index baa0a8fa20ba..27fb060fee06 100644 --- a/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js +++ b/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js @@ -466,6 +466,99 @@ describe('generateSynthPackageSwift', () => { }); }); +// --------------------------------------------------------------------------- +// Platform floor — a manifest must not sit below the app's own iOS deployment +// target: SwiftPM refuses a product whose minimum is higher than the depending +// target's, so a self-managed dep at iOS 16.4 (Expo) would fail to link. +// --------------------------------------------------------------------------- + +describe('iOS platform floor', () => { + it('defaults the aggregator to the React Native minimum, and raises it on request', () => { + expect(generateAutolinkedPackageSwift({})).toContain( + 'platforms: [.iOS("15.1")]', + ); + expect( + generateAutolinkedPackageSwift({iosDeploymentTarget: '16.4'}), + ).toContain('platforms: [.iOS("16.4")]'); + }); + + it('defaults each synth package to the React Native minimum, and raises it on request', () => { + const spec = {swiftName: 'MyDep'}; + expect(generateSynthPackageSwift(spec)).toContain( + 'platforms: [.iOS("15.1")]', + ); + expect( + generateSynthPackageSwift({...spec, iosDeploymentTarget: '16.4'}), + ).toContain('platforms: [.iOS("16.4")]'); + }); +}); + +describe('main() — --ios-deployment-target', () => { + let created = []; + let spies = []; + + beforeEach(() => { + for (const m of ['log', 'warn', 'error']) { + spies.push(jest.spyOn(console, m).mockImplementation(() => {})); + } + }); + afterEach(() => { + for (const s of spies) s.mockRestore(); + spies = []; + for (const d of created) fs.rmSync(d, {recursive: true, force: true}); + created = []; + }); + + // An app-local spm.module is the only route that produces BOTH the + // aggregator and a synth manifest without a community dep on disk. + function buildApp() { + const appRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'spm-platform-')); + created.push(appRoot); + const rnRoot = path.join(appRoot, 'rn'); + fs.mkdirSync(rnRoot, {recursive: true}); + fs.writeFileSync( + path.join(appRoot, 'package.json'), + JSON.stringify({name: 'app'}), + ); + const modDir = path.join(appRoot, 'ios', 'MyNativeModule'); + fs.mkdirSync(modDir, {recursive: true}); + fs.writeFileSync(path.join(modDir, 'Module.mm'), '// native source\n'); + fs.writeFileSync( + path.join(appRoot, 'react-native.config.js'), + `module.exports = ${JSON.stringify({ + spm: {modules: [{name: 'MyNativeModule', path: 'ios/MyNativeModule'}]}, + })};\n`, + ); + const autolinkDir = path.join(appRoot, 'build', 'generated', 'autolinking'); + fs.mkdirSync(autolinkDir, {recursive: true}); + fs.writeFileSync( + path.join(autolinkDir, 'autolinking.json'), + JSON.stringify({dependencies: {}}), + ); + return {appRoot, rnRoot, autolinkDir}; + } + + it('sanitizes the flag into both the aggregator and the synth manifest', () => { + const {appRoot, rnRoot, autolinkDir} = buildApp(); + main([ + '--app-root', + appRoot, + '--react-native-root', + rnRoot, + '--ios-deployment-target', + '16', + ]); + for (const manifest of [ + path.join(autolinkDir, 'Package.swift'), + path.join(autolinkDir, 'packages', 'MyNativeModule', 'Package.swift'), + ]) { + expect(fs.readFileSync(manifest, 'utf8')).toContain( + 'platforms: [.iOS("16.0")]', + ); + } + }); +}); + // --------------------------------------------------------------------------- // linkHeaderTree // diff --git a/packages/react-native/scripts/spm/__tests__/ios-deployment-target-test.js b/packages/react-native/scripts/spm/__tests__/ios-deployment-target-test.js new file mode 100644 index 000000000000..dab233c05107 --- /dev/null +++ b/packages/react-native/scripts/spm/__tests__/ios-deployment-target-test.js @@ -0,0 +1,268 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @noflow + */ + +'use strict'; + +const { + MIN_IOS_VERSION_SUPPORTED, + readIosDeploymentTargetFromPbxproj, + resolveIosDeploymentTarget, + sanitizeIosDeploymentTarget, +} = require('../ios-deployment-target'); +const { + PLAIN_APP, + SECOND_TARGET, + TARGET_DEBUG, + TARGET_RELEASE, + raisedTarget, + twoAppTargets, + withoutProjectSetting, + withProjectSetting, + withSetting, + withXcconfigRef, +} = require('./pbxproj-variants'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); + +const RAISED = raisedTarget('16.4'); +const TWO = twoAppTargets('16.4'); +const MIXED_CONFIGS = withSetting( + withSetting(PLAIN_APP, TARGET_DEBUG, '17.0'), + TARGET_RELEASE, + '16.4', +); +const VARIABLE_VALUE = withProjectSetting(PLAIN_APP, '"$(SOME_VAR)"'); +const NOTHING_DECLARED = withoutProjectSetting(PLAIN_APP); +const GONE_UUID = 'CC0000000000000000000000'; + +describe('sanitizeIosDeploymentTarget', () => { + it.each([ + ['16', '16.0'], + ['16.4', '16.4'], + ['14.0', MIN_IOS_VERSION_SUPPORTED], + ['$(FOO)', MIN_IOS_VERSION_SUPPORTED], + [null, MIN_IOS_VERSION_SUPPORTED], + ])('normalizes and clamps %p to %p', (raw, expected) => { + expect(sanitizeIosDeploymentTarget(raw)).toBe(expected); + }); +}); + +describe('readIosDeploymentTargetFromPbxproj', () => { + it.each([ + ['project-level fallback', PLAIN_APP, {}, '15.1'], + ['target-level wins', RAISED, {}, '16.4'], + ['minimum across configurations', MIXED_CONFIGS, {}, '16.4'], + ['a variable reference is ignored', VARIABLE_VALUE, {}, null], + ['nothing declared', NOTHING_DECLARED, {}, null], + ['minimum over every app target', TWO, {}, '15.1'], + ['named target', TWO, {targetName: 'MyApp'}, '16.4'], + ['unmatched targetName', TWO, {targetName: 'Nope'}, '15.1'], + [ + 'uuid beats name', + TWO, + {targetUuid: SECOND_TARGET, targetName: 'MyApp'}, + '15.1', + ], + ['uuid that is gone', TWO, {targetUuid: GONE_UUID}, '15.1'], + ])('%s', (_name, text, opts, expected) => { + expect(readIosDeploymentTargetFromPbxproj(text, opts)).toBe(expected); + }); +}); + +describe('readIosDeploymentTargetFromPbxproj — xcconfig chain', () => { + const SRC_ROOT = '/app'; + const APP_XCCONFIG = `${SRC_ROOT}/Config/App.xcconfig`; + const BASE_XCCONFIG = `${SRC_ROOT}/Config/Base.xcconfig`; + // Both target configurations point at the xcconfig, and the project level + // declares nothing — so the xcconfig alone decides the floor. + const XCCONFIG_ONLY = withXcconfigRef(withoutProjectSetting(PLAIN_APP), [ + TARGET_DEBUG, + TARGET_RELEASE, + ]); + + function read(text, files, opts) { + const readFile = jest.fn(absPath => files[absPath] ?? null); + const value = readIosDeploymentTargetFromPbxproj(text, { + srcRoot: SRC_ROOT, + readFile, + ...opts, + }); + return {value, readFile}; + } + + it('falls back to the xcconfig the configuration references', () => { + expect( + read(XCCONFIG_ONLY, { + [APP_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n', + }).value, + ).toBe('16.4'); + }); + + it('prefers a literal in the configuration over its xcconfig', () => { + const text = withSetting( + withSetting(XCCONFIG_ONLY, TARGET_DEBUG, '17.0'), + TARGET_RELEASE, + '17.0', + ); + expect( + read(text, {[APP_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n'}).value, + ).toBe('17.0'); + }); + + it('follows an #include chain', () => { + expect( + read(XCCONFIG_ONLY, { + [APP_XCCONFIG]: '#include "Base.xcconfig"\n', + [BASE_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n', + }).value, + ).toBe('16.4'); + }); + + it('lets an assignment after the #include win', () => { + expect( + read(XCCONFIG_ONLY, { + [APP_XCCONFIG]: + '#include? "Base.xcconfig"\nIPHONEOS_DEPLOYMENT_TARGET = 17.0;\n', + [BASE_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n', + }).value, + ).toBe('17.0'); + }); + + it('ignores comments and conditional assignments', () => { + expect( + read(XCCONFIG_ONLY, { + [APP_XCCONFIG]: + '// IPHONEOS_DEPLOYMENT_TARGET = 18.0\n' + + 'IPHONEOS_DEPLOYMENT_TARGET[sdk=iphonesimulator*] = 16.4\n', + }).value, + ).toBeNull(); + }); + + it('ignores a value that is not a plain version', () => { + expect( + read(XCCONFIG_ONLY, { + [APP_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = $(inherited)\n', + }).value, + ).toBeNull(); + }); + + it('resolves a "" reference through the group path', () => { + const text = withXcconfigRef( + withoutProjectSetting(PLAIN_APP), + [TARGET_DEBUG, TARGET_RELEASE], + {filePath: 'App.xcconfig', groupPath: 'Config'}, + ); + const {value, readFile} = read(text, { + [APP_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n', + }); + expect(value).toBe('16.4'); + expect(readFile).toHaveBeenCalledWith(APP_XCCONFIG); + }); + + it('reports nothing when the xcconfig is missing', () => { + expect(read(XCCONFIG_ONLY, {}).value).toBeNull(); + }); + + it('terminates on an #include cycle', () => { + expect( + read(XCCONFIG_ONLY, { + [APP_XCCONFIG]: + 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n#include "Base.xcconfig"\n', + [BASE_XCCONFIG]: '#include "App.xcconfig"\n', + }).value, + ).toBe('16.4'); + }); + + it('skips the xcconfig step without a srcRoot', () => { + const {value, readFile} = read( + XCCONFIG_ONLY, + {[APP_XCCONFIG]: 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n'}, + {srcRoot: null}, + ); + expect(value).toBeNull(); + expect(readFile).not.toHaveBeenCalled(); + }); +}); + +describe('resolveIosDeploymentTarget', () => { + const dirs = []; + + afterEach(() => { + for (const dir of dirs) { + fs.rmSync(dir, {recursive: true, force: true}); + } + dirs.length = 0; + }); + + // A throwaway .xcodeproj, so the fs path runs for real. + function write(text) { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'spm-iosdt-')); + dirs.push(dir); + const xcodeprojPath = path.join(dir, 'MyApp.xcodeproj'); + fs.mkdirSync(xcodeprojPath); + fs.writeFileSync(path.join(xcodeprojPath, 'project.pbxproj'), text, 'utf8'); + return xcodeprojPath; + } + + it('reads the app value, clamped to the React Native minimum', () => { + expect(resolveIosDeploymentTarget({xcodeprojPath: write(RAISED)})).toBe( + '16.4', + ); + expect( + resolveIosDeploymentTarget({ + xcodeprojPath: write(withProjectSetting(PLAIN_APP, '14.0')), + }), + ).toBe(MIN_IOS_VERSION_SUPPORTED); + }); + + it('returns null when there is nothing usable to read', () => { + expect( + resolveIosDeploymentTarget({xcodeprojPath: write(NOTHING_DECLARED)}), + ).toBeNull(); + expect(resolveIosDeploymentTarget({xcodeprojPath: null})).toBeNull(); + expect( + resolveIosDeploymentTarget({xcodeprojPath: '/no/such/App.xcodeproj'}), + ).toBeNull(); + }); + + it('reads a floor that only an xcconfig on disk declares', () => { + const xcodeprojPath = write( + withXcconfigRef(withoutProjectSetting(PLAIN_APP), [ + TARGET_DEBUG, + TARGET_RELEASE, + ]), + ); + const configDir = path.join(path.dirname(xcodeprojPath), 'Config'); + fs.mkdirSync(configDir); + fs.writeFileSync( + path.join(configDir, 'App.xcconfig'), + 'IPHONEOS_DEPLOYMENT_TARGET = 16.4\n', + 'utf8', + ); + expect(resolveIosDeploymentTarget({xcodeprojPath})).toBe('16.4'); + }); + + it('matches min_ios_version_supported in helpers.rb', () => { + const helpers = fs.readFileSync( + path.join(__dirname, '..', '..', 'cocoapods', 'helpers.rb'), + 'utf8', + ); + const match = helpers.match( + /def self\.min_ios_version_supported\s+return\s+'([\d.]+)'/, + ); + if (match == null) { + throw new Error( + 'could not read min_ios_version_supported from scripts/cocoapods/helpers.rb', + ); + } + expect(MIN_IOS_VERSION_SUPPORTED).toBe(match[1]); + }); +}); diff --git a/packages/react-native/scripts/spm/__tests__/pbxproj-variants.js b/packages/react-native/scripts/spm/__tests__/pbxproj-variants.js new file mode 100644 index 000000000000..25b226285b56 --- /dev/null +++ b/packages/react-native/scripts/spm/__tests__/pbxproj-variants.js @@ -0,0 +1,146 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @noflow + */ + +'use strict'; + +// Variants of the plain-app pbxproj fixture, shared by the tests that exercise +// iOS-deployment-target reading. The base fixture has one app target whose own +// Debug/Release configs carry no IPHONEOS_DEPLOYMENT_TARGET, and two +// project-level configs that set 15.1. + +const fs = require('node:fs'); +const path = require('node:path'); + +const PLAIN_APP = fs.readFileSync( + path.join(__dirname, '__fixtures__', 'plain-app.pbxproj'), + 'utf8', +); + +const TARGET_DEBUG = 'AA0000000000000000000901'; +const TARGET_RELEASE = 'AA00000000000000000000A2'; +const SECOND_TARGET = 'BB0000000000000000000101'; + +/** Insert IPHONEOS_DEPLOYMENT_TARGET into one XCBuildConfiguration. */ +function withSetting(text, configUuid, value) { + const at = text.indexOf(configUuid + ' /*'); + const lineEnd = text.indexOf('\n', text.indexOf('buildSettings = {', at)) + 1; + return ( + text.slice(0, lineEnd) + + `\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = ${value};\n` + + text.slice(lineEnd) + ); +} + +function withProjectSetting(text, value) { + return text.replaceAll( + 'IPHONEOS_DEPLOYMENT_TARGET = 15.1;', + `IPHONEOS_DEPLOYMENT_TARGET = ${value};`, + ); +} + +function withoutProjectSetting(text) { + return text.replaceAll('\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n', ''); +} + +/** The single app target declaring `version` in both its configurations. */ +function raisedTarget(version) { + return withSetting( + withSetting(PLAIN_APP, TARGET_DEBUG, version), + TARGET_RELEASE, + version, + ); +} + +/** + * Two app targets: MyApp declares `version`, while Second has no configurations + * of its own and inherits the project's 15.1 — so target selection and the + * minimum-over-targets rule are both observable. + */ +function twoAppTargets(version) { + return raisedTarget(version).replace( + '/* End PBXNativeTarget section */', + `\t\t${SECOND_TARGET} /* Second */ = { + isa = PBXNativeTarget; + buildConfigurationList = AA0000000000000000000601 /* project configs */; + name = Second; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */`, + ); +} + +const XCCONFIG_REF = 'DD0000000000000000000101'; +const XCCONFIG_GROUP = 'DD0000000000000000000201'; + +function insertIntoObject(text, uuid, line) { + const lineEnd = + text.indexOf('\n', text.indexOf('= {', text.indexOf(uuid + ' /*'))) + 1; + return text.slice(0, lineEnd) + `\t\t\t${line}\n` + text.slice(lineEnd); +} + +/** + * Point the given configurations at one `.xcconfig` file reference. + * `sourceTree` defaults to SOURCE_ROOT; pass `groupPath` to place the + * reference in a `""` PBXGroup carrying that path instead. + */ +function withXcconfigRef(text, configUuids, opts = {}) { + const filePath = opts.filePath ?? 'Config/App.xcconfig'; + const groupPath = opts.groupPath ?? null; + const sourceTree = + groupPath != null ? '""' : (opts.sourceTree ?? 'SOURCE_ROOT'); + const name = path.basename(filePath); + + let out = text; + for (const configUuid of configUuids) { + out = insertIntoObject( + out, + configUuid, + `baseConfigurationReference = ${XCCONFIG_REF} /* ${name} */;`, + ); + } + out = out.replace( + '/* End PBXFileReference section */', + `\t\t${XCCONFIG_REF} /* ${name} */ = { + isa = PBXFileReference; + lastKnownFileType = text.xcconfig; + path = ${filePath}; + sourceTree = ${sourceTree}; + }; +/* End PBXFileReference section */`, + ); + if (groupPath != null) { + out = out.replace( + '/* End PBXGroup section */', + `\t\t${XCCONFIG_GROUP} /* ${groupPath} */ = { + isa = PBXGroup; + children = ( + ${XCCONFIG_REF} /* ${name} */, + ); + path = ${groupPath}; + sourceTree = ""; + }; +/* End PBXGroup section */`, + ); + } + return out; +} + +module.exports = { + PLAIN_APP, + SECOND_TARGET, + TARGET_DEBUG, + TARGET_RELEASE, + raisedTarget, + twoAppTargets, + withProjectSetting, + withSetting, + withXcconfigRef, + withoutProjectSetting, +}; diff --git a/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js b/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js index 83b34597c7fc..e05e07e011d3 100644 --- a/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js +++ b/packages/react-native/scripts/spm/__tests__/scaffold-package-swift-test.js @@ -14,6 +14,7 @@ const { SCAFFOLDER_MARKER, SCAFFOLDER_VERSION, emitScaffoldedPackageSwift, + refreshScaffoldedPlatformFloors, scaffoldAll, scaffoldPackageSwiftForDep, translatePodspecToSpmTarget, @@ -562,6 +563,19 @@ describe('emitScaffoldedPackageSwift', () => { expect(out).toContain('// Cache slot: 0.87.0-nightly-20260513-abc/debug'); }); + it('floors the platform at the React Native minimum by default, in string form', () => { + const out = emitScaffoldedPackageSwift(baseSpec()); + expect(out).toContain('platforms: [.iOS("15.1")]'); + }); + + it('raises the platform floor to the app deployment target', () => { + const out = emitScaffoldedPackageSwift(baseSpec(), { + cacheSlotLabel: null, + iosDeploymentTarget: '16.4', + }); + expect(out).toContain('platforms: [.iOS("16.4")]'); + }); + it('emits DEBUG/NDEBUG config-gated cxxSettings so Fabric C++ matches the prebuilt React.framework ABI', () => { const out = emitScaffoldedPackageSwift(baseSpec()); expect(out).toContain('.define("DEBUG", .when(configuration: .debug))'); @@ -1527,6 +1541,10 @@ describe('SCAFFOLDER_VERSION', () => { expect(SCAFFOLDER_VERSION).toBeGreaterThanOrEqual(1); }); + it('is at the version the current emitter output requires', () => { + expect(SCAFFOLDER_VERSION).toBe(20); + }); + it('emitter writes the current version to the file', () => { const out = emitScaffoldedPackageSwift({ swiftName: 'foo', @@ -1629,3 +1647,191 @@ describe('scaffoldPackageSwiftForDep — version-based regen', () => { expect(result.status).toBe('skipped-scaffolder-marker'); }); }); + +// --------------------------------------------------------------------------- +// refreshScaffoldedPlatformFloors — `spm add`/`update` bring the floor of +// manifests scaffolded earlier (possibly by an older generator) up to the +// app's current deployment target, without regenerating them. +// --------------------------------------------------------------------------- + +describe('refreshScaffoldedPlatformFloors', () => { + let appRoot; + + beforeEach(() => { + appRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'spm-refresh-floor-')); + }); + + afterEach(() => { + fs.rmSync(appRoot, {recursive: true, force: true}); + }); + + function manifest(floorLine) { + return ( + `// swift-tools-version: 6.0\n${SCAFFOLDER_MARKER}\n` + + '// AUTO-SCAFFOLDED-VERSION: 19\n\nlet package = Package(\n' + + ' name: "foo",\n' + + ` ${floorLine}\n` + + ' products: [],\n)\n' + ); + } + + // One dep per entry: `content` is written to /Package.swift unless null. + function writeApp(deps) { + const autolinkingDir = path.join(appRoot, 'build/generated/autolinking'); + fs.mkdirSync(autolinkingDir, {recursive: true}); + const dependencies = {}; + for (const [name, content] of Object.entries(deps)) { + const root = path.join(appRoot, 'node_modules', name); + fs.mkdirSync(root, {recursive: true}); + if (content != null) { + fs.writeFileSync(path.join(root, 'Package.swift'), content, 'utf8'); + } + dependencies[name] = {root, platforms: {ios: {}}}; + } + fs.writeFileSync( + path.join(autolinkingDir, 'autolinking.json'), + JSON.stringify({dependencies}), + ); + } + + function refresh() { + return refreshScaffoldedPlatformFloors({ + appRoot, + iosDeploymentTarget: '16.4', + }); + } + + function read(depName) { + return fs.readFileSync( + path.join(appRoot, 'node_modules', depName, 'Package.swift'), + 'utf8', + ); + } + + it('rewrites only the platform line of a scaffolded manifest', () => { + const before = manifest('platforms: [.iOS("15.1")],'); + writeApp({'react-native-foo': before}); + + expect(refresh()).toEqual([ + { + depName: 'react-native-foo', + path: path.join(appRoot, 'node_modules/react-native-foo/Package.swift'), + from: '15.1', + to: '16.4', + }, + ]); + expect(read('react-native-foo')).toBe( + before.replace('.iOS("15.1")', '.iOS("16.4")'), + ); + }); + + it('rewrites the enum form an older scaffolder emitted', () => { + writeApp({'react-native-foo': manifest('platforms: [.iOS(.v15)],')}); + + expect(refresh()).toEqual([ + expect.objectContaining({from: '.v15', to: '16.4'}), + ]); + expect(read('react-native-foo')).toContain('platforms: [.iOS("16.4")]'); + }); + + it('rewrites only the .iOS element of an extended platforms array', () => { + writeApp({ + 'react-native-foo': manifest( + 'platforms: [.iOS("15.1"), .macOS(.v13), .tvOS("16.0")],', + ), + }); + + expect(refresh()).toEqual([expect.objectContaining({from: '15.1'})]); + expect(read('react-native-foo')).toContain( + 'platforms: [.iOS("16.4"), .macOS(.v13), .tvOS("16.0")],', + ); + }); + + it('leaves a manifest already on the floor untouched', () => { + writeApp({'react-native-foo': manifest('platforms: [.iOS("16.4")],')}); + const manifestPath = path.join( + appRoot, + 'node_modules/react-native-foo/Package.swift', + ); + const before = fs.statSync(manifestPath).mtimeMs; + + expect(refresh()).toEqual([]); + expect(fs.statSync(manifestPath).mtimeMs).toBe(before); + }); + + it('ignores manifests it does not own, and deps with none', () => { + const upstream = '// hand-authored\nplatforms: [.iOS("15.1")],\n'; + const autogen = `// AUTO-GENERATED by scripts/generate-spm-autolinking.js\n${SCAFFOLDER_MARKER}\nplatforms: [.iOS("15.1")],\n`; + writeApp({ + 'react-native-upstream': upstream, + 'react-native-autogen': autogen, + 'react-native-none': null, + }); + + expect(refresh()).toEqual([]); + expect(read('react-native-upstream')).toBe(upstream); + expect(read('react-native-autogen')).toBe(autogen); + }); + + it('refreshes a transitive spm.dependency that autolinking.json never lists', () => { + writeApp({'react-native-a': manifest('platforms: [.iOS("15.1")],')}); + fs.writeFileSync( + path.join(appRoot, 'node_modules/react-native-a/package.json'), + JSON.stringify({ + name: 'react-native-a', + swiftpmConfig: {dependencies: ['react-native-transitive']}, + }), + ); + const transitiveRoot = path.join( + appRoot, + 'node_modules', + 'react-native-transitive', + ); + fs.mkdirSync(transitiveRoot, {recursive: true}); + fs.writeFileSync( + path.join(transitiveRoot, 'package.json'), + JSON.stringify({name: 'react-native-transitive', version: '1.0.0'}), + ); + fs.writeFileSync( + path.join(transitiveRoot, 'react-native.config.js'), + 'module.exports = {dependency: {platforms: {ios: {}}}};\n', + ); + fs.writeFileSync( + path.join(transitiveRoot, 'Package.swift'), + manifest('platforms: [.iOS("15.1")],'), + 'utf8', + ); + + expect( + refresh() + .map(entry => entry.depName) + .sort(), + ).toEqual(['react-native-a', 'react-native-transitive']); + expect(read('react-native-transitive')).toContain( + 'platforms: [.iOS("16.4")]', + ); + }); + + it('returns nothing when there is no autolinking.json', () => { + expect(refresh()).toEqual([]); + }); + + it('honors an autolinking.json written outside the default location', () => { + writeApp({'react-native-foo': manifest('platforms: [.iOS("15.1")],')}); + const moved = path.join(appRoot, 'elsewhere', 'autolinking.json'); + fs.mkdirSync(path.dirname(moved)); + fs.renameSync( + path.join(appRoot, 'build/generated/autolinking/autolinking.json'), + moved, + ); + + expect(refresh()).toEqual([]); + expect( + refreshScaffoldedPlatformFloors({ + appRoot, + autolinkingJsonPath: moved, + iosDeploymentTarget: '16.4', + }), + ).toEqual([expect.objectContaining({depName: 'react-native-foo'})]); + }); +}); diff --git a/packages/react-native/scripts/spm/__tests__/setup-apple-spm-test.js b/packages/react-native/scripts/spm/__tests__/setup-apple-spm-test.js index 362538af284c..6e6278e4c1a0 100644 --- a/packages/react-native/scripts/spm/__tests__/setup-apple-spm-test.js +++ b/packages/react-native/scripts/spm/__tests__/setup-apple-spm-test.js @@ -18,12 +18,14 @@ const { generateAutolinkingConfigOrFailClosed, parseArgs, resolveAction, + resolveAppIosDeploymentTarget, resolveConfigCommandToPin, resolveExplicitConfigCommand, shouldAutoDeintegrate, } = require('../../setup-apple-spm'); const {REQUIRED_ARTIFACTS} = require('../download-spm-artifacts'); const {SPM_INJECTED_MARKER} = require('../generate-spm-xcodeproj'); +const {twoAppTargets} = require('./pbxproj-variants'); const {execFileSync} = require('node:child_process'); const fs = require('node:fs'); const os = require('node:os'); @@ -650,3 +652,51 @@ describe('determineVersion', () => { ); }); }); + +describe('resolveAppIosDeploymentTarget', () => { + let appRoot; + let logSpy; + + beforeEach(() => { + appRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'spm-setup-iosdt-')); + logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); + }); + + afterEach(() => { + logSpy.mockRestore(); + fs.rmSync(appRoot, {recursive: true, force: true}); + }); + + function logged() { + return logSpy.mock.calls.map(call => call.join(' ')).join('\n'); + } + + // No marker — the first `spm add`, where only --product-name identifies the + // target among the fixture's two app targets. + function mkTwoTargetProject() { + const dir = path.join(appRoot, 'MyApp.xcodeproj'); + fs.mkdirSync(dir, {recursive: true}); + fs.writeFileSync( + path.join(dir, 'project.pbxproj'), + twoAppTargets('16.4'), + 'utf8', + ); + } + + it('reads the app target --product-name selects, not the lowest one', () => { + mkTwoTargetProject(); + expect(resolveAppIosDeploymentTarget({productName: 'MyApp'}, appRoot)).toBe( + '16.4', + ); + expect(logged()).toContain( + 'iOS deployment target: 16.4 (from MyApp.xcodeproj)', + ); + }); + + it('names the reason alongside the default when no project could be picked', () => { + expect(resolveAppIosDeploymentTarget({}, appRoot)).toBe('15.1'); + expect(logged()).toContain( + 'iOS deployment target: 15.1 (react-native default; no .xcodeproj found', + ); + }); +}); diff --git a/packages/react-native/scripts/spm/__tests__/sync-spm-autolinking-test.js b/packages/react-native/scripts/spm/__tests__/sync-spm-autolinking-test.js index c917f1acf02c..b2e81d23e5d0 100644 --- a/packages/react-native/scripts/spm/__tests__/sync-spm-autolinking-test.js +++ b/packages/react-native/scripts/spm/__tests__/sync-spm-autolinking-test.js @@ -47,8 +47,12 @@ describe('sync-spm-autolinking main', () => { }; } + function baseArgv() { + return ['--app-root', appRoot, '--react-native-root', rnRoot]; + } + function run(deps) { - return main(['--app-root', appRoot, '--react-native-root', rnRoot], deps); + return main(baseArgv(), deps); } function stampPath() { @@ -92,6 +96,20 @@ describe('sync-spm-autolinking main', () => { expect(fs.existsSync(stampPath())).toBe(true); }); + it('forwards --ios-deployment-target to the autolinker only when given', async () => { + const withFlag = makeDeps(); + await main([...baseArgv(), '--ios-deployment-target', '16.4'], withFlag); + expect(withFlag.generateAutolinking).toHaveBeenCalledWith([ + ...baseArgv(), + '--ios-deployment-target', + '16.4', + ]); + + const withoutFlag = makeDeps(); + await run(withoutFlag); + expect(withoutFlag.generateAutolinking).toHaveBeenCalledWith(baseArgv()); + }); + it('continues with existing output when codegen fails', async () => { const deps = makeDeps({ runCodegenAndInstallTemplate: jest.fn(() => { diff --git a/packages/react-native/scripts/spm/generate-spm-autolinking.js b/packages/react-native/scripts/spm/generate-spm-autolinking.js index ecb91f8d64aa..3b41a6b56ad9 100644 --- a/packages/react-native/scripts/spm/generate-spm-autolinking.js +++ b/packages/react-native/scripts/spm/generate-spm-autolinking.js @@ -67,6 +67,10 @@ const { defaultResolveDep, expandSpmDependencies, } = require('./expand-spm-dependencies'); +const { + MIN_IOS_VERSION_SUPPORTED, + sanitizeIosDeploymentTarget, +} = require('./ios-deployment-target'); const {findPodspecs, readPodspecCached} = require('./read-podspec'); const { AUTOLINKED_PACKAGE_NAME, @@ -210,6 +214,10 @@ function parseArgs(argv /*: Array */) /*: AutolinkingArgs */ { describe: 'Path to the xcframeworks sub-package (absolute or relative to appRoot)', }) + .option('ios-deployment-target', { + type: 'string', + describe: `Platform floor of the generated manifests (default: ${MIN_IOS_VERSION_SUPPORTED})`, + }) .usage( 'Usage: $0 [options]\n\nGenerates autolinked/Package.swift for SPM autolinking.', ) @@ -222,6 +230,9 @@ function parseArgs(argv /*: Array */) /*: AutolinkingArgs */ { autolinkingJson: parsed['autolinking-json'] ?? null, output: parsed.output ?? null, xcframeworksPath: parsed['xcframeworks-path'] ?? null, + iosDeploymentTarget: sanitizeIosDeploymentTarget( + parsed['ios-deployment-target'], + ), }; } @@ -941,6 +952,8 @@ function generateAutolinkedPackageSwift( input.pluginPackageDeps ?? []; const pluginProductDeps /*: ReadonlyArray */ = input.pluginProductDeps ?? []; + const iosDeploymentTarget /*: string */ = + input.iosDeploymentTarget ?? MIN_IOS_VERSION_SUPPORTED; // Package-level dependencies: one .package(path:) per autolinked dep, // plus ReactNative if any inline target needs to import React headers. @@ -1074,7 +1087,7 @@ import Foundation ${guardBlock}let package = Package( name: "${AUTOLINKED_PACKAGE_NAME}", - platforms: [.iOS(.v15)], + platforms: [.iOS("${iosDeploymentTarget}")], products: [ .library(name: "${AUTOLINKED_PACKAGE_NAME}", targets: ["AutolinkedAggregate"]), ], @@ -1124,6 +1137,8 @@ function generateSynthPackageSwift(spec /*: SynthPackageSpec */) /*: string */ { const targetPath /*: string */ = spec.targetPath ?? `Sources/${swiftName}`; const siblingSynthAbsolutePaths /*: {[string]: string} */ = spec.siblingSynthAbsolutePaths ?? {}; + const iosDeploymentTarget /*: string */ = + spec.iosDeploymentTarget ?? MIN_IOS_VERSION_SUPPORTED; // Package dependencies — ReactNative + each spm sibling synth package. // The React + codegen package paths are plain relative strings computed by @@ -1222,7 +1237,7 @@ import PackageDescription let package = Package( name: "${swiftName}", - platforms: [.iOS(.v15)], + platforms: [.iOS("${iosDeploymentTarget}")], products: [ .library(name: "${swiftName}"${isDynamic ? ', type: .dynamic' : ''}, targets: ["${swiftName}"]), ], @@ -1697,6 +1712,7 @@ function main(argv /*:: ?: Array */) /*: void */ { const synthContent = generateSynthPackageSwift({ swiftName: target.name, + iosDeploymentTarget: args.iosDeploymentTarget, exclude: prefixedExclude, sources: prefixedSources, // Stub include/ subdir lives in the wrapper dir; satisfies SPM's @@ -1871,6 +1887,7 @@ function main(argv /*:: ?: Array */) /*: void */ { // autolinked dep is a real SPM package in its own source dir. const aggregatorContent = generateAutolinkedPackageSwift({ npmDeps: aggregatorPackageDeps, + iosDeploymentTarget: args.iosDeploymentTarget, hasReactDep, xcframeworksRelPath, pluginPackageDeps, diff --git a/packages/react-native/scripts/spm/generate-spm-xcodeproj.js b/packages/react-native/scripts/spm/generate-spm-xcodeproj.js index e0a43692fc8b..acb3c5192b04 100644 --- a/packages/react-native/scripts/spm/generate-spm-xcodeproj.js +++ b/packages/react-native/scripts/spm/generate-spm-xcodeproj.js @@ -2224,7 +2224,7 @@ function readScriptPhasesManifest( */ function readMarker( xcodeprojPath /*: string */, -) /*: ?{generatedSources?: {[string]: Array}, scriptPhases?: {[string]: string}, artifactsVersionOverride?: ?string, configCommand?: ?Array, buildSettingChanges?: Array, createdArrayFields?: Array, scheme?: {file?: ?string, created?: ?boolean}, ...} */ { +) /*: ?{targetUuid?: ?string, generatedSources?: {[string]: Array}, scriptPhases?: {[string]: string}, artifactsVersionOverride?: ?string, configCommand?: ?Array, buildSettingChanges?: Array, createdArrayFields?: Array, scheme?: {file?: ?string, created?: ?boolean}, ...} */ { const markerPath = path.join(xcodeprojPath, SPM_INJECTED_MARKER); try { // $FlowFixMe[incompatible-return] JSON.parse returns any @@ -2761,6 +2761,7 @@ module.exports = { buildSchemePreActionScript, buildEmbedFrameworksScript, flavorForBuildConfiguration, + targetBuildConfigUuids, frameworkConditionalSettings, ensureStubPackages, buildSpmDependencyGraph, @@ -2775,6 +2776,7 @@ module.exports = { addPreActionToScheme, removePreActionFromScheme, findInjectedXcodeproj, + readMarker, readArtifactsVersionOverride, readPinnedConfigCommand, readScriptPhasesManifest, diff --git a/packages/react-native/scripts/spm/ios-deployment-target.js b/packages/react-native/scripts/spm/ios-deployment-target.js new file mode 100644 index 000000000000..b6239b01925e --- /dev/null +++ b/packages/react-native/scripts/spm/ios-deployment-target.js @@ -0,0 +1,378 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +'use strict'; + +/** + * The iOS platform floor of the SwiftPM manifests React Native generates. + * SwiftPM refuses to link a product whose minimum is above the depending + * target's, so the floor tracks the app's own deployment target rather than a + * hardcoded value a dependency (every Expo package: iOS 16.4) can exceed. + */ + +const {targetBuildConfigUuids} = require('./generate-spm-xcodeproj'); +const { + findApplicationTargets, + findField, + findObjectByUuid, + findProjectObject, + forEachObjectInSection, + uuidsInArray, +} = require('./spm-pbxproj'); +const fs = require('node:fs'); +const path = require('node:path'); + +// Keep in sync with `min_ios_version_supported` in scripts/cocoapods/helpers.rb. +const MIN_IOS_VERSION_SUPPORTED /*: string */ = '15.1'; + +const IOS_VERSION_RE = /^\d+(\.\d+){0,2}$/; + +const DEPLOYMENT_TARGET_KEY = 'IPHONEOS_DEPLOYMENT_TARGET'; + +// An xcconfig may `#include` another; cap the chain instead of trusting it. +const MAX_XCCONFIG_DEPTH = 16; + +/*:: +// Everything the reader needs to follow a configuration's xcconfig. Without a +// srcRoot the xcconfig step is skipped (a caller with only pbxproj text). +type XcconfigContext = {srcRoot: ?string, readFile: (absPath: string) => ?string}; +*/ + +function normalizeIosVersion(version /*: string */) /*: string */ { + return version.includes('.') ? version : `${version}.0`; +} + +function segment( + parts /*: Array */, + index /*: number */, +) /*: number */ { + return index < parts.length ? Number(parts[index]) : 0; +} + +/** Numeric, not lexicographic: `9.0` < `10.0` and `16.4` < `16.10`. */ +function compareIosVersions(a /*: string */, b /*: string */) /*: number */ { + const left = a.split('.'); + const right = b.split('.'); + for (let i = 0; i < Math.max(left.length, right.length); i++) { + const delta = segment(left, i) - segment(right, i); + if (delta !== 0) { + return delta < 0 ? -1 : 1; + } + } + return 0; +} + +function unquote(value /*: string */) /*: string */ { + return value.replace(/^"|"$/g, ''); +} + +/** + * A version reduced to something safe to interpolate into a manifest: + * normalized, and never below React Native's own minimum. + */ +function sanitizeIosDeploymentTarget(raw /*: ?string */) /*: string */ { + if (raw == null || !IOS_VERSION_RE.test(raw)) { + return MIN_IOS_VERSION_SUPPORTED; + } + const version = normalizeIosVersion(raw); + return compareIosVersions(version, MIN_IOS_VERSION_SUPPORTED) > 0 + ? version + : MIN_IOS_VERSION_SUPPORTED; +} + +function defaultReadFile(absPath /*: string */) /*: ?string */ { + try { + return fs.readFileSync(absPath, 'utf8'); + } catch { + return null; + } +} + +/** + * `IPHONEOS_DEPLOYMENT_TARGET` as an xcconfig defines it, following `#include` + * lines in place so a later assignment in the includer wins. Null when the file + * is unreadable, sets no unconditional value, or sets one that is not a plain + * version (`$(inherited)`). + */ +function parseXcconfigSetting( + absPath /*: string */, + content /*: string */, + readFile /*: (absPath: string) => ?string */, + visited /*: Set */ = new Set(), + depth /*: number */ = 0, +) /*: ?string */ { + if (visited.has(absPath)) { + return null; + } + visited.add(absPath); + const assignment = new RegExp(`^${DEPLOYMENT_TARGET_KEY}\\s*=\\s*([^;]*);?$`); + let value /*: ?string */ = null; + for (const rawLine of content.split('\n')) { + const line = rawLine.replace(/\/\/.*$/, '').trim(); + const include = line.match(/^#include\??\s+"([^"]+)"/); + if (include != null) { + const included = readXcconfigSetting( + path.resolve(path.dirname(absPath), include[1]), + readFile, + visited, + depth + 1, + ); + if (included != null) { + value = included; + } + continue; + } + const match = line.match(assignment); + if (match != null) { + const raw = unquote(match[1].trim()); + value = IOS_VERSION_RE.test(raw) ? raw : null; + } + } + return value; +} + +/** parseXcconfigSetting for a path not read yet — the `#include` entry point. */ +function readXcconfigSetting( + absPath /*: string */, + readFile /*: (absPath: string) => ?string */, + visited /*: Set */, + depth /*: number */, +) /*: ?string */ { + if (depth > MAX_XCCONFIG_DEPTH) { + return null; + } + const content = readFile(absPath); + return content != null + ? parseXcconfigSetting(absPath, content, readFile, visited, depth) + : null; +} + +/** + * Directory components of the PBXGroup chain holding `uuid`, outermost first — + * how a `""` file reference's path is anchored to the project dir. + */ +function groupPathPrefix( + text /*: string */, + uuid /*: string */, +) /*: Array */ { + const groups /*: Array<{uuid: string, path: ?string, children: Set}> */ = + []; + forEachObjectInSection(text, 'PBXGroup', ({uuid: groupUuid, ...body}) => { + const children = findField(text, body, 'children'); + const groupPath = findField(text, body, 'path'); + groups.push({ + uuid: groupUuid, + path: groupPath != null ? unquote(groupPath.value) : null, + children: children != null ? uuidsInArray(children.value) : new Set(), + }); + }); + + const parts /*: Array */ = []; + let current = uuid; + for (let i = 0; i < groups.length; i++) { + const parent = groups.find(group => group.children.has(current)); + if (parent == null) { + break; + } + if (parent.path != null) { + parts.unshift(parent.path); + } + current = parent.uuid; + } + return parts; +} + +/** + * Absolute paths to try for the xcconfig a configuration is based on, in order: + * the reference's own anchoring first, then plain `/`. + */ +function xcconfigCandidates( + text /*: string */, + configObj /*: {bodyOpen: number, bodyClose: number, ...} */, + srcRoot /*: string */, +) /*: Array */ { + const base = findField(text, configObj, 'baseConfigurationReference'); + const refUuid = base?.value.match(/[0-9A-Fa-f]{24}/)?.[0]; + if (refUuid == null) { + return []; + } + const ref = findObjectByUuid(text, refUuid); + if (ref == null) { + return []; + } + const pathField = findField(text, ref, 'path'); + if (pathField == null) { + return []; + } + const refPath = unquote(pathField.value); + if (path.isAbsolute(refPath)) { + return [refPath]; + } + const sourceTreeField = findField(text, ref, 'sourceTree'); + const sourceTree = + sourceTreeField != null ? unquote(sourceTreeField.value) : ''; + const fallback = path.join(srcRoot, refPath); + if (sourceTree !== '') { + return [fallback]; + } + const anchored = path.join( + srcRoot, + ...groupPathPrefix(text, refUuid), + refPath, + ); + return anchored === fallback ? [fallback] : [anchored, fallback]; +} + +function configName( + text /*: string */, + configObj /*: {bodyOpen: number, bodyClose: number, ...} */, +) /*: ?string */ { + const field = findField(text, configObj, 'name'); + return field != null ? unquote(field.value) : null; +} + +/** A plain-version `IPHONEOS_DEPLOYMENT_TARGET` literal in a configuration. */ +function configLiteral( + text /*: string */, + configObj /*: {bodyOpen: number, bodyClose: number, ...} */, +) /*: ?string */ { + const settings = findField(text, configObj, 'buildSettings'); + if (settings == null) { + return null; + } + const field = findField( + text, + {bodyOpen: settings.valueStart, bodyClose: settings.tokenEnd - 1}, + DEPLOYMENT_TARGET_KEY, + ); + if (field == null) { + return null; + } + const raw = unquote(field.value); + return IOS_VERSION_RE.test(raw) ? raw : null; +} + +/** + * What one configuration declares: its own literal, else the xcconfig it is + * based on (Xcode's own precedence). + */ +function configDeploymentTarget( + text /*: string */, + configObj /*: {bodyOpen: number, bodyClose: number, ...} */, + ctx /*: XcconfigContext */, +) /*: ?string */ { + const literal = configLiteral(text, configObj); + if (literal != null || ctx.srcRoot == null) { + return literal; + } + for (const candidate of xcconfigCandidates(text, configObj, ctx.srcRoot)) { + const content = ctx.readFile(candidate); + if (content != null) { + return parseXcconfigSetting(candidate, content, ctx.readFile); + } + } + return null; +} + +/** + * The app's declared iOS deployment target, or null when nothing declares one. + * Target selection: the marker's `targetUuid`, else the app target named + * `targetName` (`--product-name`), else every app target. Each configuration + * falls back to the project-level one of the same name (each level accepting a + * literal or the xcconfig it is based on), and the lowest wins — a single + * manifest floor has to hold for every configuration. + */ +function readIosDeploymentTargetFromPbxproj( + text /*: string */, + opts /*:: ?: { + targetUuid?: ?string, + targetName?: ?string, + srcRoot?: ?string, + readFile?: (absPath: string) => ?string, + } */, +) /*: ?string */ { + const ctx /*: XcconfigContext */ = { + srcRoot: opts?.srcRoot, + readFile: opts?.readFile ?? defaultReadFile, + }; + const targetUuid = opts?.targetUuid; + const marked = targetUuid != null ? findObjectByUuid(text, targetUuid) : null; + const apps = findApplicationTargets(text); + const named = + opts?.targetName != null + ? apps.find(app => app.name === opts.targetName) + : null; + const targets = marked != null ? [marked] : named != null ? [named] : apps; + + const projectDefaults /*: Map */ = new Map(); + const project = findProjectObject(text); + if (project != null) { + for (const uuid of targetBuildConfigUuids(text, project)) { + const config = findObjectByUuid(text, uuid); + const name = config != null ? configName(text, config) : null; + const value = + config != null ? configDeploymentTarget(text, config, ctx) : null; + if (name != null && value != null) { + projectDefaults.set(name, value); + } + } + } + + let floor /*: ?string */ = null; + for (const target of targets) { + for (const uuid of targetBuildConfigUuids(text, target)) { + const config = findObjectByUuid(text, uuid); + if (config == null) { + continue; + } + const name = configName(text, config); + const value = + configDeploymentTarget(text, config, ctx) ?? + (name != null ? projectDefaults.get(name) : null) ?? + null; + if ( + value != null && + (floor == null || compareIosVersions(value, floor) < 0) + ) { + floor = value; + } + } + } + return floor; +} + +/** + * The sanitized floor read from `/project.pbxproj`, or null when + * there is no project, it cannot be read, or it declares nothing usable. + */ +function resolveIosDeploymentTarget( + opts /*: {xcodeprojPath: ?string, targetUuid?: ?string, targetName?: ?string} */, +) /*: ?string */ { + const {xcodeprojPath, targetUuid, targetName} = opts; + if (xcodeprojPath == null) { + return null; + } + try { + const found = readIosDeploymentTargetFromPbxproj( + fs.readFileSync(path.join(xcodeprojPath, 'project.pbxproj'), 'utf8'), + {targetUuid, targetName, srcRoot: path.dirname(xcodeprojPath)}, + ); + return found != null ? sanitizeIosDeploymentTarget(found) : null; + } catch { + return null; + } +} + +module.exports = { + MIN_IOS_VERSION_SUPPORTED, + readIosDeploymentTargetFromPbxproj, + resolveIosDeploymentTarget, + sanitizeIosDeploymentTarget, +}; diff --git a/packages/react-native/scripts/spm/scaffold-package-swift.js b/packages/react-native/scripts/spm/scaffold-package-swift.js index 5c0e3f8325af..cf7e5879ce2d 100644 --- a/packages/react-native/scripts/spm/scaffold-package-swift.js +++ b/packages/react-native/scripts/spm/scaffold-package-swift.js @@ -44,6 +44,7 @@ const { resolveSwiftName, } = require('./expand-spm-dependencies'); const {expandSpmSourceGlobs} = require('./generate-spm-autolinking'); +const {MIN_IOS_VERSION_SUPPORTED} = require('./ios-deployment-target'); const {findPodspecs, readPodspecCached} = require('./read-podspec'); const { REACT_CODEGEN_PACKAGE_NAME, @@ -107,7 +108,9 @@ const {log, warn} = makeLogger('scaffold-package-swift'); // v19: scaffolded C++ targets carry DEBUG/NDEBUG config defines so their Fabric // ABI matches the prebuilt React.framework (Release strips DebugStringConvertible // under NDEBUG). Bumped so existing scaffolds regenerate with the defines. -const SCAFFOLDER_VERSION = 19; +// v20: the platform floor is the app's iOS deployment target in string form +// (the `.v15` enum cannot express a dependency minimum like 16.4). +const SCAFFOLDER_VERSION = 20; const SCAFFOLDER_VERSION_LINE_RE = /^\/\/ AUTO-SCAFFOLDED-VERSION: (\d+)$/m; const AUTOGEN_MARKER = @@ -562,6 +565,7 @@ type EmitContext = { // Relative path to the app's local xcframeworks package // (/build/xcframeworks). Only referenced when remote == null. localXcfwPackageDir?: ?string, + iosDeploymentTarget?: ?string, }; */ @@ -578,6 +582,8 @@ function emitScaffoldedPackageSwift( ) /*: string */ { const slotComment = ctx.cacheSlotLabel != null ? `\n// Cache slot: ${ctx.cacheSlotLabel}` : ''; + const iosDeploymentTarget /*: string */ = + ctx.iosDeploymentTarget ?? MIN_IOS_VERSION_SUPPORTED; // React headers need NO search paths — they come from the React / // ReactNativeHeaders binaryTargets and the ReactAppHeaders product (see @@ -765,7 +771,7 @@ import PackageDescription let package = Package( name: "${spec.swiftName}", - platforms: [.iOS(.v15)], + platforms: [.iOS("${iosDeploymentTarget}")], products: [ .library(name: "${spec.swiftName}", targets: ["${spec.swiftName}"]), ], @@ -863,6 +869,7 @@ type ScaffoldContext = { // references honor each sibling's declared name. swiftNameByNpm?: Map, remote: ?{url: string, version: string, identity: string}, + iosDeploymentTarget?: ?string, }; */ @@ -1062,6 +1069,7 @@ function scaffoldPackageSwiftForDep( const content = emitScaffoldedPackageSwift(spec, { cacheSlotLabel: ctx.cacheSlotLabel, remote: ctx.remote, + iosDeploymentTarget: ctx.iosDeploymentTarget, codegenPackageDir: relFromManifest('build', 'generated', 'ios'), localXcfwPackageDir: relFromManifest('build', 'xcframeworks'), }); @@ -1123,6 +1131,151 @@ function scaffoldPackageSwiftForDep( }; } +/** + * The dependency set the autolinker considers: the iOS entries of + * autolinking.json plus their transitive SwiftPM dependencies. Null when the + * file declares none; throws when it cannot be read or parsed. `onSkipped` + * reports the entries dropped for having no iOS platform. + */ +function collectAutolinkedDeps( + opts /*: { + autolinkingJsonPath: string, + remote: ?{url: string, version: string, identity: string}, + onSkipped?: (name: string) => void, + } */, +) /*: ?Array */ { + const {autolinkingJsonPath, remote, onSkipped} = opts; + /*:: type AutolinkingJson = {dependencies?: ?{[string]: {root?: string, platforms?: {ios?: ?{...}, ...}, ...}}, ...}; */ + // $FlowFixMe[incompatible-type] JSON.parse returns any + const data /*: AutolinkingJson */ = JSON.parse( + fs.readFileSync(autolinkingJsonPath, 'utf8'), + ); + const deps = data.dependencies; + if (deps == null) { + return null; + } + + const directDeps /*: Array */ = []; + for (const name of Object.keys(deps)) { + const raw = deps[name]; + if (raw == null) continue; + const root = raw.root; + const ios = raw.platforms?.ios; + if (typeof root !== 'string' || ios == null) { + onSkipped?.(name); + continue; + } + // $FlowFixMe[incompatible-type] `ios` shape is runtime-validated above + const iosPlatform /*: AutolinkingIosPlatform */ = ios; + directDeps.push({name, root, platforms: {ios: iosPlatform}}); + } + + try { + return expandSpmDependencies(directDeps, { + readConfig: defaultReadConfig, + resolveDep: defaultResolveDep, + readPodspec: defaultReadPodspec, + extraReservedNames: remote != null ? [remote.identity] : undefined, + }); + } catch (e) { + if (e instanceof SpmNameCollisionError) { + throw e; + } + // A transitive-resolution failure shouldn't abort the whole pass; fall back + // to the direct deps so at least those are covered. They are named the way + // the autolinker names them — a manifest written under any other name + // outlives this error on disk and then fails to resolve. + log(`Transitive dependency expansion failed: ${e.message}`); + return directDeps.map(dep => { + const resolved = resolveSwiftName( + dep.name, + readSwiftpmConfig(dep.root, defaultReadConfig(dep.root)), + defaultReadPodspec(dep.root, dep.platforms.ios.podspecPath), + ); + return { + ...dep, + swiftName: resolved.name, + swiftNameSource: resolved.source, + swiftNamePodspecKey: resolved.podspecKey, + }; + }); + } +} + +// The `.iOS(...)` element of the emitted platforms array — the `.v15` enum form +// pre-v20 scaffolds carry included, and without the array's closing bracket so +// a user-extended array (`[.iOS(…), .macOS(…)]`) is still matched. +const PLATFORM_FLOOR_RE = /platforms: \[\.iOS\((\.v\d+|"[^"]*")\)/; + +/** + * Bring the platform floor of already-scaffolded manifests up to the app's + * deployment target — `spm add`/`update` must not leave a dep pinned below the + * app (SwiftPM would refuse to link it), and re-scaffolding is the user's call. + * Only the platform line of a file carrying our own marker is rewritten; no + * file is created. `from` is the previous token, verbatim (`15.1` or `.v15`). + */ +function refreshScaffoldedPlatformFloors( + opts /*: {appRoot: string, autolinkingJsonPath?: string, iosDeploymentTarget: string} */, +) /*: Array<{depName: string, path: string, from: string, to: string}> */ { + const {appRoot, iosDeploymentTarget} = opts; + const autolinkingJsonPath = + opts.autolinkingJsonPath ?? + path.join(appRoot, 'build', 'generated', 'autolinking', 'autolinking.json'); + const refreshed = []; + + // Best-effort: an unreadable autolinking.json, a name collision or a + // malformed remote config is the autolinker's error to report a moment + // later, not this pass's. + let deps /*: ?Array */ = null; + try { + deps = collectAutolinkedDeps({ + autolinkingJsonPath, + remote: remotePackageConfig(appRoot), + }); + } catch { + return refreshed; + } + if (deps == null) { + return refreshed; + } + + for (const {name: depName, root} of deps) { + const manifestPath = path.join(root, 'Package.swift'); + let content; + try { + content = fs.readFileSync(manifestPath, 'utf8'); + } catch { + continue; + } + if ( + !content.includes(SCAFFOLDER_MARKER) || + content.includes(AUTOGEN_MARKER) + ) { + continue; + } + const match = content.match(PLATFORM_FLOOR_RE); + if (match == null) { + continue; + } + const from = match[1].replace(/"/g, ''); + if (from === iosDeploymentTarget) { + continue; + } + fs.writeFileSync( + manifestPath, + content.replace(match[0], `platforms: [.iOS("${iosDeploymentTarget}")`), + 'utf8', + ); + refreshed.push({ + depName, + path: manifestPath, + from, + to: iosDeploymentTarget, + }); + } + return refreshed; +} + // --------------------------------------------------------------------------- // Multi-dep orchestrator // --------------------------------------------------------------------------- @@ -1136,6 +1289,7 @@ type ScaffoldAllOptions = { dryRun?: boolean, cacheSlotLabel?: ?string, autolinkingJsonPath?: string, + iosDeploymentTarget?: ?string, // npm dep names to skip entirely — used when the user declined the // confirmation prompt for first-time scaffolds. Skipped deps still // appear in the returned results array with status='skipped-opt-out'. @@ -1163,76 +1317,29 @@ function scaffoldAll( return []; } - /*:: type AutolinkingJson = {dependencies?: ?{[string]: {root?: string, platforms?: {ios?: ?{...}, ...}, ...}}, ...}; */ - // $FlowFixMe[incompatible-type] JSON.parse returns any - const data /*: AutolinkingJson */ = JSON.parse( - fs.readFileSync(autolinkingJsonPath, 'utf8'), - ); - const deps = data.dependencies; - if (deps == null) { - return []; - } - - // Narrow the direct autolinking.json entries with an iOS platform, then - // expand transitive `spm.dependencies` so the scaffolder covers EXACTLY the - // set the autolinker considers. Without this, a transitive native dep that + // The scaffolder covers EXACTLY the set the autolinker considers, transitive + // `spm.dependencies` included. Without them, a transitive native dep that // ships no Package.swift would be flagged by the autolinker but never // scaffolded here — leaving `react-native spm scaffold` unable to clear the // autolinker's missing-manifest error. const results /*: Array */ = []; - const directDeps /*: Array */ = []; - for (const name of Object.keys(deps)) { - const raw = deps[name]; - if (raw == null) continue; - const root = raw.root; - const ios = raw.platforms?.ios; - if (typeof root !== 'string' || ios == null) { + // Outside collectAutolinkedDeps' own try: a malformed remote config + // (RemoteVersionError) is a misconfiguration to surface, not an expansion + // failure to degrade past. + const remote = remotePackageConfig(appRoot); + const allDeps = collectAutolinkedDeps({ + autolinkingJsonPath, + remote, + onSkipped: name => { results.push({ depName: name, status: 'skipped-no-ios', reason: 'no iOS platform in autolinking.json', }); - continue; - } - // $FlowFixMe[incompatible-type] `ios` shape is runtime-validated above - const iosPlatform /*: AutolinkingIosPlatform */ = ios; - directDeps.push({name, root, platforms: {ios: iosPlatform}}); - } - - // Outside the try: a malformed remote config (RemoteVersionError) is a - // misconfiguration to surface, not an expansion failure to degrade past. - const remote = remotePackageConfig(appRoot); - - let allDeps /*: Array */ = []; - try { - allDeps = expandSpmDependencies(directDeps, { - readConfig: defaultReadConfig, - resolveDep: defaultResolveDep, - readPodspec: defaultReadPodspec, - extraReservedNames: remote != null ? [remote.identity] : undefined, - }); - } catch (e) { - if (e instanceof SpmNameCollisionError) { - throw e; - } - // A transitive-resolution failure shouldn't abort the whole scaffold pass; - // fall back to the direct deps so at least those get manifests. They are - // named the same way the autolinker names them — a manifest written under - // any other name outlives this error on disk and then fails to resolve. - log(`Transitive dependency expansion failed: ${e.message}`); - allDeps = directDeps.map(dep => { - const resolved = resolveSwiftName( - dep.name, - readSwiftpmConfig(dep.root, defaultReadConfig(dep.root)), - defaultReadPodspec(dep.root, dep.platforms.ios.podspecPath), - ); - return { - ...dep, - swiftName: resolved.name, - swiftNameSource: resolved.source, - swiftNamePodspecKey: resolved.podspecKey, - }; - }); + }, + }); + if (allDeps == null) { + return results; } // Index every autolinked dep's podspec name → its npm name, so a dep that @@ -1271,6 +1378,7 @@ function scaffoldAll( force: opts.force === true, dryRun: opts.dryRun === true, cacheSlotLabel: opts.cacheSlotLabel ?? null, + iosDeploymentTarget: opts.iosDeploymentTarget ?? null, podToNpm, swiftNameByNpm, remote, @@ -1296,6 +1404,7 @@ function scaffoldAll( } module.exports = { + refreshScaffoldedPlatformFloors, scaffoldAll, scaffoldPackageSwiftForDep, translatePodspecToSpmTarget, diff --git a/packages/react-native/scripts/spm/spm-pbxproj.js b/packages/react-native/scripts/spm/spm-pbxproj.js index c116ff38e13f..9cd40df867a1 100644 --- a/packages/react-native/scripts/spm/spm-pbxproj.js +++ b/packages/react-native/scripts/spm/spm-pbxproj.js @@ -267,19 +267,16 @@ function findProjectObject(text /*: string */) /*: ObjectRange | null */ { return findObjectByUuid(text, m[1]); } -/** - * Every PBXNativeTarget whose productType is an application. Returns uuid + - * name + body range for each. Used to pick the app target to inject into - * (and to refuse on ambiguity). - */ -function findApplicationTargets( +/** Visit every top-level object of a section, in file order. */ +function forEachObjectInSection( text /*: string */, -) /*: Array<{uuid: string, name: string, bodyOpen: number, bodyClose: number}> */ { - const section = findSection(text, 'PBXNativeTarget'); + name /*: string */, + fn /*: (obj: {uuid: string, comment: ?string, bodyOpen: number, bodyClose: number}) => void */, +) /*: void */ { + const section = findSection(text, name); if (section == null) { - return []; + return; } - const out = []; const re = /\n\t\t([0-9A-Fa-f]{24})(?: \/\* (.*?) \*\/)? = \{/g; re.lastIndex = section.contentStart; for (;;) { @@ -287,25 +284,42 @@ function findApplicationTargets( if (m == null || m.index >= section.end) { break; } - const uuid = m[1]; - const comment = m[2]; const bodyOpen = text.indexOf('{', m.index); const bodyClose = scanToClose(text, bodyOpen); - const obj = {uuid, bodyOpen, bodyClose}; - const productType = findField(text, obj, 'productType'); - if ( - productType != null && - /com\.apple\.product-type\.application/.test(productType.value) - ) { + fn({uuid: m[1], comment: m[2], bodyOpen, bodyClose}); + re.lastIndex = bodyClose; + } +} + +/** + * Every PBXNativeTarget whose productType is an application. Returns uuid + + * name + body range for each. Used to pick the app target to inject into + * (and to refuse on ambiguity). + */ +function findApplicationTargets( + text /*: string */, +) /*: Array<{uuid: string, name: string, bodyOpen: number, bodyClose: number}> */ { + const out = []; + forEachObjectInSection( + text, + 'PBXNativeTarget', + ({uuid, comment, bodyOpen, bodyClose}) => { + const obj = {uuid, bodyOpen, bodyClose}; + const productType = findField(text, obj, 'productType'); + if ( + productType == null || + !/com\.apple\.product-type\.application/.test(productType.value) + ) { + return; + } const nameField = findField(text, obj, 'name'); const name = nameField != null ? nameField.value.replace(/^"|"$/g, '') : (comment ?? uuid); out.push({uuid, name, bodyOpen, bodyClose}); - } - re.lastIndex = bodyClose; - } + }, + ); return out; } @@ -766,6 +780,7 @@ module.exports = { findSection, findProjectObject, findApplicationTargets, + forEachObjectInSection, uuidsInArray, detectFieldIndent, insertObjectsIntoSection, diff --git a/packages/react-native/scripts/spm/spm-types.js b/packages/react-native/scripts/spm/spm-types.js index dcda8d3addd7..a89142f6ada0 100644 --- a/packages/react-native/scripts/spm/spm-types.js +++ b/packages/react-native/scripts/spm/spm-types.js @@ -67,6 +67,8 @@ export type AutolinkingArgs = { autolinkingJson: string | null, output: string | null, xcframeworksPath: string | null, + // Platform floor of every manifest this run writes; sanitized by parseArgs. + iosDeploymentTarget: string, }; export type SpmTarget = { @@ -206,6 +208,7 @@ export type AggregatorInput = { // the aggregator's package deps + the AutolinkedAggregate target deps. pluginPackageDeps?: ReadonlyArray, pluginProductDeps?: ReadonlyArray, + iosDeploymentTarget?: ?string, }; // --- Autolinking plugins (PREVIEW / unstable contract) --- @@ -377,6 +380,7 @@ export type SynthPackageSpec = { // `` resolve through the // dep's own `common/cpp/` subtree. headerSearchPaths?: ?Array, + iosDeploymentTarget?: ?string, }; diff --git a/packages/react-native/scripts/spm/sync-spm-autolinking.js b/packages/react-native/scripts/spm/sync-spm-autolinking.js index b37a7e89da75..78e1fcbd43a0 100644 --- a/packages/react-native/scripts/spm/sync-spm-autolinking.js +++ b/packages/react-native/scripts/spm/sync-spm-autolinking.js @@ -82,6 +82,10 @@ async function main( demandOption: true, describe: 'Path to react-native package root', }) + .option('ios-deployment-target', { + type: 'string', + describe: 'Platform floor forwarded to the autolinker', + }) .help() .parseSync(); @@ -115,12 +119,17 @@ async function main( deps.installSpmCodegenTemplate(appRoot, reactNativeRoot, {log}); log('Re-generating build/generated/autolinking/Package.swift...'); - deps.generateAutolinking([ + const autolinkingArgv = [ '--app-root', appRoot, '--react-native-root', reactNativeRoot, - ]); + ]; + const iosDeploymentTarget = parsed['ios-deployment-target']; + if (iosDeploymentTarget != null) { + autolinkingArgv.push('--ios-deployment-target', iosDeploymentTarget); + } + deps.generateAutolinking(autolinkingArgv); // Rebuild the per-app generated-headers farm (vended as the ReactAppHeaders // SPM target inside the codegen package). React core headers need no trees From ad7b17d8eef55add5392db81d326430f26829646 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Tue, 15 Sep 2026 20:26:15 +0100 Subject: [PATCH 14/35] Fix cache-key test on release branches getCacheKey only hashes package contents when the version ends in -main; published releases short-circuit to the version string. The test asserted only the main-build property, so it failed on every release branch. Assert the correct property for each case. --- .../src/__tests__/cache-key-test.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/react-native-babel-preset/src/__tests__/cache-key-test.js b/packages/react-native-babel-preset/src/__tests__/cache-key-test.js index a14ad66633c2..5c75fddbca42 100644 --- a/packages/react-native-babel-preset/src/__tests__/cache-key-test.js +++ b/packages/react-native-babel-preset/src/__tests__/cache-key-test.js @@ -22,8 +22,19 @@ function getCacheKey(packageContents) { return require('../index').getCacheKey(); } -test('cache key includes package metadata for main builds', () => { - expect(getCacheKey('{"dependency":"1.0.0"}')).not.toBe( - getCacheKey('{"dependency":"2.0.0"}'), - ); -}); +const {version: packageVersion} = require('../../package.json'); + +// Only `-main` versions hash package contents; published releases short-circuit +// to the version string, so each build asserts a different property. +if (packageVersion.endsWith('-main')) { + test('cache key includes package metadata for main builds', () => { + expect(getCacheKey('{"dependency":"1.0.0"}')).not.toBe( + getCacheKey('{"dependency":"2.0.0"}'), + ); + }); +} else { + test('cache key is the package version for published releases', () => { + expect(getCacheKey('{"dependency":"1.0.0"}')).toBe(packageVersion); + expect(getCacheKey('{"dependency":"2.0.0"}')).toBe(packageVersion); + }); +} From 05a41cdc674b1a51a67bfce9be4b79ae3395f795 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Tue, 15 Sep 2026 22:16:48 +0000 Subject: [PATCH 15/35] Release 0.88.0-rc.1 #publish-packages-to-npm&next --- package.json | 4 ++-- packages/asset-utils/package.json | 2 +- packages/assets-registry/package.json | 2 +- packages/babel-plugin-codegen/package.json | 4 ++-- packages/community-cli-plugin/package.json | 8 ++++---- packages/debugger-frontend/package.json | 2 +- packages/debugger-shell/bin/react-native-devtools | 12 ++++++------ packages/debugger-shell/package.json | 2 +- packages/dev-middleware/package.json | 8 ++++---- packages/eslint-config-react-native/package.json | 4 ++-- packages/eslint-plugin-react-native/package.json | 2 +- packages/eslint-plugin-specs/package.json | 4 ++-- packages/gradle-plugin/package.json | 2 +- packages/jest-preset/package.json | 4 ++-- packages/metro-config/package.json | 6 +++--- packages/new-app-screen/package.json | 4 ++-- packages/normalize-color/package.json | 2 +- packages/polyfills/package.json | 2 +- packages/react-native-babel-preset/package.json | 4 ++-- .../react-native-babel-transformer/package.json | 4 ++-- packages/react-native-codegen/package.json | 2 +- .../react-native-compatibility-check/package.json | 4 ++-- .../react-native-popup-menu-android/package.json | 6 +++--- .../Libraries/Core/ReactNativeVersion.js | 2 +- packages/react-native/React/Base/RCTVersion.m | 2 +- .../react-native/ReactAndroid/gradle.properties | 2 +- .../react/modules/systeminfo/ReactNativeVersion.kt | 2 +- .../ReactCommon/cxxreact/ReactNativeVersion.h | 2 +- packages/react-native/package.json | 14 +++++++------- .../generate-artifacts-executor-test.js.snap | 8 ++++---- packages/rn-tester/package.json | 8 ++++---- packages/typescript-config/package.json | 2 +- packages/virtualized-lists/package.json | 4 ++-- private/helloworld/package.json | 12 ++++++------ .../package.json | 2 +- 35 files changed, 77 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index a0517a401903..dd896033ab6c 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,8 @@ "@jest/create-cache-key-function": "^29.7.0", "@microsoft/api-extractor": "^7.52.2", "@octokit/rest": "^22.0.0", - "@react-native/metro-babel-transformer": "0.88.0-rc.0", - "@react-native/metro-config": "0.88.0-rc.0", + "@react-native/metro-babel-transformer": "0.88.0-rc.1", + "@react-native/metro-config": "0.88.0-rc.1", "@tsconfig/node22": "22.0.2", "@types/react": "^19.1.0", "@typescript-eslint/parser": "^8.59.2", diff --git a/packages/asset-utils/package.json b/packages/asset-utils/package.json index b73e1d33b436..647f56f3b9f9 100644 --- a/packages/asset-utils/package.json +++ b/packages/asset-utils/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/asset-utils", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Asset path utilities for React Native.", "license": "MIT", "repository": { diff --git a/packages/assets-registry/package.json b/packages/assets-registry/package.json index d7606485dd13..c3e123270702 100644 --- a/packages/assets-registry/package.json +++ b/packages/assets-registry/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index a9f63b221f3d..f79ef9a71958 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-plugin-codegen", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ ], "dependencies": { "@babel/traverse": "^7.29.0", - "@react-native/codegen": "0.88.0-rc.0" + "@react-native/codegen": "0.88.0-rc.1" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index 8afc7ad3f473..085ba87d1a23 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/community-cli-plugin", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -31,8 +31,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.0", - "@react-native/dev-middleware": "0.88.0-rc.0", + "@react-native/asset-utils": "0.88.0-rc.1", + "@react-native/dev-middleware": "0.88.0-rc.1", "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -44,7 +44,7 @@ }, "peerDependencies": { "@react-native-community/cli": "*", - "@react-native/metro-config": "0.88.0-rc.0" + "@react-native/metro-config": "0.88.0-rc.1" }, "peerDependenciesMeta": { "@react-native-community/cli": { diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index b211ee258030..22ba9175aa0b 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/debugger-frontend", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Debugger frontend for React Native based on Chrome DevTools", "keywords": [ "react-native", diff --git a/packages/debugger-shell/bin/react-native-devtools b/packages/debugger-shell/bin/react-native-devtools index 11c1cc3fa415..e3c1e8908fd6 100755 --- a/packages/debugger-shell/bin/react-native-devtools +++ b/packages/debugger-shell/bin/react-native-devtools @@ -1,6 +1,6 @@ #!/usr/bin/env dotslash -// @generated SignedSource<<50b06304b2f8b753aedc77961d123abc>> +// @generated SignedSource<> { @@ -12,7 +12,7 @@ "digest": "020eea3cf10f77b8f4e1ae4a2aaa7d78a77c3802de6b00448866aa9c860509c4", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-linux-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-linux-aarch64.tar.gz" }, { "type": "http", @@ -28,7 +28,7 @@ "digest": "933aa98eb68da7f8d1b6e83e611e51f66d026f3b410dc13577faa6adf1b0f75c", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-linux-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-linux-x86_64.tar.gz" }, { "type": "http", @@ -44,7 +44,7 @@ "digest": "4a1c234b1cf27f1ff006fafce6628b8ef6993d7d3298c6ed2127e3055c93dcc6", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-macos-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-macos-aarch64.tar.gz" }, { "type": "http", @@ -60,7 +60,7 @@ "digest": "9f1de3cb78688befaea4d9e5f640a66833dd44ad58b05590a7e07bce279bf532", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-macos-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-macos-x86_64.tar.gz" }, { "type": "http", @@ -76,7 +76,7 @@ "digest": "5b56e22828549f12be49f0431fd74c54dcebfbfb4277e4b87573ec1ab084c288", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.0/React.Native.DevTools-windows-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-windows-x86_64.tar.gz" }, { "type": "http", diff --git a/packages/debugger-shell/package.json b/packages/debugger-shell/package.json index 3ddf5f6994da..7766dabdd1e0 100644 --- a/packages/debugger-shell/package.json +++ b/packages/debugger-shell/package.json @@ -1,7 +1,7 @@ { "name": "@react-native/debugger-shell", "productName": "React Native DevTools", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Experimental debugger shell for React Native for use with @react-native/debugger-frontend", "keywords": [ "react-native", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index 70e790fcf0b5..a92b7903106b 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/dev-middleware", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Dev server middleware for React Native", "keywords": [ "react-native", @@ -32,8 +32,8 @@ }, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.88.0-rc.0", - "@react-native/debugger-shell": "0.88.0-rc.0", + "@react-native/debugger-frontend": "0.88.0-rc.1", + "@react-native/debugger-shell": "0.88.0-rc.1", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -43,7 +43,7 @@ "ws": "^7.5.10" }, "devDependencies": { - "@react-native/debugger-shell": "0.88.0-rc.0", + "@react-native/debugger-shell": "0.88.0-rc.1", "selfsigned": "^5.5.0", "undici": "^6.23.0", "wait-for-expect": "^3.0.2" diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 80a1b711f43e..97796447cf98 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-config", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "ESLint config for React Native", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", - "@react-native/eslint-plugin": "0.88.0-rc.0", + "@react-native/eslint-plugin": "0.88.0-rc.1", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", "eslint-config-prettier": "^8.5.0", diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index 174b32eb01cd..6d901b8564a5 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "ESLint rules for @react-native/eslint-config", "license": "MIT", "repository": { diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index 535409eaeec8..e510c27f2a67 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin-specs", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "ESLint rules to validate NativeModule and Component Specs", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@react-native/codegen": "0.88.0-rc.0", + "@react-native/codegen": "0.88.0-rc.1", "make-dir": "^2.1.0", "pirates": "^4.0.1", "flow-parser": "0.327.0", diff --git a/packages/gradle-plugin/package.json b/packages/gradle-plugin/package.json index 57199430d0aa..d8f3833a65f6 100644 --- a/packages/gradle-plugin/package.json +++ b/packages/gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/gradle-plugin", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Gradle Plugin for React Native", "license": "MIT", "repository": { diff --git a/packages/jest-preset/package.json b/packages/jest-preset/package.json index 83d7eeb0d6ab..05ca823f1c36 100644 --- a/packages/jest-preset/package.json +++ b/packages/jest-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/jest-preset", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Jest preset for React Native apps", "keywords": [ "jest", @@ -29,7 +29,7 @@ ], "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.88.0-rc.0", + "@react-native/js-polyfills": "0.88.0-rc.1", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index 3ec7506d609e..aee2f8c27450 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-config", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Metro configuration for React Native.", "license": "MIT", "repository": { @@ -35,8 +35,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/js-polyfills": "0.88.0-rc.0", - "@react-native/metro-babel-transformer": "0.88.0-rc.0", + "@react-native/js-polyfills": "0.88.0-rc.1", + "@react-native/metro-babel-transformer": "0.88.0-rc.1", "metro-config": "^0.87.0", "metro-runtime": "^0.87.0" } diff --git a/packages/new-app-screen/package.json b/packages/new-app-screen/package.json index c81340ff4fd1..9273931319ad 100644 --- a/packages/new-app-screen/package.json +++ b/packages/new-app-screen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/new-app-screen", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "NewAppScreen component for React Native", "keywords": [ "react-native" @@ -22,7 +22,7 @@ "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.0" + "react-native": "0.88.0-rc.1" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index a352562b24d0..0ea0d611015a 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/normalize-colors", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Color normalization for React Native.", "license": "MIT", "repository": { diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index 2abd908b6e81..a5752b9ef1f5 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/js-polyfills", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Polyfills for React Native.", "license": "MIT", "repository": { diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 75d3c5af9d3b..09936c648bcd 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-preset", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Babel preset for React Native applications", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@react-native/babel-plugin-codegen": "0.88.0-rc.0", + "@react-native/babel-plugin-codegen": "0.88.0-rc.1", "flow-parser": "0.327.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index 40a7c46529b0..526145a8b80f 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-babel-transformer", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Babel transformer for React Native applications.", "repository": { "type": "git", @@ -27,7 +27,7 @@ ], "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.88.0-rc.0", + "@react-native/babel-preset": "0.88.0-rc.1", "flow-parser": "0.327.0", "nullthrows": "^1.1.1" }, diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index 20b0f1a9da83..c5ea03ea1287 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/codegen", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Code generation tools for React Native", "license": "MIT", "repository": { diff --git a/packages/react-native-compatibility-check/package.json b/packages/react-native-compatibility-check/package.json index 3f120e140866..8e963dcc0069 100644 --- a/packages/react-native-compatibility-check/package.json +++ b/packages/react-native-compatibility-check/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/compatibility-check", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Check a React Native app's boundary between JS and Native for incompatibilities", "license": "MIT", "repository": { @@ -38,7 +38,7 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.0" + "@react-native/codegen": "0.88.0-rc.1" }, "devDependencies": { "flow-remove-types": "^2.237.2", diff --git a/packages/react-native-popup-menu-android/package.json b/packages/react-native-popup-menu-android/package.json index e0fd71e056c7..329f0a33bec6 100644 --- a/packages/react-native-popup-menu-android/package.json +++ b/packages/react-native-popup-menu-android/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/popup-menu-android", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "PopupMenu for the Android platform", "repository": { "type": "git", @@ -26,12 +26,12 @@ }, "license": "MIT", "devDependencies": { - "@react-native/codegen": "0.88.0-rc.0" + "@react-native/codegen": "0.88.0-rc.1" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.0" + "react-native": "0.88.0-rc.1" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/react-native/Libraries/Core/ReactNativeVersion.js b/packages/react-native/Libraries/Core/ReactNativeVersion.js index 11fa97500475..ac9479ef810d 100644 --- a/packages/react-native/Libraries/Core/ReactNativeVersion.js +++ b/packages/react-native/Libraries/Core/ReactNativeVersion.js @@ -29,7 +29,7 @@ export default class ReactNativeVersion { static major: number = 0; static minor: number = 88; static patch: number = 0; - static prerelease: string | null = 'rc.0'; + static prerelease: string | null = 'rc.1'; static getVersionString(): string { return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`; diff --git a/packages/react-native/React/Base/RCTVersion.m b/packages/react-native/React/Base/RCTVersion.m index 7c020c998a8a..4fff67d08636 100644 --- a/packages/react-native/React/Base/RCTVersion.m +++ b/packages/react-native/React/Base/RCTVersion.m @@ -24,7 +24,7 @@ RCTVersionMajor: @(0), RCTVersionMinor: @(88), RCTVersionPatch: @(0), - RCTVersionPrerelease: @"rc.0", + RCTVersionPrerelease: @"rc.1", }; }); return __rnVersion; diff --git a/packages/react-native/ReactAndroid/gradle.properties b/packages/react-native/ReactAndroid/gradle.properties index 6b499e1f14e1..2658dba982ff 100644 --- a/packages/react-native/ReactAndroid/gradle.properties +++ b/packages/react-native/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.88.0-rc.0 +VERSION_NAME=0.88.0-rc.1 react.internal.publishingGroup=com.facebook.react react.internal.hermesPublishingGroup=com.facebook.hermes diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt index 7c4881deaefb..678b9491171d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt @@ -15,6 +15,6 @@ public object ReactNativeVersion { "major" to 0, "minor" to 88, "patch" to 0, - "prerelease" to "rc.0" + "prerelease" to "rc.1" ) } diff --git a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h index 4c3257f9661a..932d14daf508 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h @@ -22,7 +22,7 @@ struct ReactNativeVersionType { int32_t Major = 0; int32_t Minor = 88; int32_t Patch = 0; - std::string_view Prerelease = "rc.0"; + std::string_view Prerelease = "rc.1"; }; constexpr ReactNativeVersionType ReactNativeVersion; diff --git a/packages/react-native/package.json b/packages/react-native/package.json index bc61a8c4abaf..292a7e7b7164 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "A framework for building native apps using React", "license": "MIT", "repository": { @@ -151,12 +151,12 @@ } }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.0", - "@react-native/codegen": "0.88.0-rc.0", - "@react-native/community-cli-plugin": "0.88.0-rc.0", - "@react-native/gradle-plugin": "0.88.0-rc.0", - "@react-native/normalize-colors": "0.88.0-rc.0", - "@react-native/virtualized-lists": "0.88.0-rc.0", + "@react-native/asset-utils": "0.88.0-rc.1", + "@react-native/codegen": "0.88.0-rc.1", + "@react-native/community-cli-plugin": "0.88.0-rc.1", + "@react-native/gradle-plugin": "0.88.0-rc.1", + "@react-native/normalize-colors": "0.88.0-rc.1", + "@react-native/virtualized-lists": "0.88.0-rc.1", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "flow-parser": "0.327.0", diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index 51cd012e9b91..ca2862a0f1ae 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -79,7 +79,7 @@ exports[`execute test-app "ReactAppDependencyProvider/ReactAppDependencyProvider # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.0\\" +version = \\"0.88.0-rc.1\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -399,7 +399,7 @@ exports[`execute test-app "ReactCodegen/ReactCodegen.podspec" should match snaps # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.0\\" +version = \\"0.88.0-rc.1\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -590,7 +590,7 @@ exports[`execute test-app-legacy "ReactAppDependencyProvider/ReactAppDependencyP # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.0\\" +version = \\"0.88.0-rc.1\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -882,7 +882,7 @@ exports[`execute test-app-legacy "ReactCodegen/ReactCodegen.podspec" should matc # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.0\\" +version = \\"0.88.0-rc.1\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index 345385e7a6ea..fedb2921952e 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/tester", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "private": true, "description": "React Native tester app.", "license": "MIT", @@ -26,8 +26,8 @@ "e2e-test-ios": "./scripts/maestro-test-ios.sh" }, "dependencies": { - "@react-native/new-app-screen": "0.88.0-rc.0", - "@react-native/popup-menu-android": "0.88.0-rc.0", + "@react-native/new-app-screen": "0.88.0-rc.1", + "@react-native/popup-menu-android": "0.88.0-rc.1", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", @@ -36,7 +36,7 @@ }, "peerDependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.0" + "react-native": "0.88.0-rc.1" }, "codegenConfig": { "name": "AppSpecs", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 182bf4c23ddf..8f7541c3be33 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/typescript-config", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Default TypeScript configuration for React Native apps", "license": "MIT", "repository": { diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index 610bcf90bd9b..89b92a6de7b7 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/virtualized-lists", - "version": "0.88.0-rc.0", + "version": "0.88.0-rc.1", "description": "Virtualized lists for React Native.", "license": "MIT", "repository": { @@ -53,7 +53,7 @@ "peerDependencies": { "@types/react": "^19.2.0", "react": "*", - "react-native": "0.88.0-rc.0" + "react-native": "0.88.0-rc.1" }, "peerDependenciesMeta": { "@types/react": { diff --git a/private/helloworld/package.json b/private/helloworld/package.json index 3c6cf9156c2a..de0a5fde8494 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -13,18 +13,18 @@ }, "dependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.0" + "react-native": "0.88.0-rc.1" }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", - "@react-native/babel-preset": "0.88.0-rc.0", + "@react-native/babel-preset": "0.88.0-rc.1", "@react-native/core-cli-utils": "*", - "@react-native/eslint-config": "0.88.0-rc.0", - "@react-native/jest-preset": "0.88.0-rc.0", - "@react-native/metro-config": "0.88.0-rc.0", - "@react-native/typescript-config": "0.88.0-rc.0", + "@react-native/eslint-config": "0.88.0-rc.1", + "@react-native/jest-preset": "0.88.0-rc.1", + "@react-native/metro-config": "0.88.0-rc.1", + "@react-native/typescript-config": "0.88.0-rc.1", "@types/jest": "^29.5.14", "commander": "^12.0.0", "eslint": "^8.19.0", diff --git a/private/react-native-codegen-typescript-test/package.json b/private/react-native-codegen-typescript-test/package.json index efe726a7224a..339f8e8419bc 100644 --- a/private/react-native-codegen-typescript-test/package.json +++ b/private/react-native-codegen-typescript-test/package.json @@ -13,7 +13,7 @@ "prepare": "yarn run build" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.0" + "@react-native/codegen": "0.88.0-rc.1" }, "devDependencies": { "@babel/core": "^7.25.2", From 74760de04c1f466230e14a00b522149c90c0445c Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Tue, 15 Sep 2026 23:46:34 +0000 Subject: [PATCH 16/35] [LOCAL] Bump Podfile.lock --- packages/rn-tester/Podfile.lock | 686 ++++++++++++++++---------------- 1 file changed, 343 insertions(+), 343 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index b0a7d43b0726..aebf7f68999d 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -2,13 +2,13 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - fast_float (8.0.0) - - FBLazyVector (0.88.0-rc.0) + - FBLazyVector (0.88.0-rc.1) - fmt (12.1.0) - glog (0.3.5) - - hermes-engine (260318099.0.2): - - hermes-engine/Pre-built (= 260318099.0.2) - - hermes-engine/Pre-built (260318099.0.2) - - MyNativeView (0.88.0-rc.0): + - hermes-engine (260318099.0.3): + - hermes-engine/Pre-built (= 260318099.0.3) + - hermes-engine/Pre-built (260318099.0.3) + - MyNativeView (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -37,7 +37,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - NativeCxxModuleExample (0.88.0-rc.0): + - NativeCxxModuleExample (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -86,29 +86,29 @@ PODS: - fast_float (= 8.0.0) - fmt (= 12.1.0) - glog - - RCTDeprecation (0.88.0-rc.0) - - RCTRequired (0.88.0-rc.0) - - RCTSwiftUI (0.88.0-rc.0) - - RCTSwiftUIWrapper (0.88.0-rc.0): + - RCTDeprecation (0.88.0-rc.1) + - RCTRequired (0.88.0-rc.1) + - RCTSwiftUI (0.88.0-rc.1) + - RCTSwiftUIWrapper (0.88.0-rc.1): - RCTSwiftUI - - RCTTypeSafety (0.88.0-rc.0): - - FBLazyVector (= 0.88.0-rc.0) - - RCTRequired (= 0.88.0-rc.0) - - React-Core (= 0.88.0-rc.0) - - React (0.88.0-rc.0): - - React-Core (= 0.88.0-rc.0) - - React-Core/DevSupport (= 0.88.0-rc.0) - - React-Core/RCTWebSocket (= 0.88.0-rc.0) - - React-RCTActionSheet (= 0.88.0-rc.0) - - React-RCTAnimation (= 0.88.0-rc.0) - - React-RCTBlob (= 0.88.0-rc.0) - - React-RCTImage (= 0.88.0-rc.0) - - React-RCTLinking (= 0.88.0-rc.0) - - React-RCTNetwork (= 0.88.0-rc.0) - - React-RCTSettings (= 0.88.0-rc.0) - - React-RCTText (= 0.88.0-rc.0) - - React-RCTVibration (= 0.88.0-rc.0) - - React-bridging (0.88.0-rc.0): + - RCTTypeSafety (0.88.0-rc.1): + - FBLazyVector (= 0.88.0-rc.1) + - RCTRequired (= 0.88.0-rc.1) + - React-Core (= 0.88.0-rc.1) + - React (0.88.0-rc.1): + - React-Core (= 0.88.0-rc.1) + - React-Core/DevSupport (= 0.88.0-rc.1) + - React-Core/RCTWebSocket (= 0.88.0-rc.1) + - React-RCTActionSheet (= 0.88.0-rc.1) + - React-RCTAnimation (= 0.88.0-rc.1) + - React-RCTBlob (= 0.88.0-rc.1) + - React-RCTImage (= 0.88.0-rc.1) + - React-RCTLinking (= 0.88.0-rc.1) + - React-RCTNetwork (= 0.88.0-rc.1) + - React-RCTSettings (= 0.88.0-rc.1) + - React-RCTText (= 0.88.0-rc.1) + - React-RCTVibration (= 0.88.0-rc.1) + - React-bridging (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -120,12 +120,12 @@ PODS: - React-jsi - React-timing - SocketRocket - - React-callinvoker (0.88.0-rc.0): - - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.0) + - React-callinvoker (0.88.0-rc.1): + - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.1) - React-cxxstableapi - - React-callinvoker/callinvokerUmbrella (0.88.0-rc.0): + - React-callinvoker/callinvokerUmbrella (0.88.0-rc.1): - React-cxxstableapi - - React-Core (0.88.0-rc.0): + - React-Core (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -135,7 +135,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.0) + - React-Core/Default (= 0.88.0-rc.1) - React-cxxreact - React-featureflags - React-hermes @@ -150,7 +150,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.88.0-rc.0): + - React-Core/CoreModulesHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -175,7 +175,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (0.88.0-rc.0): + - React-Core/Default (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -199,7 +199,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (0.88.0-rc.0): + - React-Core/DevSupport (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -209,8 +209,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.0) - - React-Core/RCTWebSocket (= 0.88.0-rc.0) + - React-Core/Default (= 0.88.0-rc.1) + - React-Core/RCTWebSocket (= 0.88.0-rc.1) - React-cxxreact - React-featureflags - React-hermes @@ -225,7 +225,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.88.0-rc.0): + - React-Core/RCTActionSheetHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -250,7 +250,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.88.0-rc.0): + - React-Core/RCTAnimationHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -275,7 +275,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.88.0-rc.0): + - React-Core/RCTBlobHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -300,7 +300,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.88.0-rc.0): + - React-Core/RCTImageHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -325,7 +325,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.88.0-rc.0): + - React-Core/RCTLinkingHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -350,7 +350,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.88.0-rc.0): + - React-Core/RCTNetworkHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -375,7 +375,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTPushNotificationHeaders (0.88.0-rc.0): + - React-Core/RCTPushNotificationHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -400,7 +400,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.88.0-rc.0): + - React-Core/RCTSettingsHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -425,7 +425,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.88.0-rc.0): + - React-Core/RCTTextHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -450,7 +450,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.88.0-rc.0): + - React-Core/RCTVibrationHeaders (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -475,7 +475,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.88.0-rc.0): + - React-Core/RCTWebSocket (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -485,7 +485,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.0) + - React-Core/Default (= 0.88.0-rc.1) - React-cxxreact - React-featureflags - React-hermes @@ -500,7 +500,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (0.88.0-rc.0): + - React-CoreModules (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -508,11 +508,11 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 0.88.0-rc.0) - - React-Core/CoreModulesHeaders (= 0.88.0-rc.0) + - RCTTypeSafety (= 0.88.0-rc.1) + - React-Core/CoreModulesHeaders (= 0.88.0-rc.1) - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing @@ -520,12 +520,12 @@ PODS: - React-networking - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.88.0-rc.0) + - React-RCTImage (= 0.88.0-rc.1) - React-runtimeexecutor - React-utils - ReactCommon - SocketRocket - - React-cxxreact (0.88.0-rc.0): + - React-cxxreact (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -534,29 +534,29 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.0) - - React-debug (= 0.88.0-rc.0) - - React-jserrorhandler (= 0.88.0-rc.0) - - React-jsi (= 0.88.0-rc.0) + - React-callinvoker (= 0.88.0-rc.1) + - React-debug (= 0.88.0-rc.1) + - React-jserrorhandler (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.88.0-rc.0) - - React-perflogger (= 0.88.0-rc.0) + - React-logger (= 0.88.0-rc.1) + - React-perflogger (= 0.88.0-rc.1) - React-runtimeexecutor - - React-timing (= 0.88.0-rc.0) + - React-timing (= 0.88.0-rc.1) - React-utils - SocketRocket - - React-cxxstableapi (0.88.0-rc.0) - - React-debug (0.88.0-rc.0): + - React-cxxstableapi (0.88.0-rc.1) + - React-debug (0.88.0-rc.1): - React-cxxstableapi - - React-debug/debugUmbrella (= 0.88.0-rc.0) - - React-debug/redbox (= 0.88.0-rc.0) - - React-debug/debugUmbrella (0.88.0-rc.0): + - React-debug/debugUmbrella (= 0.88.0-rc.1) + - React-debug/redbox (= 0.88.0-rc.1) + - React-debug/debugUmbrella (0.88.0-rc.1): - React-cxxstableapi - - React-debug/redbox (0.88.0-rc.0): + - React-debug/redbox (0.88.0-rc.1): - React-cxxstableapi - - React-defaultsnativemodule (0.88.0-rc.0): + - React-defaultsnativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -582,7 +582,7 @@ PODS: - React-webperformancenativemodule - SocketRocket - Yoga - - React-domnativemodule (0.88.0-rc.0): + - React-domnativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -604,7 +604,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (0.88.0-rc.0): + - React-Fabric (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -620,25 +620,25 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/animated (= 0.88.0-rc.0) - - React-Fabric/animationbackend (= 0.88.0-rc.0) - - React-Fabric/animations (= 0.88.0-rc.0) - - React-Fabric/attributedstring (= 0.88.0-rc.0) - - React-Fabric/bridging (= 0.88.0-rc.0) - - React-Fabric/componentregistry (= 0.88.0-rc.0) - - React-Fabric/componentregistrynative (= 0.88.0-rc.0) - - React-Fabric/components (= 0.88.0-rc.0) - - React-Fabric/consistency (= 0.88.0-rc.0) - - React-Fabric/core (= 0.88.0-rc.0) - - React-Fabric/dom (= 0.88.0-rc.0) - - React-Fabric/imagemanager (= 0.88.0-rc.0) - - React-Fabric/leakchecker (= 0.88.0-rc.0) - - React-Fabric/mounting (= 0.88.0-rc.0) - - React-Fabric/observers (= 0.88.0-rc.0) - - React-Fabric/scheduler (= 0.88.0-rc.0) - - React-Fabric/telemetry (= 0.88.0-rc.0) - - React-Fabric/uimanager (= 0.88.0-rc.0) - - React-Fabric/viewtransition (= 0.88.0-rc.0) + - React-Fabric/animated (= 0.88.0-rc.1) + - React-Fabric/animationbackend (= 0.88.0-rc.1) + - React-Fabric/animations (= 0.88.0-rc.1) + - React-Fabric/attributedstring (= 0.88.0-rc.1) + - React-Fabric/bridging (= 0.88.0-rc.1) + - React-Fabric/componentregistry (= 0.88.0-rc.1) + - React-Fabric/componentregistrynative (= 0.88.0-rc.1) + - React-Fabric/components (= 0.88.0-rc.1) + - React-Fabric/consistency (= 0.88.0-rc.1) + - React-Fabric/core (= 0.88.0-rc.1) + - React-Fabric/dom (= 0.88.0-rc.1) + - React-Fabric/imagemanager (= 0.88.0-rc.1) + - React-Fabric/leakchecker (= 0.88.0-rc.1) + - React-Fabric/mounting (= 0.88.0-rc.1) + - React-Fabric/observers (= 0.88.0-rc.1) + - React-Fabric/scheduler (= 0.88.0-rc.1) + - React-Fabric/telemetry (= 0.88.0-rc.1) + - React-Fabric/uimanager (= 0.88.0-rc.1) + - React-Fabric/viewtransition (= 0.88.0-rc.1) - React-featureflags - React-graphics - React-jsi @@ -650,7 +650,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animated (0.88.0-rc.0): + - React-Fabric/animated (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -678,7 +678,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animationbackend (0.88.0-rc.0): + - React-Fabric/animationbackend (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -705,7 +705,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (0.88.0-rc.0): + - React-Fabric/animations (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -732,7 +732,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (0.88.0-rc.0): + - React-Fabric/attributedstring (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -759,7 +759,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/bridging (0.88.0-rc.0): + - React-Fabric/bridging (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -786,7 +786,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (0.88.0-rc.0): + - React-Fabric/componentregistry (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -813,7 +813,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (0.88.0-rc.0): + - React-Fabric/componentregistrynative (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -840,7 +840,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (0.88.0-rc.0): + - React-Fabric/components (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -856,11 +856,11 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.0) - - React-Fabric/components/root (= 0.88.0-rc.0) - - React-Fabric/components/scrollview (= 0.88.0-rc.0) - - React-Fabric/components/view (= 0.88.0-rc.0) - - React-Fabric/components/viewUmbrella (= 0.88.0-rc.0) + - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.1) + - React-Fabric/components/root (= 0.88.0-rc.1) + - React-Fabric/components/scrollview (= 0.88.0-rc.1) + - React-Fabric/components/view (= 0.88.0-rc.1) + - React-Fabric/components/viewUmbrella (= 0.88.0-rc.1) - React-featureflags - React-graphics - React-jsi @@ -872,7 +872,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.0): + - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -899,7 +899,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (0.88.0-rc.0): + - React-Fabric/components/root (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -926,7 +926,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (0.88.0-rc.0): + - React-Fabric/components/scrollview (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -953,7 +953,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (0.88.0-rc.0): + - React-Fabric/components/view (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -982,7 +982,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/components/viewUmbrella (0.88.0-rc.0): + - React-Fabric/components/viewUmbrella (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1009,7 +1009,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/consistency (0.88.0-rc.0): + - React-Fabric/consistency (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1036,7 +1036,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (0.88.0-rc.0): + - React-Fabric/core (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1063,7 +1063,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (0.88.0-rc.0): + - React-Fabric/dom (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1090,7 +1090,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (0.88.0-rc.0): + - React-Fabric/imagemanager (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1117,7 +1117,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (0.88.0-rc.0): + - React-Fabric/leakchecker (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1144,7 +1144,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (0.88.0-rc.0): + - React-Fabric/mounting (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1172,7 +1172,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (0.88.0-rc.0): + - React-Fabric/observers (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1188,10 +1188,10 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/observers/events (= 0.88.0-rc.0) - - React-Fabric/observers/intersection (= 0.88.0-rc.0) - - React-Fabric/observers/mutation (= 0.88.0-rc.0) - - React-Fabric/observers/resize (= 0.88.0-rc.0) + - React-Fabric/observers/events (= 0.88.0-rc.1) + - React-Fabric/observers/intersection (= 0.88.0-rc.1) + - React-Fabric/observers/mutation (= 0.88.0-rc.1) + - React-Fabric/observers/resize (= 0.88.0-rc.1) - React-featureflags - React-graphics - React-jsi @@ -1203,7 +1203,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (0.88.0-rc.0): + - React-Fabric/observers/events (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1230,7 +1230,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/intersection (0.88.0-rc.0): + - React-Fabric/observers/intersection (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1257,7 +1257,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/mutation (0.88.0-rc.0): + - React-Fabric/observers/mutation (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1284,7 +1284,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/resize (0.88.0-rc.0): + - React-Fabric/observers/resize (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1311,7 +1311,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (0.88.0-rc.0): + - React-Fabric/scheduler (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1343,7 +1343,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (0.88.0-rc.0): + - React-Fabric/telemetry (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1370,7 +1370,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (0.88.0-rc.0): + - React-Fabric/uimanager (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1386,7 +1386,7 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/uimanager/consistency (= 0.88.0-rc.0) + - React-Fabric/uimanager/consistency (= 0.88.0-rc.1) - React-featureflags - React-graphics - React-jsi @@ -1399,7 +1399,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (0.88.0-rc.0): + - React-Fabric/uimanager/consistency (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1427,7 +1427,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/viewtransition (0.88.0-rc.0): + - React-Fabric/viewtransition (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1454,7 +1454,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (0.88.0-rc.0): + - React-FabricComponents (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1470,8 +1470,8 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components (= 0.88.0-rc.0) - - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.0) + - React-FabricComponents/components (= 0.88.0-rc.1) + - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.1) - React-featureflags - React-graphics - React-jsi @@ -1484,7 +1484,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (0.88.0-rc.0): + - React-FabricComponents/components (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1500,16 +1500,16 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.0) - - React-FabricComponents/components/iostextinput (= 0.88.0-rc.0) - - React-FabricComponents/components/modal (= 0.88.0-rc.0) - - React-FabricComponents/components/rncore (= 0.88.0-rc.0) - - React-FabricComponents/components/safeareaview (= 0.88.0-rc.0) - - React-FabricComponents/components/switch (= 0.88.0-rc.0) - - React-FabricComponents/components/text (= 0.88.0-rc.0) - - React-FabricComponents/components/textinput (= 0.88.0-rc.0) - - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.0) - - React-FabricComponents/components/virtualview (= 0.88.0-rc.0) + - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.1) + - React-FabricComponents/components/iostextinput (= 0.88.0-rc.1) + - React-FabricComponents/components/modal (= 0.88.0-rc.1) + - React-FabricComponents/components/rncore (= 0.88.0-rc.1) + - React-FabricComponents/components/safeareaview (= 0.88.0-rc.1) + - React-FabricComponents/components/switch (= 0.88.0-rc.1) + - React-FabricComponents/components/text (= 0.88.0-rc.1) + - React-FabricComponents/components/textinput (= 0.88.0-rc.1) + - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.1) + - React-FabricComponents/components/virtualview (= 0.88.0-rc.1) - React-featureflags - React-graphics - React-jsi @@ -1522,7 +1522,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.88.0-rc.0): + - React-FabricComponents/components/inputaccessory (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1550,7 +1550,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.88.0-rc.0): + - React-FabricComponents/components/iostextinput (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1578,7 +1578,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.88.0-rc.0): + - React-FabricComponents/components/modal (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1606,7 +1606,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.88.0-rc.0): + - React-FabricComponents/components/rncore (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1634,7 +1634,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.88.0-rc.0): + - React-FabricComponents/components/safeareaview (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1662,7 +1662,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/switch (0.88.0-rc.0): + - React-FabricComponents/components/switch (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1690,7 +1690,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (0.88.0-rc.0): + - React-FabricComponents/components/text (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1718,7 +1718,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.88.0-rc.0): + - React-FabricComponents/components/textinput (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1746,7 +1746,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.88.0-rc.0): + - React-FabricComponents/components/unimplementedview (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1774,7 +1774,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (0.88.0-rc.0): + - React-FabricComponents/components/virtualview (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1802,7 +1802,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.88.0-rc.0): + - React-FabricComponents/textlayoutmanager (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1830,7 +1830,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (0.88.0-rc.0): + - React-FabricImage (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1839,22 +1839,22 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 0.88.0-rc.0) - - RCTTypeSafety (= 0.88.0-rc.0) + - RCTRequired (= 0.88.0-rc.1) + - RCTTypeSafety (= 0.88.0-rc.1) - React-cxxstableapi - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.88.0-rc.0) + - React-jsiexecutor (= 0.88.0-rc.1) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (0.88.0-rc.0): + - React-featureflags (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1863,9 +1863,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxstableapi - - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.0) + - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.1) - SocketRocket - - React-featureflags/featureflagsUmbrella (0.88.0-rc.0): + - React-featureflags/featureflagsUmbrella (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1875,7 +1875,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-featureflagsnativemodule (0.88.0-rc.0): + - React-featureflagsnativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1891,7 +1891,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (0.88.0-rc.0): + - React-graphics (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1906,7 +1906,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-hermes (0.88.0-rc.0): + - React-hermes (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1915,19 +1915,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.0) + - React-cxxreact (= 0.88.0-rc.1) - React-cxxstableapi - React-jsi - - React-jsiexecutor (= 0.88.0-rc.0) + - React-jsiexecutor (= 0.88.0-rc.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 0.88.0-rc.0) + - React-perflogger (= 0.88.0-rc.1) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (0.88.0-rc.0): + - React-idlecallbacksnativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1945,7 +1945,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (0.88.0-rc.0): + - React-ImageManager (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1961,7 +1961,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-intersectionobservernativemodule (0.88.0-rc.0): + - React-intersectionobservernativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1984,7 +1984,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-jserrorhandler (0.88.0-rc.0): + - React-jserrorhandler (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -1999,7 +1999,7 @@ PODS: - React-featureflags - React-jsi - SocketRocket - - React-jsi (0.88.0-rc.0): + - React-jsi (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2009,7 +2009,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (0.88.0-rc.0): + - React-jsiexecutor (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2031,7 +2031,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspector (0.88.0-rc.0): + - React-jsinspector (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2046,11 +2046,11 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.88.0-rc.0) + - React-perflogger (= 0.88.0-rc.1) - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspectorcdp (0.88.0-rc.0): + - React-jsinspectorcdp (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2060,7 +2060,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-jsinspectornetwork (0.88.0-rc.0): + - React-jsinspectornetwork (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2071,7 +2071,7 @@ PODS: - React-cxxstableapi - React-jsinspectorcdp - SocketRocket - - React-jsinspectortracing (0.88.0-rc.0): + - React-jsinspectortracing (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2087,7 +2087,7 @@ PODS: - React-timing - React-utils - SocketRocket - - React-jsitooling (0.88.0-rc.0): + - React-jsitooling (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2096,19 +2096,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.0) + - React-cxxreact (= 0.88.0-rc.1) - React-cxxstableapi - React-debug - - React-jsi (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.1) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - SocketRocket - - React-jsitracing (0.88.0-rc.0): + - React-jsitracing (0.88.0-rc.1): - React-jsi - - React-logger (0.88.0-rc.0): + - React-logger (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2117,7 +2117,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (0.88.0-rc.0): + - React-Mapbuffer (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2127,9 +2127,9 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - React-debug - - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.0) + - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.1) - SocketRocket - - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.0): + - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2140,7 +2140,7 @@ PODS: - React-cxxstableapi - React-debug - SocketRocket - - React-microtasksnativemodule (0.88.0-rc.0): + - React-microtasksnativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2155,7 +2155,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-mutationobservernativemodule (0.88.0-rc.0): + - React-mutationobservernativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2178,7 +2178,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-NativeModulesApple (0.88.0-rc.0): + - React-NativeModulesApple (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2199,7 +2199,7 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - React-networking (0.88.0-rc.0): + - React-networking (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2213,9 +2213,9 @@ PODS: - React-performancetimeline - React-timing - SocketRocket - - React-oscompat (0.88.0-rc.0): + - React-oscompat (0.88.0-rc.1): - React-cxxstableapi - - React-perflogger (0.88.0-rc.0): + - React-perflogger (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2224,7 +2224,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancecdpmetrics (0.88.0-rc.0): + - React-performancecdpmetrics (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2239,7 +2239,7 @@ PODS: - React-runtimeexecutor - React-timing - SocketRocket - - React-performancetimeline (0.88.0-rc.0): + - React-performancetimeline (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2254,9 +2254,9 @@ PODS: - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (0.88.0-rc.0): - - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.0) - - React-RCTAnimatedModuleProvider (0.88.0-rc.0): + - React-RCTActionSheet (0.88.0-rc.1): + - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.1) + - React-RCTAnimatedModuleProvider (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2271,7 +2271,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTAnimation (0.88.0-rc.0): + - React-RCTAnimation (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2288,7 +2288,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (0.88.0-rc.0): + - React-RCTAppDelegate (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2324,7 +2324,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (0.88.0-rc.0): + - React-RCTBlob (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2343,7 +2343,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (0.88.0-rc.0): + - React-RCTFabric (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2381,7 +2381,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.88.0-rc.0): + - React-RCTFBReactNativeSpec (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2396,10 +2396,10 @@ PODS: - React-Core - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.0) + - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.1) - ReactCommon - SocketRocket - - React-RCTFBReactNativeSpec/components (0.88.0-rc.0): + - React-RCTFBReactNativeSpec/components (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2424,7 +2424,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTImage (0.88.0-rc.0): + - React-RCTImage (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2440,14 +2440,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (0.88.0-rc.0): - - React-Core/RCTLinkingHeaders (= 0.88.0-rc.0) - - React-jsi (= 0.88.0-rc.0) + - React-RCTLinking (0.88.0-rc.1): + - React-Core/RCTLinkingHeaders (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.1) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.88.0-rc.0) - - React-RCTNetwork (0.88.0-rc.0): + - ReactCommon/turbomodule/core (= 0.88.0-rc.1) + - React-RCTNetwork (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2467,14 +2467,14 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTPushNotification (0.88.0-rc.0): + - React-RCTPushNotification (0.88.0-rc.1): - RCTTypeSafety - React-Core/RCTPushNotificationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (0.88.0-rc.0): + - React-RCTRuntime (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2496,7 +2496,7 @@ PODS: - React-RuntimeHermes - React-utils - SocketRocket - - React-RCTSettings (0.88.0-rc.0): + - React-RCTSettings (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2511,7 +2511,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTTest (0.88.0-rc.0): + - React-RCTTest (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2519,15 +2519,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-Core (= 0.88.0-rc.0) - - React-CoreModules (= 0.88.0-rc.0) - - React-jsi (= 0.88.0-rc.0) - - ReactCommon/turbomodule/core (= 0.88.0-rc.0) + - React-Core (= 0.88.0-rc.1) + - React-CoreModules (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.1) + - ReactCommon/turbomodule/core (= 0.88.0-rc.1) - SocketRocket - - React-RCTText (0.88.0-rc.0): - - React-Core/RCTTextHeaders (= 0.88.0-rc.0) + - React-RCTText (0.88.0-rc.1): + - React-Core/RCTTextHeaders (= 0.88.0-rc.1) - Yoga - - React-RCTVibration (0.88.0-rc.0): + - React-RCTVibration (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2541,11 +2541,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (0.88.0-rc.0) - - React-renderercss (0.88.0-rc.0): + - React-rendererconsistency (0.88.0-rc.1) + - React-renderercss (0.88.0-rc.1): - React-debug - React-utils - - React-rendererdebug (0.88.0-rc.0): + - React-rendererdebug (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2555,7 +2555,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-resizeobservernativemodule (0.88.0-rc.0): + - React-resizeobservernativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2579,7 +2579,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-RuntimeApple (0.88.0-rc.0): + - React-RuntimeApple (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2609,7 +2609,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (0.88.0-rc.0): + - React-RuntimeCore (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2632,7 +2632,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (0.88.0-rc.0): + - React-runtimeexecutor (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2642,10 +2642,10 @@ PODS: - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.1) - React-utils - SocketRocket - - React-RuntimeHermes (0.88.0-rc.0): + - React-RuntimeHermes (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2667,7 +2667,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-runtimescheduler (0.88.0-rc.0): + - React-runtimescheduler (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2691,14 +2691,14 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (0.88.0-rc.0): + - React-timing (0.88.0-rc.1): - React-cxxstableapi - React-debug - - React-timing/timingUmbrella (= 0.88.0-rc.0) - - React-timing/timingUmbrella (0.88.0-rc.0): + - React-timing/timingUmbrella (= 0.88.0-rc.1) + - React-timing/timingUmbrella (0.88.0-rc.1): - React-cxxstableapi - React-debug - - React-utils (0.88.0-rc.0): + - React-utils (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2708,9 +2708,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-debug - - React-jsi (= 0.88.0-rc.0) + - React-jsi (= 0.88.0-rc.1) - SocketRocket - - React-viewtransitionnativemodule (0.88.0-rc.0): + - React-viewtransitionnativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2728,7 +2728,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-webperformancenativemodule (0.88.0-rc.0): + - React-webperformancenativemodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2747,9 +2747,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - ReactAppDependencyProvider (0.88.0-rc.0): + - ReactAppDependencyProvider (0.88.0-rc.1): - ReactCodegen - - ReactCodegen (0.88.0-rc.0): + - ReactCodegen (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2775,7 +2775,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (0.88.0-rc.0): + - ReactCommon (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2783,9 +2783,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 0.88.0-rc.0) + - ReactCommon/turbomodule (= 0.88.0-rc.1) - SocketRocket - - ReactCommon-Samples (0.88.0-rc.0): + - ReactCommon-Samples (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2802,7 +2802,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - ReactCommon/turbomodule (0.88.0-rc.0): + - ReactCommon/turbomodule (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2811,13 +2811,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.0) - - React-jsi (= 0.88.0-rc.0) - - React-logger (= 0.88.0-rc.0) - - React-perflogger (= 0.88.0-rc.0) - - ReactCommon/turbomodule/core (= 0.88.0-rc.0) + - React-callinvoker (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.1) + - React-logger (= 0.88.0-rc.1) + - React-perflogger (= 0.88.0-rc.1) + - ReactCommon/turbomodule/core (= 0.88.0-rc.1) - SocketRocket - - ReactCommon/turbomodule/core (0.88.0-rc.0): + - ReactCommon/turbomodule/core (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -2827,16 +2827,16 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging - - React-callinvoker (= 0.88.0-rc.0) - - React-cxxreact (= 0.88.0-rc.0) - - React-debug (= 0.88.0-rc.0) - - React-featureflags (= 0.88.0-rc.0) - - React-jsi (= 0.88.0-rc.0) - - React-logger (= 0.88.0-rc.0) - - React-perflogger (= 0.88.0-rc.0) - - React-utils (= 0.88.0-rc.0) + - React-callinvoker (= 0.88.0-rc.1) + - React-cxxreact (= 0.88.0-rc.1) + - React-debug (= 0.88.0-rc.1) + - React-featureflags (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.1) + - React-logger (= 0.88.0-rc.1) + - React-perflogger (= 0.88.0-rc.1) + - React-utils (= 0.88.0-rc.1) - SocketRocket - - ScreenshotManager (0.88.0-rc.0): + - ScreenshotManager (0.88.0-rc.1): - boost - DoubleConversion - fast_float @@ -3152,94 +3152,94 @@ SPEC CHECKSUMS: boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: 3bfb058a0984bc787b7be62860fbaf9a6c11dd5b + FBLazyVector: 5cf5541cab4664463215430a132c4f7302cf3703 fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 - hermes-engine: de60f3b807b4b2d235f43de6d8a160090e56e2a7 - MyNativeView: 43d523206679b3008c716ba493e1a3129e343ca3 - NativeCxxModuleExample: 8af298f840f0ca089185ba733d65aef39aeaff3b + hermes-engine: 7e5f90072b91f62ead9584eebdced74fa9c742a0 + MyNativeView: b03c75f8362bb81809cbbdbcf1e81830aaa8788b + NativeCxxModuleExample: 3112c0a02b40706ca126f9cb77fdd388d449dc6c OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b - RCTDeprecation: 8d49dedf0800fbe6e127334ca4ea62c3fa39359e - RCTRequired: d0f85c4fbf2e762af6f25b943ad65198aaeb852f - RCTSwiftUI: a0d6c65b3da0decf21808a79dc0e1271f2653452 - RCTSwiftUIWrapper: 9c5a0ce6e3a562573a0f877e30306a83a953ee62 - RCTTypeSafety: 4a05f6bd4c57f141ac06b5a7850b2be3597cc306 - React: 0b93f1aed1e7f5e67857b4867fb33ecf013d5848 - React-bridging: 32dad710673d47740690ade2f6fdc73d32f7c3aa - React-callinvoker: a747804091c845cf997834fbf967291fecec32be - React-Core: db5581440be1d8824bfdf7e183600a9a0814a743 - React-CoreModules: 09bb76a32b3042369c68af108bc349db53336a37 - React-cxxreact: 6093056fdc1b245c10f4e39f08321a4e65ae7e30 - React-cxxstableapi: 70ae951e80a26756f72a688ac9fe946bab3abaf9 - React-debug: 991aa832e6351674e84d08038a213d03f4fd9245 - React-defaultsnativemodule: a62fe7e4d778ce5c1a066cb9506f25ef1cf6ee58 - React-domnativemodule: b97b4cf1d3d0865b19bb639952185d0d73d5e19c - React-Fabric: 1d2950740c3eb33938c1f328eadcd5518c410bfb - React-FabricComponents: 266c5f502400f2c24ed00814b801901c790ff2b4 - React-FabricImage: 720da45137eaa6c4f82b9c5da8e7055177cb1884 - React-featureflags: 1737c7734c506ab1bf2d68db946d5fb2b0c41fbe - React-featureflagsnativemodule: 801e12dcbddd3efede4a4416d1d0b6126c2a3c18 - React-graphics: 73fa384743afccdb83b90e800d514604d7063c8c - React-hermes: 3f5b1caff5a7e3ff21fcfb9d3bf54db31125c91b - React-idlecallbacksnativemodule: 985947f4d0f8daf532e53c5fe045b26131a9d59e - React-ImageManager: 3f5f7a700fcabb4e651e6825b6465db5e6731ea3 - React-intersectionobservernativemodule: f488a77978938cb1468cc57fc86dd867e8f9217c - React-jserrorhandler: 6d82ba0b79f0266d36c1546aa78998a9e3861449 - React-jsi: 8d5b8d37722bb63cba6040e33673ba22c0d12d5a - React-jsiexecutor: 8263ea05910bd75ca7e0121f713defac37fe4ee3 - React-jsinspector: 14f2a768e1a25c4fad02737df6bf13f373070f82 - React-jsinspectorcdp: 0dbbca735fb4a4ec82820eaa87f49f70c8eeefaf - React-jsinspectornetwork: b4198517ed2ad217942715e6f6bb5ae4759bf504 - React-jsinspectortracing: 45200b640ab803236c2272ed800cf3cd6138a06a - React-jsitooling: 48733becb95bf1668c26460e67afb7072f1cb967 - React-jsitracing: ad56a8f1b8fe13590aa30d75583a57a02723d610 - React-logger: 8d645b8a6d65f078c5d4ba164e74bdaf071fbd72 - React-Mapbuffer: 48eeef876470e330de42fd49aa387cbe6941f05d - React-microtasksnativemodule: b2651537413b751ec34632488a160ab2316903fe - React-mutationobservernativemodule: a6bf91d66aabe2c137e852ea648372350698102e - React-NativeModulesApple: 6399a4dd765a725a9fdba2673101b71634d7efb9 - React-networking: 5c3dd60edb2766749875a298d460ae899afd009f - React-oscompat: 1346cde36e1d0d009b49449a67a111c3e7583de8 - React-perflogger: 0d5e56b4d6126ad806c80a0da5a742c648332357 - React-performancecdpmetrics: 4fa397bd2d96d0b4c5cb831affadbd3fce561ad8 - React-performancetimeline: 4c98658f82d83881b8db5dc34658bed9bb1d4e20 - React-RCTActionSheet: 339a417639be325f38231d0008faed959fb1c7d6 - React-RCTAnimatedModuleProvider: 1dc4b618edf81f154d04a693d8e5272267097700 - React-RCTAnimation: ea22e973c87e7c4482084b66ae0585139601df50 - React-RCTAppDelegate: 1bbb1f8a1849e4c69c431fdc1d1622f6e45dd8a7 - React-RCTBlob: bbb3041aa6c5f8f8b64d460c621e3fd5f2832c56 - React-RCTFabric: a483ff9f127dd1dbe04786f615bf5544e8b6d657 - React-RCTFBReactNativeSpec: 8efa8546844e96f506d18642e2cd07d97e59fa24 - React-RCTImage: 902bcde00fff12c616a8c0386c99e072c15501a7 - React-RCTLinking: 4b726d66cf68dc27913753315284cc9b9e898bca - React-RCTNetwork: c01e6c19d024c79506c7744a500f03f0b2e35c12 - React-RCTPushNotification: 9d1a33ac33934d1f0a7b113d161e88213dead797 - React-RCTRuntime: 2524bde956d1abb23417e4ccad2e131489142987 - React-RCTSettings: a5ca27e5017d181ed9e9ddfd6dc7ddde2aea22cd - React-RCTTest: 0544ca13fafd425ea8b3036145dfb256ef97a6c1 - React-RCTText: fa1b884171f6a39067f76406ed691ba7ec43c6bb - React-RCTVibration: a7c10c8f228b0fd33c4a2205e963e2cd758ba86b - React-rendererconsistency: 9951d4518c1119fb1cacaa726d99209f28005488 - React-renderercss: fb913350e1b5ad9674f3fcc0528c0848695d6e13 - React-rendererdebug: f6c59faaaa3b6e973606d0caf3b49440faa626ab - React-resizeobservernativemodule: bb78c7f19173aeda91ab64ec620c410195040637 - React-RuntimeApple: 101728e68e48d2bc368b75b11af16487a29a3169 - React-RuntimeCore: 3a79a2cfabcaa96adf9b3427c69a42e6a22e377e - React-runtimeexecutor: d6f016527b25232c5d67e481b5adb0dedabb18d2 - React-RuntimeHermes: 498e776fc4256f89a5fe943a317c76c121104ece - React-runtimescheduler: 64fa54648b5e98d53b065ed2a4f273cf3f050785 - React-timing: d05f490866ea9ecd4a006940cc7c9202e8f95c8c - React-utils: 62b6647db0c18a4e4b1996d569eb9ec73c4cc582 - React-viewtransitionnativemodule: 2184b1e87705428f1ccca98852f87a7045889f00 - React-webperformancenativemodule: d1015b6f14db99fd70e05f813368523131fbdb0c - ReactAppDependencyProvider: 227e7f2d3c01ad3cfadc024347f94ac92d5aac96 - ReactCodegen: 27596f320e7f3d6f27ec1ee20e179135bc45aa71 - ReactCommon: 1781fb0054234c76a4af393b9bb8b40acfd259fb - ReactCommon-Samples: 6e2c90eaeba4feefda6f15d71f23f504ea3c8e25 - ScreenshotManager: 1d29871265a83ff722f6cc4ed7a815cdb3d185e5 + RCTDeprecation: 509a258e5ead39237fd7467ef1e08f1ca1c71392 + RCTRequired: 56ca3269ba39440e601d6e312cf54cc3e70d5be9 + RCTSwiftUI: 0c85d072b66bb2e77f802ed88f17fdc10cb6547a + RCTSwiftUIWrapper: 1b1ffc373e91646e2e9ba5111f2a7c88a74a6ad9 + RCTTypeSafety: 9968856c94499c6ec472d8681f101b29ee3d617d + React: 720e5e4c8b8ea2538b2b72d040837f9ca8c69684 + React-bridging: b120f4efe5e2eeff259c7f82f415b77d5173a6e6 + React-callinvoker: dee452809b8cd56e79158a104505ec83b7196e1d + React-Core: 054415adf7b3258dcd21f1cbe8b3d9ff05a70c76 + React-CoreModules: 73890d660240a12e56d4ac634576b0446e6938a9 + React-cxxreact: b032db636573a9bbe9d537baac0e1afee4ee1673 + React-cxxstableapi: 8a2c2cad99eb3656acce29e90ef4fca7fe4b3da2 + React-debug: 6bbe669be29fe6361dcd0e7aa0e79ea4aa4853fb + React-defaultsnativemodule: e2c64ab354467dc05323a39bb6553c9e3890a8b5 + React-domnativemodule: ad4b7a671638739ea39ba391ed66752bd0eccd00 + React-Fabric: 638e594364461de83915dcd972cc880401a3657b + React-FabricComponents: 10870813fbd088120a25998aa332f292666d4fac + React-FabricImage: b11bab4cd575c2f06542f0aa4f63c8f084ad228e + React-featureflags: 3e0ddc2abb66eaf6594f4613bd8ff0fc7dda0db5 + React-featureflagsnativemodule: b92a687582575b002029fa59ec993204c36a38e9 + React-graphics: 84dbc47b412db7d5720e2632456022f5cafa8b0d + React-hermes: 1f5ab6a09b26a4526b4599d4576e3359c22c357a + React-idlecallbacksnativemodule: ff8c7a7904f426c4bfc304a4d61d55682b58434e + React-ImageManager: 7c2dc26b482c94c15683cedd152cc8ed94ecaa23 + React-intersectionobservernativemodule: 627ae4e9e63150fe4ed85630a8584ee6f1508c8e + React-jserrorhandler: ce9079610a77fec09ed9e305905699a4f3395420 + React-jsi: 85fcd085ef0e080d4c44b2e837170be66bec76a3 + React-jsiexecutor: 5adae1070de02f645026b635608d4f9d53e0154a + React-jsinspector: 92e22fa9ae57d6cf71788e56254e01e5fa660436 + React-jsinspectorcdp: 08baeed91c92e9531910a7bb568b00009b887cca + React-jsinspectornetwork: 512cdde31956d2a7c3848fd1d8f3762a4eb235c2 + React-jsinspectortracing: 507c8d5092efae0b46b0d0f3567d8f9b725b7f00 + React-jsitooling: 8cc70ffd831dc4b05bee57c245014044b7b35990 + React-jsitracing: 20c4cfe55e9d91943f98ca387b840affd90dc3d3 + React-logger: ca978a2b56dfc550c0cddd106e5aa69c9c05e400 + React-Mapbuffer: 273ea377295e70a2471d8bbc49b0ed9c775776a4 + React-microtasksnativemodule: 651580fa9240b5a7556e8f7375f0b3039db6f905 + React-mutationobservernativemodule: 0b20f439acb819ee9a96b8f5b43e12534fa58c1b + React-NativeModulesApple: c1b4df15c52275d8d966bfeb7ef876b1b355c8c5 + React-networking: a8759a9d67f6fe6871965bbe7b27ee3e9992be05 + React-oscompat: fc14afbfd1fa9bce7d55361543328e3dd0b21e9d + React-perflogger: f1b3b7d105daad59ace46948e6a4e3e9ef5342eb + React-performancecdpmetrics: de4e728c3cf8e0e7d6449dcaae50513502e32254 + React-performancetimeline: f285e99eaf8df19d5ef73f4b0058e02db6fc09f8 + React-RCTActionSheet: 43dca5c1cef7d7b368014d30d6c01d23e15f2f77 + React-RCTAnimatedModuleProvider: 0f44008317bef05bb1cc54e090d40dc8deb201c0 + React-RCTAnimation: 708c0c05d7a32618dd58ab61fc3ea18f029fcb70 + React-RCTAppDelegate: 5d6edeb76e0d2bdd9fd090082944b148dff75f7b + React-RCTBlob: 9c010b6398872bfe0c0f83c290e68a9523a704f6 + React-RCTFabric: 59ae77e3536afb5ac74f39633f304fa286d5b7ad + React-RCTFBReactNativeSpec: 25d168f60fd6c48ca786d66cd44157c667a02f17 + React-RCTImage: fd56798b7ec0630a24ca35a5428193bca1093786 + React-RCTLinking: ef844c6ed8ec01914babe93b0e241b5bc55a399b + React-RCTNetwork: a0e6b82c2b783d219a5eb50892c29601d77d64b6 + React-RCTPushNotification: 0b9c4bd8f604816ccb3d3003c0dc44f86f4546ab + React-RCTRuntime: 40481e925780976cfe54e04605bf3448aa3ab6f7 + React-RCTSettings: 064b780b96bc622aea3200b92365955ffc1ffa12 + React-RCTTest: 4284bac77740a284b2ceb767e815e74fbe7e043f + React-RCTText: 69676af079f693ae40c93fd60758aabc6d8663a4 + React-RCTVibration: 31a03c1c66521f98a0dcc8673cf4503aa36025c2 + React-rendererconsistency: d1a9b6f55ccc6fdf8aedf09726c0a5a92b891aa9 + React-renderercss: 8bff3cf822fcb420993d81c79823c040c80ad9a5 + React-rendererdebug: 8d0ebaf605737091028aca38f41129cc66749ed6 + React-resizeobservernativemodule: bb5bfc85faf76b509b9746fe954733ec0756f60d + React-RuntimeApple: 3c04f9ad6107c7a9d100ea8420fde67dec686598 + React-RuntimeCore: 95391105a498cc0a9752a99146c3680c85bd8089 + React-runtimeexecutor: 143ab947b35d98dd3f89cbafe9605dbd04ad8e62 + React-RuntimeHermes: c8fd62030204eb1fb544e68f0566bdfc372c29e0 + React-runtimescheduler: eba89374d973248cac6e3857eaa3aa17ac004e69 + React-timing: 759385b32943b2c081b729c9e328be8cafc6b419 + React-utils: 391da1bd3d48891b458617ffeff9d9fa742aeb32 + React-viewtransitionnativemodule: f1638316a07ad429c6e8fe286d6415c994462aa5 + React-webperformancenativemodule: dc8f090943aa3867f7d5263670ea5eee375fe0a3 + ReactAppDependencyProvider: b834b007d075e546a9525f4aae771ac261415264 + ReactCodegen: 2a0b4d1dcab8b1f4d9575cf1bb887cf4c15eff10 + ReactCommon: e975689126af163523e74027294b60bc3a42d6d7 + ReactCommon-Samples: d9416107477e744439dc0280cce9b1475fdeb9f2 + ScreenshotManager: 703d512b720e1cb04bf1738bd76bd1cbe26a07f2 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 8d06fb4b6e06edd49bd0a19b7c4486fc72db0842 + Yoga: 3df102dba5effb5f50dbe6efce7d19bd1003a279 PODFILE CHECKSUM: 59f1e7d58cffbfafbeb3df31151743dd4c9a52e8 From 579212e15c9197d6c614cfeb4561e4a85956ee3b Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Wed, 16 Sep 2026 13:36:44 +0100 Subject: [PATCH 17/35] Restore .js fallback for legacy deep imports of untyped modules Relocating the hand-written declarations under types_DEPRECATED/ (#57513) changed where the react-native-legacy-deep-imports export condition points for ./Libraries/*. It used to resolve to ./Libraries/*.d.ts, beside the real .js, so TypeScript's extension substitution still found modules with no hand-written declaration. It now resolves into types_DEPRECATED/, which contains no .js files, so those specifiers stop resolving. Reported against 0.88.0-rc.0 with react-native/Libraries/Core/InitializeCore. Add the old location as a second entry so the condition falls back to it. Modules that do have a declaration keep resolving to types_DEPRECATED/ because that entry is still first. This is applied to 0.88-stable only. 0.88 is a non-breaking release, so the regression must not ship in it. main intentionally keeps the current behaviour pending a deliberate decision on retiring deep imports. --- packages/react-native/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 292a7e7b7164..78885480ced9 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -34,7 +34,10 @@ "default": "./index.js" }, "./Libraries/*": { - "react-native-legacy-deep-imports": "./types_DEPRECATED/Libraries/*.d.ts", + "react-native-legacy-deep-imports": [ + "./types_DEPRECATED/Libraries/*.d.ts", + "./Libraries/*.d.ts" + ], "types": null, "default": "./Libraries/*.js" }, From f2439a83cffc8f2bf8355a984a055ae7174bb4d9 Mon Sep 17 00:00:00 2001 From: Rob Hogan Date: Wed, 16 Sep 2026 11:45:33 +0100 Subject: [PATCH 18/35] [0.88][LOCAL] Bump Metro minimum to 0.87.1 ## Summary: Bump minimum Metro version to 0.87.1, within the same semver range, to ensure upgraders get the same version as fresh projects would. Mostly fixes, including a couple of `Platform` inlining corrections. It also replaces the `image-size` dependency to clear CVE alerts. Metro release notes: https://github.com/react/metro/releases/tag/v0.87.1 ## Changelog: [General] [Changed] - Bump Metro minimum to 0.87.1 ## Test Plan: ``` yarn install --frozen-lockfile --ignore-scripts yarn flow-check yarn test packages/metro-config packages/community-cli-plugin packages/dev-middleware ``` (cherry picked from commit 18a22b1d594924443908aa2f82c33b1a364d0bc1) --- package.json | 4 +- packages/community-cli-plugin/package.json | 4 +- packages/metro-config/package.json | 4 +- packages/react-native/package.json | 4 +- private/core-cli-utils/package.json | 2 +- yarn.lock | 249 +++++++++------------ 6 files changed, 119 insertions(+), 148 deletions(-) diff --git a/package.json b/package.json index dd896033ab6c..2bfa31eca163 100644 --- a/package.json +++ b/package.json @@ -102,8 +102,8 @@ "markdownlint-cli2": "^0.17.2", "markdownlint-rule-relative-links": "^3.0.0", "memfs": "^4.38.2", - "metro-babel-register": "^0.87.0", - "metro-transform-plugins": "^0.87.0", + "metro-babel-register": "^0.87.1", + "metro-transform-plugins": "^0.87.1", "micromatch": "^4.0.4", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index 085ba87d1a23..facfd5f6da7e 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -36,11 +36,11 @@ "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.87.0", + "metro": "^0.87.1", "semver": "^7.1.3" }, "devDependencies": { - "metro-resolver": "^0.87.0" + "metro-resolver": "^0.87.1" }, "peerDependencies": { "@react-native-community/cli": "*", diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index aee2f8c27450..69611e457290 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -37,7 +37,7 @@ "dependencies": { "@react-native/js-polyfills": "0.88.0-rc.1", "@react-native/metro-babel-transformer": "0.88.0-rc.1", - "metro-config": "^0.87.0", - "metro-runtime": "^0.87.0" + "metro-config": "^0.87.1", + "metro-runtime": "^0.87.1" } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 78885480ced9..eea6d438b306 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -168,8 +168,8 @@ "hermes-compiler": "260318099.0.3", "invariant": "^2.2.4", "memoize-one": "^5.0.0", - "metro-runtime": "^0.87.0", - "metro-source-map": "^0.87.0", + "metro-runtime": "^0.87.1", + "metro-source-map": "^0.87.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", diff --git a/private/core-cli-utils/package.json b/private/core-cli-utils/package.json index 00d5dc76338f..eb4c0437f21e 100644 --- a/private/core-cli-utils/package.json +++ b/private/core-cli-utils/package.json @@ -11,7 +11,7 @@ "./version.js": "./src/public/version.js" }, "dependencies": { - "metro-babel-register": "^0.87.0" + "metro-babel-register": "^0.87.1" }, "devDependencies": {}, "engines": { diff --git a/yarn.lock b/yarn.lock index 183603a019e1..9efd5b530dd0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3043,13 +3043,6 @@ babel-plugin-replace-ts-export-assignment@^0.0.2: resolved "https://registry.yarnpkg.com/babel-plugin-replace-ts-export-assignment/-/babel-plugin-replace-ts-export-assignment-0.0.2.tgz#927a30ba303fcf271108980a8d4f80a693e1d53f" integrity sha512-BiTEG2Ro+O1spuheL5nB289y37FFmz0ISE6GjpNCG2JuA/WNcuEHSYw01+vN8quGf208sID3FnZFDwVyqX18YQ== -babel-plugin-syntax-hermes-parser@0.36.1: - version "0.36.1" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.36.1.tgz#970277618fbec67b400bf8b01e4f61ba96ef5a40" - integrity sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA== - dependencies: - hermes-parser "0.36.1" - babel-plugin-transform-define@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.1.4.tgz#8f7088211176a55a72788d584ceea9f691a021c1" @@ -3302,11 +3295,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -4811,6 +4799,11 @@ flow-estree@0.327.0: resolved "https://registry.yarnpkg.com/flow-estree/-/flow-estree-0.327.0.tgz#59c1b87cc6c5dd7ad195ac059e9f8efa6c28c2df" integrity sha512-f9vK751YUzD0qaHSpKc5/qQM6gqOlgGS+4ZRqTNcZOpVqn3mC55yEQ6dUG2K1eaVm5FbKkz9CFWe6XNvrkQFQg== +flow-estree@0.331.0: + version "0.331.0" + resolved "https://registry.yarnpkg.com/flow-estree/-/flow-estree-0.331.0.tgz#4069f6b5e86337805413ee511d785753a015ceaa" + integrity sha512-FVLYkSL/ITb/QXBEQvNWPjPooRGswuUtGOwrH+puSlMDneNkxy640+FZsk/TfKL+b7Wbw/Fg9FTUv2bMQDpj2w== + flow-parser@0.327.0: version "0.327.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.327.0.tgz#05ab7e7ab6304a992a151cc89faf9111d89d8596" @@ -4818,6 +4811,13 @@ flow-parser@0.327.0: dependencies: flow-estree "0.327.0" +flow-parser@0.331.0: + version "0.331.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.331.0.tgz#d4b1ff0026930fb82788b02173449efd5e7b25c0" + integrity sha512-vEZcHIlnKeN8JSVtYFczj8sWJfHIJOkz+YG00O/oul/Bete+t1ZhTi+O6JRRLFYvGW+yJkZ0YgL16iStnbkUqQ== + dependencies: + flow-estree "0.331.0" + flow-remove-types@^2.237.2: version "2.259.1" resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-2.259.1.tgz#ee78962cbd73d85f0e94183b354c43399903c734" @@ -5170,11 +5170,6 @@ hermes-estree@0.25.1: resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== -hermes-estree@0.36.1: - version "0.36.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.36.1.tgz#71368d9e78238728e11ef1f458a8921d0564a572" - integrity sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw== - 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" @@ -5182,13 +5177,6 @@ hermes-parser@0.25.1, hermes-parser@^0.25.1: dependencies: hermes-estree "0.25.1" -hermes-parser@0.36.1: - version "0.36.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.36.1.tgz#f619b9f99bf34e80fb6f7024b1c62944d2beb14a" - integrity sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ== - dependencies: - hermes-estree "0.36.1" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -5263,13 +5251,6 @@ ignore@^7.0.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== -image-size@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" - integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== - dependencies: - queue "6.0.2" - import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -5304,7 +5285,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6664,10 +6645,10 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -metro-babel-register@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.87.0.tgz#2f8ed5b08dd60128bd16ba3e2166074d4f84e608" - integrity sha512-rEzGQGCjkiLEruObdJRN9pLxTQHbbWcUdiM5GVGLNBx7ux5SnIhRyQb5xqXEwNL2fAmf1GjEI01SFhV0EB12AQ== +metro-babel-register@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.87.1.tgz#c5d2ff33937c3451221e4137b3dbdf07e8858611" + integrity sha512-53Z33SmvumMoQNPYuPoY79AEjYC4Y/oX4X3eWWZepjIy6mgAYs54T4Mi1utG3fBOFLeCwCGv0SLC04d/qo/oAw== dependencies: "@babel/core" "^7.25.2" "@babel/plugin-proposal-export-namespace-from" "^7.18.9" @@ -6676,65 +6657,65 @@ metro-babel-register@^0.87.0: "@babel/preset-typescript" "^7.24.7" "@babel/register" "^7.24.6" babel-plugin-replace-ts-export-assignment "^0.0.2" - babel-plugin-syntax-hermes-parser "0.36.1" babel-plugin-transform-flow-enums "^0.0.2" escape-string-regexp "^1.0.5" flow-enums-runtime "^0.0.6" + flow-parser "0.331.0" -metro-babel-transformer@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.87.0.tgz#90f32240050185fcaecdc9949923922de48b6543" - integrity sha512-IEn1K1FyY4J1sA5y6zqDjf2OkfmpTEqhZOeP6MJX8HepSW0cuHGw1m8bYOdv2adkG3XUE9dtM0csUs0gP/Xa5w== +metro-babel-transformer@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.87.1.tgz#971435c8cdee9b3ed37e6fcdcc3c82ad9c313e6c" + integrity sha512-orvRIGpb0yK1yMbk5YP3dhVKjmoxUkRB9fdltGJxNppEqus/1tFpNuf9KnGFR3Qjg0izoUrJ4z6WgoBvdkXPrA== dependencies: "@babel/core" "^7.25.2" flow-enums-runtime "^0.0.6" - hermes-parser "0.36.1" - metro-cache-key "0.87.0" + flow-parser "0.331.0" + metro-cache-key "0.87.1" nullthrows "^1.1.1" -metro-cache-key@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.87.0.tgz#800534d5aa5dfadf5f6b0d78ea2dc8a03fbbbb24" - integrity sha512-Q+MPt6jl0zQogr4Q02WaJK6HY+GtE5A0nzj8kIV1Owgrx6OMNvm6scPTr1SM/R4LpCE8EH/Y5qfbXQ84GHTr0Q== +metro-cache-key@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.87.1.tgz#8b9740b6dd663f836bcb7f354889c8c3f9e07a44" + integrity sha512-scqVVPMA2c+RVO12I3wyMDp5xCkRPLsyrcG4Qc3xfU5JR0EW/0sz2tjty+5UjMUtG09uiM1KYQ8HjWg7OQXHtw== dependencies: flow-enums-runtime "^0.0.6" -metro-cache@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.87.0.tgz#23eddf1e61c034e05e616256565d45d96520e673" - integrity sha512-146vS1BMSKcp99jddOhFBfHwzUEWN35NrsnSJDF2sQQ0ZT5OsBcOjd574PM233TWEZISRJ5DOK+vokD+1ubx+w== +metro-cache@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.87.1.tgz#b5b9092e53b256847b3cba8b54c60600a165feb4" + integrity sha512-juNPaj0Xi5tkLp8imXqvbSnEIijwKG36m7OiFFVJMqEkiURwAjkMFVek3/xpix1+LVQqO7kjVp3PvuvIM61mKQ== dependencies: exponential-backoff "^3.1.1" flow-enums-runtime "^0.0.6" https-proxy-agent "^7.0.5" - metro-core "0.87.0" + metro-core "0.87.1" -metro-config@0.87.0, metro-config@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.87.0.tgz#5559e1ed872b709ba8cc66464d020ca996019d72" - integrity sha512-yZ9QAIzWH9MxwrzwRlX/CBGRWOT14l7klSDYg8hdtSdnoUs5A7MQRdHE2KB9iHVzGQW5wgWM5aXJswNeWbSQPA== +metro-config@0.87.1, metro-config@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.87.1.tgz#9d07992d928052db0fac5db5955ee989b035730a" + integrity sha512-NmkDlc/qZAdo5gTkVTuO2AKE/khemRKRH5IA+SKfqUBJigI5GqZ5TOXhmEokhlkAqzjt8dyzKhzI6FHvXoXaTQ== dependencies: connect "^3.6.5" flow-enums-runtime "^0.0.6" jest-validate "^29.7.0" - metro "0.87.0" - metro-cache "0.87.0" - metro-core "0.87.0" - metro-runtime "0.87.0" + metro "0.87.1" + metro-cache "0.87.1" + metro-core "0.87.1" + metro-runtime "0.87.1" -metro-core@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.87.0.tgz#97b3f4e4c3f5a0caf533a83a2000ac9fbbca1260" - integrity sha512-yW57+pCOHRC/CJZ99GA2PTd+30dORwDAjUPRCokj91IWW5In9Jwtt2FB5wACrGO8P0GHTyVHdTwDNyZsNndUbA== +metro-core@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.87.1.tgz#8e9864fa6368d93afa79313c7c5e1593f99e3649" + integrity sha512-xizzky/4+c/Mkznege8OW05j7bSdM39VPoEps61Se4+hf32UQujmbvLvIE9+UnP6kNEPVomk0Fw8NsBK9iRQmw== dependencies: flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.87.0" + metro-resolver "0.87.1" -metro-file-map@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.87.0.tgz#7ff958b189ea6cc67325c611cd897c5dc1d92be9" - integrity sha512-Dc57t8jsINwA90bbVlqaeDlxf1rVGgj5SmOEnOMbaHNUM/HCYYTJxPV8SRdOBwh7qTz/biO9vaQvBTjRBgbbsg== +metro-file-map@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.87.1.tgz#91ed728cc237beb4065bc3f62581ef5836d4cced" + integrity sha512-9sPuNCojC3pS4vj+ZPY7FXmHGpdJeckXuKXQrDAfJvZc60AF8owRFTkI8XdwlwrmPIB2w++KraK9FMEXvC4wJw== dependencies: debug "^4.4.0" fb-watchman "^2.0.0" @@ -6744,62 +6725,61 @@ metro-file-map@0.87.0: jest-worker "^29.7.0" micromatch "^4.0.4" nullthrows "^1.1.1" - walker "^1.0.7" -metro-minify-terser@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.87.0.tgz#2573f9bb7270ffdf88827116b0c083ea79aa28e7" - integrity sha512-tPa0O983PDutFu3LXbArRH5NduogcKrvW6fs9VHhksTKUA1iqDyoD1ZSj/Me52xJ6T9/9pOwIVyj9ulKc/zMkg== +metro-minify-terser@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.87.1.tgz#165b48f5590b6fad1c996593216695d57185f140" + integrity sha512-YK4k1oO1wV48hfE+Nbw2rJCnAgeabzrgT/xH5ha5n9gbK4p3HYFC898cERUiyTl9vRh58CNTiXRc88f7y6PfKg== dependencies: flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-resolver@0.87.0, metro-resolver@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.87.0.tgz#0ee08fb3ab126fe75e563a0969b57e568b3d4ed1" - integrity sha512-Xl3M9R3KToaHJvXlI2lSOxtYHitzxite+195DSi00HL9PcS7Xik5+3xlRjfkKb3FA86SZxYPj+WJwlcfgaZoxg== +metro-resolver@0.87.1, metro-resolver@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.87.1.tgz#3e7a22a0eee060a53c4c4d34d5b4d7b76e543f21" + integrity sha512-FXH/brY69wT6sPxaSW8BhMmDGD/6irmBr/cL4rUi+VWwqR3pbvdcfUOfyjcHucgQ7pe5IW3xJY21eHKLVKNumQ== dependencies: flow-enums-runtime "^0.0.6" -metro-runtime@0.87.0, metro-runtime@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.87.0.tgz#859f36f34a9867a1d3c35f18a73280b23593f249" - integrity sha512-XsXZkgEwI0ZMYSBfvOMAbenzwa60XlObXJ27g6/Khgrz9ESbiBbAsd7hR62G2jRBYOhGAzG61Gk22dpRJj/mdw== +metro-runtime@0.87.1, metro-runtime@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.87.1.tgz#fbb12f4643ddea65e0fc58a16b64c5cf388c1202" + integrity sha512-kjeuSvInsM6OzBjkCQsWxnkrKZFMKtnkCl38oXWRI9lDGs2L9hGs9Tak9sQYJ9h3gtDujneB7wZio+irgqJKDw== dependencies: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-source-map@0.87.0, metro-source-map@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.87.0.tgz#d8b9b101502d0a3c3f792b64571952e7efb5791e" - integrity sha512-31BrYqu1c2co93rF1LN9Pw+7g+BrfDyxJkNQWrYm+pfA/+eVYVumF7tFMHbXLePLmHfhvSgVvbK6su1Oyiw1ng== +metro-source-map@0.87.1, metro-source-map@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.87.1.tgz#005b6d25a33ab3efac274d48a5e323469b8abdf6" + integrity sha512-Bqpm0PBGdy53pigIJb4HRF7QxD2pUOdgSmVh/4AWbP635kSCv+Y6ltVxUZgSnzS/QbSmzyCGijmRPlXMj2/qHw== dependencies: "@babel/traverse" "^7.29.0" "@babel/types" "^7.29.0" flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.87.0" + metro-symbolicate "0.87.1" nullthrows "^1.1.1" - ob1 "0.87.0" + ob1 "0.87.1" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.87.0.tgz#fc0ed2408f52eda855e47cc6d65f0f98ad4a31a4" - integrity sha512-uOpTxAXu74N+RSujUZ78L6gjI6bDdnz6XuW+AIUNuubZDEQPIpaX0StzIb0GMeQWP6zfHOHwFrWPP5Iquu1GXw== +metro-symbolicate@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.87.1.tgz#aa19d3d0a20fc33005136bdd6ce8a63832b12d62" + integrity sha512-rcGvwabrg0lbXGRGRKl14PY3My3+dkno2jZYhdJEuH2DmjTtTkV5bYwgto4JtV/Lbe+sXE6GO1UGg654430uow== dependencies: flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.87.0" + metro-source-map "0.87.1" nullthrows "^1.1.1" source-map "^0.5.6" vlq "^1.0.0" -metro-transform-plugins@0.87.0, metro-transform-plugins@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.87.0.tgz#79003ea1861fd8224ba3ac2c21f3f2700eb6c62e" - integrity sha512-i8keUe9+BaSwMuQM26DGheElCpTtflAKIrSwJAm8ZsgDb50RAUQus+e6zt2suaJXJ1OxZa7vqgtqoZxdniM6Fw== +metro-transform-plugins@0.87.1, metro-transform-plugins@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.87.1.tgz#966466af59da109cca5a010b152f285502c37e76" + integrity sha512-qMiJ/x+VfqumFJJSefKS6nj8uojzC29b2/aK8vlMuFABIqGjDucICEOXd2Yt6k/XMFAgAcaJvShUOT0HLyYaPw== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.29.1" @@ -6808,29 +6788,29 @@ metro-transform-plugins@0.87.0, metro-transform-plugins@^0.87.0: flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-worker@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.87.0.tgz#38e8d4cf110d881d52b99c70a49fde887e8e2ef7" - integrity sha512-YftLzNJxCTYxEN5k4AzR8KYwiENTEuz30L+4QeoMrtDd+U8mDThZg/ArR3JVRd8LaikwPOjVAS5SP3xPJN0AaA== +metro-transform-worker@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.87.1.tgz#2c1041dca0b60354b7f3d8bb1f1a34c557974625" + integrity sha512-VOzs3OV405FuOLYdAhqA2wsn1F9lvueDVxMDLvCKaQ44U+yknIqphJ9eMjjsGwLDZiJq9sW3DMLhjD27JxQgqQ== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.29.1" "@babel/parser" "^7.29.0" "@babel/types" "^7.29.0" flow-enums-runtime "^0.0.6" - metro "0.87.0" - metro-babel-transformer "0.87.0" - metro-cache "0.87.0" - metro-cache-key "0.87.0" - metro-minify-terser "0.87.0" - metro-source-map "0.87.0" - metro-transform-plugins "0.87.0" + metro "0.87.1" + metro-babel-transformer "0.87.1" + metro-cache "0.87.1" + metro-cache-key "0.87.1" + metro-minify-terser "0.87.1" + metro-source-map "0.87.1" + metro-transform-plugins "0.87.1" nullthrows "^1.1.1" -metro@0.87.0, metro@^0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.87.0.tgz#ebdc81166213dc0efc894d816d38e16b5f82892f" - integrity sha512-fRqFhSzQhLNQSCvJFeuRzBRXAOOKXf1O8d2cvmMtG6yFR0jCllQ7vBsXoLP18yuqtf+N1XwWXTPF11eWy9q6dQ== +metro@0.87.1, metro@^0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.87.1.tgz#ae2d24509c6f5c81d8da896e4f514a1f643c0144" + integrity sha512-1oyLU9elM7hPAsKIqKooEekwxiuWr27+MZBhUROPhzcbXhMDxK64GPF/hCXwBZVp1F89ODavCrBmJtLx9WtBoQ== dependencies: "@babel/code-frame" "^7.29.0" "@babel/core" "^7.25.2" @@ -6840,30 +6820,28 @@ metro@0.87.0, metro@^0.87.0: "@babel/traverse" "^7.29.0" "@babel/types" "^7.29.0" accepts "^2.0.0" - ci-info "^2.0.0" connect "^3.6.5" debug "^4.4.0" error-stack-parser "^2.0.6" flow-enums-runtime "^0.0.6" + flow-parser "0.331.0" graceful-fs "^4.2.4" - hermes-parser "0.36.1" - image-size "^1.0.2" invariant "^2.2.4" jest-worker "^29.7.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.87.0" - metro-cache "0.87.0" - metro-cache-key "0.87.0" - metro-config "0.87.0" - metro-core "0.87.0" - metro-file-map "0.87.0" - metro-resolver "0.87.0" - metro-runtime "0.87.0" - metro-source-map "0.87.0" - metro-symbolicate "0.87.0" - metro-transform-plugins "0.87.0" - metro-transform-worker "0.87.0" + metro-babel-transformer "0.87.1" + metro-cache "0.87.1" + metro-cache-key "0.87.1" + metro-config "0.87.1" + metro-core "0.87.1" + metro-file-map "0.87.1" + metro-resolver "0.87.1" + metro-runtime "0.87.1" + metro-source-map "0.87.1" + metro-symbolicate "0.87.1" + metro-transform-plugins "0.87.1" + metro-transform-worker "0.87.1" mime-types "^3.0.1" nullthrows "^1.1.1" serialize-error "^2.1.0" @@ -7331,10 +7309,10 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.87.0: - version "0.87.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.87.0.tgz#66a467031147389460011bdfbe203832189d4c56" - integrity sha512-8Q8sKCiUwsxgSmjDtVWyRgmxsgeJXXam3oQH6Id8ADfNaJMV6GZKyeAl8+pGVVdgwAZabfk5+aExle7AP/nZiA== +ob1@0.87.1: + version "0.87.1" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.87.1.tgz#d705e92df01c1a4a2a0fa5dd37cfda6ba9ad4ff1" + integrity sha512-i8iA8uij0g1YQzS8uOJPSRCgwDjO9warIHUAu1Fqj877Wc3wlfxDYBioYWgKTBF2+URVJttyDWSEpmd99nlvtQ== dependencies: flow-enums-runtime "^0.0.6" @@ -7846,13 +7824,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -9228,7 +9199,7 @@ wait-for-expect@^3.0.2: resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== -walker@^1.0.7, walker@^1.0.8: +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== From 639cdedb506d6441e27eeb579225aa6a7def3ff9 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Mon, 21 Sep 2026 12:15:49 +0100 Subject: [PATCH 19/35] Revert "RCTArrayBuffer zero-copy class for ObjC TM (#57879)" This reverts commit 11f9a7f4491eb1b01955298851d5a87a3bb311cc. # Conflicts: # packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm # packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm --- .../GenerateModuleObjCpp-test.js.snap | 2 - .../modules/GenerateModuleObjCpp/index.js | 1 - .../GenerateModuleObjCpp/serializeMethod.js | 4 +- .../GenerateModuleHObjCpp-test.js.snap | 19 +- .../react-native/React/Base/RCTArrayBuffer.h | 64 ----- .../react-native/React/Base/RCTArrayBuffer.mm | 127 ---------- .../core/iostests/RCTTurboModuleTests.mm | 80 ++----- .../ios/ReactCommon/RCTInteropTurboModule.h | 3 +- .../ios/ReactCommon/RCTInteropTurboModule.mm | 3 +- .../platform/ios/ReactCommon/RCTTurboModule.h | 11 +- .../ios/ReactCommon/RCTTurboModule.mm | 103 +++----- .../ios/ReactCommon/RCTSampleTurboModule.mm | 27 +-- .../RCTTurboModuleArrayBufferTests.mm | 224 ++++-------------- .../api-snapshots/ReactAppleDebugCxx.api | 22 +- .../api-snapshots/ReactAppleNewarchCxx.api | 22 +- .../api-snapshots/ReactAppleReleaseCxx.api | 22 +- 16 files changed, 129 insertions(+), 605 deletions(-) delete mode 100644 packages/react-native/React/Base/RCTArrayBuffer.h delete mode 100644 packages/react-native/React/Base/RCTArrayBuffer.mm diff --git a/packages/react-native-codegen/e2e/deep_imports/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap b/packages/react-native-codegen/e2e/deep_imports/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap index e0bd0c195c0e..9bf2025a3a4f 100644 --- a/packages/react-native-codegen/e2e/deep_imports/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap +++ b/packages/react-native-codegen/e2e/deep_imports/__tests__/modules/__snapshots__/GenerateModuleObjCpp-test.js.snap @@ -26,7 +26,6 @@ exports[`GenerateModuleObjCpp can generate a header file NativeModule specs 1`] #import #import #import -#import #import #import #import @@ -1579,7 +1578,6 @@ exports[`GenerateModuleObjCpp can generate a header file NativeModule specs with #import #import #import -#import #import #import #import diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js index 1bf4e32b3275..8d93d9ad29c2 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/index.js @@ -97,7 +97,6 @@ const HeaderFileTemplate = ({ #import #import #import -#import #import #import #import diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js index 397516dc5c22..6811646078e2 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js @@ -227,7 +227,7 @@ function getParamObjCType( return notStruct(wrapOptional('NSArray *', !nullable)); } case 'ArrayBufferTypeAnnotation': { - return notStruct(wrapOptional('RCTArrayBuffer *', !nullable)); + return notStruct(wrapOptional('NSData *', !nullable)); } } @@ -398,7 +398,7 @@ function getReturnObjCType( case 'GenericObjectTypeAnnotation': return wrapOptional('NSDictionary *', isRequired); case 'ArrayBufferTypeAnnotation': - return wrapOptional('RCTArrayBuffer *', isRequired); + return wrapOptional('NSMutableData *', isRequired); default: typeAnnotation.type as 'MixedTypeAnnotation'; throw new Error( diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap index b1ce7953d5f3..8ed200aa17d7 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap @@ -27,7 +27,6 @@ Map { #import #import #import -#import #import #import #import @@ -93,7 +92,6 @@ Map { #import #import #import -#import #import #import #import @@ -104,9 +102,9 @@ Map { @protocol NativeSampleTurboModuleSpec -- (RCTArrayBuffer *)getArrayBuffer; -- (void)voidArrayBuffer:(RCTArrayBuffer *)arg; -- (void)voidNullableArrayBuffer:(RCTArrayBuffer * _Nullable)arg; +- (NSMutableData *)getArrayBuffer; +- (void)voidArrayBuffer:(NSData *)arg; +- (void)voidNullableArrayBuffer:(NSData * _Nullable)arg; @end @@ -161,7 +159,6 @@ Map { #import #import #import -#import #import #import #import @@ -203,7 +200,6 @@ Map { #import #import #import -#import #import #import #import @@ -479,7 +475,6 @@ Map { #import #import #import -#import #import #import #import @@ -521,7 +516,6 @@ Map { #import #import #import -#import #import #import #import @@ -587,7 +581,6 @@ Map { #import #import #import -#import #import #import #import @@ -661,7 +654,6 @@ Map { #import #import #import -#import #import #import #import @@ -847,7 +839,6 @@ Map { #import #import #import -#import #import #import #import @@ -1116,7 +1107,6 @@ Map { #import #import #import -#import #import #import #import @@ -1246,7 +1236,6 @@ Map { #import #import #import -#import #import #import #import @@ -1312,7 +1301,6 @@ Map { #import #import #import -#import #import #import #import @@ -1404,7 +1392,6 @@ Map { #import #import #import -#import #import #import #import diff --git a/packages/react-native/React/Base/RCTArrayBuffer.h b/packages/react-native/React/Base/RCTArrayBuffer.h deleted file mode 100644 index c8d80878819f..000000000000 --- a/packages/react-native/React/Base/RCTArrayBuffer.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * A fixed-length byte buffer shared between JS `ArrayBuffer`s and ObjC TurboModules. Fixed - * length lets the backing store alias JS memory; `NSMutableData` cannot do that. - * - * `isOwningBytes`: - * - `YES` — safe to retain and use from any thread (synchronize if aliasing JS - * memory). - * - `NO` — valid only during the synchronous call on the calling thread; copy with - * `arrayBufferWithCopiedBytes:length:` to keep the bytes. - */ -@interface RCTArrayBuffer : NSObject - -/** - * NULL when `length` is 0, non-NULL otherwise, matching `NSData.bytes`. - */ -@property (nonatomic, readonly, nullable) void *mutableBytes NS_RETURNS_INNER_POINTER; - -@property (nonatomic, readonly) NSUInteger length; - -/** Whether the buffer owns its bytes. See the class comment. */ -@property (nonatomic, readonly, getter=isOwningBytes) BOOL owningBytes; - -/** - * A new zero-filled owning buffer. - */ -+ (instancetype)arrayBufferWithLength:(NSUInteger)length; - -/** - * A new owning buffer holding a copy of `bytes`. Passing NULL zero-fills. - */ -+ (instancetype)arrayBufferWithCopiedBytes:(const void *_Nullable)bytes length:(NSUInteger)length; - -/** - * An owning buffer aliasing `bytes` without copying. If `cleanup` is non-nil, it runs on dealloc, - * like `-[NSData dataWithBytesNoCopy:length:freeWhenDone:YES]`; if nil, the caller must keep - * `bytes` valid until dealloc. NULL `bytes` with non-zero `length` raises NSInvalidArgumentException. - */ -+ (instancetype)arrayBufferWithOwnedBytes:(nullable void *)bytes - length:(NSUInteger)length - cleanup:(nullable void (^)(void))cleanup; - -/** - * A non-owning, zero-copy alias of `bytes`. See the class comment for lifetime rules. NULL `bytes` - * with non-zero `length` raises NSInvalidArgumentException. - */ -+ (instancetype)arrayBufferWithUnownedBytes:(nullable void *)bytes length:(NSUInteger)length; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/packages/react-native/React/Base/RCTArrayBuffer.mm b/packages/react-native/React/Base/RCTArrayBuffer.mm deleted file mode 100644 index c4270b927bee..000000000000 --- a/packages/react-native/React/Base/RCTArrayBuffer.mm +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#import "RCTArrayBuffer.h" - -#include -#include -#include -#include - -@interface RCTArrayBuffer () - -- (instancetype)initWithBytesNoCopy:(nullable void *)bytes - length:(NSUInteger)length - owningBytes:(BOOL)owningBytes - cleanup:(nullable void (^)(void))cleanup NS_DESIGNATED_INITIALIZER; -- (instancetype)initWithCopiedBytes:(const void *_Nullable)bytes length:(NSUInteger)length; - -@end - -@implementation RCTArrayBuffer { - void *_bytes; - NSUInteger _length; - BOOL _owningBytes; - void (^_cleanup)(void); - std::vector _copiedBytes; -} - -#pragma mark - Initializers - -- (instancetype)initWithBytesNoCopy:(void *)bytes - length:(NSUInteger)length - owningBytes:(BOOL)owningBytes - cleanup:(void (^)(void))cleanup -{ - if (bytes == NULL && length != 0) { - [NSException raise:NSInvalidArgumentException - format:@"RCTArrayBuffer: NULL bytes with length %lu", (unsigned long)length]; - } - - if (self = [super init]) { - _bytes = bytes; - _length = length; - _owningBytes = owningBytes; - _cleanup = [cleanup copy]; - } - return self; -} - -- (instancetype)initWithCopiedBytes:(const void *)bytes length:(NSUInteger)length -{ - if (length == 0) { - return [self initWithBytesNoCopy:NULL length:0 owningBytes:YES cleanup:nil]; - } - - std::vector copy(length); - if (bytes != NULL) { - std::memcpy(copy.data(), bytes, length); - } - - // Moving a vector hands over its heap buffer, so `data()` stays valid in `_copiedBytes`. - if (self = [self initWithBytesNoCopy:copy.data() length:length owningBytes:YES cleanup:nil]) { - _copiedBytes = std::move(copy); - } - return self; -} - -+ (instancetype)arrayBufferWithLength:(NSUInteger)length -{ - return [[self alloc] initWithCopiedBytes:NULL length:length]; -} - -+ (instancetype)arrayBufferWithCopiedBytes:(const void *)bytes length:(NSUInteger)length -{ - return [[self alloc] initWithCopiedBytes:bytes length:length]; -} - -+ (instancetype)arrayBufferWithOwnedBytes:(void *)bytes - length:(NSUInteger)length - cleanup:(nullable void (^)(void))cleanup -{ - return [[self alloc] initWithBytesNoCopy:bytes length:length owningBytes:YES cleanup:cleanup]; -} - -+ (instancetype)arrayBufferWithUnownedBytes:(void *)bytes length:(NSUInteger)length -{ - return [[self alloc] initWithBytesNoCopy:bytes length:length owningBytes:NO cleanup:nil]; -} - -#pragma mark - Accessors - -- (void *)mutableBytes -{ - return _bytes; -} - -- (NSUInteger)length -{ - return _length; -} - -- (BOOL)isOwningBytes -{ - return _owningBytes; -} - -- (NSString *)description -{ - return [NSString stringWithFormat:@"<%@: %p; length = %lu; owningBytes = %@>", - NSStringFromClass([self class]), - self, - (unsigned long)_length, - _owningBytes ? @"YES" : @"NO"]; -} - -- (void)dealloc -{ - if (_cleanup != nil) { - _cleanup(); - } -} - -@end diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm b/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm index 693cddd7d398..0c6705ffcfce 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm @@ -7,10 +7,8 @@ #import -#import #import #import -#import #import #import @@ -94,39 +92,6 @@ size_t size() const override std::vector bytes_; }; -// `jsi::Runtime::tryGetMutableBuffer` is optional — the Hermes branch linked into apps returns -// nullptr for every ArrayBuffer — so decorate the runtime to answer it for the buffers created -// through it. That keeps the coverage of the native-backed path independent of the engine. -// The registry is weak, so the only owners of a backing store remain the JS ArrayBuffer and -// whatever the conversion retains. -class MutableBufferAwareRuntime final : public facebook::jsi::RuntimeDecorator { - public: - explicit MutableBufferAwareRuntime(facebook::jsi::Runtime &plain) : RuntimeDecorator(plain) {} - - facebook::jsi::ArrayBuffer createArrayBuffer(std::shared_ptr buffer) override - { - auto arrayBuffer = RuntimeDecorator::createArrayBuffer(buffer); - buffers_.push_back(buffer); - return arrayBuffer; - } - - std::shared_ptr tryGetMutableBuffer( - const facebook::jsi::ArrayBuffer &arrayBuffer) override - { - uint8_t *data = arrayBuffer.data(*this); - for (const auto &weakBuffer : buffers_) { - auto buffer = weakBuffer.lock(); - if (buffer != nullptr && buffer->data() == data) { - return buffer; - } - } - return nullptr; - } - - private: - std::vector> buffers_; -}; - class StubNativeMethodCallInvoker : public NativeMethodCallInvoker { public: void invokeAsync(const std::string &methodName, NativeMethodCallFunc &&func) noexcept override @@ -354,46 +319,33 @@ - (void)testVoidMethodExceptionCarriesModuleAndMethodName XCTAssertNotNil(original.callStackSymbols); } -// A native-backed ArrayBuffer is aliased rather than copied, and the RCTArrayBuffer retains -// the backing MutableBuffer, so the alias outlives the JS object. -- (void)testNativeBackedArrayBufferIsAliasedAndKeepsBackingStoreAlive +// A JS ArrayBuffer converts (on the argument path) to an immutable NSData that +// owns an independent copy of the bytes, so the result stays valid after the +// source buffer is gone. This covers the ArrayBuffer-backed-by-native-MutableBuffer +// case, which is the one that could in principle have been aliased zero-copy. +- (void)testArrayBufferConvertsToIndependentNSData { constexpr size_t kBufferSize = 64 * 1024; auto hermesRuntime = facebook::hermes::makeHermesRuntime(); - MutableBufferAwareRuntime runtime(*hermesRuntime); + facebook::jsi::Runtime *rt = hermesRuntime.get(); auto buffer = std::make_shared(kBufferSize); *buffer->data() = 0xAB; - const uint8_t *sourceBytes = buffer->data(); - RCTArrayBuffer *converted = nil; - { - facebook::jsi::ArrayBuffer arrayBuffer(runtime, buffer); - const long ownersBeforeConversion = buffer.use_count(); + facebook::jsi::ArrayBuffer arrayBuffer(*rt, buffer); + id converted = + TurboModuleConvertUtils::convertJSIValueToObjCObject(*rt, facebook::jsi::Value(*rt, arrayBuffer), nullptr); - id result = TurboModuleConvertUtils::convertJSIValueToObjCObject( - runtime, facebook::jsi::Value(runtime, arrayBuffer), nullptr, NO, NO); - XCTAssertTrue([result isKindOfClass:[RCTArrayBuffer class]]); - converted = (RCTArrayBuffer *)result; + XCTAssertTrue([converted isKindOfClass:[NSData class]]); + NSData *data = (NSData *)converted; + XCTAssertEqual(data.length, (NSUInteger)kBufferSize); + XCTAssertEqual(*static_cast(data.bytes), 0xAB); - XCTAssertEqual( - buffer.use_count(), ownersBeforeConversion + 1, @"The RCTArrayBuffer must retain the backing MutableBuffer"); - } - - XCTAssertTrue(converted.isOwningBytes, @"A native-backed buffer must be safe to retain"); - XCTAssertEqual(converted.length, (NSUInteger)kBufferSize); - XCTAssertEqual(converted.mutableBytes, (void *)sourceBytes, @"Bytes must be aliased, not copied"); - - // Writes through the source are visible, and vice versa: one shared allocation. + // Independent copy: mutating the source MutableBuffer must not write through to + // the NSData. *buffer->data() = 0xCD; - XCTAssertEqual(*static_cast(converted.mutableBytes), 0xCD); - *static_cast(converted.mutableBytes) = 0xEF; - XCTAssertEqual(*buffer->data(), 0xEF); - - // Dropping the caller's reference leaves the bytes valid. - buffer.reset(); - XCTAssertEqual(*static_cast(converted.mutableBytes), 0xEF); + XCTAssertEqual(*static_cast(data.bytes), 0xAB, @"NSData must not alias the source buffer"); } @end diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h index 62a82b7e61f0..f170c5e0e6ac 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h @@ -75,8 +75,7 @@ class JSI_EXPORT ObjCInteropTurboModule : public ObjCTurboModule { const jsi::Value &arg, size_t i, NSInvocation *inv, - NSMutableArray *retainedObjectsForInvocation, - bool mustCopyBytes) override; + NSMutableArray *retainedObjectsForInvocation) override; private: std::vector methodDescriptors_; diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm index c18326ae45d8..b4c11eafaa59 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm @@ -363,8 +363,7 @@ T RCTConvertTo(SEL selector, id json) const jsi::Value &jsiArg, size_t index, NSInvocation *inv, - NSMutableArray *retainedObjectsForInvocation, - [[maybe_unused]] bool mustCopyBytes) + NSMutableArray *retainedObjectsForInvocation) { NSString *methodName = @(methodNameCStr); std::string methodJsSignature = name_ + "." + methodNameCStr + "()"; diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h index fcd3231c3833..d3fc87e6f148 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.h @@ -35,8 +35,7 @@ id convertJSIValueToObjCObject( jsi::Runtime &runtime, const jsi::Value &value, const std::shared_ptr &jsInvoker, - BOOL useNSNull = NO, - BOOL mustCopyBytes = YES); + BOOL useNSNull = NO); } // namespace TurboModuleConvertUtils template <> @@ -114,9 +113,6 @@ class JSI_EXPORT ObjCTurboModule : public TurboModule { * ObjCInteropTurboModule relies heavily on RCTConvert to convert arguments from JavaScript values to Objective C * values. ObjCTurboModule tries to minimize reliance on RCTConvert: RCTConvert uses the RCT_EXPORT_METHOD macros, * which we want to remove long term from React Native. - * - * mustCopyBytes says whether the invocation may outlive the JS call, in which case ArrayBuffer arguments must be - * copied rather than aliased. */ virtual void setInvocationArg( jsi::Runtime &runtime, @@ -125,8 +121,7 @@ class JSI_EXPORT ObjCTurboModule : public TurboModule { const jsi::Value &arg, size_t i, NSInvocation *inv, - NSMutableArray *retainedObjectsForInvocation, - bool mustCopyBytes); + NSMutableArray *retainedObjectsForInvocation); private: // Does the NativeModule dispatch async methods to the JS thread? @@ -142,13 +137,11 @@ class JSI_EXPORT ObjCTurboModule : public TurboModule { NSDictionary *> *methodArgumentTypeNames_; bool isMethodSync(TurboModuleMethodValueKind returnType); - bool mustCopyJSHeapArrayBufferBytes(TurboModuleMethodValueKind returnType); BOOL hasMethodArgConversionSelector(NSString *methodName, size_t argIndex); SEL getMethodArgConversionSelector(NSString *methodName, size_t argIndex); NSInvocation *createMethodInvocation( jsi::Runtime &runtime, bool isSync, - bool mustCopyBytes, const char *methodName, SEL selector, const jsi::Value *args, diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm index b8b5f2db3cd9..9f7877c5f8a5 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm @@ -7,7 +7,6 @@ #import "RCTTurboModule.h" -#import #import #import #import @@ -90,43 +89,35 @@ static int32_t getUniqueId() return result; } -static jsi::ArrayBuffer convertRCTArrayBufferToJSIArrayBuffer(jsi::Runtime &runtime, RCTArrayBuffer *value) +static jsi::ArrayBuffer convertNSMutableDataToJSIArrayBuffer(jsi::Runtime &runtime, NSMutableData *value) { - class RCTArrayBufferMutableBuffer final : public jsi::MutableBuffer { + class NSMutableDataBuffer final : public jsi::MutableBuffer { public: - explicit RCTArrayBufferMutableBuffer(RCTArrayBuffer *buffer) - : buffer_(buffer), data_(static_cast(buffer.mutableBytes)), size_(buffer.length) - { - } + explicit NSMutableDataBuffer(NSMutableData *data) : data_(data) {} size_t size() const override { - return size_; + return data_.length; } uint8_t *data() override { - return data_; + return static_cast(data_.mutableBytes); } private: - // Never read: retains the buffer so `data_` stays valid for the ArrayBuffer's lifetime. - [[maybe_unused]] RCTArrayBuffer *buffer_; - uint8_t *data_; - size_t size_; + NSMutableData *data_; }; - // nil would yield a NULL pointer via ObjC nil-messaging and corrupt the ArrayBuffer. + // A nil NSMutableData would silently yield a NULL `mutableBytes` pointer + // (ObjC nil-messaging) and corrupt the resulting ArrayBuffer. Substitute a + // fresh empty NSMutableData so the wrapped pointer is always well-defined. if (value == nil) { - RCTLogWarn(@"convertRCTArrayBufferToJSIArrayBuffer: received nil RCTArrayBuffer; returning empty ArrayBuffer"); - value = [RCTArrayBuffer arrayBufferWithLength:0]; - } - - if (!value.isOwningBytes) { - value = [RCTArrayBuffer arrayBufferWithCopiedBytes:value.mutableBytes length:value.length]; + RCTLogWarn(@"convertNSMutableDataToJSIArrayBuffer: received nil NSMutableData; returning empty ArrayBuffer"); + value = [NSMutableData data]; } - - return {runtime, std::make_shared(value)}; + auto buffer = std::make_shared(value); + return {runtime, std::move(buffer)}; } jsi::Value convertObjCObjectToJSIValue(jsi::Runtime &runtime, id value) @@ -142,8 +133,8 @@ size_t size() const override return convertNSDictionaryToJSIObject(runtime, (NSDictionary *)value); } else if ([value isKindOfClass:[NSArray class]]) { return convertNSArrayToJSIArray(runtime, (NSArray *)value); - } else if ([value isKindOfClass:[RCTArrayBuffer class]]) { - return convertRCTArrayBufferToJSIArrayBuffer(runtime, (RCTArrayBuffer *)value); + } else if ([value isKindOfClass:[NSMutableData class]]) { + return convertNSMutableDataToJSIArrayBuffer(runtime, (NSMutableData *)value); } else if (value == (id)kCFNull) { return jsi::Value::null(); } @@ -210,41 +201,22 @@ size_t size() const override }; } -// Native-backed buffers are aliased and keep their backing store alive, so they stay valid for -// as long as the module holds them. JS-heap buffers have nothing to retain — their bytes are -// freed when the ArrayBuffer is collected or detached — so `mustCopyBytes` is set whenever the -// invocation may outlive the JS call, and they are aliased only when it cannot. Engines that -// don't hand out the backing MutableBuffer fall back to those JS-heap rules for every buffer. -static RCTArrayBuffer * -convertJSIArrayBufferToRCTArrayBuffer(jsi::Runtime &rt, const jsi::ArrayBuffer &arrayBuffer, BOOL mustCopyBytes) +// Copy the ArrayBuffer's bytes into an immutable NSData. An inbound buffer is +// owned by the caller, not the native module, so NSData (not NSMutableData) is +// the correct read-only contract. Copying makes the NSData self-contained and +// safe to retain in a block, store, or dispatch to another thread, regardless of +// whether the bytes were owned by JS (valid only for this callstack) or by a +// native MutableBuffer (which the JS ArrayBuffer may GC concurrently). +static NSData *convertJSIArrayBufferToNSData(jsi::Runtime &rt, const jsi::ArrayBuffer &value) { - if (auto nativeBuffer = arrayBuffer.tryGetMutableBuffer(rt)) { - auto keepAlive = std::move(nativeBuffer); - return [RCTArrayBuffer arrayBufferWithOwnedBytes:keepAlive->data() - length:keepAlive->size() - cleanup:^{ - (void)keepAlive; - }]; - } - - void *bytes = arrayBuffer.data(rt); - size_t size = arrayBuffer.size(rt); - - // The bytes belong to the JS heap -> async call. - if (mustCopyBytes) { - return [RCTArrayBuffer arrayBufferWithCopiedBytes:bytes length:size]; - } - - // The bytes belong to the JS heap -> sync call. - return [RCTArrayBuffer arrayBufferWithUnownedBytes:bytes length:size]; + return [NSData dataWithBytes:value.data(rt) length:value.size(rt)]; } id convertJSIValueToObjCObject( jsi::Runtime &runtime, const jsi::Value &value, const std::shared_ptr &jsInvoker, - BOOL useNSNull, - BOOL mustCopyBytes) + BOOL useNSNull) { if (value.isUndefined() || (value.isNull() && !useNSNull)) { return nil; @@ -270,7 +242,7 @@ id convertJSIValueToObjCObject( return convertJSIFunctionToCallback(runtime, o.getFunction(runtime), jsInvoker); } if (o.isArrayBuffer(runtime)) { - return convertJSIArrayBufferToRCTArrayBuffer(runtime, o.getArrayBuffer(runtime), mustCopyBytes); + return convertJSIArrayBufferToNSData(runtime, o.getArrayBuffer(runtime)); } return convertJSIObjectToNSDictionary(runtime, o, jsInvoker, useNSNull); } @@ -629,11 +601,11 @@ TraceSection s( break; } case ArrayBufferKind: { - if (result != nil && ![result isKindOfClass:[RCTArrayBuffer class]]) { - RCTLogError(@"convertReturnIdToJSIValue: expected RCTArrayBuffer for ArrayBufferKind, got %@", [result class]); + if (result != nil && ![result isKindOfClass:[NSMutableData class]]) { + RCTLogError(@"convertReturnIdToJSIValue: expected NSMutableData for ArrayBufferKind, got %@", [result class]); break; } - returnValue = convertRCTArrayBufferToJSIArrayBuffer(runtime, (RCTArrayBuffer *)result); + returnValue = convertNSMutableDataToJSIArrayBuffer(runtime, (NSMutableData *)result); break; } case FunctionKind: @@ -710,8 +682,7 @@ TraceSection s( const jsi::Value &arg, size_t i, NSInvocation *inv, - NSMutableArray *retainedObjectsForInvocation, - bool mustCopyBytes) + NSMutableArray *retainedObjectsForInvocation) { if (arg.isBool()) { bool v = arg.getBool(); @@ -754,15 +725,13 @@ TraceSection s( * Convert arg to ObjC objects. */ BOOL enableModuleArgumentNSNullConversionIOS = ReactNativeFeatureFlags::enableModuleArgumentNSNullConversionIOS(); - id objCArg = - convertJSIValueToObjCObject(runtime, arg, jsInvoker_, enableModuleArgumentNSNullConversionIOS, mustCopyBytes); + id objCArg = convertJSIValueToObjCObject(runtime, arg, jsInvoker_, enableModuleArgumentNSNullConversionIOS); // A JS `null` in argument position must reach ObjC as `nil`; only nulls nested inside arrays and // dictionaries are preserved as `kCFNull`. Skipping `setArgument:` leaves the slot zeroed. if (enableModuleArgumentNSNullConversionIOS && objCArg == (id)kCFNull) { return; } - if (objCArg != nullptr) { NSString *methodNameNSString = @(methodName); @@ -823,7 +792,6 @@ TraceSection s( NSInvocation *ObjCTurboModule::createMethodInvocation( jsi::Runtime &runtime, bool isSync, - bool mustCopyBytes, const char *methodName, SEL selector, const jsi::Value *args, @@ -852,7 +820,7 @@ TraceSection s( for (size_t i = 0; i < count; i++) { const jsi::Value &arg = args[i]; const std::string objCArgType = [methodSignature getArgumentTypeAtIndex:i + 2]; - setInvocationArg(runtime, methodName, objCArgType, arg, i, inv, retainedObjectsForInvocation, mustCopyBytes); + setInvocationArg(runtime, methodName, objCArgType, arg, i, inv, retainedObjectsForInvocation); } if (isSync) { @@ -873,12 +841,6 @@ TraceSection s( return returnType != VoidKind && returnType != PromiseKind; } -bool ObjCTurboModule::mustCopyJSHeapArrayBufferBytes(TurboModuleMethodValueKind returnType) -{ - // Void always dispatches via invokeAsync and promise may. - return returnType == VoidKind || returnType == PromiseKind; -} - ObjCTurboModule::ObjCTurboModule(const InitParams ¶ms) : TurboModule(params.moduleName, params.jsInvoker), instance_(params.instance), @@ -899,7 +861,6 @@ TraceSection s( const char *methodName = methodNameStr.c_str(); bool isSyncInvocation = isMethodSync(returnType); - bool mustCopyBytes = mustCopyJSHeapArrayBufferBytes(returnType); if (isSyncInvocation) { TurboModulePerfLogger::syncMethodCallStart(moduleName, methodName); @@ -909,7 +870,7 @@ TraceSection s( NSMutableArray *retainedObjectsForInvocation = [NSMutableArray arrayWithCapacity:count + 2]; NSInvocation *inv = createMethodInvocation( - runtime, isSyncInvocation, mustCopyBytes, methodName, selector, args, count, retainedObjectsForInvocation); + runtime, isSyncInvocation, methodName, selector, args, count, retainedObjectsForInvocation); jsi::Value returnValue = jsi::Value::undefined(); diff --git a/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm index 6ec73228f76e..e2b9d4bf42c9 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.mm @@ -6,8 +6,6 @@ */ #import "RCTSampleTurboModule.h" - -#import #import "RCTSampleTurboModulePlugin.h" #import @@ -16,8 +14,6 @@ #import #import -#include - using namespace facebook::react; @interface RCTSampleTurboModule () @@ -149,27 +145,20 @@ - (NSDictionary *)getValue:(double)x y:(NSString *)y z:(NSDictionary *)z }; } -// The argument aliases the JS ArrayBuffer's bytes, so mutating in place is visible to JS. -- (RCTArrayBuffer *)getArrayBuffer:(RCTArrayBuffer *)buffer +// Arguments arrive as an immutable NSData, but an ArrayBuffer return must be +// NSMutableData: it is handed to JS as a jsi::MutableBuffer, whose data() is +// non-const. Echoing the argument back therefore needs a mutable copy. +- (NSMutableData *)getArrayBuffer:(NSData *)buffer { - auto *bytes = static_cast(buffer.mutableBytes); - if (bytes == nullptr) { - return buffer; - } - - std::span byteSpan(bytes, static_cast(buffer.length)); - for (auto &byte : byteSpan) { - byte = static_cast(byte * 2); - } - return buffer; + return [buffer mutableCopy]; } -- (RCTArrayBuffer *)createNativeBuffer:(double)size +- (NSMutableData *)createNativeBuffer:(double)size { - return [RCTArrayBuffer arrayBufferWithLength:(NSUInteger)size]; + return [NSMutableData dataWithLength:(NSUInteger)size]; } -- (void)processAsyncBuffer:(RCTArrayBuffer *)payload +- (void)processAsyncBuffer:(NSData *)payload resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject { diff --git a/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm b/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm index 14f32b48e849..156af187618d 100644 --- a/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm +++ b/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm @@ -7,7 +7,6 @@ #import -#import #import #import #import @@ -30,14 +29,14 @@ return facebook::hermes::makeHermesRuntime(::hermes::vm::RuntimeConfig::Builder().withMicrotaskQueue(true).build()); } -RCTArrayBuffer *createIntegerSequenceBuffer(NSUInteger size) +NSMutableData *createIntegerSequenceData(NSUInteger size) { - RCTArrayBuffer *buffer = [RCTArrayBuffer arrayBufferWithLength:size]; - auto *bytes = static_cast(buffer.mutableBytes); + NSMutableData *data = [NSMutableData dataWithLength:size]; + auto *bytes = static_cast(data.mutableBytes); for (NSUInteger i = 0; i < size; ++i) { bytes[i] = static_cast(i); } - return buffer; + return data; } std::vector bytesFromData(NSData *data) @@ -99,8 +98,6 @@ void flushQueue() @interface RCTTestArrayBufferTurboModule : NSObject @property (nonatomic, copy) NSData *lastReceivedPayload; -@property (nonatomic, assign) BOOL sawAliasedBytes; -@property (nonatomic, assign) BOOL sawUnownedBytes; @end @@ -108,54 +105,36 @@ @implementation RCTTestArrayBufferTurboModule RCT_EXPORT_MODULE() -- (RCTArrayBuffer *)testMethodWhichTransformsArrayBuffer:(RCTArrayBuffer *)buffer +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSMutableData *, testMethodWhichTransformsArrayBuffer : (NSData *)buffer) { - RCTArrayBuffer *result = [RCTArrayBuffer arrayBufferWithLength:buffer.length]; - auto *destinationBytes = static_cast(result.mutableBytes); - for (NSUInteger i = 0; i < buffer.length; ++i) { - destinationBytes[i] = static_cast((i + 1) * 10); + NSMutableData *result = [buffer mutableCopy]; + auto *bytes = static_cast(result.mutableBytes); + for (NSUInteger i = 0; i < result.length; ++i) { + bytes[i] = static_cast((i + 1) * 10); } return result; } -- (RCTArrayBuffer *)testMethodWhichReturnsItsArgument:(RCTArrayBuffer *)buffer +RCT_EXPORT_METHOD(testMethodWhichStoresArrayBuffer : (NSData *)payload) { - auto *bytes = static_cast(buffer.mutableBytes); - for (NSUInteger i = 0; i < buffer.length && i < 3; ++i) { - bytes[i] = static_cast(99 - i); - } - return buffer; -} - -- (NSNumber *)testMethodWhichChecksArrayBufferAliasing:(RCTArrayBuffer *)buffer -{ - // An observable in-place write proves the bytes were aliased, not copied on the way in. - auto *bytes = static_cast(buffer.mutableBytes); - bytes[0] = 77; - self.sawAliasedBytes = buffer.length == 3 && bytes[0] == 77; - self.sawUnownedBytes = !buffer.isOwningBytes; - return @(YES); + self.lastReceivedPayload = [payload copy]; } -- (void)testMethodWhichStoresArrayBuffer:(RCTArrayBuffer *)payload +RCT_EXPORT_METHOD(testMethodWhichStoresNestedArrayBuffer : (NSDictionary *)payload) { - self.lastReceivedPayload = [NSData dataWithBytes:payload.mutableBytes length:payload.length]; + NSDictionary *nestedPayload = payload[@"nested"]; + self.lastReceivedPayload = [nestedPayload[@"buffer"] copy]; } -- (void)testMethodWhichCallsBackWithArrayBuffer:(double)size callback:(RCTResponseSenderBlock)callback -{ - callback(@[ createIntegerSequenceBuffer(static_cast(size)) ]); -} - -- (void)testMethodWhichReturnsArrayBuffer:(double)size - resolve:(RCTPromiseResolveBlock)resolve - reject:(RCTPromiseRejectBlock)reject +RCT_EXPORT_METHOD( + testMethodWhichReturnsArrayBuffer : (double)size resolve : (RCTPromiseResolveBlock) + resolve reject : (RCTPromiseRejectBlock)reject) { if (resolve == nil || reject == nil) { return; } - resolve(createIntegerSequenceBuffer(static_cast(size))); + resolve(createIntegerSequenceData(static_cast(size))); } @end @@ -207,18 +186,18 @@ - (void)testSyncArrayBufferRoundTrip XCTAssertEqual(returnedBytes[2], 30); } -// The sync argument is a live alias: an in-place write lands on the JS ArrayBuffer itself. -- (void)testJSBackedArrayBufferIsNotCopiedDuringTheCall +- (void)testAsyncJSBackedArrayBufferIsCopied { auto hermesRuntime = createHermesRuntime(); facebook::jsi::Runtime *rt = hermesRuntime.get(); + auto nativeInvoker = std::make_shared(); auto *instance = [RCTTestArrayBufferTurboModule new]; ObjCTurboModule::InitParams params = { .moduleName = "TestModule", .instance = instance, .jsInvoker = nullptr, - .nativeMethodCallInvoker = std::make_shared(), + .nativeMethodCallInvoker = nativeInvoker, .isSyncModule = false, }; ObjCTurboModule module(params); @@ -231,93 +210,23 @@ - (void)testJSBackedArrayBufferIsNotCopiedDuringTheCall facebook::jsi::Value args[1] = {facebook::jsi::Value(*rt, sourceBuffer)}; module.invokeObjCMethod( - *rt, - BooleanKind, - "testMethodWhichChecksArrayBufferAliasing", - @selector(testMethodWhichChecksArrayBufferAliasing:), - args, - 1); - - XCTAssertTrue(instance.sawAliasedBytes, @"The argument must alias the JS ArrayBuffer's bytes"); - XCTAssertTrue(instance.sawUnownedBytes, @"A JS-heap argument to a sync method must not own its bytes"); - XCTAssertEqual(bytesFromArrayBuffer(*rt, sourceBuffer)[0], 77, @"The native write must land on the JS ArrayBuffer"); -} - -// Returning the argument must hand JS the mutated bytes: it has to stay valid through the -// return-value conversion. -- (void)testSyncMethodCanReturnItsOwnArgument -{ - auto hermesRuntime = createHermesRuntime(); - facebook::jsi::Runtime *rt = hermesRuntime.get(); - auto *instance = [RCTTestArrayBufferTurboModule new]; - - ObjCTurboModule::InitParams params = { - .moduleName = "TestModule", - .instance = instance, - .jsInvoker = nullptr, - .nativeMethodCallInvoker = std::make_shared(), - .isSyncModule = false, - }; - ObjCTurboModule module(params); - - auto sourceBuffer = rt->global() - .getPropertyAsFunction(*rt, "eval") - .call(*rt, "new Uint8Array([1, 2, 3]).buffer") - .asObject(*rt) - .getArrayBuffer(*rt); - facebook::jsi::Value args[1] = {facebook::jsi::Value(*rt, sourceBuffer)}; - - auto result = module.invokeObjCMethod( - *rt, - ArrayBufferKind, - "testMethodWhichReturnsItsArgument", - @selector(testMethodWhichReturnsItsArgument:), - args, - 1); - - XCTAssertTrue(result.isObject()); - XCTAssertTrue(result.asObject(*rt).isArrayBuffer(*rt)); - auto returnedBytes = bytesFromArrayBuffer(*rt, result.asObject(*rt).getArrayBuffer(*rt)); - XCTAssertEqual(returnedBytes.size(), 3u, @"Returning the argument must not yield an empty buffer"); - XCTAssertEqual(returnedBytes[0], 99); - XCTAssertEqual(returnedBytes[1], 98); - XCTAssertEqual(returnedBytes[2], 97); -} - -// A zero-length ArrayBuffer must round-trip, NULL bytes pointer and all. -- (void)testEmptyArrayBufferRoundTrip -{ - auto hermesRuntime = createHermesRuntime(); - facebook::jsi::Runtime *rt = hermesRuntime.get(); - auto *instance = [RCTTestArrayBufferTurboModule new]; - - ObjCTurboModule::InitParams params = { - .moduleName = "TestModule", - .instance = instance, - .jsInvoker = nullptr, - .nativeMethodCallInvoker = std::make_shared(), - .isSyncModule = false, - }; - ObjCTurboModule module(params); + *rt, VoidKind, "testMethodWhichStoresArrayBuffer", @selector(testMethodWhichStoresArrayBuffer:), args, 1); - auto sourceBuffer = - rt->global().getPropertyAsFunction(*rt, "eval").call(*rt, "new ArrayBuffer(0)").asObject(*rt).getArrayBuffer(*rt); - facebook::jsi::Value args[1] = {facebook::jsi::Value(*rt, sourceBuffer)}; + auto *sourceBytes = sourceBuffer.data(*rt); + sourceBytes[0] = 9; + sourceBytes[1] = 8; + sourceBytes[2] = 7; - auto result = module.invokeObjCMethod( - *rt, - ArrayBufferKind, - "testMethodWhichTransformsArrayBuffer", - @selector(testMethodWhichTransformsArrayBuffer:), - args, - 1); + nativeInvoker->flushQueue(); - XCTAssertTrue(result.isObject()); - XCTAssertTrue(result.asObject(*rt).isArrayBuffer(*rt)); - XCTAssertEqual(result.asObject(*rt).getArrayBuffer(*rt).size(*rt), 0u); + auto receivedBytes = bytesFromData(instance.lastReceivedPayload); + XCTAssertEqual(receivedBytes.size(), 3u); + XCTAssertEqual(receivedBytes[0], 1); + XCTAssertEqual(receivedBytes[1], 2); + XCTAssertEqual(receivedBytes[2], 3); } -- (void)testAsyncJSBackedArrayBufferIsCopied +- (void)testAsyncNestedJSBackedArrayBufferIsCopied { auto hermesRuntime = createHermesRuntime(); facebook::jsi::Runtime *rt = hermesRuntime.get(); @@ -333,15 +242,24 @@ - (void)testAsyncJSBackedArrayBufferIsCopied }; ObjCTurboModule module(params); - auto sourceBuffer = rt->global() + auto sourceObject = rt->global() .getPropertyAsFunction(*rt, "eval") - .call(*rt, "new Uint8Array([1, 2, 3]).buffer") + .call(*rt, "({nested: {buffer: new Uint8Array([1, 2, 3]).buffer}})") + .asObject(*rt); + auto sourceBuffer = sourceObject.getProperty(*rt, "nested") + .asObject(*rt) + .getProperty(*rt, "buffer") .asObject(*rt) .getArrayBuffer(*rt); - facebook::jsi::Value args[1] = {facebook::jsi::Value(*rt, sourceBuffer)}; + facebook::jsi::Value args[1] = {facebook::jsi::Value(*rt, sourceObject)}; module.invokeObjCMethod( - *rt, VoidKind, "testMethodWhichStoresArrayBuffer", @selector(testMethodWhichStoresArrayBuffer:), args, 1); + *rt, + VoidKind, + "testMethodWhichStoresNestedArrayBuffer", + @selector(testMethodWhichStoresNestedArrayBuffer:), + args, + 1); auto *sourceBytes = sourceBuffer.data(*rt); sourceBytes[0] = 9; @@ -394,56 +312,6 @@ - (void)testAsyncNativeBackedArrayBufferRetainsBackingStore XCTAssertEqual(receivedBytes[3], 7); } -// A buffer handed to a callback is delivered to JS after the native call has returned. -- (void)testCallbackDeliversArrayBuffer -{ - auto hermesRuntime = createHermesRuntime(); - facebook::jsi::Runtime *rt = hermesRuntime.get(); - auto jsInvoker = std::make_shared(*rt); - auto *instance = [RCTTestArrayBufferTurboModule new]; - - ObjCTurboModule::InitParams params = { - .moduleName = "TestModule", - .instance = instance, - .jsInvoker = jsInvoker, - .nativeMethodCallInvoker = std::make_shared(), - .isSyncModule = false, - }; - ObjCTurboModule module(params); - - std::vector callbackBytes; - auto onCallback = facebook::jsi::Function::createFromHostFunction( - *rt, - facebook::jsi::PropNameID::forAscii(*rt, "onCallback"), - 1, - [&callbackBytes]( - facebook::jsi::Runtime &runtime, - const facebook::jsi::Value &, - const facebook::jsi::Value *callbackArgs, - size_t count) -> facebook::jsi::Value { - if (count == 1 && callbackArgs[0].isObject() && callbackArgs[0].asObject(runtime).isArrayBuffer(runtime)) { - callbackBytes = bytesFromArrayBuffer(runtime, callbackArgs[0].asObject(runtime).getArrayBuffer(runtime)); - } - return facebook::jsi::Value::undefined(); - }); - facebook::jsi::Value args[2] = {facebook::jsi::Value(3.0), facebook::jsi::Value(*rt, onCallback)}; - - module.invokeObjCMethod( - *rt, - VoidKind, - "testMethodWhichCallsBackWithArrayBuffer", - @selector(testMethodWhichCallsBackWithArrayBuffer:callback:), - args, - 2); - - jsInvoker->flushQueue(); - - XCTAssertEqual(callbackBytes.size(), 3u); - XCTAssertEqual(callbackBytes[0], 0); - XCTAssertEqual(callbackBytes[1], 1); - XCTAssertEqual(callbackBytes[2], 2); -} - - (void)testPromiseResolvesArrayBuffer { auto hermesRuntime = createHermesRuntime(true); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index c23703c476a3..4b927bf1ac61 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -654,16 +654,6 @@ interface RCTAppearance : public RCTEventEmitter { public virtual instancetype init(); } -interface RCTArrayBuffer : public NSObject { - public @property (assign, readonly) BOOL owningBytes; - public @property (assign, readonly) NSUInteger length; - public @property (assign, readonly) void* mutableBytes NS_RETURNS_INNER_POINTER; - public virtual static instancetype arrayBufferWithCopiedBytes:length:(const void* _Nullable bytes, NSUInteger length); - public virtual static instancetype arrayBufferWithLength:(NSUInteger length); - public virtual static instancetype arrayBufferWithOwnedBytes:length:cleanup:(_Nullable void* bytes, NSUInteger length, _Nullable void(^)(void) cleanup); - public virtual static instancetype arrayBufferWithUnownedBytes:length:(_Nullable void* bytes, NSUInteger length); -} - interface RCTBackedTextFieldDelegateAdapter : public NSObject { public virtual instancetype initWithTextField:(UITextField* backedTextInputView); public virtual void selectedTextRangeWasSet(); @@ -2512,19 +2502,19 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual NSDictionary* getObjectThrows:(NSDictionary* arg); public virtual NSDictionary* getUnsafeObject:(NSDictionary* arg); public virtual NSDictionary* getValue:y:z:(double x, NSString* y, NSDictionary* z); + public virtual NSMutableData* createNativeBuffer:(double size); + public virtual NSMutableData* getArrayBuffer:(NSData* buffer); public virtual NSNumber* getBool:(BOOL arg); public virtual NSNumber* getEnum:(double arg); public virtual NSNumber* getNumber:(double arg); public virtual NSNumber* getRootTag:(double arg); public virtual NSString* getString:(NSString* arg); - public virtual RCTArrayBuffer* createNativeBuffer:(double size); - public virtual RCTArrayBuffer* getArrayBuffer:(RCTArrayBuffer* buffer); public virtual facebook::react::ModuleConstants constantsToExport(); public virtual facebook::react::ModuleConstants getConstants(); public virtual void getImageUrl:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void getValueWithCallback:(RCTResponseSenderBlock callback); public virtual void getValueWithPromise:resolve:reject:(BOOL error, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); - public virtual void processAsyncBuffer:resolve:reject:(RCTArrayBuffer* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); + public virtual void processAsyncBuffer:resolve:reject:(NSData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseAssert:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseThrows:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void voidFunc(); @@ -6169,7 +6159,7 @@ class facebook::react::ObjCInteropTurboModule : public facebook::react::ObjCTurb protected virtual NSString* getArgumentTypeName(facebook::jsi::Runtime& runtime, NSString* methodName, int argIndex) override; protected virtual facebook::jsi::Value convertReturnIdToJSIValue(facebook::jsi::Runtime& runtime, const char* methodName, facebook::react::TurboModuleMethodValueKind returnType, id result) override; protected virtual facebook::jsi::Value create(facebook::jsi::Runtime& runtime, const facebook::jsi::PropNameID& propName) override; - protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation, bool mustCopyBytes) override; + protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation) override; public ObjCInteropTurboModule(const facebook::react::ObjCTurboModule::InitParams& params); public virtual std::vector getPropertyNames(facebook::jsi::Runtime& runtime) override; } @@ -6184,7 +6174,7 @@ struct facebook::react::ObjCInteropTurboModule::MethodDescriptor { class facebook::react::ObjCTurboModule : public facebook::react::TurboModule { protected virtual NSString* getArgumentTypeName(facebook::jsi::Runtime& runtime, NSString* methodName, int argIndex); protected virtual facebook::jsi::Value convertReturnIdToJSIValue(facebook::jsi::Runtime& runtime, const char* methodName, facebook::react::TurboModuleMethodValueKind returnType, id result); - protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation, bool mustCopyBytes); + protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation); protected void setEventEmitterCallback(facebook::react::EventEmitterCallback eventEmitterCallback); protected void setMethodArgConversionSelector(NSString* methodName, size_t argIndex, NSString* fnName); public ObjCTurboModule(const facebook::react::ObjCTurboModule::InitParams& params); @@ -13661,7 +13651,7 @@ struct facebook::react::dom::RNMeasureRect { facebook::jsi::Value facebook::react::TurboModuleConvertUtils::convertObjCObjectToJSIValue(facebook::jsi::Runtime& runtime, id value); -id facebook::react::TurboModuleConvertUtils::convertJSIValueToObjCObject(facebook::jsi::Runtime& runtime, const facebook::jsi::Value& value, const std::shared_ptr& jsInvoker, BOOL useNSNull = NO, BOOL mustCopyBytes = YES); +id facebook::react::TurboModuleConvertUtils::convertJSIValueToObjCObject(facebook::jsi::Runtime& runtime, const facebook::jsi::Value& value, const std::shared_ptr& jsInvoker, BOOL useNSNull = NO); static const facebook::react::Color facebook::react::HostPlatformColor::UndefinedColor; diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index 95f5e8b375fc..bec93c59aa33 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -654,16 +654,6 @@ interface RCTAppearance : public RCTEventEmitter { public virtual instancetype init(); } -interface RCTArrayBuffer : public NSObject { - public @property (assign, readonly) BOOL owningBytes; - public @property (assign, readonly) NSUInteger length; - public @property (assign, readonly) void* mutableBytes NS_RETURNS_INNER_POINTER; - public virtual static instancetype arrayBufferWithCopiedBytes:length:(const void* _Nullable bytes, NSUInteger length); - public virtual static instancetype arrayBufferWithLength:(NSUInteger length); - public virtual static instancetype arrayBufferWithOwnedBytes:length:cleanup:(_Nullable void* bytes, NSUInteger length, _Nullable void(^)(void) cleanup); - public virtual static instancetype arrayBufferWithUnownedBytes:length:(_Nullable void* bytes, NSUInteger length); -} - interface RCTBackedTextFieldDelegateAdapter : public NSObject { public virtual instancetype initWithTextField:(UITextField* backedTextInputView); public virtual void selectedTextRangeWasSet(); @@ -2505,19 +2495,19 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual NSDictionary* getObjectThrows:(NSDictionary* arg); public virtual NSDictionary* getUnsafeObject:(NSDictionary* arg); public virtual NSDictionary* getValue:y:z:(double x, NSString* y, NSDictionary* z); + public virtual NSMutableData* createNativeBuffer:(double size); + public virtual NSMutableData* getArrayBuffer:(NSData* buffer); public virtual NSNumber* getBool:(BOOL arg); public virtual NSNumber* getEnum:(double arg); public virtual NSNumber* getNumber:(double arg); public virtual NSNumber* getRootTag:(double arg); public virtual NSString* getString:(NSString* arg); - public virtual RCTArrayBuffer* createNativeBuffer:(double size); - public virtual RCTArrayBuffer* getArrayBuffer:(RCTArrayBuffer* buffer); public virtual facebook::react::ModuleConstants constantsToExport(); public virtual facebook::react::ModuleConstants getConstants(); public virtual void getImageUrl:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void getValueWithCallback:(RCTResponseSenderBlock callback); public virtual void getValueWithPromise:resolve:reject:(BOOL error, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); - public virtual void processAsyncBuffer:resolve:reject:(RCTArrayBuffer* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); + public virtual void processAsyncBuffer:resolve:reject:(NSData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseAssert:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseThrows:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void voidFunc(); @@ -6055,7 +6045,7 @@ class facebook::react::ObjCInteropTurboModule : public facebook::react::ObjCTurb protected virtual NSString* getArgumentTypeName(facebook::jsi::Runtime& runtime, NSString* methodName, int argIndex) override; protected virtual facebook::jsi::Value convertReturnIdToJSIValue(facebook::jsi::Runtime& runtime, const char* methodName, facebook::react::TurboModuleMethodValueKind returnType, id result) override; protected virtual facebook::jsi::Value create(facebook::jsi::Runtime& runtime, const facebook::jsi::PropNameID& propName) override; - protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation, bool mustCopyBytes) override; + protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation) override; public ObjCInteropTurboModule(const facebook::react::ObjCTurboModule::InitParams& params); public virtual std::vector getPropertyNames(facebook::jsi::Runtime& runtime) override; } @@ -6070,7 +6060,7 @@ struct facebook::react::ObjCInteropTurboModule::MethodDescriptor { class facebook::react::ObjCTurboModule : public facebook::react::TurboModule { protected virtual NSString* getArgumentTypeName(facebook::jsi::Runtime& runtime, NSString* methodName, int argIndex); protected virtual facebook::jsi::Value convertReturnIdToJSIValue(facebook::jsi::Runtime& runtime, const char* methodName, facebook::react::TurboModuleMethodValueKind returnType, id result); - protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation, bool mustCopyBytes); + protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation); protected void setEventEmitterCallback(facebook::react::EventEmitterCallback eventEmitterCallback); protected void setMethodArgConversionSelector(NSString* methodName, size_t argIndex, NSString* fnName); public ObjCTurboModule(const facebook::react::ObjCTurboModule::InitParams& params); @@ -13340,7 +13330,7 @@ struct facebook::react::dom::RNMeasureRect { facebook::jsi::Value facebook::react::TurboModuleConvertUtils::convertObjCObjectToJSIValue(facebook::jsi::Runtime& runtime, id value); -id facebook::react::TurboModuleConvertUtils::convertJSIValueToObjCObject(facebook::jsi::Runtime& runtime, const facebook::jsi::Value& value, const std::shared_ptr& jsInvoker, BOOL useNSNull = NO, BOOL mustCopyBytes = YES); +id facebook::react::TurboModuleConvertUtils::convertJSIValueToObjCObject(facebook::jsi::Runtime& runtime, const facebook::jsi::Value& value, const std::shared_ptr& jsInvoker, BOOL useNSNull = NO); static const facebook::react::Color facebook::react::HostPlatformColor::UndefinedColor; diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 9e9d12b2d5f0..481f3569b856 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -654,16 +654,6 @@ interface RCTAppearance : public RCTEventEmitter { public virtual instancetype init(); } -interface RCTArrayBuffer : public NSObject { - public @property (assign, readonly) BOOL owningBytes; - public @property (assign, readonly) NSUInteger length; - public @property (assign, readonly) void* mutableBytes NS_RETURNS_INNER_POINTER; - public virtual static instancetype arrayBufferWithCopiedBytes:length:(const void* _Nullable bytes, NSUInteger length); - public virtual static instancetype arrayBufferWithLength:(NSUInteger length); - public virtual static instancetype arrayBufferWithOwnedBytes:length:cleanup:(_Nullable void* bytes, NSUInteger length, _Nullable void(^)(void) cleanup); - public virtual static instancetype arrayBufferWithUnownedBytes:length:(_Nullable void* bytes, NSUInteger length); -} - interface RCTBackedTextFieldDelegateAdapter : public NSObject { public virtual instancetype initWithTextField:(UITextField* backedTextInputView); public virtual void selectedTextRangeWasSet(); @@ -2512,19 +2502,19 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual NSDictionary* getObjectThrows:(NSDictionary* arg); public virtual NSDictionary* getUnsafeObject:(NSDictionary* arg); public virtual NSDictionary* getValue:y:z:(double x, NSString* y, NSDictionary* z); + public virtual NSMutableData* createNativeBuffer:(double size); + public virtual NSMutableData* getArrayBuffer:(NSData* buffer); public virtual NSNumber* getBool:(BOOL arg); public virtual NSNumber* getEnum:(double arg); public virtual NSNumber* getNumber:(double arg); public virtual NSNumber* getRootTag:(double arg); public virtual NSString* getString:(NSString* arg); - public virtual RCTArrayBuffer* createNativeBuffer:(double size); - public virtual RCTArrayBuffer* getArrayBuffer:(RCTArrayBuffer* buffer); public virtual facebook::react::ModuleConstants constantsToExport(); public virtual facebook::react::ModuleConstants getConstants(); public virtual void getImageUrl:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void getValueWithCallback:(RCTResponseSenderBlock callback); public virtual void getValueWithPromise:resolve:reject:(BOOL error, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); - public virtual void processAsyncBuffer:resolve:reject:(RCTArrayBuffer* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); + public virtual void processAsyncBuffer:resolve:reject:(NSData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseAssert:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseThrows:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void voidFunc(); @@ -6166,7 +6156,7 @@ class facebook::react::ObjCInteropTurboModule : public facebook::react::ObjCTurb protected virtual NSString* getArgumentTypeName(facebook::jsi::Runtime& runtime, NSString* methodName, int argIndex) override; protected virtual facebook::jsi::Value convertReturnIdToJSIValue(facebook::jsi::Runtime& runtime, const char* methodName, facebook::react::TurboModuleMethodValueKind returnType, id result) override; protected virtual facebook::jsi::Value create(facebook::jsi::Runtime& runtime, const facebook::jsi::PropNameID& propName) override; - protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation, bool mustCopyBytes) override; + protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation) override; public ObjCInteropTurboModule(const facebook::react::ObjCTurboModule::InitParams& params); public virtual std::vector getPropertyNames(facebook::jsi::Runtime& runtime) override; } @@ -6181,7 +6171,7 @@ struct facebook::react::ObjCInteropTurboModule::MethodDescriptor { class facebook::react::ObjCTurboModule : public facebook::react::TurboModule { protected virtual NSString* getArgumentTypeName(facebook::jsi::Runtime& runtime, NSString* methodName, int argIndex); protected virtual facebook::jsi::Value convertReturnIdToJSIValue(facebook::jsi::Runtime& runtime, const char* methodName, facebook::react::TurboModuleMethodValueKind returnType, id result); - protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation, bool mustCopyBytes); + protected virtual void setInvocationArg(facebook::jsi::Runtime& runtime, const char* methodName, const std::string& objCArgType, const facebook::jsi::Value& arg, size_t i, NSInvocation* inv, NSMutableArray* retainedObjectsForInvocation); protected void setEventEmitterCallback(facebook::react::EventEmitterCallback eventEmitterCallback); protected void setMethodArgConversionSelector(NSString* methodName, size_t argIndex, NSString* fnName); public ObjCTurboModule(const facebook::react::ObjCTurboModule::InitParams& params); @@ -13515,7 +13505,7 @@ struct facebook::react::dom::RNMeasureRect { facebook::jsi::Value facebook::react::TurboModuleConvertUtils::convertObjCObjectToJSIValue(facebook::jsi::Runtime& runtime, id value); -id facebook::react::TurboModuleConvertUtils::convertJSIValueToObjCObject(facebook::jsi::Runtime& runtime, const facebook::jsi::Value& value, const std::shared_ptr& jsInvoker, BOOL useNSNull = NO, BOOL mustCopyBytes = YES); +id facebook::react::TurboModuleConvertUtils::convertJSIValueToObjCObject(facebook::jsi::Runtime& runtime, const facebook::jsi::Value& value, const std::shared_ptr& jsInvoker, BOOL useNSNull = NO); static const facebook::react::Color facebook::react::HostPlatformColor::UndefinedColor; From 19a31849817b8cf0eaef56305330c4b39d826fe8 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Mon, 21 Sep 2026 12:17:17 +0100 Subject: [PATCH 20/35] Revert "Use NSData for the JS->ObjC ArrayBuffer argument path (#57596)" This reverts commit 5e86c323cefb728bba0a21c3b2a65af93e5868d6. # Conflicts: # packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap # packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm --- .../GenerateModuleObjCpp/serializeMethod.js | 2 +- .../GenerateModuleHObjCpp-test.js.snap | 4 ++-- .../core/iostests/RCTTurboModuleTests.mm | 23 ++++++++++--------- .../ios/ReactCommon/RCTTurboModule.mm | 19 +++++++-------- .../RCTTurboModuleArrayBufferTests.mm | 15 ++++++------ 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js index 6811646078e2..e5dcb5e52c14 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js @@ -227,7 +227,7 @@ function getParamObjCType( return notStruct(wrapOptional('NSArray *', !nullable)); } case 'ArrayBufferTypeAnnotation': { - return notStruct(wrapOptional('NSData *', !nullable)); + return notStruct(wrapOptional('NSMutableData *', !nullable)); } } diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap index 8ed200aa17d7..a1bdcd93e58f 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap @@ -103,8 +103,8 @@ Map { @protocol NativeSampleTurboModuleSpec - (NSMutableData *)getArrayBuffer; -- (void)voidArrayBuffer:(NSData *)arg; -- (void)voidNullableArrayBuffer:(NSData * _Nullable)arg; +- (void)voidArrayBuffer:(NSMutableData *)arg; +- (void)voidNullableArrayBuffer:(NSMutableData * _Nullable)arg; @end diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm b/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm index 0c6705ffcfce..fa58d4b4a8cc 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm @@ -319,11 +319,12 @@ - (void)testVoidMethodExceptionCarriesModuleAndMethodName XCTAssertNotNil(original.callStackSymbols); } -// A JS ArrayBuffer converts (on the argument path) to an immutable NSData that -// owns an independent copy of the bytes, so the result stays valid after the -// source buffer is gone. This covers the ArrayBuffer-backed-by-native-MutableBuffer -// case, which is the one that could in principle have been aliased zero-copy. -- (void)testArrayBufferConvertsToIndependentNSData +// A JS ArrayBuffer converts to an NSMutableData that owns an independent copy of +// the bytes — NSMutableData cannot alias a foreign buffer, so the result stays +// valid and is safe to mutate after the source buffer is gone. This covers the +// ArrayBuffer-backed-by-native-MutableBuffer case, which is the one that could in +// principle have been aliased zero-copy. +- (void)testArrayBufferConvertsToIndependentNSMutableData { constexpr size_t kBufferSize = 64 * 1024; @@ -337,15 +338,15 @@ - (void)testArrayBufferConvertsToIndependentNSData id converted = TurboModuleConvertUtils::convertJSIValueToObjCObject(*rt, facebook::jsi::Value(*rt, arrayBuffer), nullptr); - XCTAssertTrue([converted isKindOfClass:[NSData class]]); - NSData *data = (NSData *)converted; + XCTAssertTrue([converted isKindOfClass:[NSMutableData class]]); + NSMutableData *data = (NSMutableData *)converted; XCTAssertEqual(data.length, (NSUInteger)kBufferSize); XCTAssertEqual(*static_cast(data.bytes), 0xAB); - // Independent copy: mutating the source MutableBuffer must not write through to - // the NSData. - *buffer->data() = 0xCD; - XCTAssertEqual(*static_cast(data.bytes), 0xAB, @"NSData must not alias the source buffer"); + // Independent copy: mutating the NSMutableData must not write through to the + // source MutableBuffer. + *static_cast(data.mutableBytes) = 0xCD; + XCTAssertEqual(*buffer->data(), 0xAB, @"NSMutableData must not alias the source buffer"); } @end diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm index 9f7877c5f8a5..f3ec9bc7215b 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm @@ -201,15 +201,16 @@ size_t size() const override }; } -// Copy the ArrayBuffer's bytes into an immutable NSData. An inbound buffer is -// owned by the caller, not the native module, so NSData (not NSMutableData) is -// the correct read-only contract. Copying makes the NSData self-contained and -// safe to retain in a block, store, or dispatch to another thread, regardless of -// whether the bytes were owned by JS (valid only for this callstack) or by a -// native MutableBuffer (which the JS ArrayBuffer may GC concurrently). -static NSData *convertJSIArrayBufferToNSData(jsi::Runtime &rt, const jsi::ArrayBuffer &value) +// Copy the ArrayBuffer's bytes into an NSMutableData. A zero-copy wrap is not +// possible here: NSMutableData needs its own resizable backing store and cannot +// alias a foreign buffer (even via initWithBytesNoCopy:length:deallocator:, which +// copies eagerly for the mutable subclass). Copying also makes the result safe to +// retain in a block, store, or dispatch to another thread, regardless of whether +// the bytes were owned by JS (valid only for this callstack) or by a native +// MutableBuffer (which the JS ArrayBuffer may GC concurrently). +static NSMutableData *convertJSIArrayBufferToNSMutableData(jsi::Runtime &rt, const jsi::ArrayBuffer &value) { - return [NSData dataWithBytes:value.data(rt) length:value.size(rt)]; + return [NSMutableData dataWithBytes:value.data(rt) length:value.size(rt)]; } id convertJSIValueToObjCObject( @@ -242,7 +243,7 @@ id convertJSIValueToObjCObject( return convertJSIFunctionToCallback(runtime, o.getFunction(runtime), jsInvoker); } if (o.isArrayBuffer(runtime)) { - return convertJSIArrayBufferToNSData(runtime, o.getArrayBuffer(runtime)); + return convertJSIArrayBufferToNSMutableData(runtime, o.getArrayBuffer(runtime)); } return convertJSIObjectToNSDictionary(runtime, o, jsInvoker, useNSNull); } diff --git a/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm b/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm index 156af187618d..fd242c2de83d 100644 --- a/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm +++ b/packages/rn-tester/RNTesterUnitTests/RCTTurboModuleArrayBufferTests.mm @@ -105,17 +105,16 @@ @implementation RCTTestArrayBufferTurboModule RCT_EXPORT_MODULE() -RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSMutableData *, testMethodWhichTransformsArrayBuffer : (NSData *)buffer) +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSMutableData *, testMethodWhichMutatesArrayBuffer : (NSMutableData *)buffer) { - NSMutableData *result = [buffer mutableCopy]; - auto *bytes = static_cast(result.mutableBytes); - for (NSUInteger i = 0; i < result.length; ++i) { + auto *bytes = static_cast(buffer.mutableBytes); + for (NSUInteger i = 0; i < buffer.length; ++i) { bytes[i] = static_cast((i + 1) * 10); } - return result; + return buffer; } -RCT_EXPORT_METHOD(testMethodWhichStoresArrayBuffer : (NSData *)payload) +RCT_EXPORT_METHOD(testMethodWhichStoresArrayBuffer : (NSMutableData *)payload) { self.lastReceivedPayload = [payload copy]; } @@ -170,8 +169,8 @@ - (void)testSyncArrayBufferRoundTrip auto result = module.invokeObjCMethod( *rt, ArrayBufferKind, - "testMethodWhichTransformsArrayBuffer", - @selector(testMethodWhichTransformsArrayBuffer:), + "testMethodWhichMutatesArrayBuffer", + @selector(testMethodWhichMutatesArrayBuffer:), args, 1); From 070af03ab3b9584473b0ffb1a837ac252d127ec9 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Mon, 21 Sep 2026 14:42:15 +0100 Subject: [PATCH 21/35] Revert "Align TurboModule EventEmitter payload types across platforms (#58063)" This reverts commit ab2ea649e65cac6bce00770eeebd65a47f88d65a. --- .../src/generators/modules/GenerateModuleH.js | 6 --- .../modules/GenerateModuleJavaSpec.js | 10 ++--- .../serializeEventEmitter.js | 11 ++---- .../src/generators/modules/Utils.js | 19 ---------- .../modules/__test_fixtures__/fixtures.js | 30 --------------- .../modules/__tests__/GenerateModuleH-test.js | 37 ------------------- .../__tests__/GenerateModuleHObjCpp-test.js | 36 ------------------ .../__tests__/GenerateModuleJavaSpec-test.js | 31 ---------------- .../GenerateModuleH-test.js.snap | 24 ------------ .../GenerateModuleHObjCpp-test.js.snap | 3 -- .../GenerateModuleJavaSpec-test.js.snap | 21 ----------- .../GenerateModuleJniCpp-test.js.snap | 3 -- .../GenerateModuleMm-test.js.snap | 24 ------------ .../src/parsers/__tests__/error-utils-test.js | 30 --------------- .../src/parsers/error-utils.js | 21 ----------- .../src/parsers/errors.js | 16 -------- .../modules/__test_fixtures__/failures.js | 26 ------------- .../modules/__test_fixtures__/fixtures.js | 5 +-- .../module-parser-snapshot-test.js.snap | 32 ---------------- .../src/parsers/parsers-commons.js | 8 ---- .../modules/__test_fixtures__/failures.js | 22 ----------- .../modules/__test_fixtures__/fixtures.js | 4 -- ...script-module-parser-snapshot-test.js.snap | 32 ---------------- 23 files changed, 10 insertions(+), 441 deletions(-) diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index d2395dd297cf..af7f00aa3008 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -40,7 +40,6 @@ const { getModules, isArrayRecursiveMember, isDirectRecursiveMember, - throwIfUnsupportedEventEmitterPayload, } = require('./Utils'); type FilesOutput = Map; @@ -639,11 +638,6 @@ function translateEventEmitterToCpp( resolveAlias: AliasResolver, enumMap: NativeModuleEnumMap, ): EventEmitterCpp { - throwIfUnsupportedEventEmitterPayload( - eventEmitter.name, - eventEmitter.typeAnnotation.typeAnnotation, - ); - const isVoidTypeAnnotation = eventEmitter.typeAnnotation.typeAnnotation.type === 'VoidTypeAnnotation'; const templateName = `${toPascalCase(eventEmitter.name)}Type`; diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js index 52e8aa994d39..9dc0b42ce8f6 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js @@ -28,7 +28,6 @@ const {parseValidUnionType, toPascalCase} = require('../Utils'); const { createAliasResolver, getModules, - throwIfUnsupportedEventEmitterPayload, throwIfUnsupportedPromiseArrayBuffer, } = require('./Utils'); @@ -142,9 +141,6 @@ function translateEventEmitterTypeToJavaType( imports: Set, ): string { const typeAnnotation = eventEmitter.typeAnnotation.typeAnnotation; - - throwIfUnsupportedEventEmitterPayload(eventEmitter.name, typeAnnotation); - switch (typeAnnotation.type) { case 'StringTypeAnnotation': return 'String'; @@ -183,8 +179,12 @@ function translateEventEmitterTypeToJavaType( case 'ArrayTypeAnnotation': imports.add('com.facebook.react.bridge.ReadableArray'); return 'ReadableArray'; + case 'DoubleTypeAnnotation': + case 'FloatTypeAnnotation': + case 'Int32TypeAnnotation': case 'VoidTypeAnnotation': - // Void emitters take no argument, so the caller never asks for a type. + case 'ArrayBufferTypeAnnotation': + // TODO: Add support for these types throw new Error( `Unsupported eventType for ${eventEmitter.name}. Found: ${eventEmitter.typeAnnotation.typeAnnotation.type}`, ); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js index 774c4afb4903..b5ea25048fef 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js @@ -11,15 +11,12 @@ import type {NativeModuleEventEmitterShape} from '../../../CodegenSchema'; const {parseValidUnionType, toPascalCase} = require('../../Utils'); -const {throwIfUnsupportedEventEmitterPayload} = require('../Utils'); function getEventEmitterTypeObjCType( eventEmitter: NativeModuleEventEmitterShape, ): string { const typeAnnotation = eventEmitter.typeAnnotation.typeAnnotation; - throwIfUnsupportedEventEmitterPayload(eventEmitter.name, typeAnnotation); - switch (typeAnnotation.type) { case 'StringTypeAnnotation': return 'NSString *_Nonnull'; @@ -42,9 +39,6 @@ function getEventEmitterTypeObjCType( } case 'NumberTypeAnnotation': case 'NumberLiteralTypeAnnotation': - case 'DoubleTypeAnnotation': - case 'FloatTypeAnnotation': - case 'Int32TypeAnnotation': return 'NSNumber *_Nonnull'; case 'BooleanTypeAnnotation': case 'BooleanLiteralTypeAnnotation': @@ -55,8 +49,11 @@ function getEventEmitterTypeObjCType( return 'NSDictionary *'; case 'ArrayTypeAnnotation': return 'NSArray> *'; + case 'DoubleTypeAnnotation': + case 'FloatTypeAnnotation': + case 'Int32TypeAnnotation': case 'VoidTypeAnnotation': - // Void emitters take no argument, so both callers skip this function. + // TODO: Add support for these types throw new Error( `Unsupported eventType for ${eventEmitter.name}. Found: ${eventEmitter.typeAnnotation.typeAnnotation.type}`, ); diff --git a/packages/react-native-codegen/src/generators/modules/Utils.js b/packages/react-native-codegen/src/generators/modules/Utils.js index 9c35c3e5bea0..8cd8d37ff096 100644 --- a/packages/react-native-codegen/src/generators/modules/Utils.js +++ b/packages/react-native-codegen/src/generators/modules/Utils.js @@ -118,29 +118,10 @@ function throwIfUnsupportedPromiseArrayBuffer( } } -// ArrayBuffer is not emittable on any platform: Android emitters always carry a -// folly::dynamic payload, which cannot hold raw bytes, and neither the ObjC nor -// the C++ emitter contract can hand out a buffer that outlives the emit call. -// The parser rejects this too; the guard here also covers schemas built without -// going through the parser. -function throwIfUnsupportedEventEmitterPayload( - eventEmitterName: string, - typeAnnotation: NativeModuleTypeAnnotation, -): void { - if (typeAnnotation.type === 'ArrayBufferTypeAnnotation') { - throw new Error( - `Unsupported eventType for ${eventEmitterName}. Found: ${typeAnnotation.type}. ` + - 'ArrayBuffer is not supported as an EventEmitter payload on any platform. ' + - 'Pass the ArrayBuffer through a method instead.', - ); - } -} - module.exports = { createAliasResolver, getModules, isDirectRecursiveMember, isArrayRecursiveMember, - throwIfUnsupportedEventEmitterPayload, throwIfUnsupportedPromiseArrayBuffer, }; diff --git a/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js index fca175285f76..83cc98bef054 100644 --- a/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js @@ -130,36 +130,6 @@ const EVENT_EMITTER_MODULES: SchemaType = { }, }, }, - { - name: 'onEvent7', - optional: false, - typeAnnotation: { - type: 'EventEmitterTypeAnnotation', - typeAnnotation: { - type: 'DoubleTypeAnnotation', - }, - }, - }, - { - name: 'onEvent8', - optional: false, - typeAnnotation: { - type: 'EventEmitterTypeAnnotation', - typeAnnotation: { - type: 'FloatTypeAnnotation', - }, - }, - }, - { - name: 'onEvent9', - optional: false, - typeAnnotation: { - type: 'EventEmitterTypeAnnotation', - typeAnnotation: { - type: 'Int32TypeAnnotation', - }, - }, - }, ], methods: [ { diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleH-test.js b/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleH-test.js index 48e619215f0d..3bc24589a19c 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleH-test.js +++ b/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleH-test.js @@ -10,37 +10,9 @@ 'use strict'; -import type {SchemaType} from '../../../CodegenSchema'; - const fixtures = require('../__test_fixtures__/fixtures.js'); const generator = require('../GenerateModuleH.js'); -const ARRAY_BUFFER_EVENT_EMITTER_SCHEMA: SchemaType = { - modules: { - NativeSampleTurboModule: { - type: 'NativeModule', - aliasMap: {}, - enumMap: {}, - spec: { - eventEmitters: [ - { - name: 'onBuffer', - optional: false, - typeAnnotation: { - type: 'EventEmitterTypeAnnotation', - typeAnnotation: { - type: 'ArrayBufferTypeAnnotation', - }, - }, - }, - ], - methods: [], - }, - moduleName: 'SampleTurboModule', - }, - }, -}; - describe('GenerateModuleH', () => { Object.keys(fixtures) .sort() @@ -57,13 +29,4 @@ describe('GenerateModuleH', () => { ).toMatchSnapshot(); }); }); - - it('throws for an EventEmitter with an ArrayBuffer payload', () => { - expect(() => - generator.generate( - 'array_buffer_event_emitter_throws', - ARRAY_BUFFER_EVENT_EMITTER_SCHEMA, - ), - ).toThrow(/ArrayBuffer is not supported as an EventEmitter payload/); - }); }); diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleHObjCpp-test.js b/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleHObjCpp-test.js index 5dd67931bc09..c151a4aa1cc1 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleHObjCpp-test.js +++ b/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleHObjCpp-test.js @@ -71,40 +71,4 @@ describe('GenerateModuleHObjCpp', () => { ), ).toThrow(/Promise is not supported/); }); - - it('throws for an EventEmitter with an ArrayBuffer payload', () => { - const schema: SchemaType = { - modules: { - NativeSampleTurboModule: { - type: 'NativeModule', - aliasMap: {}, - enumMap: {}, - spec: { - eventEmitters: [ - { - name: 'onBuffer', - optional: false, - typeAnnotation: { - type: 'EventEmitterTypeAnnotation', - typeAnnotation: { - type: 'ArrayBufferTypeAnnotation', - }, - }, - }, - ], - methods: [], - }, - moduleName: 'SampleTurboModule', - }, - }, - }; - expect(() => - generator.generate( - 'array_buffer_event_emitter_throws', - schema, - 'com.facebook.fbreact.specs', - false, - ), - ).toThrow(/ArrayBuffer is not supported as an EventEmitter payload/); - }); }); diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleJavaSpec-test.js b/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleJavaSpec-test.js index a413ae0c27a0..3cbcf9747179 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleJavaSpec-test.js +++ b/packages/react-native-codegen/src/generators/modules/__tests__/GenerateModuleJavaSpec-test.js @@ -64,35 +64,4 @@ describe('GenerateModuleJavaSpec', () => { generator.generate('array_buffer_promise_throws', schema), ).toThrow(/Promise is not supported/); }); - - it('throws for an EventEmitter with an ArrayBuffer payload', () => { - const schema: SchemaType = { - modules: { - NativeSampleTurboModule: { - type: 'NativeModule', - aliasMap: {}, - enumMap: {}, - spec: { - eventEmitters: [ - { - name: 'onBuffer', - optional: false, - typeAnnotation: { - type: 'EventEmitterTypeAnnotation', - typeAnnotation: { - type: 'ArrayBufferTypeAnnotation', - }, - }, - }, - ], - methods: [], - }, - moduleName: 'SampleTurboModule', - }, - }, - }; - expect(() => - generator.generate('array_buffer_event_emitter_throws', schema), - ).toThrow(/ArrayBuffer is not supported as an EventEmitter payload/); - }); }); diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap index 466e7e67626e..f2b1d6ad49ce 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleH-test.js.snap @@ -1083,9 +1083,6 @@ protected: eventEmitterMap_[\\"onEvent4\\"] = std::make_shared>(); eventEmitterMap_[\\"onEvent5\\"] = std::make_shared>(); eventEmitterMap_[\\"onEvent6\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent7\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent8\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent9\\"] = std::make_shared>(); } void emitOnEvent1() { @@ -1126,27 +1123,6 @@ protected: return bridging::toJs(rt, eventValue, jsInvoker); }); } - - template void emitOnEvent7(OnEvent7Type value) { - static_assert(bridging::supportsFromJs, \\"value cannnot be converted to double\\"); - static_cast&>(*eventEmitterMap_[\\"onEvent7\\"]).emit([jsInvoker = jsInvoker_, eventValue = value](jsi::Runtime& rt) -> jsi::Value { - return bridging::toJs(rt, eventValue, jsInvoker); - }); - } - - template void emitOnEvent8(OnEvent8Type value) { - static_assert(bridging::supportsFromJs, \\"value cannnot be converted to double\\"); - static_cast&>(*eventEmitterMap_[\\"onEvent8\\"]).emit([jsInvoker = jsInvoker_, eventValue = value](jsi::Runtime& rt) -> jsi::Value { - return bridging::toJs(rt, eventValue, jsInvoker); - }); - } - - template void emitOnEvent9(OnEvent9Type value) { - static_assert(bridging::supportsFromJs, \\"value cannnot be converted to int\\"); - static_cast&>(*eventEmitterMap_[\\"onEvent9\\"]).emit([jsInvoker = jsInvoker_, eventValue = value](jsi::Runtime& rt) -> jsi::Value { - return bridging::toJs(rt, eventValue, jsInvoker); - }); - } private: static jsi::Value __voidFunc(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* /*args*/, size_t /*count*/) { static_assert( diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap index a1bdcd93e58f..cdd2958afd94 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleHObjCpp-test.js.snap @@ -607,9 +607,6 @@ facebook::react::EventEmitterCallback _eventEmitterCallback; - (void)emitOnEvent4:(BOOL)value; - (void)emitOnEvent5:(NSDictionary *)value; - (void)emitOnEvent6:(NSArray> *)value; -- (void)emitOnEvent7:(NSNumber *_Nonnull)value; -- (void)emitOnEvent8:(NSNumber *_Nonnull)value; -- (void)emitOnEvent9:(NSNumber *_Nonnull)value; @end namespace facebook::react { diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap index c9d66a175adf..14722e2179f5 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap @@ -292,27 +292,6 @@ public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaMo } } - protected final void emitOnEvent7(double value) { - CxxCallbackImpl eventEmitterCallback = mEventEmitterCallback; - if (eventEmitterCallback != null) { - eventEmitterCallback.invoke(\\"onEvent7\\", value); - } - } - - protected final void emitOnEvent8(double value) { - CxxCallbackImpl eventEmitterCallback = mEventEmitterCallback; - if (eventEmitterCallback != null) { - eventEmitterCallback.invoke(\\"onEvent8\\", value); - } - } - - protected final void emitOnEvent9(double value) { - CxxCallbackImpl eventEmitterCallback = mEventEmitterCallback; - if (eventEmitterCallback != null) { - eventEmitterCallback.invoke(\\"onEvent9\\", value); - } - } - @ReactMethod @DoNotStrip public abstract void voidFunc(); diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap index 9207d5d26a5d..547344fda403 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJniCpp-test.js.snap @@ -280,9 +280,6 @@ NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const JavaTurboMo eventEmitterMap_[\\"onEvent4\\"] = std::make_shared>(); eventEmitterMap_[\\"onEvent5\\"] = std::make_shared>(); eventEmitterMap_[\\"onEvent6\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent7\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent8\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent9\\"] = std::make_shared>(); configureEventEmitterCallback(); } diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap index 0395bb0b6548..f70403ac89b6 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleMm-test.js.snap @@ -366,27 +366,6 @@ Map { eventEmitterCallback(\\"onEvent6\\", value); } } -- (void)emitOnEvent7:(NSNumber *_Nonnull)value -{ - auto eventEmitterCallback = _eventEmitterCallback; - if (eventEmitterCallback) { - eventEmitterCallback(\\"onEvent7\\", value); - } -} -- (void)emitOnEvent8:(NSNumber *_Nonnull)value -{ - auto eventEmitterCallback = _eventEmitterCallback; - if (eventEmitterCallback) { - eventEmitterCallback(\\"onEvent8\\", value); - } -} -- (void)emitOnEvent9:(NSNumber *_Nonnull)value -{ - auto eventEmitterCallback = _eventEmitterCallback; - if (eventEmitterCallback) { - eventEmitterCallback(\\"onEvent9\\", value); - } -} - (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper { @@ -412,9 +391,6 @@ namespace facebook::react { eventEmitterMap_[\\"onEvent4\\"] = std::make_shared>(); eventEmitterMap_[\\"onEvent5\\"] = std::make_shared>(); eventEmitterMap_[\\"onEvent6\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent7\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent8\\"] = std::make_shared>(); - eventEmitterMap_[\\"onEvent9\\"] = std::make_shared>(); setEventEmitterCallback([eventEmitterMap = eventEmitterMap_](const std::string &name, id value) { auto it = eventEmitterMap.find(name); if (it != eventEmitterMap.end() && it->second) { diff --git a/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js b/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js index ec101f4a0bd0..6e893f6e4197 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js @@ -18,7 +18,6 @@ const { throwIfArgumentPropsAreNull, throwIfArrayElementTypeAnnotationIsUnsupported, throwIfBubblingTypeIsNull, - throwIfEventEmitterPayloadTypeIsUnsupported, throwIfEventHasNoName, throwIfIncorrectModuleRegistryCallArgument, throwIfIncorrectModuleRegistryCallTypeParameterParserError, @@ -826,35 +825,6 @@ describe('throwIfArrayElementTypeAnnotationIsUnsupported', () => { }); }); -describe('throwIfEventEmitterPayloadTypeIsUnsupported', () => { - const { - UnsupportedModuleEventEmitterPayloadTypeParserError, - } = require('../errors.js'); - const moduleName = 'moduleName'; - - it('throws the error if the payload is an ArrayBuffer', () => { - expect(() => { - throwIfEventEmitterPayloadTypeIsUnsupported( - moduleName, - undefined, - 'onBuffer', - {type: 'ArrayBufferTypeAnnotation'}, - ); - }).toThrow(UnsupportedModuleEventEmitterPayloadTypeParserError); - }); - - it('does not throw the error if the payload is a supported type', () => { - expect(() => { - throwIfEventEmitterPayloadTypeIsUnsupported( - moduleName, - undefined, - 'onCount', - {type: 'DoubleTypeAnnotation'}, - ); - }).not.toThrow(); - }); -}); - describe('throwIfPartialNotAnnotatingTypeParameter', () => { const flowParser = new FlowParser(); const typescriptParser = new TypeScriptParser(); diff --git a/packages/react-native-codegen/src/parsers/error-utils.js b/packages/react-native-codegen/src/parsers/error-utils.js index 3eb3d5eef65d..348f688f9b7a 100644 --- a/packages/react-native-codegen/src/parsers/error-utils.js +++ b/packages/react-native-codegen/src/parsers/error-utils.js @@ -27,7 +27,6 @@ const { UnsupportedArrayElementTypeAnnotationParserError, UnsupportedFunctionParamTypeAnnotationParserError, UnsupportedFunctionReturnTypeAnnotationParserError, - UnsupportedModuleEventEmitterPayloadTypeParserError, UnsupportedModuleEventEmitterPropertyParserError, UnsupportedModuleEventEmitterTypePropertyParserError, UnsupportedModulePropertyParserError, @@ -197,25 +196,6 @@ function throwIfEventEmitterEventTypeIsUnsupported( } } -// ArrayBuffer is not emittable on any platform: Android emitters always carry a -// folly::dynamic payload, which cannot hold raw bytes, and neither the ObjC nor -// the C++ emitter contract can hand out a buffer that outlives the emit call. -function throwIfEventEmitterPayloadTypeIsUnsupported( - nativeModuleName: string, - propertyValue: $FlowFixMe, - propertyName: string, - payloadTypeAnnotation: NativeModuleTypeAnnotation, -) { - if (payloadTypeAnnotation.type === 'ArrayBufferTypeAnnotation') { - throw new UnsupportedModuleEventEmitterPayloadTypeParserError( - nativeModuleName, - propertyValue, - propertyName, - 'ArrayBuffer', - ); - } -} - function throwIfModuleTypeIsUnsupported( nativeModuleName: string, propertyValue: $FlowFixMe, @@ -438,7 +418,6 @@ module.exports = { throwIfUntypedModule, throwIfEventEmitterTypeIsUnsupported, throwIfEventEmitterEventTypeIsUnsupported, - throwIfEventEmitterPayloadTypeIsUnsupported, throwIfModuleTypeIsUnsupported, throwIfMoreThanOneModuleInterfaceParserError, throwIfUnsupportedFunctionParamTypeAnnotationParserError, diff --git a/packages/react-native-codegen/src/parsers/errors.js b/packages/react-native-codegen/src/parsers/errors.js index 8cd8706eac56..7e0b2277930f 100644 --- a/packages/react-native-codegen/src/parsers/errors.js +++ b/packages/react-native-codegen/src/parsers/errors.js @@ -111,21 +111,6 @@ class UnsupportedModuleEventEmitterPropertyParserError extends ParserError { } } -class UnsupportedModuleEventEmitterPayloadTypeParserError extends ParserError { - constructor( - nativeModuleName: string, - propertyValue: $FlowFixMe, - propertyName: string, - payloadType: string, - ) { - super( - nativeModuleName, - propertyValue, - `EventEmitter '${propertyName}' cannot have payload type '${payloadType}'.`, - ); - } -} - class UnsupportedModulePropertyParserError extends ParserError { constructor( nativeModuleName: string, @@ -471,7 +456,6 @@ module.exports = { UnsupportedEnumDeclarationParserError, UnsupportedModuleEventEmitterTypePropertyParserError, UnsupportedModuleEventEmitterPropertyParserError, - UnsupportedModuleEventEmitterPayloadTypeParserError, UnsupportedModulePropertyParserError, UnsupportedObjectPropertyTypeAnnotationParserError, UnsupportedObjectPropertyWithIndexerTypeAnnotationParserError, diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/failures.js b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/failures.js index 9c55884ac0a7..515098be5462 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/failures.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/failures.js @@ -350,31 +350,6 @@ export default TurboModuleRegistry.getEnforcing('SampleTurboModule'); `; -const NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_EVENT_EMITTER = ` -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow strict-local - * @format - */ - -'use strict'; - -import type {TurboModule} from '../RCTExport'; -import type {EventEmitter} from '../CodegenTypes'; -import * as TurboModuleRegistry from '../TurboModuleRegistry'; - -export interface Spec extends TurboModule { - +onBuffer: EventEmitter; -} - -export default TurboModuleRegistry.getEnforcing('SampleTurboModule'); - -`; - module.exports = { NATIVE_MODULES_WITH_READ_ONLY_OBJECT_NO_TYPE_FOR_CONTENT, NATIVE_MODULES_WITH_UNNAMED_PARAMS, @@ -389,5 +364,4 @@ module.exports = { NUMERIC_VALUES_ENUM_NATIVE_MODULE, MAP_WITH_EXTRA_KEYS_NATIVE_MODULE, NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_OBJECT_PROPERTY, - NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_EVENT_EMITTER, }; diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js index 9cc97dbef580..53605cbe10ea 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js @@ -667,7 +667,7 @@ const NATIVE_MODULE_WITH_EVENT_EMITTERS = ` 'use strict'; import type {TurboModule} from '../RCTExport'; -import type {Double, EventEmitter, Float, Int32} from '../CodegenTypes'; +import type {EventEmitter} from '../CodegenTypes'; import * as TurboModuleRegistry from '../TurboModuleRegistry'; export type ObjectStruct = { @@ -686,9 +686,6 @@ export interface Spec extends TurboModule { +onEvent5: EventEmitter; +onEvent6: EventEmitter; +onEvent7: EventEmitter; - +onEvent8: EventEmitter; - +onEvent9: EventEmitter; - +onEvent10: EventEmitter; } export default TurboModuleRegistry.getEnforcing('SampleTurboModule'); diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap index 64d69f752c6f..5309c7d0c616 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap @@ -6,8 +6,6 @@ exports[`RN Codegen Flow Parser Fails with error message MAP_WITH_EXTRA_KEYS_NAT exports[`RN Codegen Flow Parser Fails with error message MIXED_VALUES_ENUM_NATIVE_MODULE 1`] = `"Module NativeSampleTurboModule: Failed parsing the enum SomeEnum in NativeSampleTurboModule with the error: Enums can not be mixed- they all must be either blank, number, or string values."`; -exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_EVENT_EMITTER 1`] = `"Module NativeSampleTurboModule: EventEmitter 'onBuffer' cannot have payload type 'ArrayBuffer'."`; - exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_OBJECT_PROPERTY 1`] = `"Module NativeSampleTurboModule: Object property '[object Object]' cannot have type 'ArrayBuffer'."`; exports[`RN Codegen Flow Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_WITH_NO_TYPE_FOR_CONTENT 1`] = `"Module NativeSampleTurboModule: Generic 'Array' must have type parameters."`; @@ -2121,36 +2119,6 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_EVENT_EM } } } - }, - { - 'name': 'onEvent8', - 'optional': false, - 'typeAnnotation': { - 'type': 'EventEmitterTypeAnnotation', - 'typeAnnotation': { - 'type': 'DoubleTypeAnnotation' - } - } - }, - { - 'name': 'onEvent9', - 'optional': false, - 'typeAnnotation': { - 'type': 'EventEmitterTypeAnnotation', - 'typeAnnotation': { - 'type': 'FloatTypeAnnotation' - } - } - }, - { - 'name': 'onEvent10', - 'optional': false, - 'typeAnnotation': { - 'type': 'EventEmitterTypeAnnotation', - 'typeAnnotation': { - 'type': 'Int32TypeAnnotation' - } - } } ], 'methods': [] diff --git a/packages/react-native-codegen/src/parsers/parsers-commons.js b/packages/react-native-codegen/src/parsers/parsers-commons.js index a8b64de42408..330e52fe8c76 100644 --- a/packages/react-native-codegen/src/parsers/parsers-commons.js +++ b/packages/react-native-codegen/src/parsers/parsers-commons.js @@ -42,7 +42,6 @@ import type { const { throwIfConfigNotfound, throwIfEventEmitterEventTypeIsUnsupported, - throwIfEventEmitterPayloadTypeIsUnsupported, throwIfEventEmitterTypeIsUnsupported, throwIfIncorrectModuleRegistryCallArgument, throwIfIncorrectModuleRegistryCallTypeParameterParserError, @@ -552,13 +551,6 @@ function buildEventEmitterSchema( parser, ); - throwIfEventEmitterPayloadTypeIsUnsupported( - hasteModuleName, - typeAnnotation.typeParameters.params[0], - key.name, - eventTypeAnnotation, - ); - return { name: eventemitterName, optional: Boolean(property.optional), diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/failures.js b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/failures.js index 11b7f2b08519..a59c138df1d8 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/failures.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/failures.js @@ -286,27 +286,6 @@ export default TurboModuleRegistry.getEnforcing('SampleTurboModule'); `; -const NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_EVENT_EMITTER = ` -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; -import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; - -export interface Spec extends TurboModule { - readonly onBuffer: EventEmitter; -} - -export default TurboModuleRegistry.getEnforcing('SampleTurboModule'); - -`; - module.exports = { NATIVE_MODULES_WITH_UNNAMED_PARAMS, NATIVE_MODULES_WITH_PROMISE_WITHOUT_TYPE, @@ -320,5 +299,4 @@ module.exports = { NUMERIC_VALUES_ENUM_NATIVE_MODULE, MAP_WITH_EXTRA_KEYS_NATIVE_MODULE, NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_OBJECT_PROPERTY, - NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_EVENT_EMITTER, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js index ddd35c961d9c..c405627b93e4 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js @@ -766,7 +766,6 @@ const NATIVE_MODULE_WITH_EVENT_EMITTERS = ` */ import type {TurboModule} from 'react-native/Libraries/TurboModule/RCTExport'; -import type {Double, Float, Int32} from 'react-native/Libraries/Types/CodegenTypes'; import * as TurboModuleRegistry from 'react-native/Libraries/TurboModule/TurboModuleRegistry'; export type ObjectStruct = { @@ -785,9 +784,6 @@ export interface Spec extends TurboModule { readonly onEvent5: EventEmitter; readonly onEvent6: EventEmitter; readonly onEvent7: EventEmitter; - readonly onEvent8: EventEmitter; - readonly onEvent9: EventEmitter; - readonly onEvent10: EventEmitter; } export default TurboModuleRegistry.getEnforcing('SampleTurboModule'); diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index 27c8ba733690..4b098b27af55 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -6,8 +6,6 @@ exports[`RN Codegen TypeScript Parser Fails with error message MAP_WITH_EXTRA_KE exports[`RN Codegen TypeScript Parser Fails with error message MIXED_VALUES_ENUM_NATIVE_MODULE 1`] = `"Module NativeSampleTurboModule: Failed parsing the enum SomeEnum in NativeSampleTurboModule with the error: Enum values can not be mixed. They all must be either blank, number, or string values."`; -exports[`RN Codegen TypeScript Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_EVENT_EMITTER 1`] = `"Module NativeSampleTurboModule: EventEmitter 'onBuffer' cannot have payload type 'ArrayBuffer'."`; - exports[`RN Codegen TypeScript Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_BUFFER_IN_OBJECT_PROPERTY 1`] = `"Module NativeSampleTurboModule: Object property '[object Object]' cannot have type 'ArrayBuffer'."`; exports[`RN Codegen TypeScript Parser Fails with error message NATIVE_MODULES_WITH_ARRAY_WITH_NO_TYPE_FOR_CONTENT 1`] = `"Module NativeSampleTurboModule: Generic 'Array' must have type parameters."`; @@ -2345,36 +2343,6 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_EV } } } - }, - { - 'name': 'onEvent8', - 'optional': false, - 'typeAnnotation': { - 'type': 'EventEmitterTypeAnnotation', - 'typeAnnotation': { - 'type': 'DoubleTypeAnnotation' - } - } - }, - { - 'name': 'onEvent9', - 'optional': false, - 'typeAnnotation': { - 'type': 'EventEmitterTypeAnnotation', - 'typeAnnotation': { - 'type': 'FloatTypeAnnotation' - } - } - }, - { - 'name': 'onEvent10', - 'optional': false, - 'typeAnnotation': { - 'type': 'EventEmitterTypeAnnotation', - 'typeAnnotation': { - 'type': 'Int32TypeAnnotation' - } - } } ], 'methods': [] From 215169c51bfe7b395a73454d65d5ff20e60113d6 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Mon, 21 Sep 2026 16:15:27 +0000 Subject: [PATCH 22/35] Release 0.88.0-rc.2 #publish-packages-to-npm&next --- package.json | 4 ++-- packages/asset-utils/package.json | 2 +- packages/assets-registry/package.json | 2 +- packages/babel-plugin-codegen/package.json | 4 ++-- packages/community-cli-plugin/package.json | 8 ++++---- packages/debugger-frontend/package.json | 2 +- packages/debugger-shell/bin/react-native-devtools | 12 ++++++------ packages/debugger-shell/package.json | 2 +- packages/dev-middleware/package.json | 8 ++++---- packages/eslint-config-react-native/package.json | 4 ++-- packages/eslint-plugin-react-native/package.json | 2 +- packages/eslint-plugin-specs/package.json | 4 ++-- packages/gradle-plugin/package.json | 2 +- packages/jest-preset/package.json | 4 ++-- packages/metro-config/package.json | 6 +++--- packages/new-app-screen/package.json | 4 ++-- packages/normalize-color/package.json | 2 +- packages/polyfills/package.json | 2 +- packages/react-native-babel-preset/package.json | 4 ++-- .../react-native-babel-transformer/package.json | 4 ++-- packages/react-native-codegen/package.json | 2 +- .../react-native-compatibility-check/package.json | 4 ++-- .../react-native-popup-menu-android/package.json | 6 +++--- .../Libraries/Core/ReactNativeVersion.js | 2 +- packages/react-native/React/Base/RCTVersion.m | 2 +- .../react-native/ReactAndroid/gradle.properties | 2 +- .../react/modules/systeminfo/ReactNativeVersion.kt | 2 +- .../ReactCommon/cxxreact/ReactNativeVersion.h | 2 +- packages/react-native/package.json | 14 +++++++------- .../generate-artifacts-executor-test.js.snap | 8 ++++---- packages/rn-tester/package.json | 8 ++++---- packages/typescript-config/package.json | 2 +- packages/virtualized-lists/package.json | 4 ++-- private/helloworld/package.json | 12 ++++++------ .../package.json | 2 +- 35 files changed, 77 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index 2bfa31eca163..8baf9f52daa1 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,8 @@ "@jest/create-cache-key-function": "^29.7.0", "@microsoft/api-extractor": "^7.52.2", "@octokit/rest": "^22.0.0", - "@react-native/metro-babel-transformer": "0.88.0-rc.1", - "@react-native/metro-config": "0.88.0-rc.1", + "@react-native/metro-babel-transformer": "0.88.0-rc.2", + "@react-native/metro-config": "0.88.0-rc.2", "@tsconfig/node22": "22.0.2", "@types/react": "^19.1.0", "@typescript-eslint/parser": "^8.59.2", diff --git a/packages/asset-utils/package.json b/packages/asset-utils/package.json index 647f56f3b9f9..51e2c66ac76e 100644 --- a/packages/asset-utils/package.json +++ b/packages/asset-utils/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/asset-utils", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Asset path utilities for React Native.", "license": "MIT", "repository": { diff --git a/packages/assets-registry/package.json b/packages/assets-registry/package.json index c3e123270702..db23c45e5fbd 100644 --- a/packages/assets-registry/package.json +++ b/packages/assets-registry/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index f79ef9a71958..6347fff31d8f 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-plugin-codegen", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ ], "dependencies": { "@babel/traverse": "^7.29.0", - "@react-native/codegen": "0.88.0-rc.1" + "@react-native/codegen": "0.88.0-rc.2" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index facfd5f6da7e..a4578013ff5f 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/community-cli-plugin", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -31,8 +31,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.1", - "@react-native/dev-middleware": "0.88.0-rc.1", + "@react-native/asset-utils": "0.88.0-rc.2", + "@react-native/dev-middleware": "0.88.0-rc.2", "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -44,7 +44,7 @@ }, "peerDependencies": { "@react-native-community/cli": "*", - "@react-native/metro-config": "0.88.0-rc.1" + "@react-native/metro-config": "0.88.0-rc.2" }, "peerDependenciesMeta": { "@react-native-community/cli": { diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index 22ba9175aa0b..6b5484db8308 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/debugger-frontend", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Debugger frontend for React Native based on Chrome DevTools", "keywords": [ "react-native", diff --git a/packages/debugger-shell/bin/react-native-devtools b/packages/debugger-shell/bin/react-native-devtools index e3c1e8908fd6..1351c1c13305 100755 --- a/packages/debugger-shell/bin/react-native-devtools +++ b/packages/debugger-shell/bin/react-native-devtools @@ -1,6 +1,6 @@ #!/usr/bin/env dotslash -// @generated SignedSource<> +// @generated SignedSource<<2ea17685ffe3ab3951a8abaa6011b60e>> { @@ -12,7 +12,7 @@ "digest": "020eea3cf10f77b8f4e1ae4a2aaa7d78a77c3802de6b00448866aa9c860509c4", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-linux-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-linux-aarch64.tar.gz" }, { "type": "http", @@ -28,7 +28,7 @@ "digest": "933aa98eb68da7f8d1b6e83e611e51f66d026f3b410dc13577faa6adf1b0f75c", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-linux-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-linux-x86_64.tar.gz" }, { "type": "http", @@ -44,7 +44,7 @@ "digest": "4a1c234b1cf27f1ff006fafce6628b8ef6993d7d3298c6ed2127e3055c93dcc6", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-macos-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-macos-aarch64.tar.gz" }, { "type": "http", @@ -60,7 +60,7 @@ "digest": "9f1de3cb78688befaea4d9e5f640a66833dd44ad58b05590a7e07bce279bf532", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-macos-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-macos-x86_64.tar.gz" }, { "type": "http", @@ -76,7 +76,7 @@ "digest": "5b56e22828549f12be49f0431fd74c54dcebfbfb4277e4b87573ec1ab084c288", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.1/React.Native.DevTools-windows-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-windows-x86_64.tar.gz" }, { "type": "http", diff --git a/packages/debugger-shell/package.json b/packages/debugger-shell/package.json index 7766dabdd1e0..efad6492cfe0 100644 --- a/packages/debugger-shell/package.json +++ b/packages/debugger-shell/package.json @@ -1,7 +1,7 @@ { "name": "@react-native/debugger-shell", "productName": "React Native DevTools", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Experimental debugger shell for React Native for use with @react-native/debugger-frontend", "keywords": [ "react-native", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index a92b7903106b..6e8ec7d330a5 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/dev-middleware", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Dev server middleware for React Native", "keywords": [ "react-native", @@ -32,8 +32,8 @@ }, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.88.0-rc.1", - "@react-native/debugger-shell": "0.88.0-rc.1", + "@react-native/debugger-frontend": "0.88.0-rc.2", + "@react-native/debugger-shell": "0.88.0-rc.2", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -43,7 +43,7 @@ "ws": "^7.5.10" }, "devDependencies": { - "@react-native/debugger-shell": "0.88.0-rc.1", + "@react-native/debugger-shell": "0.88.0-rc.2", "selfsigned": "^5.5.0", "undici": "^6.23.0", "wait-for-expect": "^3.0.2" diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 97796447cf98..78729240b42e 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-config", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "ESLint config for React Native", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", - "@react-native/eslint-plugin": "0.88.0-rc.1", + "@react-native/eslint-plugin": "0.88.0-rc.2", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", "eslint-config-prettier": "^8.5.0", diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index 6d901b8564a5..e8515e7aa623 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "ESLint rules for @react-native/eslint-config", "license": "MIT", "repository": { diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index e510c27f2a67..356aec4c8276 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin-specs", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "ESLint rules to validate NativeModule and Component Specs", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@react-native/codegen": "0.88.0-rc.1", + "@react-native/codegen": "0.88.0-rc.2", "make-dir": "^2.1.0", "pirates": "^4.0.1", "flow-parser": "0.327.0", diff --git a/packages/gradle-plugin/package.json b/packages/gradle-plugin/package.json index d8f3833a65f6..ce012251617e 100644 --- a/packages/gradle-plugin/package.json +++ b/packages/gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/gradle-plugin", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Gradle Plugin for React Native", "license": "MIT", "repository": { diff --git a/packages/jest-preset/package.json b/packages/jest-preset/package.json index 05ca823f1c36..0c987f76a522 100644 --- a/packages/jest-preset/package.json +++ b/packages/jest-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/jest-preset", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Jest preset for React Native apps", "keywords": [ "jest", @@ -29,7 +29,7 @@ ], "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.88.0-rc.1", + "@react-native/js-polyfills": "0.88.0-rc.2", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index 69611e457290..f4c863a0cc44 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-config", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Metro configuration for React Native.", "license": "MIT", "repository": { @@ -35,8 +35,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/js-polyfills": "0.88.0-rc.1", - "@react-native/metro-babel-transformer": "0.88.0-rc.1", + "@react-native/js-polyfills": "0.88.0-rc.2", + "@react-native/metro-babel-transformer": "0.88.0-rc.2", "metro-config": "^0.87.1", "metro-runtime": "^0.87.1" } diff --git a/packages/new-app-screen/package.json b/packages/new-app-screen/package.json index 9273931319ad..0bdb5c17c836 100644 --- a/packages/new-app-screen/package.json +++ b/packages/new-app-screen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/new-app-screen", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "NewAppScreen component for React Native", "keywords": [ "react-native" @@ -22,7 +22,7 @@ "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.1" + "react-native": "0.88.0-rc.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index 0ea0d611015a..51d58935fde8 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/normalize-colors", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Color normalization for React Native.", "license": "MIT", "repository": { diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index a5752b9ef1f5..f0c2806eb0dc 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/js-polyfills", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Polyfills for React Native.", "license": "MIT", "repository": { diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 09936c648bcd..6e1a11ee3946 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-preset", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Babel preset for React Native applications", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@react-native/babel-plugin-codegen": "0.88.0-rc.1", + "@react-native/babel-plugin-codegen": "0.88.0-rc.2", "flow-parser": "0.327.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index 526145a8b80f..ca7a6e84866f 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-babel-transformer", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Babel transformer for React Native applications.", "repository": { "type": "git", @@ -27,7 +27,7 @@ ], "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.88.0-rc.1", + "@react-native/babel-preset": "0.88.0-rc.2", "flow-parser": "0.327.0", "nullthrows": "^1.1.1" }, diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index c5ea03ea1287..e24929275bad 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/codegen", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Code generation tools for React Native", "license": "MIT", "repository": { diff --git a/packages/react-native-compatibility-check/package.json b/packages/react-native-compatibility-check/package.json index 8e963dcc0069..e1b0ec773b4e 100644 --- a/packages/react-native-compatibility-check/package.json +++ b/packages/react-native-compatibility-check/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/compatibility-check", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Check a React Native app's boundary between JS and Native for incompatibilities", "license": "MIT", "repository": { @@ -38,7 +38,7 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.1" + "@react-native/codegen": "0.88.0-rc.2" }, "devDependencies": { "flow-remove-types": "^2.237.2", diff --git a/packages/react-native-popup-menu-android/package.json b/packages/react-native-popup-menu-android/package.json index 329f0a33bec6..ab98d6e342db 100644 --- a/packages/react-native-popup-menu-android/package.json +++ b/packages/react-native-popup-menu-android/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/popup-menu-android", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "PopupMenu for the Android platform", "repository": { "type": "git", @@ -26,12 +26,12 @@ }, "license": "MIT", "devDependencies": { - "@react-native/codegen": "0.88.0-rc.1" + "@react-native/codegen": "0.88.0-rc.2" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.1" + "react-native": "0.88.0-rc.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/react-native/Libraries/Core/ReactNativeVersion.js b/packages/react-native/Libraries/Core/ReactNativeVersion.js index ac9479ef810d..be310b502b84 100644 --- a/packages/react-native/Libraries/Core/ReactNativeVersion.js +++ b/packages/react-native/Libraries/Core/ReactNativeVersion.js @@ -29,7 +29,7 @@ export default class ReactNativeVersion { static major: number = 0; static minor: number = 88; static patch: number = 0; - static prerelease: string | null = 'rc.1'; + static prerelease: string | null = 'rc.2'; static getVersionString(): string { return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`; diff --git a/packages/react-native/React/Base/RCTVersion.m b/packages/react-native/React/Base/RCTVersion.m index 4fff67d08636..2e2920d89529 100644 --- a/packages/react-native/React/Base/RCTVersion.m +++ b/packages/react-native/React/Base/RCTVersion.m @@ -24,7 +24,7 @@ RCTVersionMajor: @(0), RCTVersionMinor: @(88), RCTVersionPatch: @(0), - RCTVersionPrerelease: @"rc.1", + RCTVersionPrerelease: @"rc.2", }; }); return __rnVersion; diff --git a/packages/react-native/ReactAndroid/gradle.properties b/packages/react-native/ReactAndroid/gradle.properties index 2658dba982ff..f765949d13ad 100644 --- a/packages/react-native/ReactAndroid/gradle.properties +++ b/packages/react-native/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.88.0-rc.1 +VERSION_NAME=0.88.0-rc.2 react.internal.publishingGroup=com.facebook.react react.internal.hermesPublishingGroup=com.facebook.hermes diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt index 678b9491171d..d73c7837e9fb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt @@ -15,6 +15,6 @@ public object ReactNativeVersion { "major" to 0, "minor" to 88, "patch" to 0, - "prerelease" to "rc.1" + "prerelease" to "rc.2" ) } diff --git a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h index 932d14daf508..55a1d9503a3c 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h @@ -22,7 +22,7 @@ struct ReactNativeVersionType { int32_t Major = 0; int32_t Minor = 88; int32_t Patch = 0; - std::string_view Prerelease = "rc.1"; + std::string_view Prerelease = "rc.2"; }; constexpr ReactNativeVersionType ReactNativeVersion; diff --git a/packages/react-native/package.json b/packages/react-native/package.json index eea6d438b306..22e37bea6eb2 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "A framework for building native apps using React", "license": "MIT", "repository": { @@ -154,12 +154,12 @@ } }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.1", - "@react-native/codegen": "0.88.0-rc.1", - "@react-native/community-cli-plugin": "0.88.0-rc.1", - "@react-native/gradle-plugin": "0.88.0-rc.1", - "@react-native/normalize-colors": "0.88.0-rc.1", - "@react-native/virtualized-lists": "0.88.0-rc.1", + "@react-native/asset-utils": "0.88.0-rc.2", + "@react-native/codegen": "0.88.0-rc.2", + "@react-native/community-cli-plugin": "0.88.0-rc.2", + "@react-native/gradle-plugin": "0.88.0-rc.2", + "@react-native/normalize-colors": "0.88.0-rc.2", + "@react-native/virtualized-lists": "0.88.0-rc.2", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "flow-parser": "0.327.0", diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index ca2862a0f1ae..4af5aa5dd9b6 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -79,7 +79,7 @@ exports[`execute test-app "ReactAppDependencyProvider/ReactAppDependencyProvider # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.1\\" +version = \\"0.88.0-rc.2\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -399,7 +399,7 @@ exports[`execute test-app "ReactCodegen/ReactCodegen.podspec" should match snaps # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.1\\" +version = \\"0.88.0-rc.2\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -590,7 +590,7 @@ exports[`execute test-app-legacy "ReactAppDependencyProvider/ReactAppDependencyP # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.1\\" +version = \\"0.88.0-rc.2\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -882,7 +882,7 @@ exports[`execute test-app-legacy "ReactCodegen/ReactCodegen.podspec" should matc # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.1\\" +version = \\"0.88.0-rc.2\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index fedb2921952e..60bfdb72f52c 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/tester", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "private": true, "description": "React Native tester app.", "license": "MIT", @@ -26,8 +26,8 @@ "e2e-test-ios": "./scripts/maestro-test-ios.sh" }, "dependencies": { - "@react-native/new-app-screen": "0.88.0-rc.1", - "@react-native/popup-menu-android": "0.88.0-rc.1", + "@react-native/new-app-screen": "0.88.0-rc.2", + "@react-native/popup-menu-android": "0.88.0-rc.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", @@ -36,7 +36,7 @@ }, "peerDependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.1" + "react-native": "0.88.0-rc.2" }, "codegenConfig": { "name": "AppSpecs", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 8f7541c3be33..be10703f45b5 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/typescript-config", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Default TypeScript configuration for React Native apps", "license": "MIT", "repository": { diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index 89b92a6de7b7..3f868eb3dbf7 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/virtualized-lists", - "version": "0.88.0-rc.1", + "version": "0.88.0-rc.2", "description": "Virtualized lists for React Native.", "license": "MIT", "repository": { @@ -53,7 +53,7 @@ "peerDependencies": { "@types/react": "^19.2.0", "react": "*", - "react-native": "0.88.0-rc.1" + "react-native": "0.88.0-rc.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/private/helloworld/package.json b/private/helloworld/package.json index de0a5fde8494..55bd3f1f2054 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -13,18 +13,18 @@ }, "dependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.1" + "react-native": "0.88.0-rc.2" }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", - "@react-native/babel-preset": "0.88.0-rc.1", + "@react-native/babel-preset": "0.88.0-rc.2", "@react-native/core-cli-utils": "*", - "@react-native/eslint-config": "0.88.0-rc.1", - "@react-native/jest-preset": "0.88.0-rc.1", - "@react-native/metro-config": "0.88.0-rc.1", - "@react-native/typescript-config": "0.88.0-rc.1", + "@react-native/eslint-config": "0.88.0-rc.2", + "@react-native/jest-preset": "0.88.0-rc.2", + "@react-native/metro-config": "0.88.0-rc.2", + "@react-native/typescript-config": "0.88.0-rc.2", "@types/jest": "^29.5.14", "commander": "^12.0.0", "eslint": "^8.19.0", diff --git a/private/react-native-codegen-typescript-test/package.json b/private/react-native-codegen-typescript-test/package.json index 339f8e8419bc..a89a84f00acd 100644 --- a/private/react-native-codegen-typescript-test/package.json +++ b/private/react-native-codegen-typescript-test/package.json @@ -13,7 +13,7 @@ "prepare": "yarn run build" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.1" + "@react-native/codegen": "0.88.0-rc.2" }, "devDependencies": { "@babel/core": "^7.25.2", From 62f0e0b54abd2b405e154b2b3e6ce2b17dfbdef5 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Mon, 21 Sep 2026 18:05:20 +0000 Subject: [PATCH 23/35] [LOCAL] Bump Podfile.lock --- packages/rn-tester/Podfile.lock | 678 ++++++++++++++++---------------- 1 file changed, 339 insertions(+), 339 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index aebf7f68999d..7e7838bb6e8e 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -2,13 +2,13 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - fast_float (8.0.0) - - FBLazyVector (0.88.0-rc.1) + - FBLazyVector (0.88.0-rc.2) - fmt (12.1.0) - glog (0.3.5) - hermes-engine (260318099.0.3): - hermes-engine/Pre-built (= 260318099.0.3) - hermes-engine/Pre-built (260318099.0.3) - - MyNativeView (0.88.0-rc.1): + - MyNativeView (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -37,7 +37,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - NativeCxxModuleExample (0.88.0-rc.1): + - NativeCxxModuleExample (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -86,29 +86,29 @@ PODS: - fast_float (= 8.0.0) - fmt (= 12.1.0) - glog - - RCTDeprecation (0.88.0-rc.1) - - RCTRequired (0.88.0-rc.1) - - RCTSwiftUI (0.88.0-rc.1) - - RCTSwiftUIWrapper (0.88.0-rc.1): + - RCTDeprecation (0.88.0-rc.2) + - RCTRequired (0.88.0-rc.2) + - RCTSwiftUI (0.88.0-rc.2) + - RCTSwiftUIWrapper (0.88.0-rc.2): - RCTSwiftUI - - RCTTypeSafety (0.88.0-rc.1): - - FBLazyVector (= 0.88.0-rc.1) - - RCTRequired (= 0.88.0-rc.1) - - React-Core (= 0.88.0-rc.1) - - React (0.88.0-rc.1): - - React-Core (= 0.88.0-rc.1) - - React-Core/DevSupport (= 0.88.0-rc.1) - - React-Core/RCTWebSocket (= 0.88.0-rc.1) - - React-RCTActionSheet (= 0.88.0-rc.1) - - React-RCTAnimation (= 0.88.0-rc.1) - - React-RCTBlob (= 0.88.0-rc.1) - - React-RCTImage (= 0.88.0-rc.1) - - React-RCTLinking (= 0.88.0-rc.1) - - React-RCTNetwork (= 0.88.0-rc.1) - - React-RCTSettings (= 0.88.0-rc.1) - - React-RCTText (= 0.88.0-rc.1) - - React-RCTVibration (= 0.88.0-rc.1) - - React-bridging (0.88.0-rc.1): + - RCTTypeSafety (0.88.0-rc.2): + - FBLazyVector (= 0.88.0-rc.2) + - RCTRequired (= 0.88.0-rc.2) + - React-Core (= 0.88.0-rc.2) + - React (0.88.0-rc.2): + - React-Core (= 0.88.0-rc.2) + - React-Core/DevSupport (= 0.88.0-rc.2) + - React-Core/RCTWebSocket (= 0.88.0-rc.2) + - React-RCTActionSheet (= 0.88.0-rc.2) + - React-RCTAnimation (= 0.88.0-rc.2) + - React-RCTBlob (= 0.88.0-rc.2) + - React-RCTImage (= 0.88.0-rc.2) + - React-RCTLinking (= 0.88.0-rc.2) + - React-RCTNetwork (= 0.88.0-rc.2) + - React-RCTSettings (= 0.88.0-rc.2) + - React-RCTText (= 0.88.0-rc.2) + - React-RCTVibration (= 0.88.0-rc.2) + - React-bridging (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -120,12 +120,12 @@ PODS: - React-jsi - React-timing - SocketRocket - - React-callinvoker (0.88.0-rc.1): - - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.1) + - React-callinvoker (0.88.0-rc.2): + - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.2) - React-cxxstableapi - - React-callinvoker/callinvokerUmbrella (0.88.0-rc.1): + - React-callinvoker/callinvokerUmbrella (0.88.0-rc.2): - React-cxxstableapi - - React-Core (0.88.0-rc.1): + - React-Core (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -135,7 +135,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.1) + - React-Core/Default (= 0.88.0-rc.2) - React-cxxreact - React-featureflags - React-hermes @@ -150,7 +150,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.88.0-rc.1): + - React-Core/CoreModulesHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -175,7 +175,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (0.88.0-rc.1): + - React-Core/Default (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -199,7 +199,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (0.88.0-rc.1): + - React-Core/DevSupport (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -209,8 +209,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.1) - - React-Core/RCTWebSocket (= 0.88.0-rc.1) + - React-Core/Default (= 0.88.0-rc.2) + - React-Core/RCTWebSocket (= 0.88.0-rc.2) - React-cxxreact - React-featureflags - React-hermes @@ -225,7 +225,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.88.0-rc.1): + - React-Core/RCTActionSheetHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -250,7 +250,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.88.0-rc.1): + - React-Core/RCTAnimationHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -275,7 +275,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.88.0-rc.1): + - React-Core/RCTBlobHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -300,7 +300,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.88.0-rc.1): + - React-Core/RCTImageHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -325,7 +325,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.88.0-rc.1): + - React-Core/RCTLinkingHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -350,7 +350,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.88.0-rc.1): + - React-Core/RCTNetworkHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -375,7 +375,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTPushNotificationHeaders (0.88.0-rc.1): + - React-Core/RCTPushNotificationHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -400,7 +400,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.88.0-rc.1): + - React-Core/RCTSettingsHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -425,7 +425,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.88.0-rc.1): + - React-Core/RCTTextHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -450,7 +450,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.88.0-rc.1): + - React-Core/RCTVibrationHeaders (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -475,7 +475,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.88.0-rc.1): + - React-Core/RCTWebSocket (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -485,7 +485,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.1) + - React-Core/Default (= 0.88.0-rc.2) - React-cxxreact - React-featureflags - React-hermes @@ -500,7 +500,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (0.88.0-rc.1): + - React-CoreModules (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -508,11 +508,11 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 0.88.0-rc.1) - - React-Core/CoreModulesHeaders (= 0.88.0-rc.1) + - RCTTypeSafety (= 0.88.0-rc.2) + - React-Core/CoreModulesHeaders (= 0.88.0-rc.2) - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.2) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing @@ -520,12 +520,12 @@ PODS: - React-networking - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.88.0-rc.1) + - React-RCTImage (= 0.88.0-rc.2) - React-runtimeexecutor - React-utils - ReactCommon - SocketRocket - - React-cxxreact (0.88.0-rc.1): + - React-cxxreact (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -534,29 +534,29 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.1) - - React-debug (= 0.88.0-rc.1) - - React-jserrorhandler (= 0.88.0-rc.1) - - React-jsi (= 0.88.0-rc.1) + - React-callinvoker (= 0.88.0-rc.2) + - React-debug (= 0.88.0-rc.2) + - React-jserrorhandler (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.2) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.88.0-rc.1) - - React-perflogger (= 0.88.0-rc.1) + - React-logger (= 0.88.0-rc.2) + - React-perflogger (= 0.88.0-rc.2) - React-runtimeexecutor - - React-timing (= 0.88.0-rc.1) + - React-timing (= 0.88.0-rc.2) - React-utils - SocketRocket - - React-cxxstableapi (0.88.0-rc.1) - - React-debug (0.88.0-rc.1): + - React-cxxstableapi (0.88.0-rc.2) + - React-debug (0.88.0-rc.2): - React-cxxstableapi - - React-debug/debugUmbrella (= 0.88.0-rc.1) - - React-debug/redbox (= 0.88.0-rc.1) - - React-debug/debugUmbrella (0.88.0-rc.1): + - React-debug/debugUmbrella (= 0.88.0-rc.2) + - React-debug/redbox (= 0.88.0-rc.2) + - React-debug/debugUmbrella (0.88.0-rc.2): - React-cxxstableapi - - React-debug/redbox (0.88.0-rc.1): + - React-debug/redbox (0.88.0-rc.2): - React-cxxstableapi - - React-defaultsnativemodule (0.88.0-rc.1): + - React-defaultsnativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -582,7 +582,7 @@ PODS: - React-webperformancenativemodule - SocketRocket - Yoga - - React-domnativemodule (0.88.0-rc.1): + - React-domnativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -604,7 +604,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (0.88.0-rc.1): + - React-Fabric (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -620,25 +620,25 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/animated (= 0.88.0-rc.1) - - React-Fabric/animationbackend (= 0.88.0-rc.1) - - React-Fabric/animations (= 0.88.0-rc.1) - - React-Fabric/attributedstring (= 0.88.0-rc.1) - - React-Fabric/bridging (= 0.88.0-rc.1) - - React-Fabric/componentregistry (= 0.88.0-rc.1) - - React-Fabric/componentregistrynative (= 0.88.0-rc.1) - - React-Fabric/components (= 0.88.0-rc.1) - - React-Fabric/consistency (= 0.88.0-rc.1) - - React-Fabric/core (= 0.88.0-rc.1) - - React-Fabric/dom (= 0.88.0-rc.1) - - React-Fabric/imagemanager (= 0.88.0-rc.1) - - React-Fabric/leakchecker (= 0.88.0-rc.1) - - React-Fabric/mounting (= 0.88.0-rc.1) - - React-Fabric/observers (= 0.88.0-rc.1) - - React-Fabric/scheduler (= 0.88.0-rc.1) - - React-Fabric/telemetry (= 0.88.0-rc.1) - - React-Fabric/uimanager (= 0.88.0-rc.1) - - React-Fabric/viewtransition (= 0.88.0-rc.1) + - React-Fabric/animated (= 0.88.0-rc.2) + - React-Fabric/animationbackend (= 0.88.0-rc.2) + - React-Fabric/animations (= 0.88.0-rc.2) + - React-Fabric/attributedstring (= 0.88.0-rc.2) + - React-Fabric/bridging (= 0.88.0-rc.2) + - React-Fabric/componentregistry (= 0.88.0-rc.2) + - React-Fabric/componentregistrynative (= 0.88.0-rc.2) + - React-Fabric/components (= 0.88.0-rc.2) + - React-Fabric/consistency (= 0.88.0-rc.2) + - React-Fabric/core (= 0.88.0-rc.2) + - React-Fabric/dom (= 0.88.0-rc.2) + - React-Fabric/imagemanager (= 0.88.0-rc.2) + - React-Fabric/leakchecker (= 0.88.0-rc.2) + - React-Fabric/mounting (= 0.88.0-rc.2) + - React-Fabric/observers (= 0.88.0-rc.2) + - React-Fabric/scheduler (= 0.88.0-rc.2) + - React-Fabric/telemetry (= 0.88.0-rc.2) + - React-Fabric/uimanager (= 0.88.0-rc.2) + - React-Fabric/viewtransition (= 0.88.0-rc.2) - React-featureflags - React-graphics - React-jsi @@ -650,7 +650,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animated (0.88.0-rc.1): + - React-Fabric/animated (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -678,7 +678,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animationbackend (0.88.0-rc.1): + - React-Fabric/animationbackend (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -705,7 +705,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (0.88.0-rc.1): + - React-Fabric/animations (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -732,7 +732,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (0.88.0-rc.1): + - React-Fabric/attributedstring (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -759,7 +759,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/bridging (0.88.0-rc.1): + - React-Fabric/bridging (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -786,7 +786,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (0.88.0-rc.1): + - React-Fabric/componentregistry (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -813,7 +813,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (0.88.0-rc.1): + - React-Fabric/componentregistrynative (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -840,7 +840,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (0.88.0-rc.1): + - React-Fabric/components (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -856,11 +856,11 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.1) - - React-Fabric/components/root (= 0.88.0-rc.1) - - React-Fabric/components/scrollview (= 0.88.0-rc.1) - - React-Fabric/components/view (= 0.88.0-rc.1) - - React-Fabric/components/viewUmbrella (= 0.88.0-rc.1) + - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.2) + - React-Fabric/components/root (= 0.88.0-rc.2) + - React-Fabric/components/scrollview (= 0.88.0-rc.2) + - React-Fabric/components/view (= 0.88.0-rc.2) + - React-Fabric/components/viewUmbrella (= 0.88.0-rc.2) - React-featureflags - React-graphics - React-jsi @@ -872,7 +872,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.1): + - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -899,7 +899,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (0.88.0-rc.1): + - React-Fabric/components/root (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -926,7 +926,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (0.88.0-rc.1): + - React-Fabric/components/scrollview (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -953,7 +953,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (0.88.0-rc.1): + - React-Fabric/components/view (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -982,7 +982,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/components/viewUmbrella (0.88.0-rc.1): + - React-Fabric/components/viewUmbrella (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1009,7 +1009,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/consistency (0.88.0-rc.1): + - React-Fabric/consistency (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1036,7 +1036,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (0.88.0-rc.1): + - React-Fabric/core (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1063,7 +1063,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (0.88.0-rc.1): + - React-Fabric/dom (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1090,7 +1090,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (0.88.0-rc.1): + - React-Fabric/imagemanager (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1117,7 +1117,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (0.88.0-rc.1): + - React-Fabric/leakchecker (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1144,7 +1144,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (0.88.0-rc.1): + - React-Fabric/mounting (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1172,7 +1172,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (0.88.0-rc.1): + - React-Fabric/observers (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1188,10 +1188,10 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/observers/events (= 0.88.0-rc.1) - - React-Fabric/observers/intersection (= 0.88.0-rc.1) - - React-Fabric/observers/mutation (= 0.88.0-rc.1) - - React-Fabric/observers/resize (= 0.88.0-rc.1) + - React-Fabric/observers/events (= 0.88.0-rc.2) + - React-Fabric/observers/intersection (= 0.88.0-rc.2) + - React-Fabric/observers/mutation (= 0.88.0-rc.2) + - React-Fabric/observers/resize (= 0.88.0-rc.2) - React-featureflags - React-graphics - React-jsi @@ -1203,7 +1203,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (0.88.0-rc.1): + - React-Fabric/observers/events (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1230,7 +1230,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/intersection (0.88.0-rc.1): + - React-Fabric/observers/intersection (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1257,7 +1257,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/mutation (0.88.0-rc.1): + - React-Fabric/observers/mutation (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1284,7 +1284,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/resize (0.88.0-rc.1): + - React-Fabric/observers/resize (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1311,7 +1311,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (0.88.0-rc.1): + - React-Fabric/scheduler (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1343,7 +1343,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (0.88.0-rc.1): + - React-Fabric/telemetry (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1370,7 +1370,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (0.88.0-rc.1): + - React-Fabric/uimanager (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1386,7 +1386,7 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/uimanager/consistency (= 0.88.0-rc.1) + - React-Fabric/uimanager/consistency (= 0.88.0-rc.2) - React-featureflags - React-graphics - React-jsi @@ -1399,7 +1399,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (0.88.0-rc.1): + - React-Fabric/uimanager/consistency (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1427,7 +1427,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/viewtransition (0.88.0-rc.1): + - React-Fabric/viewtransition (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1454,7 +1454,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (0.88.0-rc.1): + - React-FabricComponents (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1470,8 +1470,8 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components (= 0.88.0-rc.1) - - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.1) + - React-FabricComponents/components (= 0.88.0-rc.2) + - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.2) - React-featureflags - React-graphics - React-jsi @@ -1484,7 +1484,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (0.88.0-rc.1): + - React-FabricComponents/components (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1500,16 +1500,16 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.1) - - React-FabricComponents/components/iostextinput (= 0.88.0-rc.1) - - React-FabricComponents/components/modal (= 0.88.0-rc.1) - - React-FabricComponents/components/rncore (= 0.88.0-rc.1) - - React-FabricComponents/components/safeareaview (= 0.88.0-rc.1) - - React-FabricComponents/components/switch (= 0.88.0-rc.1) - - React-FabricComponents/components/text (= 0.88.0-rc.1) - - React-FabricComponents/components/textinput (= 0.88.0-rc.1) - - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.1) - - React-FabricComponents/components/virtualview (= 0.88.0-rc.1) + - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.2) + - React-FabricComponents/components/iostextinput (= 0.88.0-rc.2) + - React-FabricComponents/components/modal (= 0.88.0-rc.2) + - React-FabricComponents/components/rncore (= 0.88.0-rc.2) + - React-FabricComponents/components/safeareaview (= 0.88.0-rc.2) + - React-FabricComponents/components/switch (= 0.88.0-rc.2) + - React-FabricComponents/components/text (= 0.88.0-rc.2) + - React-FabricComponents/components/textinput (= 0.88.0-rc.2) + - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.2) + - React-FabricComponents/components/virtualview (= 0.88.0-rc.2) - React-featureflags - React-graphics - React-jsi @@ -1522,7 +1522,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.88.0-rc.1): + - React-FabricComponents/components/inputaccessory (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1550,7 +1550,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.88.0-rc.1): + - React-FabricComponents/components/iostextinput (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1578,7 +1578,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.88.0-rc.1): + - React-FabricComponents/components/modal (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1606,7 +1606,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.88.0-rc.1): + - React-FabricComponents/components/rncore (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1634,7 +1634,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.88.0-rc.1): + - React-FabricComponents/components/safeareaview (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1662,7 +1662,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/switch (0.88.0-rc.1): + - React-FabricComponents/components/switch (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1690,7 +1690,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (0.88.0-rc.1): + - React-FabricComponents/components/text (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1718,7 +1718,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.88.0-rc.1): + - React-FabricComponents/components/textinput (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1746,7 +1746,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.88.0-rc.1): + - React-FabricComponents/components/unimplementedview (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1774,7 +1774,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (0.88.0-rc.1): + - React-FabricComponents/components/virtualview (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1802,7 +1802,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.88.0-rc.1): + - React-FabricComponents/textlayoutmanager (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1830,7 +1830,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (0.88.0-rc.1): + - React-FabricImage (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1839,22 +1839,22 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 0.88.0-rc.1) - - RCTTypeSafety (= 0.88.0-rc.1) + - RCTRequired (= 0.88.0-rc.2) + - RCTTypeSafety (= 0.88.0-rc.2) - React-cxxstableapi - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.88.0-rc.1) + - React-jsiexecutor (= 0.88.0-rc.2) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (0.88.0-rc.1): + - React-featureflags (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1863,9 +1863,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxstableapi - - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.1) + - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.2) - SocketRocket - - React-featureflags/featureflagsUmbrella (0.88.0-rc.1): + - React-featureflags/featureflagsUmbrella (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1875,7 +1875,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-featureflagsnativemodule (0.88.0-rc.1): + - React-featureflagsnativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1891,7 +1891,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (0.88.0-rc.1): + - React-graphics (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1906,7 +1906,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-hermes (0.88.0-rc.1): + - React-hermes (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1915,19 +1915,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.1) + - React-cxxreact (= 0.88.0-rc.2) - React-cxxstableapi - React-jsi - - React-jsiexecutor (= 0.88.0-rc.1) + - React-jsiexecutor (= 0.88.0-rc.2) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 0.88.0-rc.1) + - React-perflogger (= 0.88.0-rc.2) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (0.88.0-rc.1): + - React-idlecallbacksnativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1945,7 +1945,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (0.88.0-rc.1): + - React-ImageManager (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1961,7 +1961,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-intersectionobservernativemodule (0.88.0-rc.1): + - React-intersectionobservernativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1984,7 +1984,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-jserrorhandler (0.88.0-rc.1): + - React-jserrorhandler (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -1999,7 +1999,7 @@ PODS: - React-featureflags - React-jsi - SocketRocket - - React-jsi (0.88.0-rc.1): + - React-jsi (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2009,7 +2009,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (0.88.0-rc.1): + - React-jsiexecutor (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2031,7 +2031,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspector (0.88.0-rc.1): + - React-jsinspector (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2046,11 +2046,11 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.88.0-rc.1) + - React-perflogger (= 0.88.0-rc.2) - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspectorcdp (0.88.0-rc.1): + - React-jsinspectorcdp (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2060,7 +2060,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-jsinspectornetwork (0.88.0-rc.1): + - React-jsinspectornetwork (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2071,7 +2071,7 @@ PODS: - React-cxxstableapi - React-jsinspectorcdp - SocketRocket - - React-jsinspectortracing (0.88.0-rc.1): + - React-jsinspectortracing (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2087,7 +2087,7 @@ PODS: - React-timing - React-utils - SocketRocket - - React-jsitooling (0.88.0-rc.1): + - React-jsitooling (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2096,19 +2096,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.1) + - React-cxxreact (= 0.88.0-rc.2) - React-cxxstableapi - React-debug - - React-jsi (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.2) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - SocketRocket - - React-jsitracing (0.88.0-rc.1): + - React-jsitracing (0.88.0-rc.2): - React-jsi - - React-logger (0.88.0-rc.1): + - React-logger (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2117,7 +2117,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (0.88.0-rc.1): + - React-Mapbuffer (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2127,9 +2127,9 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - React-debug - - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.1) + - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.2) - SocketRocket - - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.1): + - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2140,7 +2140,7 @@ PODS: - React-cxxstableapi - React-debug - SocketRocket - - React-microtasksnativemodule (0.88.0-rc.1): + - React-microtasksnativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2155,7 +2155,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-mutationobservernativemodule (0.88.0-rc.1): + - React-mutationobservernativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2178,7 +2178,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-NativeModulesApple (0.88.0-rc.1): + - React-NativeModulesApple (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2199,7 +2199,7 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - React-networking (0.88.0-rc.1): + - React-networking (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2213,9 +2213,9 @@ PODS: - React-performancetimeline - React-timing - SocketRocket - - React-oscompat (0.88.0-rc.1): + - React-oscompat (0.88.0-rc.2): - React-cxxstableapi - - React-perflogger (0.88.0-rc.1): + - React-perflogger (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2224,7 +2224,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancecdpmetrics (0.88.0-rc.1): + - React-performancecdpmetrics (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2239,7 +2239,7 @@ PODS: - React-runtimeexecutor - React-timing - SocketRocket - - React-performancetimeline (0.88.0-rc.1): + - React-performancetimeline (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2254,9 +2254,9 @@ PODS: - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (0.88.0-rc.1): - - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.1) - - React-RCTAnimatedModuleProvider (0.88.0-rc.1): + - React-RCTActionSheet (0.88.0-rc.2): + - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.2) + - React-RCTAnimatedModuleProvider (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2271,7 +2271,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTAnimation (0.88.0-rc.1): + - React-RCTAnimation (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2288,7 +2288,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (0.88.0-rc.1): + - React-RCTAppDelegate (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2324,7 +2324,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (0.88.0-rc.1): + - React-RCTBlob (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2343,7 +2343,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (0.88.0-rc.1): + - React-RCTFabric (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2381,7 +2381,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.88.0-rc.1): + - React-RCTFBReactNativeSpec (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2396,10 +2396,10 @@ PODS: - React-Core - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.1) + - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.2) - ReactCommon - SocketRocket - - React-RCTFBReactNativeSpec/components (0.88.0-rc.1): + - React-RCTFBReactNativeSpec/components (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2424,7 +2424,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTImage (0.88.0-rc.1): + - React-RCTImage (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2440,14 +2440,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (0.88.0-rc.1): - - React-Core/RCTLinkingHeaders (= 0.88.0-rc.1) - - React-jsi (= 0.88.0-rc.1) + - React-RCTLinking (0.88.0-rc.2): + - React-Core/RCTLinkingHeaders (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.2) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.88.0-rc.1) - - React-RCTNetwork (0.88.0-rc.1): + - ReactCommon/turbomodule/core (= 0.88.0-rc.2) + - React-RCTNetwork (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2467,14 +2467,14 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTPushNotification (0.88.0-rc.1): + - React-RCTPushNotification (0.88.0-rc.2): - RCTTypeSafety - React-Core/RCTPushNotificationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (0.88.0-rc.1): + - React-RCTRuntime (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2496,7 +2496,7 @@ PODS: - React-RuntimeHermes - React-utils - SocketRocket - - React-RCTSettings (0.88.0-rc.1): + - React-RCTSettings (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2511,7 +2511,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTTest (0.88.0-rc.1): + - React-RCTTest (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2519,15 +2519,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-Core (= 0.88.0-rc.1) - - React-CoreModules (= 0.88.0-rc.1) - - React-jsi (= 0.88.0-rc.1) - - ReactCommon/turbomodule/core (= 0.88.0-rc.1) + - React-Core (= 0.88.0-rc.2) + - React-CoreModules (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.2) + - ReactCommon/turbomodule/core (= 0.88.0-rc.2) - SocketRocket - - React-RCTText (0.88.0-rc.1): - - React-Core/RCTTextHeaders (= 0.88.0-rc.1) + - React-RCTText (0.88.0-rc.2): + - React-Core/RCTTextHeaders (= 0.88.0-rc.2) - Yoga - - React-RCTVibration (0.88.0-rc.1): + - React-RCTVibration (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2541,11 +2541,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (0.88.0-rc.1) - - React-renderercss (0.88.0-rc.1): + - React-rendererconsistency (0.88.0-rc.2) + - React-renderercss (0.88.0-rc.2): - React-debug - React-utils - - React-rendererdebug (0.88.0-rc.1): + - React-rendererdebug (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2555,7 +2555,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-resizeobservernativemodule (0.88.0-rc.1): + - React-resizeobservernativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2579,7 +2579,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-RuntimeApple (0.88.0-rc.1): + - React-RuntimeApple (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2609,7 +2609,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (0.88.0-rc.1): + - React-RuntimeCore (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2632,7 +2632,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (0.88.0-rc.1): + - React-runtimeexecutor (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2642,10 +2642,10 @@ PODS: - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.2) - React-utils - SocketRocket - - React-RuntimeHermes (0.88.0-rc.1): + - React-RuntimeHermes (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2667,7 +2667,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-runtimescheduler (0.88.0-rc.1): + - React-runtimescheduler (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2691,14 +2691,14 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (0.88.0-rc.1): + - React-timing (0.88.0-rc.2): - React-cxxstableapi - React-debug - - React-timing/timingUmbrella (= 0.88.0-rc.1) - - React-timing/timingUmbrella (0.88.0-rc.1): + - React-timing/timingUmbrella (= 0.88.0-rc.2) + - React-timing/timingUmbrella (0.88.0-rc.2): - React-cxxstableapi - React-debug - - React-utils (0.88.0-rc.1): + - React-utils (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2708,9 +2708,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-debug - - React-jsi (= 0.88.0-rc.1) + - React-jsi (= 0.88.0-rc.2) - SocketRocket - - React-viewtransitionnativemodule (0.88.0-rc.1): + - React-viewtransitionnativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2728,7 +2728,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-webperformancenativemodule (0.88.0-rc.1): + - React-webperformancenativemodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2747,9 +2747,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - ReactAppDependencyProvider (0.88.0-rc.1): + - ReactAppDependencyProvider (0.88.0-rc.2): - ReactCodegen - - ReactCodegen (0.88.0-rc.1): + - ReactCodegen (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2775,7 +2775,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (0.88.0-rc.1): + - ReactCommon (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2783,9 +2783,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 0.88.0-rc.1) + - ReactCommon/turbomodule (= 0.88.0-rc.2) - SocketRocket - - ReactCommon-Samples (0.88.0-rc.1): + - ReactCommon-Samples (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2802,7 +2802,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - ReactCommon/turbomodule (0.88.0-rc.1): + - ReactCommon/turbomodule (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2811,13 +2811,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.1) - - React-jsi (= 0.88.0-rc.1) - - React-logger (= 0.88.0-rc.1) - - React-perflogger (= 0.88.0-rc.1) - - ReactCommon/turbomodule/core (= 0.88.0-rc.1) + - React-callinvoker (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.2) + - React-logger (= 0.88.0-rc.2) + - React-perflogger (= 0.88.0-rc.2) + - ReactCommon/turbomodule/core (= 0.88.0-rc.2) - SocketRocket - - ReactCommon/turbomodule/core (0.88.0-rc.1): + - ReactCommon/turbomodule/core (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -2827,16 +2827,16 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging - - React-callinvoker (= 0.88.0-rc.1) - - React-cxxreact (= 0.88.0-rc.1) - - React-debug (= 0.88.0-rc.1) - - React-featureflags (= 0.88.0-rc.1) - - React-jsi (= 0.88.0-rc.1) - - React-logger (= 0.88.0-rc.1) - - React-perflogger (= 0.88.0-rc.1) - - React-utils (= 0.88.0-rc.1) + - React-callinvoker (= 0.88.0-rc.2) + - React-cxxreact (= 0.88.0-rc.2) + - React-debug (= 0.88.0-rc.2) + - React-featureflags (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.2) + - React-logger (= 0.88.0-rc.2) + - React-perflogger (= 0.88.0-rc.2) + - React-utils (= 0.88.0-rc.2) - SocketRocket - - ScreenshotManager (0.88.0-rc.1): + - ScreenshotManager (0.88.0-rc.2): - boost - DoubleConversion - fast_float @@ -3152,94 +3152,94 @@ SPEC CHECKSUMS: boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: 5cf5541cab4664463215430a132c4f7302cf3703 + FBLazyVector: 5e686700a3c42cd33b2841a767b321b694beb358 fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 hermes-engine: 7e5f90072b91f62ead9584eebdced74fa9c742a0 - MyNativeView: b03c75f8362bb81809cbbdbcf1e81830aaa8788b - NativeCxxModuleExample: 3112c0a02b40706ca126f9cb77fdd388d449dc6c + MyNativeView: 7f52d3ec25566dfed88ee953efc23580392fb885 + NativeCxxModuleExample: 001c7081a43be791f0382af2367a8fc673feeb41 OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b - RCTDeprecation: 509a258e5ead39237fd7467ef1e08f1ca1c71392 - RCTRequired: 56ca3269ba39440e601d6e312cf54cc3e70d5be9 - RCTSwiftUI: 0c85d072b66bb2e77f802ed88f17fdc10cb6547a - RCTSwiftUIWrapper: 1b1ffc373e91646e2e9ba5111f2a7c88a74a6ad9 - RCTTypeSafety: 9968856c94499c6ec472d8681f101b29ee3d617d - React: 720e5e4c8b8ea2538b2b72d040837f9ca8c69684 - React-bridging: b120f4efe5e2eeff259c7f82f415b77d5173a6e6 - React-callinvoker: dee452809b8cd56e79158a104505ec83b7196e1d - React-Core: 054415adf7b3258dcd21f1cbe8b3d9ff05a70c76 - React-CoreModules: 73890d660240a12e56d4ac634576b0446e6938a9 - React-cxxreact: b032db636573a9bbe9d537baac0e1afee4ee1673 - React-cxxstableapi: 8a2c2cad99eb3656acce29e90ef4fca7fe4b3da2 - React-debug: 6bbe669be29fe6361dcd0e7aa0e79ea4aa4853fb - React-defaultsnativemodule: e2c64ab354467dc05323a39bb6553c9e3890a8b5 - React-domnativemodule: ad4b7a671638739ea39ba391ed66752bd0eccd00 - React-Fabric: 638e594364461de83915dcd972cc880401a3657b - React-FabricComponents: 10870813fbd088120a25998aa332f292666d4fac - React-FabricImage: b11bab4cd575c2f06542f0aa4f63c8f084ad228e - React-featureflags: 3e0ddc2abb66eaf6594f4613bd8ff0fc7dda0db5 - React-featureflagsnativemodule: b92a687582575b002029fa59ec993204c36a38e9 - React-graphics: 84dbc47b412db7d5720e2632456022f5cafa8b0d - React-hermes: 1f5ab6a09b26a4526b4599d4576e3359c22c357a - React-idlecallbacksnativemodule: ff8c7a7904f426c4bfc304a4d61d55682b58434e - React-ImageManager: 7c2dc26b482c94c15683cedd152cc8ed94ecaa23 - React-intersectionobservernativemodule: 627ae4e9e63150fe4ed85630a8584ee6f1508c8e - React-jserrorhandler: ce9079610a77fec09ed9e305905699a4f3395420 - React-jsi: 85fcd085ef0e080d4c44b2e837170be66bec76a3 - React-jsiexecutor: 5adae1070de02f645026b635608d4f9d53e0154a - React-jsinspector: 92e22fa9ae57d6cf71788e56254e01e5fa660436 - React-jsinspectorcdp: 08baeed91c92e9531910a7bb568b00009b887cca - React-jsinspectornetwork: 512cdde31956d2a7c3848fd1d8f3762a4eb235c2 - React-jsinspectortracing: 507c8d5092efae0b46b0d0f3567d8f9b725b7f00 - React-jsitooling: 8cc70ffd831dc4b05bee57c245014044b7b35990 - React-jsitracing: 20c4cfe55e9d91943f98ca387b840affd90dc3d3 - React-logger: ca978a2b56dfc550c0cddd106e5aa69c9c05e400 - React-Mapbuffer: 273ea377295e70a2471d8bbc49b0ed9c775776a4 - React-microtasksnativemodule: 651580fa9240b5a7556e8f7375f0b3039db6f905 - React-mutationobservernativemodule: 0b20f439acb819ee9a96b8f5b43e12534fa58c1b - React-NativeModulesApple: c1b4df15c52275d8d966bfeb7ef876b1b355c8c5 - React-networking: a8759a9d67f6fe6871965bbe7b27ee3e9992be05 - React-oscompat: fc14afbfd1fa9bce7d55361543328e3dd0b21e9d - React-perflogger: f1b3b7d105daad59ace46948e6a4e3e9ef5342eb - React-performancecdpmetrics: de4e728c3cf8e0e7d6449dcaae50513502e32254 - React-performancetimeline: f285e99eaf8df19d5ef73f4b0058e02db6fc09f8 - React-RCTActionSheet: 43dca5c1cef7d7b368014d30d6c01d23e15f2f77 - React-RCTAnimatedModuleProvider: 0f44008317bef05bb1cc54e090d40dc8deb201c0 - React-RCTAnimation: 708c0c05d7a32618dd58ab61fc3ea18f029fcb70 - React-RCTAppDelegate: 5d6edeb76e0d2bdd9fd090082944b148dff75f7b - React-RCTBlob: 9c010b6398872bfe0c0f83c290e68a9523a704f6 - React-RCTFabric: 59ae77e3536afb5ac74f39633f304fa286d5b7ad - React-RCTFBReactNativeSpec: 25d168f60fd6c48ca786d66cd44157c667a02f17 - React-RCTImage: fd56798b7ec0630a24ca35a5428193bca1093786 - React-RCTLinking: ef844c6ed8ec01914babe93b0e241b5bc55a399b - React-RCTNetwork: a0e6b82c2b783d219a5eb50892c29601d77d64b6 - React-RCTPushNotification: 0b9c4bd8f604816ccb3d3003c0dc44f86f4546ab - React-RCTRuntime: 40481e925780976cfe54e04605bf3448aa3ab6f7 - React-RCTSettings: 064b780b96bc622aea3200b92365955ffc1ffa12 - React-RCTTest: 4284bac77740a284b2ceb767e815e74fbe7e043f - React-RCTText: 69676af079f693ae40c93fd60758aabc6d8663a4 - React-RCTVibration: 31a03c1c66521f98a0dcc8673cf4503aa36025c2 - React-rendererconsistency: d1a9b6f55ccc6fdf8aedf09726c0a5a92b891aa9 - React-renderercss: 8bff3cf822fcb420993d81c79823c040c80ad9a5 - React-rendererdebug: 8d0ebaf605737091028aca38f41129cc66749ed6 - React-resizeobservernativemodule: bb5bfc85faf76b509b9746fe954733ec0756f60d - React-RuntimeApple: 3c04f9ad6107c7a9d100ea8420fde67dec686598 - React-RuntimeCore: 95391105a498cc0a9752a99146c3680c85bd8089 - React-runtimeexecutor: 143ab947b35d98dd3f89cbafe9605dbd04ad8e62 - React-RuntimeHermes: c8fd62030204eb1fb544e68f0566bdfc372c29e0 - React-runtimescheduler: eba89374d973248cac6e3857eaa3aa17ac004e69 - React-timing: 759385b32943b2c081b729c9e328be8cafc6b419 - React-utils: 391da1bd3d48891b458617ffeff9d9fa742aeb32 - React-viewtransitionnativemodule: f1638316a07ad429c6e8fe286d6415c994462aa5 - React-webperformancenativemodule: dc8f090943aa3867f7d5263670ea5eee375fe0a3 - ReactAppDependencyProvider: b834b007d075e546a9525f4aae771ac261415264 - ReactCodegen: 2a0b4d1dcab8b1f4d9575cf1bb887cf4c15eff10 - ReactCommon: e975689126af163523e74027294b60bc3a42d6d7 - ReactCommon-Samples: d9416107477e744439dc0280cce9b1475fdeb9f2 - ScreenshotManager: 703d512b720e1cb04bf1738bd76bd1cbe26a07f2 + RCTDeprecation: 2cb4fec4847c7147462962f0192db93fbb88d74b + RCTRequired: dc7424892f40625e26f814edc234a51b08de1e8d + RCTSwiftUI: de83f2b7a2cac2a76f98ba8483c3d7c8dfa35745 + RCTSwiftUIWrapper: 981ad1c4acfeac509df6d110ebed593f634f80b3 + RCTTypeSafety: 7cc5b531a79dcab2539a6b59547238e149875e2e + React: ac5e0f5bac8accc28d8a64013a794d1d2ac1db05 + React-bridging: bbc2a8437c6e962e4194a8a448c4dbe5bcb626f6 + React-callinvoker: ad10fe10b5e51d74597a2f7675bfdaf17d1b08b1 + React-Core: 8c0f44e37eb0a14c17ecc40e0b11d93452cea373 + React-CoreModules: bea35318de31e6cf3f43807065114d2e6afe0e28 + React-cxxreact: fbb56faec87045b7f0eda9efc521589fb9c1133c + React-cxxstableapi: bcc05c7039ca25abcb8cfb0ab4192fb76295953c + React-debug: 4882615b63ac103faabc35f42886ca9cfe0fe32a + React-defaultsnativemodule: db32a13b50a090025986137cd891c581d06d72eb + React-domnativemodule: 124609264d859a9547efd7d40e24850722b4300a + React-Fabric: c888b1de52d71d5d02bf496ba7a078456e829faa + React-FabricComponents: fc34c7633a01f3e97aa28208cf9b841b2bcafa3e + React-FabricImage: e24f1de1a028cb657a2be414cc43f3ed4ebd197a + React-featureflags: 11f26f2ac085b680a3190684e854129a57d16022 + React-featureflagsnativemodule: 3c22092d4c01d57ea5c06ad7675d96af03834787 + React-graphics: 0adcbc8c9ef8cdcf6dafdcbc9f5cf13edcab900f + React-hermes: 9126177557ba811ec1b7cbf58b8d939eb3690920 + React-idlecallbacksnativemodule: 02f715b2092fb2e231fbf10be82bf5b9b93c4669 + React-ImageManager: bc6406bb3b92332d431ba34d8563175345104feb + React-intersectionobservernativemodule: 1aae42f5e89df546f9996d1e29a319cf8d968b06 + React-jserrorhandler: dcc2c379fe0c045c28fdf8335489fc417d005467 + React-jsi: a3a845682f7c6729ad5a174e9c263ce65564ca58 + React-jsiexecutor: fca5ff2e5f40fb3ee6e85d287943169e066b97fb + React-jsinspector: ddaa096984595290f2d939b79a5cc9feeeefb729 + React-jsinspectorcdp: 362519e391460feb3c63921f956f24ad99beaa56 + React-jsinspectornetwork: e67b2124f9ca6bda3e7dbb72b6f5bc4c263dfd11 + React-jsinspectortracing: 751988eb402cb4739f54960729ab0e3bfa3ca962 + React-jsitooling: 9a098887c0748fac150393243584995b65ea491a + React-jsitracing: d617ab03571050de287b15d39272f3c8d5193d29 + React-logger: 14d59d49bdfff7a487de00385a13d94edf2cb319 + React-Mapbuffer: fc9b6135e1b1c2add7e9fed9dba7755cb53dcb20 + React-microtasksnativemodule: 1c74713617ef9d6513ebfd965ded18af7cd3b399 + React-mutationobservernativemodule: 2bfd3ed4b5a52be5839ad44b5031db0b7e80c541 + React-NativeModulesApple: be21a8cd462695a45e0c8182d0542293d4b1f013 + React-networking: a71f2db5e67c09632a221c0e15c8df296a05e003 + React-oscompat: 51f06d78dfa0d64cbdbbe3b779c0dc98fbf30425 + React-perflogger: f6fb8c5365ba29e656c9f5ad6c0c520777d0050c + React-performancecdpmetrics: 902e6906d1746e0bc15b86832c2c5524b3294bc4 + React-performancetimeline: d5811c33c36bba0cb916bc9a3ae118838b8b9115 + React-RCTActionSheet: 389bd2a644f10f97168aaae96afa6a3e1f0fbe68 + React-RCTAnimatedModuleProvider: c0c0ac31b3c36c1afe040ef3832669a2c504f3c8 + React-RCTAnimation: a71f49ccee1d8f139cd762e43a63ff1f13edbed2 + React-RCTAppDelegate: d42ff8a506a01d564c6dbf5632717af4b4542f75 + React-RCTBlob: e0537c265ad9d1bf292997fdb197dd1473be61e6 + React-RCTFabric: e9b2c9861d7a3917f43c61bb630ebb9ed32d45ee + React-RCTFBReactNativeSpec: 297138668383fe53f447d1cd9165f87d4029975d + React-RCTImage: b748123e2c3618f5472fd4e241273e6c873692ac + React-RCTLinking: 815f0bb859759ff2378dffd929329e941fa18b86 + React-RCTNetwork: 4e161d34daf948c5393fda10ef1e84c6eb9ba79c + React-RCTPushNotification: ae62cf6c97938211f93e2d0af0fc8757f7c89b0f + React-RCTRuntime: 41769528df86929cc8cd47e7538d6147daec69fb + React-RCTSettings: d15d09bf69fb555c5d55bc0996618406a9d4ba81 + React-RCTTest: 6e1240e21a7c6efc3afa2ae8e150496f609421b6 + React-RCTText: ddc2d014d72f47f658037382521ac1876b0f751c + React-RCTVibration: 49420b33eedc352bf51ce9886b1af918eadc9cd2 + React-rendererconsistency: dfce88334e2fbb0972e2f36e27efac8ab8b2e6ee + React-renderercss: 8e12c8a23fd82e8a1a426507e26ae2c8fc35379b + React-rendererdebug: e804fa450e01428a412caf577724876fceb514c0 + React-resizeobservernativemodule: 567ff9231d78009c701a79a749beba2d7a2956fb + React-RuntimeApple: ca0d98d5ffe44c98479d88db99abbca97aef2457 + React-RuntimeCore: 3008e4628f76f55838d3a613b5c17b3a0d861df3 + React-runtimeexecutor: dfa1c896855f821d6cea8594e26afc79ac638cdd + React-RuntimeHermes: 1d1993a7d31fdd41114e9a1b6dce101fbd028bd3 + React-runtimescheduler: 5ad796868e1b67c894c4bc70f98d14bd980e993c + React-timing: aebf3cb0fd6622457282d7fc5b1ae5c9eaabaa5a + React-utils: 6936fb35835ba9ad7235acdc84dd27dbac8ab206 + React-viewtransitionnativemodule: 8aad635cba0f95fc956021dc0b804c0a43083a6c + React-webperformancenativemodule: 03478de4af68a40bcf85ed2c9bda1d76e7b726ab + ReactAppDependencyProvider: c5b9a1a498bc4a1e37abe92bfac128f9446a0ea0 + ReactCodegen: 29baeca8bc65b96b199bac820a5244afc65d2e2f + ReactCommon: 9674bcbe0f53864025359fcc8ad60d8bfa4174fd + ReactCommon-Samples: ce729453b9727357701792d6df7acfe8118f5df2 + ScreenshotManager: 4ae76e2eb811e39d7af099926c159dcfb8f0d95c SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 3df102dba5effb5f50dbe6efce7d19bd1003a279 + Yoga: 1b8c4d09a0c4cb8f5651aeeb0896c9e552069b58 PODFILE CHECKSUM: 59f1e7d58cffbfafbeb3df31151743dd4c9a52e8 From e1988679c7f89f7b0d156df0a3cba0777b29a482 Mon Sep 17 00:00:00 2001 From: Oskar Pawica Date: Tue, 8 Sep 2026 04:26:36 -0700 Subject: [PATCH 24/35] fix(android): bump androidx.collection to 1.4.4 to avoid MutableIntObjectMap corruption in SurfaceMountingManager (#58389) Summary: since https://github.com/react/react-native/issues/56646 the view registry is a `MutableIntObjectMap`; `androidx.collection` 1.4.0 to 1.4.2 corrupt `ScatterMap` and its primitive variants after remove-heavy sequences, fixed in 1.4.3 (https://issuetracker.google.com/issues/352560465). Apps resolve 1.4.0 or 1.4.2 and lose registry entries; RN then drops mount instructions and can leave stale views. Fixes https://github.com/react/react-native/issues/58388. ## Changelog: `[ANDROID] [FIXED] - Bump androidx.collection to 1.4.4 to fix view registry entries getting lost in SurfaceMountingManager` Pull Request resolved: https://github.com/react/react-native/pull/58389 Test Plan: Reproducer: https://github.com/pawicao/rn-android-view-registry-corruption - RN 0.87.1 app resolving androidx.collection 1.4.2: 91 `Unable to find viewState` soft exceptions on 45 tags over two 40-round runs on a Pixel 9a, and a stale view left on screen. - Same screen with androidx.collection pinned to 1.4.4: none over 120 rounds. Reviewed By: cortinico Differential Revision: D119149754 Pulled By: javache fbshipit-source-id: afb13330bac575218a07a030bb1bcd5bf7e00824 (cherry picked from commit d6a5f159c6ef81651d38af2a33338b921700e044) --- packages/react-native/gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native/gradle/libs.versions.toml b/packages/react-native/gradle/libs.versions.toml index d12ebc7b91e6..0bba9087d8dc 100644 --- a/packages/react-native/gradle/libs.versions.toml +++ b/packages/react-native/gradle/libs.versions.toml @@ -10,7 +10,7 @@ agp = "9.2.1" androidx-annotation = "1.6.0" androidx-appcompat = "1.7.0" androidx-autofill = "1.3.0" -androidx-collection = "1.4.0" +androidx-collection = "1.4.4" androidx-benchmark-macro-junit4 = "1.3.3" androidx-profileinstaller = "1.4.1" androidx-swiperefreshlayout = "1.1.0" From 6532c25d242d06b924193f5b53b4f14a3bb13765 Mon Sep 17 00:00:00 2001 From: Bao Nguyen Date: Tue, 8 Sep 2026 07:34:16 -0700 Subject: [PATCH 25/35] Expose ReactNativeFeatureFlags through react-private-interface (#57940) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Fixes https://github.com/react/react-native/issues/57933. `react-native/virtualized-lists` is published separately and imported `ReactNativeFeatureFlags` through `react-native/src/private/featureflags/ReactNativeFeatureFlags`, which is not listed in `react-native`'s `"exports"`. Metro therefore warned and fell back to file-based resolution whenever an app rendered a virtualized list. Thanks huntie for the patch and the direction — this PR now applies it instead of the original approach: - `ReactNativeFeatureFlags` is exposed on the existing private package boundary, `react-native/react-private-interface` (both the runtime getter and the `.js.flow` re-export); - `VirtualizedList.js` and `VirtualizeUtils.js` import it from there. No new `src/private/*` subpath is exported, and the feature-flag singleton is unchanged. Per your review, the `scripts/monorepo-tests/__tests__/check-packages-test.js` and `scripts/shared/monorepoUtils.js` changes have been dropped — the PR is now just the patch above. Happy to look at enabling `react-native/no-deep-imports` on `virtualized-lists` as a follow-up if that's wanted. `VirtualizeUtils.js` is included alongside `VirtualizedList.js` because it carried the same runtime deep import. The remaining occurrences are out of scope: the four in `react-native/jest-preset` are all `import type` and are erased before resolution, and the one in `VirtualizeUtils-test.js` is not shipped (`virtualized-lists` excludes `**/__tests__/**` from `files`). ## Changelog: [GENERAL] [FIXED] - Fix the Metro package-exports warning caused by `react-native/virtualized-lists` importing an unexported React Native subpath. Pull Request resolved: https://github.com/react/react-native/pull/57940 Test Plan: No new test is added. The existing `virtualized-lists` suites already cover this route, because `VirtualizeUtils`/`VirtualizedList` read the flags at runtime through the new boundary. Counterfactual — dropping only the `ReactNativeFeatureFlags` getter and its `import typeof` from `react-private-interface.js`, keeping the two `virtualized-lists` imports: ```text TypeError: Cannot read properties of undefined (reading 'fixVirtualizeListCollapseWindowSize') 182 | let lastWillAddMore; 183 | > 184 | if (ReactNativeFeatureFlags.fixVirtualizeListCollapseWindowSize()) { | ^ at computeWindowedRenderLimits (packages/virtualized-lists/Lists/VirtualizeUtils.js:184:32) at Object. (packages/virtualized-lists/Lists/__tests__/VirtualizeUtils-test.js:261:47) Test Suites: 2 failed, 6 passed, 8 total Tests: 20 failed, 1 skipped, 151 passed, 172 total ``` Restoring the getter makes it green again. ```text $ yarn jest packages/virtualized-lists scripts/monorepo-tests packages/react-native/Libraries/ReactPrivate --runInBand Test Suites: 9 passed, 9 total Tests: 1 skipped, 176 passed, 177 total Snapshots: 69 passed, 69 total $ yarn flow-check Found 0 errors $ yarn lint $ eslint --max-warnings 0 . Done in 10.23s. ``` Reviewed By: javache Differential Revision: D119164284 Pulled By: cortinico fbshipit-source-id: 1e8ae3b85ae7fb28c55f207f887a97aad85b563c (cherry picked from commit a506ed66cc5744ec017556f49a2c296fb4bad318) --- packages/react-native/src/react-private-interface.js | 4 ++++ packages/react-native/src/react-private-interface.js.flow | 1 + packages/virtualized-lists/Lists/VirtualizeUtils.js | 2 +- packages/virtualized-lists/Lists/VirtualizedList.js | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/react-native/src/react-private-interface.js b/packages/react-native/src/react-private-interface.js index d2cf244b1d85..f2abb8f81803 100644 --- a/packages/react-native/src/react-private-interface.js +++ b/packages/react-native/src/react-private-interface.js @@ -49,6 +49,7 @@ import type {DangerouslyImpreciseStyleProp} from '../Libraries/StyleSheet/StyleS import typeof deepFreezeAndThrowOnMutationInDev from '../Libraries/Utilities/deepFreezeAndThrowOnMutationInDev'; import typeof deepDiffer from '../Libraries/Utilities/differ/deepDiffer'; import typeof Platform from '../Libraries/Utilities/Platform'; +import typeof * as ReactNativeFeatureFlags from './private/featureflags/ReactNativeFeatureFlags'; import typeof dispatchNativeEvent from './private/renderer/events/dispatchNativeEvent'; import typeof CustomEvent from './private/webapis/dom/events/CustomEvent'; @@ -70,6 +71,9 @@ module.exports = { get RCTEventEmitter(): RCTEventEmitter { return require('../Libraries/EventEmitter/RCTEventEmitter').default; }, + get ReactNativeFeatureFlags(): ReactNativeFeatureFlags { + return require('./private/featureflags/ReactNativeFeatureFlags'); + }, get ReactNativeViewConfigRegistry(): ReactNativeViewConfigRegistry { return require('../Libraries/Renderer/shims/ReactNativeViewConfigRegistry'); }, diff --git a/packages/react-native/src/react-private-interface.js.flow b/packages/react-native/src/react-private-interface.js.flow index e3295e6cc47d..6375b1ed6a22 100644 --- a/packages/react-native/src/react-private-interface.js.flow +++ b/packages/react-native/src/react-private-interface.js.flow @@ -24,6 +24,7 @@ export {default as BatchedBridge} from '../Libraries/BatchedBridge/BatchedBridge export {default as ExceptionsManager} from '../Libraries/Core/ExceptionsManager'; export {default as Platform} from '../Libraries/Utilities/Platform'; export {default as RCTEventEmitter} from '../Libraries/EventEmitter/RCTEventEmitter'; +export * as ReactNativeFeatureFlags from './private/featureflags/ReactNativeFeatureFlags'; export * as ReactNativeViewConfigRegistry from '../Libraries/Renderer/shims/ReactNativeViewConfigRegistry'; export {default as TextInputState} from '../Libraries/Components/TextInput/TextInputState'; export {default as UIManager} from '../Libraries/ReactNative/UIManager'; diff --git a/packages/virtualized-lists/Lists/VirtualizeUtils.js b/packages/virtualized-lists/Lists/VirtualizeUtils.js index 598eb2e7c9b0..4e5c6877fc77 100644 --- a/packages/virtualized-lists/Lists/VirtualizeUtils.js +++ b/packages/virtualized-lists/Lists/VirtualizeUtils.js @@ -13,7 +13,7 @@ import type ListMetricsAggregator from './ListMetricsAggregator'; import type {CellMetricProps} from './ListMetricsAggregator'; -import * as ReactNativeFeatureFlags from 'react-native/src/private/featureflags/ReactNativeFeatureFlags'; +import {ReactNativeFeatureFlags} from 'react-native/react-private-interface'; /** * Used to find the indices of the frames that overlap the given offsets. Useful for finding the diff --git a/packages/virtualized-lists/Lists/VirtualizedList.js b/packages/virtualized-lists/Lists/VirtualizedList.js index e78dc3738839..413d14d53d29 100644 --- a/packages/virtualized-lists/Lists/VirtualizedList.js +++ b/packages/virtualized-lists/Lists/VirtualizedList.js @@ -64,7 +64,7 @@ import { View, findNodeHandle, } from 'react-native'; -import * as ReactNativeFeatureFlags from 'react-native/src/private/featureflags/ReactNativeFeatureFlags'; +import {ReactNativeFeatureFlags} from 'react-native/react-private-interface'; export type {ListRenderItemInfo, ListRenderItem, Separators}; From 9465ef76f7c5ea74742d5b2e9d67ac2c47c71bfc Mon Sep 17 00:00:00 2001 From: Christian Falch Date: Tue, 22 Sep 2026 06:57:35 -0700 Subject: [PATCH 26/35] Stop re-creating library package roots on every sync (#58597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Building an app in Xcode fails when it autolinks a library that ships its own `Package.swift`, with one error per such library: ``` Missing package product 'reactnativeskia_ReactNativeSkia.ReactNativeSkia' Missing package product 'reactnativesafeareacontext_ReactNativeSafeAreaContext.ReactNativeSafeAreaContext' ``` The same project builds fine from the command line. Two problems combine. **The sync destroys package roots Xcode has already loaded.** Autolinking writes one symlink per self-managed library into `build/generated/autolinking/libs/`, and Xcode treats each as a local Swift package root. The generator deleted that whole directory and recreated it on every run, even when the generated output was byte-for-byte identical. Measured on a real app, across one no-op sync: the `libs/` inode changed from 1913513750 to 1913930645, `libs/ReactNativeSkia` from 1913513937 to 1913930649, while the generated `Package.swift` kept the same MD5. Recreating a package root that Xcode has already resolved is what produces the error above. **Xcode's own bookkeeping made the sync run every time.** The "Sync SPM Autolinking" build phase re-syncs when a watched input looks newer than its stamp, and it checked each library's whole directory with `find -newer `. Xcode writes its per-user scheme state inside that directory, at `/.swiftpm/xcode/xcuserdata/.xcuserdatad/xcschemes/xcschememanagement.plist`. So Xcode's own write marked the next build stale, which triggered the destructive re-sync, which broke that build. `xcodebuild` does not write that file, which is why command-line builds were never affected. This change makes the `libs/` tree idempotent — unchanged entries keep their inode, and entries that are no longer autolinked are pruned instead of wiped — and makes the staleness check skip `.swiftpm`. ### How to verify In an app that autolinks a library shipping its own `Package.swift`, build in Xcode twice in a row. Both builds should succeed. Before this change the second build fails with `Missing package product`. ## Changelog: [IOS][FIXED] - Stop SwiftPM autolinking from recreating library package roots on every sync, which broke Xcode builds of apps using libraries that ship their own Package.swift Pull Request resolved: https://github.com/react/react-native/pull/58597 Test Plan: **Unit tests.** `yarn test packages/react-native/scripts/spm` — 21 suites, 1009 tests pass. New tests, written and seen failing before the fix: - Two consecutive generation runs over an unchanged self-managed dependency keep both the `libs/` inode and each entry's inode. Failed before the fix with the same inode churn measured on the real app. - A dependency removed between two runs leaves no symlink under `libs/`. - The emitted staleness snippet is extracted from the generated script and executed under `/bin/bash -c` with `set -euo pipefail` against a temporary tree. A write under `.swiftpm/` is ignored; a real source change is still detected. **Real app.** A React Native 0.87.1 app on Xcode 27 autolinking `shopify/react-native-skia` and `react-native-safe-area-context`, both self-managed. Before: `xcodebuild` succeeded, Xcode failed in about 5 seconds with the two errors above, on nearly every build. **Not run:** the full CI matrix, and no Android-side check — this touches iOS SwiftPM tooling only. ## Scope Deliberately minimal. One case still re-syncs: the first time Xcode creates `.swiftpm` inside a library, that bumps the library directory's own mtime, so the build after a fresh checkout reports stale once per library. That is harmless now that the sync is idempotent. One related item is left alone: the aggregate `Package.swift` is still rewritten on every sync even when its content is unchanged, which bumps its mtime and can make Xcode re-resolve. That is wasteful but not destructive, and it is no longer reached on an ordinary IDE build now that `.swiftpm` writes do not mark the sync stale. Reviewed By: cipolleschi Differential Revision: D120740029 Pulled By: shwanton fbshipit-source-id: 3783d4cee4791ab13517d8f0dcac71f752cb7c1b (cherry picked from commit 97cc934dc75184977363e06b1793277de82fed54) --- .../generate-spm-autolinking-test.js | 97 +++++++++++++++++++ .../__tests__/generate-spm-xcodeproj-test.js | 64 ++++++++++++ .../scripts/spm/generate-spm-autolinking.js | 29 ++++-- .../scripts/spm/generate-spm-xcodeproj.js | 4 +- 4 files changed, 184 insertions(+), 10 deletions(-) diff --git a/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js b/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js index 27fb060fee06..aa2d2170ec73 100644 --- a/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js +++ b/packages/react-native/scripts/spm/__tests__/generate-spm-autolinking-test.js @@ -1982,6 +1982,103 @@ describe('main() — .spm-sync-watch-paths emission', () => { }); }); +// --------------------------------------------------------------------------- +// main() — libs/ symlinks for self-managed deps +// +// Xcode loads each libs/ symlink as a local package root. Replacing +// one that did not change invalidates the package graph Xcode already holds, +// and the build then fails with "Missing package product". So a sync that +// changes nothing must leave every inode under libs/ — and libs/ itself — +// untouched, while a dep that is gone must lose its symlink. +// --------------------------------------------------------------------------- + +describe('main() — libs/ symlinks for self-managed deps', () => { + const {created} = useTempApps(); + + function buildApp(depNames) { + const appRoot = fs.realpathSync( + fs.mkdtempSync(path.join(os.tmpdir(), 'spm-libs-sync-')), + ); + created.push(appRoot); + const rnRoot = path.join(appRoot, 'rn'); + fs.mkdirSync(rnRoot, {recursive: true}); + fs.writeFileSync( + path.join(appRoot, 'package.json'), + JSON.stringify({name: 'app'}), + ); + + const dependencies = {}; + for (const npmName of depNames) { + // A hand-authored root Package.swift (no AUTOGEN marker) is what makes a + // dep self-managed. + const depDir = path.join(appRoot, 'node_modules', npmName); + fs.mkdirSync(depDir, {recursive: true}); + fs.writeFileSync( + path.join(depDir, 'Package.swift'), + '// swift-tools-version:5.9\n// hand-authored\n', + ); + fs.writeFileSync(path.join(depDir, 'Source.swift'), '// src\n'); + dependencies[npmName] = {root: depDir, platforms: {ios: {}}}; + } + + const autolinkDir = path.join(appRoot, 'build', 'generated', 'autolinking'); + fs.mkdirSync(autolinkDir, {recursive: true}); + const writeAutolinkingJson = names => + fs.writeFileSync( + path.join(autolinkDir, 'autolinking.json'), + JSON.stringify({ + dependencies: Object.fromEntries( + names.map(n => [n, dependencies[n]]), + ), + }), + ); + writeAutolinkingJson(depNames); + + return { + libsDir: path.join(autolinkDir, 'libs'), + writeAutolinkingJson, + sync: () => main(['--app-root', appRoot, '--react-native-root', rnRoot]), + }; + } + + const inodesOf = libsDir => + Object.fromEntries( + ['.', ...fs.readdirSync(libsDir)].map(entry => [ + entry, + fs.lstatSync(path.join(libsDir, entry)).ino, + ]), + ); + + it('keeps every inode when nothing changed', () => { + const app = buildApp(['react-native-foo', 'react-native-bar']); + + app.sync(); + const before = inodesOf(app.libsDir); + expect(Object.keys(before).sort()).toEqual([ + '.', + 'ReactNativeBar', + 'ReactNativeFoo', + ]); + + app.sync(); + expect(inodesOf(app.libsDir)).toEqual(before); + }); + + it('drops the symlink of a dep that is no longer autolinked', () => { + const app = buildApp(['react-native-foo', 'react-native-bar']); + + app.sync(); + expect(fs.readdirSync(app.libsDir).sort()).toEqual([ + 'ReactNativeBar', + 'ReactNativeFoo', + ]); + + app.writeAutolinkingJson(['react-native-foo']); + app.sync(); + expect(fs.readdirSync(app.libsDir)).toEqual(['ReactNativeFoo']); + }); +}); + // --------------------------------------------------------------------------- // main() — the name a dep's podspec declares reaching a real manifest. // --------------------------------------------------------------------------- diff --git a/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js b/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js index ec6a44d4f8a2..f5b1145edf3a 100644 --- a/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js +++ b/packages/react-native/scripts/spm/__tests__/generate-spm-xcodeproj-test.js @@ -234,6 +234,70 @@ describe('sync scripts', () => { ); }); + // Xcode writes per-user scheme state into /.swiftpm/ on every + // IDE build. Counting that as a change made every IDE build re-sync. + describe('the watched-directory staleness probe', () => { + // Runs the generated `find` in isolation, with $P/$STAMP bound as the + // build phase binds them. + function probe(watchedDir, stampFile) { + const findCommand = /\$\((find "\$P"[^()]*)\)/.exec(script)?.[1]; + expect(findCommand).toBeDefined(); + return execFileSync( + '/bin/bash', + [ + '-c', + `set -euo pipefail\nP="$1"\nSTAMP="$2"\n${String(findCommand)}\n`, + 'probe', + watchedDir, + stampFile, + ], + {encoding: 'utf8'}, + ); + } + + let root; + let watchedDir; + let stampFile; + let schemeState; + let source; + + beforeEach(() => { + root = fs.mkdtempSync(path.join(os.tmpdir(), 'spm-sync-stale-')); + watchedDir = path.join(root, 'node_modules', 'react-native-foo'); + schemeState = path.join( + watchedDir, + '.swiftpm/xcode/xcuserdata/someone.xcuserdatad/xcschemes/xcschememanagement.plist', + ); + source = path.join(watchedDir, 'Foo.swift'); + fs.mkdirSync(path.dirname(schemeState), {recursive: true}); + fs.writeFileSync(schemeState, '\n'); + fs.writeFileSync(source, '// src\n'); + // The stamp is written after the tree, so nothing is newer until a test + // makes it so. + stampFile = path.join(root, '.spm-sync-stamp'); + fs.writeFileSync(stampFile, ''); + }); + + afterEach(() => { + fs.rmSync(root, {recursive: true, force: true}); + }); + + const touch = file => { + const future = new Date(Date.now() + 10_000); + fs.utimesSync(file, future, future); + }; + + it('ignores Xcode-owned state under .swiftpm', () => { + touch(schemeState); + expect(probe(watchedDir, stampFile)).toBe(''); + }); + + it('still reports a changed source file', () => { + touch(source); + expect(probe(watchedDir, stampFile).trim()).toBe(source); + }); + }); + it('is deterministic, shared with the pre-action, and valid POSIX shell', () => { expect(buildSyncAutolinkingScript(baked)).toBe(script); expect(buildSchemePreActionScript(baked)).toBe(script); diff --git a/packages/react-native/scripts/spm/generate-spm-autolinking.js b/packages/react-native/scripts/spm/generate-spm-autolinking.js index 3b41a6b56ad9..17ecbbe7bef9 100644 --- a/packages/react-native/scripts/spm/generate-spm-autolinking.js +++ b/packages/react-native/scripts/spm/generate-spm-autolinking.js @@ -1515,11 +1515,14 @@ function main(argv /*:: ?: Array */) /*: void */ { // is the Swift module name (guaranteed unique per dep), so SPM's // path-basename-based package identity never collides — even when two // libs ship their own Package.swift inside `ios/` (a common convention). - // Wiped on every run; populated below as self-managed deps are visited. + // Populated below as self-managed deps are visited, then pruned. Entries + // that do not change keep their inode: Xcode holds each one as a loaded + // package root, and recreating one it already resolved fails the build with + // "Missing package product". const libsDir = path.join(outputDir, 'libs'); + const wantedLibAliases /*: Set */ = new Set(); fs.mkdirSync(packagesDir, {recursive: true}); fs.mkdirSync(headersDir, {recursive: true}); - fs.rmSync(libsDir, {recursive: true, force: true}); fs.mkdirSync(libsDir, {recursive: true}); const wrapperDirs /*: Map */ = new Map(); @@ -1652,6 +1655,7 @@ function main(argv /*:: ?: Array */) /*: void */ { const realPackageDir = selfManagedDirs.get(target.name) ?? absSource; const aliasPath = path.join(libsDir, target.name); ensureSymlink(aliasPath, realPackageDir); + wantedLibAliases.add(target.name); aggregatorPackageDeps.push({ swiftName: target.name, packagePath: `libs/${target.name}`, @@ -1779,23 +1783,30 @@ function main(argv /*:: ?: Array */) /*: void */ { }); } - // Prune stale wrappers + header dirs for entries no longer autolinked. - // Preserve both wrapper-managed and self-managed names; only entries that - // are no longer autolinked at all get removed. Note: `packages/` only has - // wrapper-managed names (self-managed deps live in their own source dirs), - // but `headers/` has both since we populate the central tree for everyone. + // Prune stale wrappers, header dirs and lib aliases for entries no longer + // autolinked. Preserve both wrapper-managed and self-managed names; only + // entries that are no longer autolinked at all get removed. Note: + // `packages/` only has wrapper-managed names (self-managed deps live in + // their own source dirs), but `headers/` has both since we populate the + // central tree for everyone. `libs/` keeps only the aliases written above, + // so a dep that stopped being self-managed loses its alias too. const activeNames /*: Set */ = new Set([ ...wrapperDirs.keys(), ...selfManagedDirs.keys(), ]); - for (const subdir of ['packages', 'headers']) { + const pruneTargets /*: Array<[string, Set]> */ = [ + ['packages', activeNames], + ['headers', activeNames], + ['libs', wantedLibAliases], + ]; + for (const [subdir, keptNames] of pruneTargets) { const dir = path.join(outputDir, subdir); try { const existing /*: Array<{name: string, isSymbolicLink(): boolean, isDirectory(): boolean}> */ = // $FlowFixMe[incompatible-type] Dirent typing fs.readdirSync(dir, {withFileTypes: true}); for (const entry of existing) { - if (activeNames.has(entry.name)) continue; + if (keptNames.has(entry.name)) continue; const stale = path.join(dir, entry.name); if (entry.isSymbolicLink() || !entry.isDirectory()) { fs.unlinkSync(stale); diff --git a/packages/react-native/scripts/spm/generate-spm-xcodeproj.js b/packages/react-native/scripts/spm/generate-spm-xcodeproj.js index acb3c5192b04..349f366b2fa1 100644 --- a/packages/react-native/scripts/spm/generate-spm-xcodeproj.js +++ b/packages/react-native/scripts/spm/generate-spm-xcodeproj.js @@ -767,7 +767,9 @@ if [ "$STALE" -eq 0 ] && [ -f "$WATCH_FILE" ]; then while IFS= read -r P; do [ -z "$P" ] && continue if [ -d "$P" ]; then - if [ -n "$(find "$P" -newer "$STAMP" -print -quit 2>/dev/null)" ]; then + # .swiftpm holds Xcode's own per-user scheme state, which it rewrites + # during a build — reading it as a change makes every IDE build re-sync. + if [ -n "$(find "$P" -name .swiftpm -prune -o -newer "$STAMP" -print -quit 2>/dev/null)" ]; then STALE=1 break fi From 7fdfc4ebf31fd899ca892332be11c74c8c9ce5be Mon Sep 17 00:00:00 2001 From: Christian Falch Date: Wed, 23 Sep 2026 07:06:12 -0700 Subject: [PATCH 27/35] Repair stale staged headers in the iOS prebuild (#58596) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: The iOS prebuild (`node scripts/ios-prebuild`) stages React Native's headers into `packages/react-native/.build/headers` as hard links, and skipped any target that already existed. When changing the original source files, these hard links can become stale and errors like this can occur: ``` Libraries/LinkingIOS/RCTLinkingManager.mm:91:7: error: use of undeclared identifier 'RCTIsSceneDelegateApp' ``` This is a problem that contributors will see - not regular users, but the fix helps with strange error messages. ## Changelog: [INTERNAL] [FIXED] - Repair stale staged headers in the iOS prebuild instead of compiling against a previous checkout's copies Pull Request resolved: https://github.com/react/react-native/pull/58596 Test Plan: ✅ New unit tests, 16 cases in `packages/react-native/scripts/ios-prebuild/__tests__/setup-test.js`, using real temporary directories rather than an `fs` mock, since the defect is about inodes. End to end on an Xcode 27 checkout: - Replaced a staged header with a copy, so it kept the same contents but a different inode. `node scripts/ios-prebuild -s -f Debug` restored it to the source inode and logged `Linked React/Base → .build/headers/React`. The previous code skipped it. - Ran setup a second time with nothing changed: no file was relinked, and nothing was logged. - Confirmed the three colliding targets still resolve to the same source as before the change, by inode. - `node scripts/ios-prebuild -b -f Debug -p ios-simulator` → `** BUILD SUCCEEDED **`. Reviewed By: cipolleschi Differential Revision: D120740409 Pulled By: shwanton fbshipit-source-id: 41c1eb112c3395d6c7158d7151be7fdd92a21cef (cherry picked from commit b935e74ad5abbea2c581148fe8d02141d79a351b) --- .../ios-prebuild/__tests__/setup-test.js | 296 ++++++++++++++++++ .../scripts/ios-prebuild/setup.js | 165 ++++++---- 2 files changed, 398 insertions(+), 63 deletions(-) create mode 100644 packages/react-native/scripts/ios-prebuild/__tests__/setup-test.js diff --git a/packages/react-native/scripts/ios-prebuild/__tests__/setup-test.js b/packages/react-native/scripts/ios-prebuild/__tests__/setup-test.js new file mode 100644 index 000000000000..a0a66f27721d --- /dev/null +++ b/packages/react-native/scripts/ios-prebuild/__tests__/setup-test.js @@ -0,0 +1,296 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +'use strict'; + +const {createHeaderLinker} = require('../setup'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); + +describe('createHeaderLinker', () => { + let tmp /*: string */ = ''; + let root /*: string */ = ''; + let linksFolder /*: string */ = ''; + let log /*: JestMockFn<[string], void> */ = jest.fn(); + let stage /*: (fromPath: string, includePath?: ?string) => void */ = () => {}; + + // Each pass gets its own linker, the way a prebuild run does. + const newPass = () => { + log = jest.fn(); + return createHeaderLinker(root, linksFolder, log); + }; + + const write = (relPath /*: string */, contents /*: string */) => { + const file = path.join(root, relPath); + fs.mkdirSync(path.dirname(file), {recursive: true}); + fs.writeFileSync(file, contents); + return file; + }; + + const staged = (relPath /*: string */) => path.join(linksFolder, relPath); + + const linkedMessage = (fromPath /*: string */, includePath /*: string */) => + `Linked ${fromPath} → ${path.relative(root, staged(includePath))}`; + + beforeEach(() => { + tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'header-links-test-')); + root = path.join(tmp, 'source'); + linksFolder = path.join(tmp, 'headers'); + fs.mkdirSync(root, {recursive: true}); + fs.mkdirSync(linksFolder, {recursive: true}); + stage = newPass(); + }); + + afterEach(() => { + jest.restoreAllMocks(); + fs.rmSync(tmp, {recursive: true, force: true}); + }); + + it('hard links a header into the staging folder', () => { + const source = write('React/Base/RCTUtils.h', '// original\n'); + + stage('React/Base', 'React'); + + expect(fs.readFileSync(staged('React/RCTUtils.h'), 'utf8')).toBe( + '// original\n', + ); + expect(fs.statSync(staged('React/RCTUtils.h')).ino).toBe( + fs.statSync(source).ino, + ); + expect(log).toHaveBeenCalledTimes(1); + expect(log).toHaveBeenCalledWith(linkedMessage('React/Base', 'React')); + }); + + it('repairs a staged link whose source was replaced by a new inode', () => { + write('React/Base/RCTUtils.h', '// june\n'); + stage('React/Base', 'React'); + + // git checkout writes a new file and renames it over the old one, so the + // source gets a new inode and the staged link keeps serving the old one. + const replacement = path.join(tmp, 'RCTUtils.h.new'); + fs.writeFileSync(replacement, '// august\n'); + const source = path.join(root, 'React/Base/RCTUtils.h'); + fs.renameSync(replacement, source); + + stage = newPass(); + stage('React/Base', 'React'); + + expect(fs.readFileSync(staged('React/RCTUtils.h'), 'utf8')).toBe( + '// august\n', + ); + expect(fs.statSync(staged('React/RCTUtils.h')).ino).toBe( + fs.statSync(source).ino, + ); + expect(log).toHaveBeenCalledWith(linkedMessage('React/Base', 'React')); + }); + + it('does not relink an up-to-date link on a later pass', () => { + write('React/Base/RCTUtils.h', '// original\n'); + stage('React/Base', 'React'); + + const linkSync = jest.spyOn(fs, 'linkSync'); + const unlinkSync = jest.spyOn(fs, 'unlinkSync'); + + stage = newPass(); + stage('React/Base', 'React'); + + expect(linkSync).not.toHaveBeenCalled(); + expect(unlinkSync).not.toHaveBeenCalled(); + expect(log).not.toHaveBeenCalled(); + }); + + it('keeps the header staged first when two sources collide on one target', () => { + const umbrella = write('callinvoker/React/CallInvoker.h', '// umbrella\n'); + write('callinvoker/ReactCommon/CallInvoker.h', '// interface\n'); + + stage('callinvoker/React', 'ReactCommon'); + stage('callinvoker/ReactCommon', 'ReactCommon'); + + expect(fs.readFileSync(staged('ReactCommon/CallInvoker.h'), 'utf8')).toBe( + '// umbrella\n', + ); + expect(fs.statSync(staged('ReactCommon/CallInvoker.h')).ino).toBe( + fs.statSync(umbrella).ino, + ); + expect(log).toHaveBeenCalledTimes(1); + expect(log).toHaveBeenCalledWith( + linkedMessage('callinvoker/React', 'ReactCommon'), + ); + + const linkSync = jest.spyOn(fs, 'linkSync'); + const unlinkSync = jest.spyOn(fs, 'unlinkSync'); + + stage = newPass(); + stage('callinvoker/React', 'ReactCommon'); + stage('callinvoker/ReactCommon', 'ReactCommon'); + + expect(linkSync).not.toHaveBeenCalled(); + expect(unlinkSync).not.toHaveBeenCalled(); + expect(fs.readFileSync(staged('ReactCommon/CallInvoker.h'), 'utf8')).toBe( + '// umbrella\n', + ); + }); + + it('keeps the header visited first when one pass recurses into colliding siblings', () => { + write('callinvoker/React/CallInvoker.h', '// umbrella\n'); + write('callinvoker/ReactCommon/CallInvoker.h', '// interface\n'); + + // Read the traversal order rather than assume it: the invariant is that the + // first sibling visited wins, not that a particular sibling wins. + const [firstVisited] = fs + .readdirSync(path.join(root, 'callinvoker'), {withFileTypes: true}) + .filter(dirent => dirent.isDirectory()) + .map(dirent => String(dirent.name)); + const winner = path.join( + root, + 'callinvoker', + firstVisited, + 'CallInvoker.h', + ); + + stage('callinvoker', 'ReactCommon'); + + expect(fs.readFileSync(staged('ReactCommon/CallInvoker.h'), 'utf8')).toBe( + fs.readFileSync(winner, 'utf8'), + ); + expect(fs.statSync(staged('ReactCommon/CallInvoker.h')).ino).toBe( + fs.statSync(winner).ino, + ); + }); + + it('replaces a staged symlink that points at the source file', () => { + const source = write('React/Base/RCTUtils.h', '// original\n'); + fs.mkdirSync(staged('React'), {recursive: true}); + // A symlink resolves to the source inode but does not share it, so it would + // not track in-place edits the way the staging tree assumes. + fs.symlinkSync(source, staged('React/RCTUtils.h')); + + stage('React/Base', 'React'); + + expect(fs.lstatSync(staged('React/RCTUtils.h')).isSymbolicLink()).toBe( + false, + ); + expect(fs.statSync(staged('React/RCTUtils.h')).ino).toBe( + fs.statSync(source).ino, + ); + }); + + it('stages the remaining headers when one file fails to link', () => { + const consoleError = jest + .spyOn(console, 'error') + .mockImplementation(() => {}); + write('React/Base/RCTUtils.h', ''); + write('React/Base/RCTConversions.h', ''); + + const unlinkable = staged('React/RCTUtils.h'); + const realLinkSync = fs.linkSync; + jest.spyOn(fs, 'linkSync').mockImplementation((sourceFile, targetFile) => { + if (targetFile === unlinkable) { + throw new Error('Operation not permitted'); + } + realLinkSync(sourceFile, targetFile); + }); + + expect(() => stage('React/Base', 'React')).not.toThrow(); + + expect(fs.readdirSync(staged('React'))).toEqual(['RCTConversions.h']); + expect(consoleError).toHaveBeenCalledWith( + expect.stringContaining(`Failed to create link for`), + ); + }); + + it('replaces a staged copy that does not share the source inode', () => { + const source = write('React/Base/RCTUtils.h', '// original\n'); + fs.mkdirSync(staged('React'), {recursive: true}); + fs.writeFileSync(staged('React/RCTUtils.h'), '// a copy, not a link\n'); + + stage('React/Base', 'React'); + + expect(fs.statSync(staged('React/RCTUtils.h')).ino).toBe( + fs.statSync(source).ino, + ); + }); + + it('replaces a staged symlink instead of following it', () => { + const source = write('React/Base/RCTUtils.h', '// original\n'); + const elsewhere = write('elsewhere/RCTUtils.h', '// elsewhere\n'); + fs.mkdirSync(staged('React'), {recursive: true}); + fs.symlinkSync(elsewhere, staged('React/RCTUtils.h')); + + stage('React/Base', 'React'); + + expect(fs.lstatSync(staged('React/RCTUtils.h')).isSymbolicLink()).toBe( + false, + ); + expect(fs.statSync(staged('React/RCTUtils.h')).ino).toBe( + fs.statSync(source).ino, + ); + expect(fs.readFileSync(elsewhere, 'utf8')).toBe('// elsewhere\n'); + }); + + it('stages only header files', () => { + write('React/Base/RCTUtils.h', ''); + write('React/Base/RCTConversions.hpp', ''); + write('React/Base/RCTUtils.m', ''); + write('React/Base/RCTUtils.cpp', ''); + write('React/Base/BUCK.txt', ''); + + stage('React/Base', 'React'); + + expect(fs.readdirSync(staged('React')).sort()).toEqual([ + 'RCTConversions.hpp', + 'RCTUtils.h', + ]); + }); + + it('skips files of a folder without headers but still recurses into it', () => { + write('React/README.md', ''); + write('React/Base/RCTUtils.h', ''); + + stage('React', 'React'); + + expect(fs.readdirSync(staged('React'))).toEqual(['RCTUtils.h']); + expect(log).toHaveBeenCalledTimes(1); + expect(log).toHaveBeenCalledWith(linkedMessage('React/Base', 'React')); + }); + + it('does not log a pass that staged nothing', () => { + write('React/Base/README.md', ''); + + stage('React/Base', 'React'); + + expect(log).not.toHaveBeenCalled(); + }); + + it('flattens nested subfolders under the same include path', () => { + write('React/Base/RCTUtils.h', ''); + write('React/Base/Surface/RCTSurface.h', ''); + + stage('React/Base', 'React'); + + expect(fs.readdirSync(staged('React')).sort()).toEqual([ + 'RCTSurface.h', + 'RCTUtils.h', + ]); + }); + + it.each(['__tests__', 'tests', 'platform'])( + 'does not stage headers from a %s subfolder', + folder => { + write('React/Base/RCTUtils.h', ''); + write(`React/Base/${folder}/RCTUtilsTests.h`, ''); + + stage('React/Base', 'React'); + + expect(fs.readdirSync(staged('React'))).toEqual(['RCTUtils.h']); + }, + ); +}); diff --git a/packages/react-native/scripts/ios-prebuild/setup.js b/packages/react-native/scripts/ios-prebuild/setup.js index afd019566408..37269d05e2ba 100644 --- a/packages/react-native/scripts/ios-prebuild/setup.js +++ b/packages/react-native/scripts/ios-prebuild/setup.js @@ -38,69 +38,7 @@ async function setup( const linksFolder = path.resolve(buildFolder, 'headers'); createFolderIfNotExists(linksFolder); - /** - * Creates a hard link from one path to another. For each subfolder - * in the source path, it creates a link in the target path with an - * underscore prefix. - */ - const link = (fromPath /*:string*/, includePath /*:?string*/) => { - const source = path.resolve(root, fromPath); - const target = path.resolve(linksFolder, includePath ?? fromPath); - - createFolderIfNotExists(target); - - let linkedFiles = 0; - - // get subfolders in source - make sure we only copy folders with header files - const entries = fs.readdirSync(source, {withFileTypes: true}); - if ( - entries.some( - dirent => - dirent.isFile() && - (String(dirent.name).endsWith('.h') || - String(dirent.name).endsWith('.hpp')), - ) - ) { - // Create link for all header files (*.h, *.hpp) in the source directory - entries.forEach(entry => { - const entryName = String(entry.name); - if (entry.isFile() && /\.(h|hpp)$/.test(entryName)) { - const sourceFile = path.join(source, entryName); - const targetFile = path.join(target, entryName); - // Skip if the file already exists - if (fs.existsSync(targetFile)) { - return; - } - try { - fs.linkSync(sourceFile, targetFile); - linkedFiles++; - } catch (e) { - console.error( - `Failed to create link for ${sourceFile} to ${targetFile}: ${e}`, - ); - } - } - }); - } - - if (linkedFiles > 0) { - prebuildLog( - `Linked ${path.relative(root, source)} → ${path.relative(root, target)}`, - ); - } - - const subfolders = entries - .filter(dirent => dirent.isDirectory()) - .filter(dirent => dirent.name !== '__tests__') - .filter(dirent => dirent.name !== 'tests') - .filter(dirent => dirent.name !== 'platform') - .map(dirent => dirent.name); - - // Create links for subfolders - subfolders.forEach(folder => { - link(path.join(fromPath, String(folder)), includePath); - }); - }; + const link = createHeaderLinker(root, linksFolder, prebuildLog); // HERMES ARTIFACTS await prepareHermesArtifactsAsync(currentVersion, buildType); @@ -199,6 +137,107 @@ async function setup( link('.build/codegen/build/generated/ios', 'ReactCodegen'); } +function lstatSyncIfExists(filePath /*: string */) /*: ?fs.Stats */ { + try { + return fs.lstatSync(filePath); + } catch (e) { + if (e.code === 'ENOENT') { + return null; + } + throw e; + } +} + +/** + * Builds the staging function for one prebuild pass: it hard links the header + * files of a source folder into the prebuild's flat include tree, recursing + * into subfolders. A folder without any header file directly in it contributes + * nothing but is still traversed. + */ +function createHeaderLinker( + root /*: string */, + linksFolder /*: string */, + log /*: (message: string) => void */, +) /*: (fromPath: string, includePath?: ?string) => void */ { + // Several call sites flatten distinct source folders onto one target folder, + // and a few of those collide on a basename. The first source staged in a pass + // owns the target; the compiler has been seeing that header all along. + const claimed /*: Set */ = new Set(); + + const linkFolder = ( + fromPath /*: string */, + includePath /*: ?string */, + ) /*: void */ => { + const source = path.resolve(root, fromPath); + const target = path.resolve(linksFolder, includePath ?? fromPath); + + createFolderIfNotExists(target); + + let linkedFiles = 0; + + const entries = fs.readdirSync(source, {withFileTypes: true}); + if ( + entries.some( + dirent => dirent.isFile() && /\.(h|hpp)$/.test(String(dirent.name)), + ) + ) { + entries.forEach(entry => { + const entryName = String(entry.name); + if (entry.isFile() && /\.(h|hpp)$/.test(entryName)) { + const sourceFile = path.join(source, entryName); + const targetFile = path.join(target, entryName); + if (claimed.has(targetFile)) { + return; + } + try { + // `git checkout` replaces a header by renaming a new file over it, + // so the source gets a new inode and a link staged earlier keeps + // serving the old contents. Anything that is not the source inode + // is stale. + const staged = lstatSyncIfExists(targetFile); + if (staged != null) { + const sourceStat = fs.statSync(sourceFile); + if ( + staged.dev === sourceStat.dev && + staged.ino === sourceStat.ino + ) { + claimed.add(targetFile); + return; + } + fs.unlinkSync(targetFile); + } + fs.linkSync(sourceFile, targetFile); + claimed.add(targetFile); + linkedFiles++; + } catch (e) { + console.error( + `Failed to create link for ${sourceFile} to ${targetFile}: ${e}`, + ); + } + } + }); + } + + if (linkedFiles > 0) { + log( + `Linked ${path.relative(root, source)} → ${path.relative(root, target)}`, + ); + } + + entries + .filter(dirent => dirent.isDirectory()) + .filter(dirent => dirent.name !== '__tests__') + .filter(dirent => dirent.name !== 'tests') + .filter(dirent => dirent.name !== 'platform') + .forEach(dirent => { + linkFolder(path.join(fromPath, String(dirent.name)), includePath); + }); + }; + + return linkFolder; +} + module.exports = { + createHeaderLinker, setup, }; From 13d30b643cb722304845bd5c53d2076c061eb6a2 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Thu, 24 Sep 2026 15:31:31 +0100 Subject: [PATCH 28/35] Regenerate C++ API snapshots after the ObjC ArrayBuffer reverts The revert of the NSData argument path moved codegen back to NSMutableData but did not refresh the recorded snapshots, leaving Validate C++ API Snapshots red on the release branch. Changelog: [Internal] --- scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api | 4 ++-- scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api | 4 ++-- scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index 4b927bf1ac61..d60317dda7f8 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -2503,7 +2503,7 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual NSDictionary* getUnsafeObject:(NSDictionary* arg); public virtual NSDictionary* getValue:y:z:(double x, NSString* y, NSDictionary* z); public virtual NSMutableData* createNativeBuffer:(double size); - public virtual NSMutableData* getArrayBuffer:(NSData* buffer); + public virtual NSMutableData* getArrayBuffer:(NSMutableData* buffer); public virtual NSNumber* getBool:(BOOL arg); public virtual NSNumber* getEnum:(double arg); public virtual NSNumber* getNumber:(double arg); @@ -2514,7 +2514,7 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual void getImageUrl:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void getValueWithCallback:(RCTResponseSenderBlock callback); public virtual void getValueWithPromise:resolve:reject:(BOOL error, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); - public virtual void processAsyncBuffer:resolve:reject:(NSData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); + public virtual void processAsyncBuffer:resolve:reject:(NSMutableData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseAssert:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseThrows:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void voidFunc(); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index bec93c59aa33..edf8c0cd4909 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -2496,7 +2496,7 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual NSDictionary* getUnsafeObject:(NSDictionary* arg); public virtual NSDictionary* getValue:y:z:(double x, NSString* y, NSDictionary* z); public virtual NSMutableData* createNativeBuffer:(double size); - public virtual NSMutableData* getArrayBuffer:(NSData* buffer); + public virtual NSMutableData* getArrayBuffer:(NSMutableData* buffer); public virtual NSNumber* getBool:(BOOL arg); public virtual NSNumber* getEnum:(double arg); public virtual NSNumber* getNumber:(double arg); @@ -2507,7 +2507,7 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual void getImageUrl:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void getValueWithCallback:(RCTResponseSenderBlock callback); public virtual void getValueWithPromise:resolve:reject:(BOOL error, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); - public virtual void processAsyncBuffer:resolve:reject:(NSData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); + public virtual void processAsyncBuffer:resolve:reject:(NSMutableData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseAssert:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseThrows:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void voidFunc(); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 481f3569b856..4e964faacfe6 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -2503,7 +2503,7 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual NSDictionary* getUnsafeObject:(NSDictionary* arg); public virtual NSDictionary* getValue:y:z:(double x, NSString* y, NSDictionary* z); public virtual NSMutableData* createNativeBuffer:(double size); - public virtual NSMutableData* getArrayBuffer:(NSData* buffer); + public virtual NSMutableData* getArrayBuffer:(NSMutableData* buffer); public virtual NSNumber* getBool:(BOOL arg); public virtual NSNumber* getEnum:(double arg); public virtual NSNumber* getNumber:(double arg); @@ -2514,7 +2514,7 @@ protocol NativeSampleTurboModuleSpec : public NSObjectRCTBridgeModule, public RC public virtual void getImageUrl:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void getValueWithCallback:(RCTResponseSenderBlock callback); public virtual void getValueWithPromise:resolve:reject:(BOOL error, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); - public virtual void processAsyncBuffer:resolve:reject:(NSData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); + public virtual void processAsyncBuffer:resolve:reject:(NSMutableData* payload, RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseAssert:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void promiseThrows:reject:(RCTPromiseResolveBlock resolve, RCTPromiseRejectBlock reject); public virtual void voidFunc(); From 993be7d6c69c838bd6fb7acf6b979f8ea65ca03c Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Sun, 27 Sep 2026 12:28:32 +0100 Subject: [PATCH 29/35] Bump Hermes to 260318099.0.4 Picks up two fixes released in hermes-v260318099.0.4: - Avoid reserve() in ConsecutiveStringStorage. Lazy compilation appends to the string storage on every newly compiled function, and reserve() on libc++ sizes to exactly the requested capacity rather than growing geometrically, so repeated appends were quadratic. - Re-land of the VariableScope rescan optimization. See https://github.com/reactwg/react-native-releases/issues/1430 --- packages/react-native/package.json | 2 +- packages/react-native/sdks/hermes-engine/version.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 22e37bea6eb2..2f8d901d6941 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -165,7 +165,7 @@ "flow-parser": "0.327.0", "base64-js": "^1.5.1", "flow-enums-runtime": "^0.0.6", - "hermes-compiler": "260318099.0.3", + "hermes-compiler": "260318099.0.4", "invariant": "^2.2.4", "memoize-one": "^5.0.0", "metro-runtime": "^0.87.1", diff --git a/packages/react-native/sdks/hermes-engine/version.properties b/packages/react-native/sdks/hermes-engine/version.properties index 30373000a504..2754541812df 100644 --- a/packages/react-native/sdks/hermes-engine/version.properties +++ b/packages/react-native/sdks/hermes-engine/version.properties @@ -1 +1 @@ -HERMES_VERSION_NAME=260318099.0.3 +HERMES_VERSION_NAME=260318099.0.4 From 0782c61fe6cf0dd566ed83d6b7600c80ef75b490 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Mon, 28 Sep 2026 09:11:17 +0000 Subject: [PATCH 30/35] Release 0.88.0-rc.3 #publish-packages-to-npm&next --- package.json | 4 ++-- packages/asset-utils/package.json | 2 +- packages/assets-registry/package.json | 2 +- packages/babel-plugin-codegen/package.json | 4 ++-- packages/community-cli-plugin/package.json | 8 ++++---- packages/debugger-frontend/package.json | 2 +- packages/debugger-shell/bin/react-native-devtools | 12 ++++++------ packages/debugger-shell/package.json | 2 +- packages/dev-middleware/package.json | 8 ++++---- packages/eslint-config-react-native/package.json | 4 ++-- packages/eslint-plugin-react-native/package.json | 2 +- packages/eslint-plugin-specs/package.json | 4 ++-- packages/gradle-plugin/package.json | 2 +- packages/jest-preset/package.json | 4 ++-- packages/metro-config/package.json | 6 +++--- packages/new-app-screen/package.json | 4 ++-- packages/normalize-color/package.json | 2 +- packages/polyfills/package.json | 2 +- packages/react-native-babel-preset/package.json | 4 ++-- .../react-native-babel-transformer/package.json | 4 ++-- packages/react-native-codegen/package.json | 2 +- .../react-native-compatibility-check/package.json | 4 ++-- .../react-native-popup-menu-android/package.json | 6 +++--- .../Libraries/Core/ReactNativeVersion.js | 2 +- packages/react-native/React/Base/RCTVersion.m | 2 +- .../react-native/ReactAndroid/gradle.properties | 2 +- .../react/modules/systeminfo/ReactNativeVersion.kt | 2 +- .../ReactCommon/cxxreact/ReactNativeVersion.h | 2 +- packages/react-native/package.json | 14 +++++++------- .../generate-artifacts-executor-test.js.snap | 8 ++++---- packages/rn-tester/package.json | 8 ++++---- packages/typescript-config/package.json | 2 +- packages/virtualized-lists/package.json | 4 ++-- private/helloworld/package.json | 12 ++++++------ .../package.json | 2 +- 35 files changed, 77 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index 8baf9f52daa1..3c48180e81cc 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,8 @@ "@jest/create-cache-key-function": "^29.7.0", "@microsoft/api-extractor": "^7.52.2", "@octokit/rest": "^22.0.0", - "@react-native/metro-babel-transformer": "0.88.0-rc.2", - "@react-native/metro-config": "0.88.0-rc.2", + "@react-native/metro-babel-transformer": "0.88.0-rc.3", + "@react-native/metro-config": "0.88.0-rc.3", "@tsconfig/node22": "22.0.2", "@types/react": "^19.1.0", "@typescript-eslint/parser": "^8.59.2", diff --git a/packages/asset-utils/package.json b/packages/asset-utils/package.json index 51e2c66ac76e..120a692be7db 100644 --- a/packages/asset-utils/package.json +++ b/packages/asset-utils/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/asset-utils", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Asset path utilities for React Native.", "license": "MIT", "repository": { diff --git a/packages/assets-registry/package.json b/packages/assets-registry/package.json index db23c45e5fbd..2aa77f613217 100644 --- a/packages/assets-registry/package.json +++ b/packages/assets-registry/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index 6347fff31d8f..78bb73437f3c 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-plugin-codegen", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ ], "dependencies": { "@babel/traverse": "^7.29.0", - "@react-native/codegen": "0.88.0-rc.2" + "@react-native/codegen": "0.88.0-rc.3" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index a4578013ff5f..dbb244934646 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/community-cli-plugin", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -31,8 +31,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.2", - "@react-native/dev-middleware": "0.88.0-rc.2", + "@react-native/asset-utils": "0.88.0-rc.3", + "@react-native/dev-middleware": "0.88.0-rc.3", "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -44,7 +44,7 @@ }, "peerDependencies": { "@react-native-community/cli": "*", - "@react-native/metro-config": "0.88.0-rc.2" + "@react-native/metro-config": "0.88.0-rc.3" }, "peerDependenciesMeta": { "@react-native-community/cli": { diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index 6b5484db8308..d68ab8408b81 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/debugger-frontend", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Debugger frontend for React Native based on Chrome DevTools", "keywords": [ "react-native", diff --git a/packages/debugger-shell/bin/react-native-devtools b/packages/debugger-shell/bin/react-native-devtools index 1351c1c13305..0dd373dfa94e 100755 --- a/packages/debugger-shell/bin/react-native-devtools +++ b/packages/debugger-shell/bin/react-native-devtools @@ -1,6 +1,6 @@ #!/usr/bin/env dotslash -// @generated SignedSource<<2ea17685ffe3ab3951a8abaa6011b60e>> +// @generated SignedSource<<1c6ca2efc5c75d6d1e01202633fc89cd>> { @@ -12,7 +12,7 @@ "digest": "020eea3cf10f77b8f4e1ae4a2aaa7d78a77c3802de6b00448866aa9c860509c4", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-linux-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-linux-aarch64.tar.gz" }, { "type": "http", @@ -28,7 +28,7 @@ "digest": "933aa98eb68da7f8d1b6e83e611e51f66d026f3b410dc13577faa6adf1b0f75c", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-linux-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-linux-x86_64.tar.gz" }, { "type": "http", @@ -44,7 +44,7 @@ "digest": "4a1c234b1cf27f1ff006fafce6628b8ef6993d7d3298c6ed2127e3055c93dcc6", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-macos-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-macos-aarch64.tar.gz" }, { "type": "http", @@ -60,7 +60,7 @@ "digest": "9f1de3cb78688befaea4d9e5f640a66833dd44ad58b05590a7e07bce279bf532", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-macos-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-macos-x86_64.tar.gz" }, { "type": "http", @@ -76,7 +76,7 @@ "digest": "5b56e22828549f12be49f0431fd74c54dcebfbfb4277e4b87573ec1ab084c288", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.2/React.Native.DevTools-windows-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-windows-x86_64.tar.gz" }, { "type": "http", diff --git a/packages/debugger-shell/package.json b/packages/debugger-shell/package.json index efad6492cfe0..5acb2f81d5b1 100644 --- a/packages/debugger-shell/package.json +++ b/packages/debugger-shell/package.json @@ -1,7 +1,7 @@ { "name": "@react-native/debugger-shell", "productName": "React Native DevTools", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Experimental debugger shell for React Native for use with @react-native/debugger-frontend", "keywords": [ "react-native", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index 6e8ec7d330a5..0adf644172dd 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/dev-middleware", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Dev server middleware for React Native", "keywords": [ "react-native", @@ -32,8 +32,8 @@ }, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.88.0-rc.2", - "@react-native/debugger-shell": "0.88.0-rc.2", + "@react-native/debugger-frontend": "0.88.0-rc.3", + "@react-native/debugger-shell": "0.88.0-rc.3", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -43,7 +43,7 @@ "ws": "^7.5.10" }, "devDependencies": { - "@react-native/debugger-shell": "0.88.0-rc.2", + "@react-native/debugger-shell": "0.88.0-rc.3", "selfsigned": "^5.5.0", "undici": "^6.23.0", "wait-for-expect": "^3.0.2" diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 78729240b42e..9d4f446fbb61 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-config", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "ESLint config for React Native", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", - "@react-native/eslint-plugin": "0.88.0-rc.2", + "@react-native/eslint-plugin": "0.88.0-rc.3", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", "eslint-config-prettier": "^8.5.0", diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index e8515e7aa623..0ecae7c1786d 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "ESLint rules for @react-native/eslint-config", "license": "MIT", "repository": { diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index 356aec4c8276..85dd8a9e2168 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin-specs", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "ESLint rules to validate NativeModule and Component Specs", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@react-native/codegen": "0.88.0-rc.2", + "@react-native/codegen": "0.88.0-rc.3", "make-dir": "^2.1.0", "pirates": "^4.0.1", "flow-parser": "0.327.0", diff --git a/packages/gradle-plugin/package.json b/packages/gradle-plugin/package.json index ce012251617e..ac047cb62396 100644 --- a/packages/gradle-plugin/package.json +++ b/packages/gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/gradle-plugin", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Gradle Plugin for React Native", "license": "MIT", "repository": { diff --git a/packages/jest-preset/package.json b/packages/jest-preset/package.json index 0c987f76a522..56ea651cb9ca 100644 --- a/packages/jest-preset/package.json +++ b/packages/jest-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/jest-preset", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Jest preset for React Native apps", "keywords": [ "jest", @@ -29,7 +29,7 @@ ], "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.88.0-rc.2", + "@react-native/js-polyfills": "0.88.0-rc.3", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index f4c863a0cc44..2cd74d12014a 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-config", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Metro configuration for React Native.", "license": "MIT", "repository": { @@ -35,8 +35,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/js-polyfills": "0.88.0-rc.2", - "@react-native/metro-babel-transformer": "0.88.0-rc.2", + "@react-native/js-polyfills": "0.88.0-rc.3", + "@react-native/metro-babel-transformer": "0.88.0-rc.3", "metro-config": "^0.87.1", "metro-runtime": "^0.87.1" } diff --git a/packages/new-app-screen/package.json b/packages/new-app-screen/package.json index 0bdb5c17c836..a4de81f40e8f 100644 --- a/packages/new-app-screen/package.json +++ b/packages/new-app-screen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/new-app-screen", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "NewAppScreen component for React Native", "keywords": [ "react-native" @@ -22,7 +22,7 @@ "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.2" + "react-native": "0.88.0-rc.3" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index 51d58935fde8..b03ff51b9103 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/normalize-colors", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Color normalization for React Native.", "license": "MIT", "repository": { diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index f0c2806eb0dc..ea38fd6166f1 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/js-polyfills", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Polyfills for React Native.", "license": "MIT", "repository": { diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 6e1a11ee3946..1c43f108d587 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-preset", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Babel preset for React Native applications", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@react-native/babel-plugin-codegen": "0.88.0-rc.2", + "@react-native/babel-plugin-codegen": "0.88.0-rc.3", "flow-parser": "0.327.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index ca7a6e84866f..6828adff8c32 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-babel-transformer", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Babel transformer for React Native applications.", "repository": { "type": "git", @@ -27,7 +27,7 @@ ], "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.88.0-rc.2", + "@react-native/babel-preset": "0.88.0-rc.3", "flow-parser": "0.327.0", "nullthrows": "^1.1.1" }, diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index e24929275bad..e0987a52ce54 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/codegen", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Code generation tools for React Native", "license": "MIT", "repository": { diff --git a/packages/react-native-compatibility-check/package.json b/packages/react-native-compatibility-check/package.json index e1b0ec773b4e..999cc33f35a6 100644 --- a/packages/react-native-compatibility-check/package.json +++ b/packages/react-native-compatibility-check/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/compatibility-check", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Check a React Native app's boundary between JS and Native for incompatibilities", "license": "MIT", "repository": { @@ -38,7 +38,7 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.2" + "@react-native/codegen": "0.88.0-rc.3" }, "devDependencies": { "flow-remove-types": "^2.237.2", diff --git a/packages/react-native-popup-menu-android/package.json b/packages/react-native-popup-menu-android/package.json index ab98d6e342db..c1d70fe8047b 100644 --- a/packages/react-native-popup-menu-android/package.json +++ b/packages/react-native-popup-menu-android/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/popup-menu-android", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "PopupMenu for the Android platform", "repository": { "type": "git", @@ -26,12 +26,12 @@ }, "license": "MIT", "devDependencies": { - "@react-native/codegen": "0.88.0-rc.2" + "@react-native/codegen": "0.88.0-rc.3" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.2" + "react-native": "0.88.0-rc.3" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/react-native/Libraries/Core/ReactNativeVersion.js b/packages/react-native/Libraries/Core/ReactNativeVersion.js index be310b502b84..d567902f220e 100644 --- a/packages/react-native/Libraries/Core/ReactNativeVersion.js +++ b/packages/react-native/Libraries/Core/ReactNativeVersion.js @@ -29,7 +29,7 @@ export default class ReactNativeVersion { static major: number = 0; static minor: number = 88; static patch: number = 0; - static prerelease: string | null = 'rc.2'; + static prerelease: string | null = 'rc.3'; static getVersionString(): string { return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`; diff --git a/packages/react-native/React/Base/RCTVersion.m b/packages/react-native/React/Base/RCTVersion.m index 2e2920d89529..58da42d4fdb7 100644 --- a/packages/react-native/React/Base/RCTVersion.m +++ b/packages/react-native/React/Base/RCTVersion.m @@ -24,7 +24,7 @@ RCTVersionMajor: @(0), RCTVersionMinor: @(88), RCTVersionPatch: @(0), - RCTVersionPrerelease: @"rc.2", + RCTVersionPrerelease: @"rc.3", }; }); return __rnVersion; diff --git a/packages/react-native/ReactAndroid/gradle.properties b/packages/react-native/ReactAndroid/gradle.properties index f765949d13ad..dd5cdd00be48 100644 --- a/packages/react-native/ReactAndroid/gradle.properties +++ b/packages/react-native/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.88.0-rc.2 +VERSION_NAME=0.88.0-rc.3 react.internal.publishingGroup=com.facebook.react react.internal.hermesPublishingGroup=com.facebook.hermes diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt index d73c7837e9fb..93b54b318463 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt @@ -15,6 +15,6 @@ public object ReactNativeVersion { "major" to 0, "minor" to 88, "patch" to 0, - "prerelease" to "rc.2" + "prerelease" to "rc.3" ) } diff --git a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h index 55a1d9503a3c..1c4fe16e13c4 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h @@ -22,7 +22,7 @@ struct ReactNativeVersionType { int32_t Major = 0; int32_t Minor = 88; int32_t Patch = 0; - std::string_view Prerelease = "rc.2"; + std::string_view Prerelease = "rc.3"; }; constexpr ReactNativeVersionType ReactNativeVersion; diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 2f8d901d6941..94aa881daf7d 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "A framework for building native apps using React", "license": "MIT", "repository": { @@ -154,12 +154,12 @@ } }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.2", - "@react-native/codegen": "0.88.0-rc.2", - "@react-native/community-cli-plugin": "0.88.0-rc.2", - "@react-native/gradle-plugin": "0.88.0-rc.2", - "@react-native/normalize-colors": "0.88.0-rc.2", - "@react-native/virtualized-lists": "0.88.0-rc.2", + "@react-native/asset-utils": "0.88.0-rc.3", + "@react-native/codegen": "0.88.0-rc.3", + "@react-native/community-cli-plugin": "0.88.0-rc.3", + "@react-native/gradle-plugin": "0.88.0-rc.3", + "@react-native/normalize-colors": "0.88.0-rc.3", + "@react-native/virtualized-lists": "0.88.0-rc.3", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "flow-parser": "0.327.0", diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index 4af5aa5dd9b6..4a0930b2dd28 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -79,7 +79,7 @@ exports[`execute test-app "ReactAppDependencyProvider/ReactAppDependencyProvider # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.2\\" +version = \\"0.88.0-rc.3\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -399,7 +399,7 @@ exports[`execute test-app "ReactCodegen/ReactCodegen.podspec" should match snaps # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.2\\" +version = \\"0.88.0-rc.3\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -590,7 +590,7 @@ exports[`execute test-app-legacy "ReactAppDependencyProvider/ReactAppDependencyP # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.2\\" +version = \\"0.88.0-rc.3\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -882,7 +882,7 @@ exports[`execute test-app-legacy "ReactCodegen/ReactCodegen.podspec" should matc # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.2\\" +version = \\"0.88.0-rc.3\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index 60bfdb72f52c..c29aab13b7ab 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/tester", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "private": true, "description": "React Native tester app.", "license": "MIT", @@ -26,8 +26,8 @@ "e2e-test-ios": "./scripts/maestro-test-ios.sh" }, "dependencies": { - "@react-native/new-app-screen": "0.88.0-rc.2", - "@react-native/popup-menu-android": "0.88.0-rc.2", + "@react-native/new-app-screen": "0.88.0-rc.3", + "@react-native/popup-menu-android": "0.88.0-rc.3", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", @@ -36,7 +36,7 @@ }, "peerDependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.2" + "react-native": "0.88.0-rc.3" }, "codegenConfig": { "name": "AppSpecs", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index be10703f45b5..0dd6b22ba227 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/typescript-config", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Default TypeScript configuration for React Native apps", "license": "MIT", "repository": { diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index 3f868eb3dbf7..13c7eda5662b 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/virtualized-lists", - "version": "0.88.0-rc.2", + "version": "0.88.0-rc.3", "description": "Virtualized lists for React Native.", "license": "MIT", "repository": { @@ -53,7 +53,7 @@ "peerDependencies": { "@types/react": "^19.2.0", "react": "*", - "react-native": "0.88.0-rc.2" + "react-native": "0.88.0-rc.3" }, "peerDependenciesMeta": { "@types/react": { diff --git a/private/helloworld/package.json b/private/helloworld/package.json index 55bd3f1f2054..cc4af834923f 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -13,18 +13,18 @@ }, "dependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.2" + "react-native": "0.88.0-rc.3" }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", - "@react-native/babel-preset": "0.88.0-rc.2", + "@react-native/babel-preset": "0.88.0-rc.3", "@react-native/core-cli-utils": "*", - "@react-native/eslint-config": "0.88.0-rc.2", - "@react-native/jest-preset": "0.88.0-rc.2", - "@react-native/metro-config": "0.88.0-rc.2", - "@react-native/typescript-config": "0.88.0-rc.2", + "@react-native/eslint-config": "0.88.0-rc.3", + "@react-native/jest-preset": "0.88.0-rc.3", + "@react-native/metro-config": "0.88.0-rc.3", + "@react-native/typescript-config": "0.88.0-rc.3", "@types/jest": "^29.5.14", "commander": "^12.0.0", "eslint": "^8.19.0", diff --git a/private/react-native-codegen-typescript-test/package.json b/private/react-native-codegen-typescript-test/package.json index a89a84f00acd..88e7b50e3632 100644 --- a/private/react-native-codegen-typescript-test/package.json +++ b/private/react-native-codegen-typescript-test/package.json @@ -13,7 +13,7 @@ "prepare": "yarn run build" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.2" + "@react-native/codegen": "0.88.0-rc.3" }, "devDependencies": { "@babel/core": "^7.25.2", From 600715184a0c80579c14c666d593f595f0a33ae1 Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Mon, 28 Sep 2026 11:28:04 +0000 Subject: [PATCH 31/35] [LOCAL] Bump Podfile.lock --- packages/rn-tester/Podfile.lock | 686 ++++++++++++++++---------------- 1 file changed, 343 insertions(+), 343 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index 7e7838bb6e8e..5cbc5af1f68b 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -2,13 +2,13 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - fast_float (8.0.0) - - FBLazyVector (0.88.0-rc.2) + - FBLazyVector (0.88.0-rc.3) - fmt (12.1.0) - glog (0.3.5) - - hermes-engine (260318099.0.3): - - hermes-engine/Pre-built (= 260318099.0.3) - - hermes-engine/Pre-built (260318099.0.3) - - MyNativeView (0.88.0-rc.2): + - hermes-engine (260318099.0.4): + - hermes-engine/Pre-built (= 260318099.0.4) + - hermes-engine/Pre-built (260318099.0.4) + - MyNativeView (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -37,7 +37,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - NativeCxxModuleExample (0.88.0-rc.2): + - NativeCxxModuleExample (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -86,29 +86,29 @@ PODS: - fast_float (= 8.0.0) - fmt (= 12.1.0) - glog - - RCTDeprecation (0.88.0-rc.2) - - RCTRequired (0.88.0-rc.2) - - RCTSwiftUI (0.88.0-rc.2) - - RCTSwiftUIWrapper (0.88.0-rc.2): + - RCTDeprecation (0.88.0-rc.3) + - RCTRequired (0.88.0-rc.3) + - RCTSwiftUI (0.88.0-rc.3) + - RCTSwiftUIWrapper (0.88.0-rc.3): - RCTSwiftUI - - RCTTypeSafety (0.88.0-rc.2): - - FBLazyVector (= 0.88.0-rc.2) - - RCTRequired (= 0.88.0-rc.2) - - React-Core (= 0.88.0-rc.2) - - React (0.88.0-rc.2): - - React-Core (= 0.88.0-rc.2) - - React-Core/DevSupport (= 0.88.0-rc.2) - - React-Core/RCTWebSocket (= 0.88.0-rc.2) - - React-RCTActionSheet (= 0.88.0-rc.2) - - React-RCTAnimation (= 0.88.0-rc.2) - - React-RCTBlob (= 0.88.0-rc.2) - - React-RCTImage (= 0.88.0-rc.2) - - React-RCTLinking (= 0.88.0-rc.2) - - React-RCTNetwork (= 0.88.0-rc.2) - - React-RCTSettings (= 0.88.0-rc.2) - - React-RCTText (= 0.88.0-rc.2) - - React-RCTVibration (= 0.88.0-rc.2) - - React-bridging (0.88.0-rc.2): + - RCTTypeSafety (0.88.0-rc.3): + - FBLazyVector (= 0.88.0-rc.3) + - RCTRequired (= 0.88.0-rc.3) + - React-Core (= 0.88.0-rc.3) + - React (0.88.0-rc.3): + - React-Core (= 0.88.0-rc.3) + - React-Core/DevSupport (= 0.88.0-rc.3) + - React-Core/RCTWebSocket (= 0.88.0-rc.3) + - React-RCTActionSheet (= 0.88.0-rc.3) + - React-RCTAnimation (= 0.88.0-rc.3) + - React-RCTBlob (= 0.88.0-rc.3) + - React-RCTImage (= 0.88.0-rc.3) + - React-RCTLinking (= 0.88.0-rc.3) + - React-RCTNetwork (= 0.88.0-rc.3) + - React-RCTSettings (= 0.88.0-rc.3) + - React-RCTText (= 0.88.0-rc.3) + - React-RCTVibration (= 0.88.0-rc.3) + - React-bridging (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -120,12 +120,12 @@ PODS: - React-jsi - React-timing - SocketRocket - - React-callinvoker (0.88.0-rc.2): - - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.2) + - React-callinvoker (0.88.0-rc.3): + - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.3) - React-cxxstableapi - - React-callinvoker/callinvokerUmbrella (0.88.0-rc.2): + - React-callinvoker/callinvokerUmbrella (0.88.0-rc.3): - React-cxxstableapi - - React-Core (0.88.0-rc.2): + - React-Core (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -135,7 +135,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.2) + - React-Core/Default (= 0.88.0-rc.3) - React-cxxreact - React-featureflags - React-hermes @@ -150,7 +150,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.88.0-rc.2): + - React-Core/CoreModulesHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -175,7 +175,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (0.88.0-rc.2): + - React-Core/Default (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -199,7 +199,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (0.88.0-rc.2): + - React-Core/DevSupport (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -209,8 +209,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.2) - - React-Core/RCTWebSocket (= 0.88.0-rc.2) + - React-Core/Default (= 0.88.0-rc.3) + - React-Core/RCTWebSocket (= 0.88.0-rc.3) - React-cxxreact - React-featureflags - React-hermes @@ -225,7 +225,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.88.0-rc.2): + - React-Core/RCTActionSheetHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -250,7 +250,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.88.0-rc.2): + - React-Core/RCTAnimationHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -275,7 +275,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.88.0-rc.2): + - React-Core/RCTBlobHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -300,7 +300,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.88.0-rc.2): + - React-Core/RCTImageHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -325,7 +325,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.88.0-rc.2): + - React-Core/RCTLinkingHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -350,7 +350,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.88.0-rc.2): + - React-Core/RCTNetworkHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -375,7 +375,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTPushNotificationHeaders (0.88.0-rc.2): + - React-Core/RCTPushNotificationHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -400,7 +400,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.88.0-rc.2): + - React-Core/RCTSettingsHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -425,7 +425,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.88.0-rc.2): + - React-Core/RCTTextHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -450,7 +450,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.88.0-rc.2): + - React-Core/RCTVibrationHeaders (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -475,7 +475,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.88.0-rc.2): + - React-Core/RCTWebSocket (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -485,7 +485,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.2) + - React-Core/Default (= 0.88.0-rc.3) - React-cxxreact - React-featureflags - React-hermes @@ -500,7 +500,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (0.88.0-rc.2): + - React-CoreModules (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -508,11 +508,11 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 0.88.0-rc.2) - - React-Core/CoreModulesHeaders (= 0.88.0-rc.2) + - RCTTypeSafety (= 0.88.0-rc.3) + - React-Core/CoreModulesHeaders (= 0.88.0-rc.3) - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.3) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing @@ -520,12 +520,12 @@ PODS: - React-networking - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.88.0-rc.2) + - React-RCTImage (= 0.88.0-rc.3) - React-runtimeexecutor - React-utils - ReactCommon - SocketRocket - - React-cxxreact (0.88.0-rc.2): + - React-cxxreact (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -534,29 +534,29 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.2) - - React-debug (= 0.88.0-rc.2) - - React-jserrorhandler (= 0.88.0-rc.2) - - React-jsi (= 0.88.0-rc.2) + - React-callinvoker (= 0.88.0-rc.3) + - React-debug (= 0.88.0-rc.3) + - React-jserrorhandler (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.3) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.88.0-rc.2) - - React-perflogger (= 0.88.0-rc.2) + - React-logger (= 0.88.0-rc.3) + - React-perflogger (= 0.88.0-rc.3) - React-runtimeexecutor - - React-timing (= 0.88.0-rc.2) + - React-timing (= 0.88.0-rc.3) - React-utils - SocketRocket - - React-cxxstableapi (0.88.0-rc.2) - - React-debug (0.88.0-rc.2): + - React-cxxstableapi (0.88.0-rc.3) + - React-debug (0.88.0-rc.3): - React-cxxstableapi - - React-debug/debugUmbrella (= 0.88.0-rc.2) - - React-debug/redbox (= 0.88.0-rc.2) - - React-debug/debugUmbrella (0.88.0-rc.2): + - React-debug/debugUmbrella (= 0.88.0-rc.3) + - React-debug/redbox (= 0.88.0-rc.3) + - React-debug/debugUmbrella (0.88.0-rc.3): - React-cxxstableapi - - React-debug/redbox (0.88.0-rc.2): + - React-debug/redbox (0.88.0-rc.3): - React-cxxstableapi - - React-defaultsnativemodule (0.88.0-rc.2): + - React-defaultsnativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -582,7 +582,7 @@ PODS: - React-webperformancenativemodule - SocketRocket - Yoga - - React-domnativemodule (0.88.0-rc.2): + - React-domnativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -604,7 +604,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (0.88.0-rc.2): + - React-Fabric (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -620,25 +620,25 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/animated (= 0.88.0-rc.2) - - React-Fabric/animationbackend (= 0.88.0-rc.2) - - React-Fabric/animations (= 0.88.0-rc.2) - - React-Fabric/attributedstring (= 0.88.0-rc.2) - - React-Fabric/bridging (= 0.88.0-rc.2) - - React-Fabric/componentregistry (= 0.88.0-rc.2) - - React-Fabric/componentregistrynative (= 0.88.0-rc.2) - - React-Fabric/components (= 0.88.0-rc.2) - - React-Fabric/consistency (= 0.88.0-rc.2) - - React-Fabric/core (= 0.88.0-rc.2) - - React-Fabric/dom (= 0.88.0-rc.2) - - React-Fabric/imagemanager (= 0.88.0-rc.2) - - React-Fabric/leakchecker (= 0.88.0-rc.2) - - React-Fabric/mounting (= 0.88.0-rc.2) - - React-Fabric/observers (= 0.88.0-rc.2) - - React-Fabric/scheduler (= 0.88.0-rc.2) - - React-Fabric/telemetry (= 0.88.0-rc.2) - - React-Fabric/uimanager (= 0.88.0-rc.2) - - React-Fabric/viewtransition (= 0.88.0-rc.2) + - React-Fabric/animated (= 0.88.0-rc.3) + - React-Fabric/animationbackend (= 0.88.0-rc.3) + - React-Fabric/animations (= 0.88.0-rc.3) + - React-Fabric/attributedstring (= 0.88.0-rc.3) + - React-Fabric/bridging (= 0.88.0-rc.3) + - React-Fabric/componentregistry (= 0.88.0-rc.3) + - React-Fabric/componentregistrynative (= 0.88.0-rc.3) + - React-Fabric/components (= 0.88.0-rc.3) + - React-Fabric/consistency (= 0.88.0-rc.3) + - React-Fabric/core (= 0.88.0-rc.3) + - React-Fabric/dom (= 0.88.0-rc.3) + - React-Fabric/imagemanager (= 0.88.0-rc.3) + - React-Fabric/leakchecker (= 0.88.0-rc.3) + - React-Fabric/mounting (= 0.88.0-rc.3) + - React-Fabric/observers (= 0.88.0-rc.3) + - React-Fabric/scheduler (= 0.88.0-rc.3) + - React-Fabric/telemetry (= 0.88.0-rc.3) + - React-Fabric/uimanager (= 0.88.0-rc.3) + - React-Fabric/viewtransition (= 0.88.0-rc.3) - React-featureflags - React-graphics - React-jsi @@ -650,7 +650,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animated (0.88.0-rc.2): + - React-Fabric/animated (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -678,7 +678,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animationbackend (0.88.0-rc.2): + - React-Fabric/animationbackend (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -705,7 +705,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (0.88.0-rc.2): + - React-Fabric/animations (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -732,7 +732,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (0.88.0-rc.2): + - React-Fabric/attributedstring (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -759,7 +759,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/bridging (0.88.0-rc.2): + - React-Fabric/bridging (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -786,7 +786,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (0.88.0-rc.2): + - React-Fabric/componentregistry (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -813,7 +813,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (0.88.0-rc.2): + - React-Fabric/componentregistrynative (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -840,7 +840,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (0.88.0-rc.2): + - React-Fabric/components (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -856,11 +856,11 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.2) - - React-Fabric/components/root (= 0.88.0-rc.2) - - React-Fabric/components/scrollview (= 0.88.0-rc.2) - - React-Fabric/components/view (= 0.88.0-rc.2) - - React-Fabric/components/viewUmbrella (= 0.88.0-rc.2) + - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.3) + - React-Fabric/components/root (= 0.88.0-rc.3) + - React-Fabric/components/scrollview (= 0.88.0-rc.3) + - React-Fabric/components/view (= 0.88.0-rc.3) + - React-Fabric/components/viewUmbrella (= 0.88.0-rc.3) - React-featureflags - React-graphics - React-jsi @@ -872,7 +872,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.2): + - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -899,7 +899,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (0.88.0-rc.2): + - React-Fabric/components/root (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -926,7 +926,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (0.88.0-rc.2): + - React-Fabric/components/scrollview (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -953,7 +953,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (0.88.0-rc.2): + - React-Fabric/components/view (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -982,7 +982,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/components/viewUmbrella (0.88.0-rc.2): + - React-Fabric/components/viewUmbrella (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1009,7 +1009,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/consistency (0.88.0-rc.2): + - React-Fabric/consistency (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1036,7 +1036,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (0.88.0-rc.2): + - React-Fabric/core (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1063,7 +1063,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (0.88.0-rc.2): + - React-Fabric/dom (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1090,7 +1090,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (0.88.0-rc.2): + - React-Fabric/imagemanager (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1117,7 +1117,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (0.88.0-rc.2): + - React-Fabric/leakchecker (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1144,7 +1144,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (0.88.0-rc.2): + - React-Fabric/mounting (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1172,7 +1172,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (0.88.0-rc.2): + - React-Fabric/observers (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1188,10 +1188,10 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/observers/events (= 0.88.0-rc.2) - - React-Fabric/observers/intersection (= 0.88.0-rc.2) - - React-Fabric/observers/mutation (= 0.88.0-rc.2) - - React-Fabric/observers/resize (= 0.88.0-rc.2) + - React-Fabric/observers/events (= 0.88.0-rc.3) + - React-Fabric/observers/intersection (= 0.88.0-rc.3) + - React-Fabric/observers/mutation (= 0.88.0-rc.3) + - React-Fabric/observers/resize (= 0.88.0-rc.3) - React-featureflags - React-graphics - React-jsi @@ -1203,7 +1203,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (0.88.0-rc.2): + - React-Fabric/observers/events (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1230,7 +1230,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/intersection (0.88.0-rc.2): + - React-Fabric/observers/intersection (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1257,7 +1257,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/mutation (0.88.0-rc.2): + - React-Fabric/observers/mutation (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1284,7 +1284,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/resize (0.88.0-rc.2): + - React-Fabric/observers/resize (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1311,7 +1311,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (0.88.0-rc.2): + - React-Fabric/scheduler (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1343,7 +1343,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (0.88.0-rc.2): + - React-Fabric/telemetry (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1370,7 +1370,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (0.88.0-rc.2): + - React-Fabric/uimanager (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1386,7 +1386,7 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/uimanager/consistency (= 0.88.0-rc.2) + - React-Fabric/uimanager/consistency (= 0.88.0-rc.3) - React-featureflags - React-graphics - React-jsi @@ -1399,7 +1399,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (0.88.0-rc.2): + - React-Fabric/uimanager/consistency (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1427,7 +1427,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/viewtransition (0.88.0-rc.2): + - React-Fabric/viewtransition (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1454,7 +1454,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (0.88.0-rc.2): + - React-FabricComponents (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1470,8 +1470,8 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components (= 0.88.0-rc.2) - - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.2) + - React-FabricComponents/components (= 0.88.0-rc.3) + - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.3) - React-featureflags - React-graphics - React-jsi @@ -1484,7 +1484,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (0.88.0-rc.2): + - React-FabricComponents/components (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1500,16 +1500,16 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.2) - - React-FabricComponents/components/iostextinput (= 0.88.0-rc.2) - - React-FabricComponents/components/modal (= 0.88.0-rc.2) - - React-FabricComponents/components/rncore (= 0.88.0-rc.2) - - React-FabricComponents/components/safeareaview (= 0.88.0-rc.2) - - React-FabricComponents/components/switch (= 0.88.0-rc.2) - - React-FabricComponents/components/text (= 0.88.0-rc.2) - - React-FabricComponents/components/textinput (= 0.88.0-rc.2) - - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.2) - - React-FabricComponents/components/virtualview (= 0.88.0-rc.2) + - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.3) + - React-FabricComponents/components/iostextinput (= 0.88.0-rc.3) + - React-FabricComponents/components/modal (= 0.88.0-rc.3) + - React-FabricComponents/components/rncore (= 0.88.0-rc.3) + - React-FabricComponents/components/safeareaview (= 0.88.0-rc.3) + - React-FabricComponents/components/switch (= 0.88.0-rc.3) + - React-FabricComponents/components/text (= 0.88.0-rc.3) + - React-FabricComponents/components/textinput (= 0.88.0-rc.3) + - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.3) + - React-FabricComponents/components/virtualview (= 0.88.0-rc.3) - React-featureflags - React-graphics - React-jsi @@ -1522,7 +1522,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.88.0-rc.2): + - React-FabricComponents/components/inputaccessory (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1550,7 +1550,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.88.0-rc.2): + - React-FabricComponents/components/iostextinput (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1578,7 +1578,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.88.0-rc.2): + - React-FabricComponents/components/modal (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1606,7 +1606,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.88.0-rc.2): + - React-FabricComponents/components/rncore (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1634,7 +1634,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.88.0-rc.2): + - React-FabricComponents/components/safeareaview (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1662,7 +1662,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/switch (0.88.0-rc.2): + - React-FabricComponents/components/switch (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1690,7 +1690,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (0.88.0-rc.2): + - React-FabricComponents/components/text (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1718,7 +1718,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.88.0-rc.2): + - React-FabricComponents/components/textinput (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1746,7 +1746,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.88.0-rc.2): + - React-FabricComponents/components/unimplementedview (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1774,7 +1774,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (0.88.0-rc.2): + - React-FabricComponents/components/virtualview (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1802,7 +1802,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.88.0-rc.2): + - React-FabricComponents/textlayoutmanager (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1830,7 +1830,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (0.88.0-rc.2): + - React-FabricImage (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1839,22 +1839,22 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 0.88.0-rc.2) - - RCTTypeSafety (= 0.88.0-rc.2) + - RCTRequired (= 0.88.0-rc.3) + - RCTTypeSafety (= 0.88.0-rc.3) - React-cxxstableapi - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.88.0-rc.2) + - React-jsiexecutor (= 0.88.0-rc.3) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (0.88.0-rc.2): + - React-featureflags (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1863,9 +1863,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxstableapi - - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.2) + - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.3) - SocketRocket - - React-featureflags/featureflagsUmbrella (0.88.0-rc.2): + - React-featureflags/featureflagsUmbrella (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1875,7 +1875,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-featureflagsnativemodule (0.88.0-rc.2): + - React-featureflagsnativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1891,7 +1891,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (0.88.0-rc.2): + - React-graphics (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1906,7 +1906,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-hermes (0.88.0-rc.2): + - React-hermes (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1915,19 +1915,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.2) + - React-cxxreact (= 0.88.0-rc.3) - React-cxxstableapi - React-jsi - - React-jsiexecutor (= 0.88.0-rc.2) + - React-jsiexecutor (= 0.88.0-rc.3) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 0.88.0-rc.2) + - React-perflogger (= 0.88.0-rc.3) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (0.88.0-rc.2): + - React-idlecallbacksnativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1945,7 +1945,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (0.88.0-rc.2): + - React-ImageManager (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1961,7 +1961,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-intersectionobservernativemodule (0.88.0-rc.2): + - React-intersectionobservernativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1984,7 +1984,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-jserrorhandler (0.88.0-rc.2): + - React-jserrorhandler (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -1999,7 +1999,7 @@ PODS: - React-featureflags - React-jsi - SocketRocket - - React-jsi (0.88.0-rc.2): + - React-jsi (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2009,7 +2009,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (0.88.0-rc.2): + - React-jsiexecutor (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2031,7 +2031,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspector (0.88.0-rc.2): + - React-jsinspector (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2046,11 +2046,11 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.88.0-rc.2) + - React-perflogger (= 0.88.0-rc.3) - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspectorcdp (0.88.0-rc.2): + - React-jsinspectorcdp (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2060,7 +2060,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-jsinspectornetwork (0.88.0-rc.2): + - React-jsinspectornetwork (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2071,7 +2071,7 @@ PODS: - React-cxxstableapi - React-jsinspectorcdp - SocketRocket - - React-jsinspectortracing (0.88.0-rc.2): + - React-jsinspectortracing (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2087,7 +2087,7 @@ PODS: - React-timing - React-utils - SocketRocket - - React-jsitooling (0.88.0-rc.2): + - React-jsitooling (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2096,19 +2096,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.2) + - React-cxxreact (= 0.88.0-rc.3) - React-cxxstableapi - React-debug - - React-jsi (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.3) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - SocketRocket - - React-jsitracing (0.88.0-rc.2): + - React-jsitracing (0.88.0-rc.3): - React-jsi - - React-logger (0.88.0-rc.2): + - React-logger (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2117,7 +2117,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (0.88.0-rc.2): + - React-Mapbuffer (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2127,9 +2127,9 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - React-debug - - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.2) + - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.3) - SocketRocket - - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.2): + - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2140,7 +2140,7 @@ PODS: - React-cxxstableapi - React-debug - SocketRocket - - React-microtasksnativemodule (0.88.0-rc.2): + - React-microtasksnativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2155,7 +2155,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-mutationobservernativemodule (0.88.0-rc.2): + - React-mutationobservernativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2178,7 +2178,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-NativeModulesApple (0.88.0-rc.2): + - React-NativeModulesApple (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2199,7 +2199,7 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - React-networking (0.88.0-rc.2): + - React-networking (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2213,9 +2213,9 @@ PODS: - React-performancetimeline - React-timing - SocketRocket - - React-oscompat (0.88.0-rc.2): + - React-oscompat (0.88.0-rc.3): - React-cxxstableapi - - React-perflogger (0.88.0-rc.2): + - React-perflogger (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2224,7 +2224,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancecdpmetrics (0.88.0-rc.2): + - React-performancecdpmetrics (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2239,7 +2239,7 @@ PODS: - React-runtimeexecutor - React-timing - SocketRocket - - React-performancetimeline (0.88.0-rc.2): + - React-performancetimeline (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2254,9 +2254,9 @@ PODS: - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (0.88.0-rc.2): - - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.2) - - React-RCTAnimatedModuleProvider (0.88.0-rc.2): + - React-RCTActionSheet (0.88.0-rc.3): + - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.3) + - React-RCTAnimatedModuleProvider (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2271,7 +2271,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTAnimation (0.88.0-rc.2): + - React-RCTAnimation (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2288,7 +2288,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (0.88.0-rc.2): + - React-RCTAppDelegate (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2324,7 +2324,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (0.88.0-rc.2): + - React-RCTBlob (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2343,7 +2343,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (0.88.0-rc.2): + - React-RCTFabric (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2381,7 +2381,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.88.0-rc.2): + - React-RCTFBReactNativeSpec (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2396,10 +2396,10 @@ PODS: - React-Core - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.2) + - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.3) - ReactCommon - SocketRocket - - React-RCTFBReactNativeSpec/components (0.88.0-rc.2): + - React-RCTFBReactNativeSpec/components (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2424,7 +2424,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTImage (0.88.0-rc.2): + - React-RCTImage (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2440,14 +2440,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (0.88.0-rc.2): - - React-Core/RCTLinkingHeaders (= 0.88.0-rc.2) - - React-jsi (= 0.88.0-rc.2) + - React-RCTLinking (0.88.0-rc.3): + - React-Core/RCTLinkingHeaders (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.3) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.88.0-rc.2) - - React-RCTNetwork (0.88.0-rc.2): + - ReactCommon/turbomodule/core (= 0.88.0-rc.3) + - React-RCTNetwork (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2467,14 +2467,14 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTPushNotification (0.88.0-rc.2): + - React-RCTPushNotification (0.88.0-rc.3): - RCTTypeSafety - React-Core/RCTPushNotificationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (0.88.0-rc.2): + - React-RCTRuntime (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2496,7 +2496,7 @@ PODS: - React-RuntimeHermes - React-utils - SocketRocket - - React-RCTSettings (0.88.0-rc.2): + - React-RCTSettings (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2511,7 +2511,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTTest (0.88.0-rc.2): + - React-RCTTest (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2519,15 +2519,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-Core (= 0.88.0-rc.2) - - React-CoreModules (= 0.88.0-rc.2) - - React-jsi (= 0.88.0-rc.2) - - ReactCommon/turbomodule/core (= 0.88.0-rc.2) + - React-Core (= 0.88.0-rc.3) + - React-CoreModules (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.3) + - ReactCommon/turbomodule/core (= 0.88.0-rc.3) - SocketRocket - - React-RCTText (0.88.0-rc.2): - - React-Core/RCTTextHeaders (= 0.88.0-rc.2) + - React-RCTText (0.88.0-rc.3): + - React-Core/RCTTextHeaders (= 0.88.0-rc.3) - Yoga - - React-RCTVibration (0.88.0-rc.2): + - React-RCTVibration (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2541,11 +2541,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (0.88.0-rc.2) - - React-renderercss (0.88.0-rc.2): + - React-rendererconsistency (0.88.0-rc.3) + - React-renderercss (0.88.0-rc.3): - React-debug - React-utils - - React-rendererdebug (0.88.0-rc.2): + - React-rendererdebug (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2555,7 +2555,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-resizeobservernativemodule (0.88.0-rc.2): + - React-resizeobservernativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2579,7 +2579,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-RuntimeApple (0.88.0-rc.2): + - React-RuntimeApple (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2609,7 +2609,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (0.88.0-rc.2): + - React-RuntimeCore (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2632,7 +2632,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (0.88.0-rc.2): + - React-runtimeexecutor (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2642,10 +2642,10 @@ PODS: - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.3) - React-utils - SocketRocket - - React-RuntimeHermes (0.88.0-rc.2): + - React-RuntimeHermes (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2667,7 +2667,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-runtimescheduler (0.88.0-rc.2): + - React-runtimescheduler (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2691,14 +2691,14 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (0.88.0-rc.2): + - React-timing (0.88.0-rc.3): - React-cxxstableapi - React-debug - - React-timing/timingUmbrella (= 0.88.0-rc.2) - - React-timing/timingUmbrella (0.88.0-rc.2): + - React-timing/timingUmbrella (= 0.88.0-rc.3) + - React-timing/timingUmbrella (0.88.0-rc.3): - React-cxxstableapi - React-debug - - React-utils (0.88.0-rc.2): + - React-utils (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2708,9 +2708,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-debug - - React-jsi (= 0.88.0-rc.2) + - React-jsi (= 0.88.0-rc.3) - SocketRocket - - React-viewtransitionnativemodule (0.88.0-rc.2): + - React-viewtransitionnativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2728,7 +2728,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-webperformancenativemodule (0.88.0-rc.2): + - React-webperformancenativemodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2747,9 +2747,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - ReactAppDependencyProvider (0.88.0-rc.2): + - ReactAppDependencyProvider (0.88.0-rc.3): - ReactCodegen - - ReactCodegen (0.88.0-rc.2): + - ReactCodegen (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2775,7 +2775,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (0.88.0-rc.2): + - ReactCommon (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2783,9 +2783,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 0.88.0-rc.2) + - ReactCommon/turbomodule (= 0.88.0-rc.3) - SocketRocket - - ReactCommon-Samples (0.88.0-rc.2): + - ReactCommon-Samples (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2802,7 +2802,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - ReactCommon/turbomodule (0.88.0-rc.2): + - ReactCommon/turbomodule (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2811,13 +2811,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.2) - - React-jsi (= 0.88.0-rc.2) - - React-logger (= 0.88.0-rc.2) - - React-perflogger (= 0.88.0-rc.2) - - ReactCommon/turbomodule/core (= 0.88.0-rc.2) + - React-callinvoker (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.3) + - React-logger (= 0.88.0-rc.3) + - React-perflogger (= 0.88.0-rc.3) + - ReactCommon/turbomodule/core (= 0.88.0-rc.3) - SocketRocket - - ReactCommon/turbomodule/core (0.88.0-rc.2): + - ReactCommon/turbomodule/core (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -2827,16 +2827,16 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging - - React-callinvoker (= 0.88.0-rc.2) - - React-cxxreact (= 0.88.0-rc.2) - - React-debug (= 0.88.0-rc.2) - - React-featureflags (= 0.88.0-rc.2) - - React-jsi (= 0.88.0-rc.2) - - React-logger (= 0.88.0-rc.2) - - React-perflogger (= 0.88.0-rc.2) - - React-utils (= 0.88.0-rc.2) + - React-callinvoker (= 0.88.0-rc.3) + - React-cxxreact (= 0.88.0-rc.3) + - React-debug (= 0.88.0-rc.3) + - React-featureflags (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.3) + - React-logger (= 0.88.0-rc.3) + - React-perflogger (= 0.88.0-rc.3) + - React-utils (= 0.88.0-rc.3) - SocketRocket - - ScreenshotManager (0.88.0-rc.2): + - ScreenshotManager (0.88.0-rc.3): - boost - DoubleConversion - fast_float @@ -3152,94 +3152,94 @@ SPEC CHECKSUMS: boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: 5e686700a3c42cd33b2841a767b321b694beb358 + FBLazyVector: ea9b230e7e868bf13b5cea5b4b19274fb747e7cc fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 - hermes-engine: 7e5f90072b91f62ead9584eebdced74fa9c742a0 - MyNativeView: 7f52d3ec25566dfed88ee953efc23580392fb885 - NativeCxxModuleExample: 001c7081a43be791f0382af2367a8fc673feeb41 + hermes-engine: 6a00d96909f1648698fe5419972fe3c9e628755e + MyNativeView: e01161f4b1a1635aec0f759ef6811fadf50b3155 + NativeCxxModuleExample: edb24a6862fddee49c950a27cb3ad41b706c935c OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b - RCTDeprecation: 2cb4fec4847c7147462962f0192db93fbb88d74b - RCTRequired: dc7424892f40625e26f814edc234a51b08de1e8d - RCTSwiftUI: de83f2b7a2cac2a76f98ba8483c3d7c8dfa35745 - RCTSwiftUIWrapper: 981ad1c4acfeac509df6d110ebed593f634f80b3 - RCTTypeSafety: 7cc5b531a79dcab2539a6b59547238e149875e2e - React: ac5e0f5bac8accc28d8a64013a794d1d2ac1db05 - React-bridging: bbc2a8437c6e962e4194a8a448c4dbe5bcb626f6 - React-callinvoker: ad10fe10b5e51d74597a2f7675bfdaf17d1b08b1 - React-Core: 8c0f44e37eb0a14c17ecc40e0b11d93452cea373 - React-CoreModules: bea35318de31e6cf3f43807065114d2e6afe0e28 - React-cxxreact: fbb56faec87045b7f0eda9efc521589fb9c1133c - React-cxxstableapi: bcc05c7039ca25abcb8cfb0ab4192fb76295953c - React-debug: 4882615b63ac103faabc35f42886ca9cfe0fe32a - React-defaultsnativemodule: db32a13b50a090025986137cd891c581d06d72eb - React-domnativemodule: 124609264d859a9547efd7d40e24850722b4300a - React-Fabric: c888b1de52d71d5d02bf496ba7a078456e829faa - React-FabricComponents: fc34c7633a01f3e97aa28208cf9b841b2bcafa3e - React-FabricImage: e24f1de1a028cb657a2be414cc43f3ed4ebd197a - React-featureflags: 11f26f2ac085b680a3190684e854129a57d16022 - React-featureflagsnativemodule: 3c22092d4c01d57ea5c06ad7675d96af03834787 - React-graphics: 0adcbc8c9ef8cdcf6dafdcbc9f5cf13edcab900f - React-hermes: 9126177557ba811ec1b7cbf58b8d939eb3690920 - React-idlecallbacksnativemodule: 02f715b2092fb2e231fbf10be82bf5b9b93c4669 - React-ImageManager: bc6406bb3b92332d431ba34d8563175345104feb - React-intersectionobservernativemodule: 1aae42f5e89df546f9996d1e29a319cf8d968b06 - React-jserrorhandler: dcc2c379fe0c045c28fdf8335489fc417d005467 - React-jsi: a3a845682f7c6729ad5a174e9c263ce65564ca58 - React-jsiexecutor: fca5ff2e5f40fb3ee6e85d287943169e066b97fb - React-jsinspector: ddaa096984595290f2d939b79a5cc9feeeefb729 - React-jsinspectorcdp: 362519e391460feb3c63921f956f24ad99beaa56 - React-jsinspectornetwork: e67b2124f9ca6bda3e7dbb72b6f5bc4c263dfd11 - React-jsinspectortracing: 751988eb402cb4739f54960729ab0e3bfa3ca962 - React-jsitooling: 9a098887c0748fac150393243584995b65ea491a - React-jsitracing: d617ab03571050de287b15d39272f3c8d5193d29 - React-logger: 14d59d49bdfff7a487de00385a13d94edf2cb319 - React-Mapbuffer: fc9b6135e1b1c2add7e9fed9dba7755cb53dcb20 - React-microtasksnativemodule: 1c74713617ef9d6513ebfd965ded18af7cd3b399 - React-mutationobservernativemodule: 2bfd3ed4b5a52be5839ad44b5031db0b7e80c541 - React-NativeModulesApple: be21a8cd462695a45e0c8182d0542293d4b1f013 - React-networking: a71f2db5e67c09632a221c0e15c8df296a05e003 - React-oscompat: 51f06d78dfa0d64cbdbbe3b779c0dc98fbf30425 - React-perflogger: f6fb8c5365ba29e656c9f5ad6c0c520777d0050c - React-performancecdpmetrics: 902e6906d1746e0bc15b86832c2c5524b3294bc4 - React-performancetimeline: d5811c33c36bba0cb916bc9a3ae118838b8b9115 - React-RCTActionSheet: 389bd2a644f10f97168aaae96afa6a3e1f0fbe68 - React-RCTAnimatedModuleProvider: c0c0ac31b3c36c1afe040ef3832669a2c504f3c8 - React-RCTAnimation: a71f49ccee1d8f139cd762e43a63ff1f13edbed2 - React-RCTAppDelegate: d42ff8a506a01d564c6dbf5632717af4b4542f75 - React-RCTBlob: e0537c265ad9d1bf292997fdb197dd1473be61e6 - React-RCTFabric: e9b2c9861d7a3917f43c61bb630ebb9ed32d45ee - React-RCTFBReactNativeSpec: 297138668383fe53f447d1cd9165f87d4029975d - React-RCTImage: b748123e2c3618f5472fd4e241273e6c873692ac - React-RCTLinking: 815f0bb859759ff2378dffd929329e941fa18b86 - React-RCTNetwork: 4e161d34daf948c5393fda10ef1e84c6eb9ba79c - React-RCTPushNotification: ae62cf6c97938211f93e2d0af0fc8757f7c89b0f - React-RCTRuntime: 41769528df86929cc8cd47e7538d6147daec69fb - React-RCTSettings: d15d09bf69fb555c5d55bc0996618406a9d4ba81 - React-RCTTest: 6e1240e21a7c6efc3afa2ae8e150496f609421b6 - React-RCTText: ddc2d014d72f47f658037382521ac1876b0f751c - React-RCTVibration: 49420b33eedc352bf51ce9886b1af918eadc9cd2 - React-rendererconsistency: dfce88334e2fbb0972e2f36e27efac8ab8b2e6ee - React-renderercss: 8e12c8a23fd82e8a1a426507e26ae2c8fc35379b - React-rendererdebug: e804fa450e01428a412caf577724876fceb514c0 - React-resizeobservernativemodule: 567ff9231d78009c701a79a749beba2d7a2956fb - React-RuntimeApple: ca0d98d5ffe44c98479d88db99abbca97aef2457 - React-RuntimeCore: 3008e4628f76f55838d3a613b5c17b3a0d861df3 - React-runtimeexecutor: dfa1c896855f821d6cea8594e26afc79ac638cdd - React-RuntimeHermes: 1d1993a7d31fdd41114e9a1b6dce101fbd028bd3 - React-runtimescheduler: 5ad796868e1b67c894c4bc70f98d14bd980e993c - React-timing: aebf3cb0fd6622457282d7fc5b1ae5c9eaabaa5a - React-utils: 6936fb35835ba9ad7235acdc84dd27dbac8ab206 - React-viewtransitionnativemodule: 8aad635cba0f95fc956021dc0b804c0a43083a6c - React-webperformancenativemodule: 03478de4af68a40bcf85ed2c9bda1d76e7b726ab - ReactAppDependencyProvider: c5b9a1a498bc4a1e37abe92bfac128f9446a0ea0 - ReactCodegen: 29baeca8bc65b96b199bac820a5244afc65d2e2f - ReactCommon: 9674bcbe0f53864025359fcc8ad60d8bfa4174fd - ReactCommon-Samples: ce729453b9727357701792d6df7acfe8118f5df2 - ScreenshotManager: 4ae76e2eb811e39d7af099926c159dcfb8f0d95c + RCTDeprecation: 1d1a94a247818610796b6ecb790d50272b92074d + RCTRequired: 4917cf98f463f9ad12309b27e78e37b8ad2a3d58 + RCTSwiftUI: d96b5197f7ccba00f28e13359a9c2cc77400b989 + RCTSwiftUIWrapper: 8c99c93a4563499f9803819b3c24621d940b1c2b + RCTTypeSafety: 09bc56757c7d70f3673c07e370026e5362f8b708 + React: 8481ff37bcd808e18b85af345ce2657c36b710e6 + React-bridging: e4e8989ad05eaad067ede6d8521ee3fdb6f20b3f + React-callinvoker: 98b9100df52d588a4165ee6c8968d2aaede63bd2 + React-Core: edfa0f33a182e298bc8a71575f8ea1e61a8a0cea + React-CoreModules: 7514e89fa1ab26154ee271af5ddcbf599561af0e + React-cxxreact: 6345f3a4b2ed7b5c47bd57c6cc994d1fd972e988 + React-cxxstableapi: 9c7d9d86f4dd92682f9cafb111be48fea68196fa + React-debug: b32296ce291625314457c208842af04a6d78ecff + React-defaultsnativemodule: 556d5ef8de7eb1f293be1b6d48f7112534db5d91 + React-domnativemodule: 17ff1366cfd82f21d13bf802e535564d945349f7 + React-Fabric: a16edcdd5bceec6f9387a6293a9cac5b88a93957 + React-FabricComponents: e75ea2328efc2ea02ed42ecc02051eebdf8ddc49 + React-FabricImage: b08f75d7f12e1c6a375c757c7cbf135278106ed2 + React-featureflags: 98a66611e38f29a355b04dc7bbaa3fffb266b142 + React-featureflagsnativemodule: c1da4d15f21237d2e5e965d724de2343b98ff831 + React-graphics: 84b1a5f4e70ec04c261637a223fbf91534559605 + React-hermes: 1bd4244c807fea0625f896f9fb913a050ac185f5 + React-idlecallbacksnativemodule: f10df9e7493930d468672749dafcb81ebc147c44 + React-ImageManager: a063e0f23e35295eae6023c6834df31d61d4bd6b + React-intersectionobservernativemodule: 610ad10cdf2b4519091fea852e8973bf22bdf360 + React-jserrorhandler: 062de56d545492062289e54ec4c0bc1f75fef32c + React-jsi: 5ee7eeceba1bd4f399df8b7fae5f262c5d023dfc + React-jsiexecutor: 9b3a86c2135abe450de87df4a24d2fb9021df391 + React-jsinspector: 9d55e364b80b2d900c1492c7b29450a446af5dcb + React-jsinspectorcdp: 2a7b37cb580d6e59258fe44a5e69086530575622 + React-jsinspectornetwork: b8a9a41f5961d4b9869850034d3c1257835af531 + React-jsinspectortracing: 6efea0c24c0d1a45bfae8de2e76f792653191d91 + React-jsitooling: b147ee402adc3046c0b12719a12be0ea42612e8f + React-jsitracing: 9a6ddd540634a1b834bcee35c170d9fdb2cb08b3 + React-logger: 44b18898ab189ecf53a817dec092e6202fd7aa74 + React-Mapbuffer: 73dd8eef245d1b90428d4499908a393ad26edeb2 + React-microtasksnativemodule: 73e65759d4abe6467179d1a1d360835b03a98531 + React-mutationobservernativemodule: 05804c1d14ec1000ae99e8b7668ca12cf8e1656e + React-NativeModulesApple: ea373ec661bbec657d00aca0a1206bc1b7ccc2de + React-networking: 23b6563161943fd639cafaf8d2a446d932fc3178 + React-oscompat: 070f927db94332cea0f0f288dd5d9d91530dfacb + React-perflogger: 69839f5d9e147b5edf0e0c73581f88aed69f3dfa + React-performancecdpmetrics: e601ff949648adf6c21a5b36177eb398e4fc691d + React-performancetimeline: 0eedcc73fae3c6f7300249fca253cb2a7403580e + React-RCTActionSheet: a3f69d475497566461e06137c0ceccaa49e82252 + React-RCTAnimatedModuleProvider: 945c200a1b507b23379a29b10757575de50e0c49 + React-RCTAnimation: 661a034e60aee0d0025f1cb78a21869bad31fa65 + React-RCTAppDelegate: 7892fc185e1a45e63e85e9250aa8b83a49f58ba0 + React-RCTBlob: 12b8f1e0ec850405dda376c4cd7f5fdc3e5183e6 + React-RCTFabric: 5d571709c8ac6a2130ac62ce2ced7e6bb1ae3181 + React-RCTFBReactNativeSpec: 37695f8cfb144831127fb3aae8053ed5fd103462 + React-RCTImage: 79d7c5357222e73e748e55fa1fc1ccf38fa2eeff + React-RCTLinking: 9eb3c5c6e41508339898e05b008c9722a8a18e05 + React-RCTNetwork: 6f1a695b129e9046e6bd60ba45147f5e68345dc9 + React-RCTPushNotification: 03d6b57b2c799ea0cae944b8bab05d708b9ca858 + React-RCTRuntime: b1b688ed2cc3556ddc80b20c6e25db06a47120d3 + React-RCTSettings: 20c02a4cdaf930b78281b103a474714a318958b3 + React-RCTTest: e86cce9da1a41796ac765a448e33142dd43121f6 + React-RCTText: 73ba82716dd67c6fd71d9e88dc571b3bb48893e3 + React-RCTVibration: a6b3f2eafccb6645a2e862d6dc36d5984c1b7f33 + React-rendererconsistency: 21edaab59872cf6e8e7f88a1eb8776bdcde9b40c + React-renderercss: e87b204d46a9741444db979377d6f9be64861793 + React-rendererdebug: 2ed06b3c5a04db1cde6918711b775ea70b556185 + React-resizeobservernativemodule: 7241ff2b1707d2976f069bc3cb9c44fb54a87c77 + React-RuntimeApple: 52df3db096993b8a04c04ae1c5f40a4cfaf70be3 + React-RuntimeCore: 9d5c9a0e60126abe9cc0ed6b39dc17c511e31272 + React-runtimeexecutor: 8df10f178687b9f2d6efd7871c0f997709fc5068 + React-RuntimeHermes: 797a778b240714067135692a25517fd83986734d + React-runtimescheduler: 4488a8be500e5e5af0035276a3c55a1173d7ecbd + React-timing: 802fc6c8c1fe87ac0a300ea5bf7fc78ded49d0c2 + React-utils: 5a89beb54c076cd4727e1c9eef4537644dbe5fef + React-viewtransitionnativemodule: 8f6e4492817296f7ff063367d6d6b25d90d03de9 + React-webperformancenativemodule: c6fdb2d10cee9b0b8f1cfa91348cfd1b21251b86 + ReactAppDependencyProvider: 7a86900b342815446f0d353a877f2b777597c365 + ReactCodegen: 7691c14d2a24af0fee635a6f9790dbaa9ff71240 + ReactCommon: a917082dd662fb88a33515fab74f5972aed80e0e + ReactCommon-Samples: 73e7f7dd75608a5e1d1d1e317f80f537872b1e62 + ScreenshotManager: 0e4dd1945472c1e81cd0007b8c856609b48e4983 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 1b8c4d09a0c4cb8f5651aeeb0896c9e552069b58 + Yoga: 54249c61111e792ca81fe3557b84004459bbcdb4 PODFILE CHECKSUM: 59f1e7d58cffbfafbeb3df31151743dd4c9a52e8 From 7822b9cce2233db00b26eeab8a04e4812d0468b3 Mon Sep 17 00:00:00 2001 From: Fabrizio Cucci Date: Mon, 5 Oct 2026 14:42:14 +0100 Subject: [PATCH 32/35] Properly enable Pressable after disabled prop reset (#58799) Summary: JSI drops `undefined` keys, so reseting `disabled` from `true` to `undefined` on Touchables/Pressables never runs `setEnabled(true)` There is props diffing feature flag that fixes this, which is off by default Also added safety check against explicit `null` & reset on recycling Fixes https://github.com/react/react-native/issues/56777 and supersedes https://github.com/react/react-native/issues/58795 ## Changelog: [ANDROID] [FIXED] - Properly enable Pressable after `disabled` prop resets from `true` Pull Request resolved: https://github.com/react/react-native/pull/58799 Test Plan: Added BaseViewManagerTest as well as videos of testing it on Pressable: https://github.com/user-attachments/assets/e9a7dcd2-46d5-4cdc-88a3-728bff22e76b https://github.com/user-attachments/assets/043150ae-64f2-47c9-b13c-abfec5b61747 Reviewed By: javache Differential Revision: D122872380 Pulled By: zeyap fbshipit-source-id: f3f1cad378f36f006bbb6c7f3f2e4f9aa8e61541 (cherry picked from commit 357b6998c4df940f2450448a20478b11deaf741b) --- .../react/uimanager/BaseViewManager.java | 18 ++++++- .../main/res/views/uimanager/values/ids.xml | 3 ++ .../react/uimanager/BaseViewManagerTest.kt | 32 +++++++++++ .../js/examples/Pressable/PressableExample.js | 53 +++++++++++++++++++ 4 files changed, 104 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java index d2747ebda577..c78d3151219a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java @@ -88,6 +88,8 @@ public BaseViewManager(@Nullable ReactApplicationContext reactContext) { view.setTag(R.id.accessibility_actions, null); view.setTag(R.id.accessibility_value, null); view.setTag(R.id.accessibility_state_expanded, null); + view.setTag(R.id.accessibility_state_disabled, null); + view.setEnabled(true); view.setTag(R.id.view_clipped, null); // This indirectly calls (and resets): @@ -360,6 +362,7 @@ public void setAccessibilityCollectionItem( @ReactProp(name = ViewProps.ACCESSIBILITY_STATE) public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilityState) { if (accessibilityState == null) { + resetDisabledFromAccessibilityState(view); return; } if (accessibilityState.hasKey("expanded")) { @@ -381,8 +384,12 @@ public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilitySta view.setSelected(false); } view.setTag(R.id.accessibility_state, accessibilityState); - if (accessibilityState.hasKey("disabled")) { - view.setEnabled(!accessibilityState.getBoolean("disabled")); + if (accessibilityState.hasKey("disabled") && !accessibilityState.isNull("disabled")) { + boolean disabled = accessibilityState.getBoolean("disabled"); + view.setEnabled(!disabled); + view.setTag(R.id.accessibility_state_disabled, disabled); + } else { + resetDisabledFromAccessibilityState(view); } // For states which don't have corresponding methods in @@ -409,6 +416,13 @@ public void setViewState(@NonNull T view, @Nullable ReadableMap accessibilitySta } } + private static void resetDisabledFromAccessibilityState(@NonNull View view) { + if (Boolean.TRUE.equals(view.getTag(R.id.accessibility_state_disabled))) { + view.setEnabled(true); + } + view.setTag(R.id.accessibility_state_disabled, null); + } + private void updateViewContentDescription(@NonNull T view) { final String accessibilityLabel = (String) view.getTag(R.id.accessibility_label); final ReadableMap accessibilityState = (ReadableMap) view.getTag(R.id.accessibility_state); diff --git a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values/ids.xml b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values/ids.xml index 0e51a358eb77..e5258b13a062 100644 --- a/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values/ids.xml +++ b/packages/react-native/ReactAndroid/src/main/res/views/uimanager/values/ids.xml @@ -36,6 +36,9 @@ + + + diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt index 8915d91903a7..95e47b23e9a2 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.kt @@ -71,6 +71,38 @@ class BaseViewManagerTest { Assertions.assertThat(view.isSelected).isEqualTo(true) } + @Test + fun testAccessibilityStateDisabledRemovedReenablesView() { + viewManager.setViewState(view, JavaOnlyMap.of("disabled", true)) + Assertions.assertThat(view.isEnabled).isFalse() + + viewManager.setViewState(view, JavaOnlyMap()) + Assertions.assertThat(view.isEnabled).isTrue() + } + + @Test + fun testAccessibilityStateNullReenablesView() { + viewManager.setViewState(view, JavaOnlyMap.of("disabled", true)) + viewManager.setViewState(view, null) + Assertions.assertThat(view.isEnabled).isTrue() + } + + @Test + fun testAccessibilityStateDisabledNullDoesNotCrash() { + viewManager.setViewState(view, JavaOnlyMap.of("disabled", true)) + viewManager.setViewState(view, JavaOnlyMap.of("disabled", null)) + Assertions.assertThat(view.isEnabled).isTrue() + } + + @Test + fun testAccessibilityStateWithoutDisabledKeepsViewDisabledByOtherProps() { + view.isEnabled = false + viewManager.setViewState(view, JavaOnlyMap()) + Assertions.assertThat(view.isEnabled).isFalse() + viewManager.setViewState(view, null) + Assertions.assertThat(view.isEnabled).isFalse() + } + @Test fun testRoleList() { viewManager.setRole(view, "list") diff --git a/packages/rn-tester/js/examples/Pressable/PressableExample.js b/packages/rn-tester/js/examples/Pressable/PressableExample.js index b52f9f9ba053..fc7ba7bb8005 100644 --- a/packages/rn-tester/js/examples/Pressable/PressableExample.js +++ b/packages/rn-tester/js/examples/Pressable/PressableExample.js @@ -255,7 +255,17 @@ function PressableNativeMethods() { ); } +const DISABLED_OPTIONS: Array<{label: string, value: ?boolean}> = [ + {label: 'true', value: true}, + {label: 'false', value: false}, + {label: 'undefined', value: undefined}, + {label: 'null', value: null}, +]; + function PressableDisabled() { + const [disabled, setDisabled] = useState(true); + const [timesPressed, setTimesPressed] = useState(0); + return ( <> @@ -271,6 +281,33 @@ function PressableDisabled() { ]}> Enabled Pressable + + + {DISABLED_OPTIONS.map(option => ( + setDisabled(option.value)} + style={[ + styles.disabledOption, + disabled === option.value && styles.disabledOptionSelected, + ]}> + {option.label} + + ))} + + setTimesPressed(current => current + 1)} + style={({pressed}) => [ + {opacity: pressed ? 0.5 : 1}, + styles.row, + styles.block, + styles.disabledToggleTarget, + ]}> + + {`disabled={${String(disabled)}}`} pressed {timesPressed} times + + ); } @@ -296,6 +333,22 @@ const styles = StyleSheet.create({ color: '#007AFF', opacity: 0.5, }, + disabledOption: { + paddingHorizontal: 8, + paddingVertical: 4, + marginHorizontal: 4, + borderRadius: 4, + borderWidth: StyleSheet.hairlineWidth, + borderColor: '#007AFF', + }, + disabledOptionSelected: { + backgroundColor: '#cce4ff', + }, + disabledToggleTarget: { + padding: 20, + borderWidth: StyleSheet.hairlineWidth, + borderColor: '#007AFF', + }, hitSlopButton: { color: 'white', }, From ee4bd403d43ce51e6de8fce462208364515cf8b5 Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Fri, 25 Sep 2026 15:00:54 -0700 Subject: [PATCH 33/35] Make generated props and style types augmentable (#58168) Summary: react-native-web and Nativewind extend React Native's types with module augmentation. https://github.com/react/react-native/issues/58062 made the props and style types interfaces, which cleared the duplicate identifier errors. Two things still can't be extended. **Styles:** `ViewStyle` is an interface derived from `____ViewStyle_Internal`, but `ViewProps['style']` reads the base, so augmenting `ViewStyle` doesn't reach it: ```ts declare module 'react-native' { interface ViewStyle { transitionDuration?: string } } ; // error StyleSheet.create({ box: { transitionDuration: '1s' } }); // error ``` `____ViewStyle_Internal` is now named `ViewStyle`, and the same for Text and Image. `StyleSheet` re-exports each name unchanged, so the interface and the base are one symbol. **Props written as inline object literals:** The transform copies them into the interface body, where a second declaration is a merge conflict rather than an override, so the augmentation is silently ignored. Eleven of the 24 annotated types are affected. Each now moves its inline members into a private `Core` alias, so they reach the interface through the extends clause and are inherited, like everything from `ViewProps` already was: ```ts // before declare interface KeyboardAvoidingViewProps extends Readonly { readonly enabled?: boolean } // after declare interface KeyboardAvoidingViewProps extends Readonly< ViewProps & KeyboardAvoidingViewPropsCore > {} ``` That costs 11 new names in the API snapshot, one per affected type. `PressableProps` set the precedent with `PressableBaseProps`. `ImagePropsBase` and `ImageBackgroundProps` declare members that shadow keys of the type they spread, and a Flow spread of an optional property unions the two types instead of replacing the member, so those keys get an explicit `Omit`. Caveat: an augmented member has to be assignable to the inherited one. Adding a key is clean and narrowing works, but widening raises `TS2430` on the declaration file, which `skipLibCheck: true` silences. [GENERAL] [CHANGED] - Allow module augmentation to extend generated props and style types Pull Request resolved: https://github.com/react/react-native/pull/58168 Test Plan: `yarn build-types`: all 24 annotated types now emit an empty interface body. `ViewStyle`, `TextStyle` and `ImageStyle` are unchanged; the props types gain the 11 `Core` aliases. Compiled augmentations with `skipLibCheck: false`. Styles: the two lines above pass here and report `TS2353` on `main`. Props: adding a key and narrowing an existing one on each of the 11 types passes here and reports `TS2717` on `main`. `yarn flow-check`, `yarn test-generated-typescript`, `yarn format-check` and `yarn lint`: clean, apart from 3 Flow errors in `packages/react-native-codegen/lib` already on `main`. `yarn jest packages/react-native/Libraries packages/react-native/src scripts/js-api`: 632 tests pass, no snapshot changed. Reviewed By: christophpurrer Differential Revision: D117876097 Pulled By: cortinico fbshipit-source-id: c0797f14d95a01662930f7158738ea79e1bf1a30 (cherry picked from commit 447ccd1ddbf3b9d95ce5e54410d7a5a54ce9bade) --- .../Animated/components/AnimatedScrollView.js | 4 +- .../ActivityIndicator/ActivityIndicator.js | 13 +- .../Libraries/Components/Button.js | 6 +- .../Keyboard/KeyboardAvoidingView.js | 11 +- .../Components/Pressable/Pressable.js | 6 +- .../TextInput/InputAccessoryView.js | 14 +- .../Components/TextInput/TextInput.js | 10 +- .../Touchable/TouchableWithoutFeedback.js | 169 +++++----- .../Components/View/ViewAccessibility.js | 12 +- .../Libraries/Image/ImageProps.js | 56 ++-- .../react-native/Libraries/Modal/Modal.js | 6 +- .../Libraries/StyleSheet/StyleSheet.js | 12 +- .../Libraries/StyleSheet/StyleSheet.js.flow | 12 +- .../Libraries/StyleSheet/StyleSheetTypes.js | 21 +- .../Libraries/StyleSheet/splitLayoutProps.js | 12 +- packages/react-native/Libraries/Text/Text.js | 12 +- packages/react-native/ReactNativeApi.d.ts | 294 +++++++++--------- 17 files changed, 356 insertions(+), 314 deletions(-) diff --git a/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js b/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js index 9ba8f735c94e..798d09f971e5 100644 --- a/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js +++ b/packages/react-native/Libraries/Animated/components/AnimatedScrollView.js @@ -8,7 +8,7 @@ * @format */ -import type {____ViewStyle_Internal} from '../../StyleSheet/StyleSheetTypes'; +import type {ViewStyle} from '../../StyleSheet/StyleSheetTypes'; import type { AnimatedComponentType, AnimatedProps, @@ -99,7 +99,7 @@ const AnimatedScrollViewWithInvertedRefreshControl = // Handle animated props on `refreshControl`. const [refreshControlAnimatedProps, refreshControlRef] = useAnimatedProps< - {style: ?____ViewStyle_Internal}, + {style: ?ViewStyle}, $FlowFixMe, >(intermediatePropsForRefreshControl); // NOTE: Assumes that refreshControl.ref` and `refreshControl.style` can be diff --git a/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js b/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js index f021d43aad26..e73577e68c0b 100644 --- a/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js +++ b/packages/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.js @@ -38,11 +38,7 @@ type ActivityIndicatorIOSProps = Readonly<{ hidesWhenStopped?: ?boolean, }>; -/** @build-types emit-as-interface Uniwind compatibility */ -export type ActivityIndicatorProps = Readonly<{ - ...ViewProps, - ...ActivityIndicatorIOSProps, - +type ActivityIndicatorPropsCore = Readonly<{ /** * Whether to show the indicator (`true`) or hide it (`false`). */ @@ -67,6 +63,13 @@ export type ActivityIndicatorProps = Readonly<{ size?: ?IndicatorSize, }>; +/** @build-types emit-as-interface Uniwind compatibility */ +export type ActivityIndicatorProps = Readonly<{ + ...ViewProps, + ...ActivityIndicatorIOSProps, + ...ActivityIndicatorPropsCore, +}>; + /** * Displays a circular loading indicator. * diff --git a/packages/react-native/Libraries/Components/Button.js b/packages/react-native/Libraries/Components/Button.js index cf283e552318..0c3ddba19678 100644 --- a/packages/react-native/Libraries/Components/Button.js +++ b/packages/react-native/Libraries/Components/Button.js @@ -27,8 +27,7 @@ import View from './View/View'; import invariant from 'invariant'; import * as React from 'react'; -/** @build-types emit-as-interface Uniwind compatibility */ -export type ButtonProps = Readonly<{ +type ButtonPropsCore = Readonly<{ /** * Text to display inside the button. On Android the given title will be * converted to the uppercased form. @@ -167,6 +166,9 @@ export type ButtonProps = Readonly<{ accessibilityLanguage?: ?Stringish, }>; +/** @build-types emit-as-interface Uniwind compatibility */ +export type ButtonProps = ButtonPropsCore; + const NativeTouchable: typeof TouchableNativeFeedback | typeof TouchableOpacity = Platform.OS === 'android' ? TouchableNativeFeedback : TouchableOpacity; diff --git a/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js b/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js index c2a22df4b347..d2fff116cc32 100644 --- a/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js +++ b/packages/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.js @@ -26,10 +26,7 @@ import Keyboard from './Keyboard'; import * as React from 'react'; import {createRef} from 'react'; -/** @build-types emit-as-interface Uniwind compatibility */ -export type KeyboardAvoidingViewProps = Readonly<{ - ...ViewProps, - +type KeyboardAvoidingViewPropsCore = Readonly<{ /** * Specify how to react to the presence of the keyboard. */ @@ -56,6 +53,12 @@ export type KeyboardAvoidingViewProps = Readonly<{ keyboardVerticalOffset?: number, }>; +/** @build-types emit-as-interface Uniwind compatibility */ +export type KeyboardAvoidingViewProps = Readonly<{ + ...ViewProps, + ...KeyboardAvoidingViewPropsCore, +}>; + type KeyboardAvoidingViewState = { bottom: number, }; diff --git a/packages/react-native/Libraries/Components/Pressable/Pressable.js b/packages/react-native/Libraries/Components/Pressable/Pressable.js index c96e0c7001ce..ba26272d9304 100644 --- a/packages/react-native/Libraries/Components/Pressable/Pressable.js +++ b/packages/react-native/Libraries/Components/Pressable/Pressable.js @@ -32,11 +32,13 @@ export type PressableInstance = HostInstance; export type {PressableAndroidRippleConfig}; -/** @build-types emit-as-interface react-native-web compatibility */ -export type PressableStateCallbackType = Readonly<{ +type PressableStateCallbackTypeCore = Readonly<{ pressed: boolean, }>; +/** @build-types emit-as-interface react-native-web compatibility */ +export type PressableStateCallbackType = PressableStateCallbackTypeCore; + type PressableBaseProps = Readonly<{ /** * Whether a press gesture can be interrupted by a parent gesture such as a diff --git a/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js b/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js index e00db0a1fa35..5ded8e707aed 100644 --- a/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js +++ b/packages/react-native/Libraries/Components/TextInput/InputAccessoryView.js @@ -18,12 +18,7 @@ import useWindowDimensions from '../../Utilities/useWindowDimensions'; import RCTInputAccessoryViewNativeComponent from './RCTInputAccessoryViewNativeComponent'; import * as React from 'react'; -/** - * InputAccessoryView is deprecated and will be removed in a future release. - * @deprecated - * @build-types emit-as-interface Expo compatibility - */ -export type InputAccessoryViewProps = Readonly<{ +type InputAccessoryViewPropsCore = Readonly<{ readonly children: React.Node, /** * An ID used to associate this `InputAccessoryView` to specified `TextInput`(s). @@ -33,6 +28,13 @@ export type InputAccessoryViewProps = Readonly<{ backgroundColor?: ?ColorValue, }>; +/** + * InputAccessoryView is deprecated and will be removed in a future release. + * @deprecated + * @build-types emit-as-interface Expo compatibility + */ +export type InputAccessoryViewProps = InputAccessoryViewPropsCore; + /** * A component which enables customization of the keyboard input accessory view on iOS. The input accessory view is displayed above the keyboard whenever a `TextInput` has focus. This component can be used to create custom toolbars. * diff --git a/packages/react-native/Libraries/Components/TextInput/TextInput.js b/packages/react-native/Libraries/Components/TextInput/TextInput.js index ee48b398c125..abcc3d815d36 100644 --- a/packages/react-native/Libraries/Components/TextInput/TextInput.js +++ b/packages/react-native/Libraries/Components/TextInput/TextInput.js @@ -9,7 +9,7 @@ */ import type {HostInstance} from '../../../src/private/types/HostInstance'; -import type {____TextStyle_Internal as TextStyleInternal} from '../../StyleSheet/StyleSheetTypes'; +import type {TextStyle} from '../../StyleSheet/StyleSheetTypes'; import type { BlurEvent, FocusEvent, @@ -543,16 +543,16 @@ function InternalTextInput(props: TextInputProps): React.Node { let _style = props.style; const flattenedStyle = flattenStyle(props.style); if (flattenedStyle != null) { - let overrides: ?{...TextStyleInternal} = null; + let overrides: ?{...TextStyle} = null; if (typeof flattenedStyle?.fontWeight === 'number') { - overrides = overrides || ({} as {...TextStyleInternal}); + overrides = overrides || ({} as {...TextStyle}); overrides.fontWeight = // $FlowFixMe[incompatible-type] - flattenedStyle.fontWeight.toString() as TextStyleInternal['fontWeight']; + flattenedStyle.fontWeight.toString() as TextStyle['fontWeight']; } if (flattenedStyle.verticalAlign != null) { - overrides = overrides || ({} as {...TextStyleInternal}); + overrides = overrides || ({} as {...TextStyle}); overrides.textAlignVertical = verticalAlignToTextAlignVerticalMap[flattenedStyle.verticalAlign]; overrides.verticalAlign = undefined; diff --git a/packages/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.js b/packages/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.js index 3e9b92ad06b1..92c4ba114b7f 100755 --- a/packages/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.js +++ b/packages/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.js @@ -36,92 +36,93 @@ export type TouchableWithoutFeedbackPropsAndroid = { touchSoundDisabled?: ?boolean, }; +type TouchableWithoutFeedbackPropsCore = { + children?: ?React.Node, + /** + * Delay in ms, from onPressIn, before onLongPress is called. + */ + delayLongPress?: ?number, + /** + * Delay in ms, from the start of the touch, before onPressIn is called. + */ + delayPressIn?: ?number, + /** + * Delay in ms, from the release of the touch, before onPressOut is called. + */ + delayPressOut?: ?number, + /** + * If true, disable all interactions for this component. + */ + disabled?: ?boolean, + /** + * Whether this View should be focusable with a non-touch input device, + * eg. receive focus with a hardware keyboard / TV remote. + */ + focusable?: ?boolean, + /** + * This defines how far your touch can start away from the button. + * This is added to pressRetentionOffset when moving off of the button. + * NOTE The touch area never extends past the parent view bounds and + * the Z-index of sibling views always takes precedence if a touch hits + * two overlapping views. + */ + hitSlop?: ?EdgeInsetsOrSizeProp, + /** + * Used to reference react managed views from native code. + */ + id?: string, + importantForAccessibility?: ?('auto' | 'yes' | 'no' | 'no-hide-descendants'), + nativeID?: ?string, + onAccessibilityAction?: ?(event: AccessibilityActionEvent) => unknown, + /** + * When `accessible` is true (which is the default) this may be called when + * the OS-specific concept of "blur" occurs, meaning the element lost focus. + * Some platforms may not have the concept of blur. + */ + onBlur?: ?(event: BlurEvent) => unknown, + /** + * When `accessible` is true (which is the default) this may be called when + * the OS-specific concept of "focus" occurs. Some platforms may not have + * the concept of focus. + */ + onFocus?: ?(event: FocusEvent) => unknown, + /** + * Invoked on mount and layout changes with + * {nativeEvent: {layout: {x, y, width, height}}} + */ + onLayout?: ?(event: LayoutChangeEvent) => unknown, + onLongPress?: ?(event: GestureResponderEvent) => unknown, + /** + * Called when the touch is released, + * but not if cancelled (e.g. by a scroll that steals the responder lock). + */ + onPress?: ?(event: GestureResponderEvent) => unknown, + onPressIn?: ?(event: GestureResponderEvent) => unknown, + onPressOut?: ?(event: GestureResponderEvent) => unknown, + /** + * When the scroll view is disabled, this defines how far your + * touch may move off of the button, before deactivating the button. + * Once deactivated, try moving it back and you'll see that the button + * is once again reactivated! Move it back and forth several times + * while the scroll view is disabled. Ensure you pass in a constant + * to reduce memory allocations. + */ + pressRetentionOffset?: ?EdgeInsetsOrSizeProp, + rejectResponderTermination?: ?boolean, + /** + * Used to locate this view in end-to-end tests. + */ + testID?: ?string, + /** + * //FIXME: not in doc but available in examples + */ + style?: ?ViewStyleProp, +}; + /** @build-types emit-as-interface Expo compatibility */ export type TouchableWithoutFeedbackProps = Readonly< - { - children?: ?React.Node, - /** - * Delay in ms, from onPressIn, before onLongPress is called. - */ - delayLongPress?: ?number, - /** - * Delay in ms, from the start of the touch, before onPressIn is called. - */ - delayPressIn?: ?number, - /** - * Delay in ms, from the release of the touch, before onPressOut is called. - */ - delayPressOut?: ?number, - /** - * If true, disable all interactions for this component. - */ - disabled?: ?boolean, - /** - * Whether this View should be focusable with a non-touch input device, - * eg. receive focus with a hardware keyboard / TV remote. - */ - focusable?: ?boolean, - /** - * This defines how far your touch can start away from the button. - * This is added to pressRetentionOffset when moving off of the button. - * NOTE The touch area never extends past the parent view bounds and - * the Z-index of sibling views always takes precedence if a touch hits - * two overlapping views. - */ - hitSlop?: ?EdgeInsetsOrSizeProp, - /** - * Used to reference react managed views from native code. - */ - id?: string, - importantForAccessibility?: ?( - 'auto' | 'yes' | 'no' | 'no-hide-descendants' - ), - nativeID?: ?string, - onAccessibilityAction?: ?(event: AccessibilityActionEvent) => unknown, - /** - * When `accessible` is true (which is the default) this may be called when - * the OS-specific concept of "blur" occurs, meaning the element lost focus. - * Some platforms may not have the concept of blur. - */ - onBlur?: ?(event: BlurEvent) => unknown, - /** - * When `accessible` is true (which is the default) this may be called when - * the OS-specific concept of "focus" occurs. Some platforms may not have - * the concept of focus. - */ - onFocus?: ?(event: FocusEvent) => unknown, - /** - * Invoked on mount and layout changes with - * {nativeEvent: {layout: {x, y, width, height}}} - */ - onLayout?: ?(event: LayoutChangeEvent) => unknown, - onLongPress?: ?(event: GestureResponderEvent) => unknown, - /** - * Called when the touch is released, - * but not if cancelled (e.g. by a scroll that steals the responder lock). - */ - onPress?: ?(event: GestureResponderEvent) => unknown, - onPressIn?: ?(event: GestureResponderEvent) => unknown, - onPressOut?: ?(event: GestureResponderEvent) => unknown, - /** - * When the scroll view is disabled, this defines how far your - * touch may move off of the button, before deactivating the button. - * Once deactivated, try moving it back and you'll see that the button - * is once again reactivated! Move it back and forth several times - * while the scroll view is disabled. Ensure you pass in a constant - * to reduce memory allocations. - */ - pressRetentionOffset?: ?EdgeInsetsOrSizeProp, - rejectResponderTermination?: ?boolean, - /** - * Used to locate this view in end-to-end tests. - */ - testID?: ?string, - /** - * //FIXME: not in doc but available in examples - */ - style?: ?ViewStyleProp, - } & TouchableWithoutFeedbackPropsAndroid & + TouchableWithoutFeedbackPropsCore & + TouchableWithoutFeedbackPropsAndroid & TouchableWithoutFeedbackPropsIOS & AccessibilityProps, >; diff --git a/packages/react-native/Libraries/Components/View/ViewAccessibility.js b/packages/react-native/Libraries/Components/View/ViewAccessibility.js index 369388635674..5c1b250a1462 100644 --- a/packages/react-native/Libraries/Components/View/ViewAccessibility.js +++ b/packages/react-native/Libraries/Components/View/ViewAccessibility.js @@ -349,10 +349,7 @@ export type AccessibilityPropsIOS = Readonly<{ accessibilityRespondsToUserInteraction?: ?boolean, }>; -/** @build-types emit-as-interface react-native-web compatibility */ -export type AccessibilityProps = Readonly<{ - ...AccessibilityPropsAndroid, - ...AccessibilityPropsIOS, +type AccessibilityPropsCore = Readonly<{ /** * When `true`, indicates that the view is an accessibility element. * By default, all the touchable elements are accessible. @@ -434,3 +431,10 @@ export type AccessibilityProps = Readonly<{ */ 'aria-hidden'?: ?boolean, }>; + +/** @build-types emit-as-interface react-native-web compatibility */ +export type AccessibilityProps = Readonly<{ + ...AccessibilityPropsAndroid, + ...AccessibilityPropsIOS, + ...AccessibilityPropsCore, +}>; diff --git a/packages/react-native/Libraries/Image/ImageProps.js b/packages/react-native/Libraries/Image/ImageProps.js index 124ffe9a4e2b..3dd4213e92c1 100644 --- a/packages/react-native/Libraries/Image/ImageProps.js +++ b/packages/react-native/Libraries/Image/ImageProps.js @@ -147,10 +147,7 @@ export type ImagePropsAndroid = Readonly<{ resizeMultiplier?: ?number, }>; -/** @build-types emit-as-interface Expo compatibility */ -export type ImagePropsBase = Readonly<{ - ...Omit, - +type ImagePropsBaseCore = Readonly<{ /** * When `true`, indicates the image is an accessibility element. */ @@ -327,27 +324,38 @@ export type ImagePropsBase = Readonly<{ children?: empty, }>; -/** @build-types emit-as-interface react-native-web compatibility */ -export type ImageProps = Readonly<{ - ...ImagePropsIOS, - ...ImagePropsAndroid, - ...ImagePropsBase, +/** @build-types emit-as-interface Expo compatibility */ +export type ImagePropsBase = Readonly<{ + ...Omit< + ViewProps, + | 'accessibilityLabel' + | 'accessible' + | 'aria-label' + | 'aria-labelledby' + | 'children' + | 'onLayout' + | 'style' + | 'testID', + >, + ...ImagePropsBaseCore, +}>; +type ImagePropsCore = Readonly<{ /** * Style applied to the `Image` component. */ style?: ?ImageStyleProp, }>; -/** - * ImageBackground is deprecated and will be removed in a future release. - * Use a `View` with an absolutely positioned `Image` instead. - * @see https://reactnative.dev/docs/imagebackground - * @deprecated - * @build-types emit-as-interface Uniwind compatibility - */ -export type ImageBackgroundProps = Readonly<{ - ...ImageProps, +/** @build-types emit-as-interface react-native-web compatibility */ +export type ImageProps = Readonly<{ + ...ImagePropsIOS, + ...ImagePropsAndroid, + ...ImagePropsBase, + ...ImagePropsCore, +}>; + +type ImageBackgroundPropsCore = Readonly<{ children?: React.Node, /** @@ -367,3 +375,15 @@ export type ImageBackgroundProps = Readonly<{ */ imageRef?: React.RefSetter>, }>; + +/** + * ImageBackground is deprecated and will be removed in a future release. + * Use a `View` with an absolutely positioned `Image` instead. + * @see https://reactnative.dev/docs/imagebackground + * @deprecated + * @build-types emit-as-interface Uniwind compatibility + */ +export type ImageBackgroundProps = Readonly<{ + ...Omit, + ...ImageBackgroundPropsCore, +}>; diff --git a/packages/react-native/Libraries/Modal/Modal.js b/packages/react-native/Libraries/Modal/Modal.js index 66a9343eaa87..a0f4d01155f8 100644 --- a/packages/react-native/Libraries/Modal/Modal.js +++ b/packages/react-native/Libraries/Modal/Modal.js @@ -41,8 +41,7 @@ type OrientationChangeEvent = Readonly<{ orientation: 'portrait' | 'landscape', }>; -/** @build-types emit-as-interface Uniwind compatibility */ -export type ModalBaseProps = { +type ModalBasePropsCore = { /** * Controls how the modal animates. `'slide'` slides in from the bottom, * `'fade'` fades into view, `'none'` appears without animation. @@ -92,6 +91,9 @@ export type ModalBaseProps = { modalRef?: React.RefSetter, }; +/** @build-types emit-as-interface Uniwind compatibility */ +export type ModalBaseProps = ModalBasePropsCore; + export type ModalPropsIOS = { /** * Controls how the modal appears. diff --git a/packages/react-native/Libraries/StyleSheet/StyleSheet.js b/packages/react-native/Libraries/StyleSheet/StyleSheet.js index 92c7621274bf..ff549f0af855 100644 --- a/packages/react-native/Libraries/StyleSheet/StyleSheet.js +++ b/packages/react-native/Libraries/StyleSheet/StyleSheet.js @@ -16,12 +16,9 @@ import type { ____DangerouslyImpreciseStyle_Internal, ____DangerouslyImpreciseStyleProp_Internal, ____FontVariant_Internal, - ____ImageStyle_Internal, ____ImageStyleProp_Internal, - ____TextStyle_Internal, ____TextStyleProp_Internal, ____TransformStyle_Internal, - ____ViewStyle_Internal, ____ViewStyleProp_Internal, NativeColorValue, } from './StyleSheetTypes'; @@ -136,8 +133,7 @@ export type TypeForStyleKey< * object of styles to pass to a View that can't be precomputed with * StyleSheet.create. */ -/** @build-types emit-as-interface react-native-web compatibility */ -export type ViewStyle = ____ViewStyle_Internal; +export type {ViewStyle} from './StyleSheetTypes'; /** * This type is an object of the different possible style @@ -154,8 +150,7 @@ export type ViewStyle = ____ViewStyle_Internal; * object of styles to pass to a Text that can't be precomputed with * StyleSheet.create. */ -/** @build-types emit-as-interface react-native-web compatibility */ -export type TextStyle = ____TextStyle_Internal; +export type {TextStyle} from './StyleSheetTypes'; /** * This type is an object of the different possible style @@ -172,8 +167,7 @@ export type TextStyle = ____TextStyle_Internal; * object of styles to pass to an Image that can't be precomputed with * StyleSheet.create. */ -/** @build-types emit-as-interface react-native-web compatibility */ -export type ImageStyle = ____ImageStyle_Internal; +export type {ImageStyle} from './StyleSheetTypes'; /** * WARNING: You probably shouldn't be using this type. This type is an object diff --git a/packages/react-native/Libraries/StyleSheet/StyleSheet.js.flow b/packages/react-native/Libraries/StyleSheet/StyleSheet.js.flow index b4b6d0f97b5e..5b0564a3b9ce 100644 --- a/packages/react-native/Libraries/StyleSheet/StyleSheet.js.flow +++ b/packages/react-native/Libraries/StyleSheet/StyleSheet.js.flow @@ -15,12 +15,9 @@ import type { ____DangerouslyImpreciseStyle_Internal, ____DangerouslyImpreciseStyleProp_Internal, ____FontVariant_Internal, - ____ImageStyle_Internal, ____ImageStyleProp_Internal, - ____TextStyle_Internal, ____TextStyleProp_Internal, ____TransformStyle_Internal, - ____ViewStyle_Internal, ____ViewStyleProp_Internal, NativeColorValue, } from './StyleSheetTypes'; @@ -137,8 +134,7 @@ export type TypeForStyleKey< * object of styles to pass to a View that can't be precomputed with * StyleSheet.create. */ -/** @build-types emit-as-interface react-native-web compatibility */ -export type ViewStyle = ____ViewStyle_Internal; +export type {ViewStyle} from './StyleSheetTypes'; /** * This type is an object of the different possible style @@ -155,8 +151,7 @@ export type ViewStyle = ____ViewStyle_Internal; * object of styles to pass to a Text that can't be precomputed with * StyleSheet.create. */ -/** @build-types emit-as-interface react-native-web compatibility */ -export type TextStyle = ____TextStyle_Internal; +export type {TextStyle} from './StyleSheetTypes'; /** * This type is an object of the different possible style @@ -173,8 +168,7 @@ export type TextStyle = ____TextStyle_Internal; * object of styles to pass to an Image that can't be precomputed with * StyleSheet.create. */ -/** @build-types emit-as-interface react-native-web compatibility */ -export type ImageStyle = ____ImageStyle_Internal; +export type {ImageStyle} from './StyleSheetTypes'; /** * WARNING: You probably shouldn't be using this type. This type is an object diff --git a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js index 5a1951a1e2c6..13b5b4c095d8 100644 --- a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js +++ b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js @@ -910,7 +910,8 @@ export type ____ViewStyle_InternalCore = Readonly<{ ...____ViewStyle_InternalBase, }>; -export type ____ViewStyle_Internal = Readonly<{ +/** @build-types emit-as-interface react-native-web compatibility */ +export type ViewStyle = Readonly<{ ...____ViewStyle_InternalCore, ...____ViewStyle_InternalOverrides, }>; @@ -1047,17 +1048,18 @@ type ____TextStyle_InternalBase = Readonly<{ }>; export type ____TextStyle_InternalCore = Readonly<{ - ...$Exact<____ViewStyle_Internal>, + ...$Exact, ...____TextStyle_InternalBase, }>; -export type ____TextStyle_Internal = Readonly<{ +/** @build-types emit-as-interface react-native-web compatibility */ +export type TextStyle = Readonly<{ ...____TextStyle_InternalCore, ...____TextStyle_InternalOverrides, }>; export type ____ImageStyle_InternalCore = Readonly<{ - ...$Exact<____ViewStyle_Internal>, + ...$Exact, resizeMode?: ImageResizeMode, objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | 'none', tintColor?: ____ColorValue_Internal, @@ -1065,13 +1067,14 @@ export type ____ImageStyle_InternalCore = Readonly<{ overflow?: 'visible' | 'hidden', }>; -export type ____ImageStyle_Internal = Readonly<{ +/** @build-types emit-as-interface react-native-web compatibility */ +export type ImageStyle = Readonly<{ ...____ImageStyle_InternalCore, ...____ImageStyle_InternalOverrides, }>; export type ____DangerouslyImpreciseStyle_InternalCore = Readonly<{ - ...$Exact<____TextStyle_Internal>, + ...$Exact, resizeMode?: ImageResizeMode, objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | 'none', tintColor?: ____ColorValue_Internal, @@ -1095,13 +1098,13 @@ export type ____DangerouslyImpreciseAnimatedStyleProp_Internal = WithAnimatedValue>>; export type ____ViewStyleProp_Internal = StyleProp< - Readonly>, + Readonly>, >; export type ____TextStyleProp_Internal = StyleProp< - Readonly>, + Readonly>, >; export type ____ImageStyleProp_Internal = StyleProp< - Readonly>, + Readonly>, >; export type ____Styles_Internal = { diff --git a/packages/react-native/Libraries/StyleSheet/splitLayoutProps.js b/packages/react-native/Libraries/StyleSheet/splitLayoutProps.js index acf2dbbeedb8..e37b9b749d0b 100644 --- a/packages/react-native/Libraries/StyleSheet/splitLayoutProps.js +++ b/packages/react-native/Libraries/StyleSheet/splitLayoutProps.js @@ -8,14 +8,14 @@ * @format */ -import type {____ViewStyle_Internal} from './StyleSheetTypes'; +import type {ViewStyle} from './StyleSheetTypes'; -export default function splitLayoutProps(props: ?____ViewStyle_Internal): { - outer: ?____ViewStyle_Internal, - inner: ?____ViewStyle_Internal, +export default function splitLayoutProps(props: ?ViewStyle): { + outer: ?ViewStyle, + inner: ?ViewStyle, } { - let outer: ?____ViewStyle_Internal = null; - let inner: ?____ViewStyle_Internal = null; + let outer: ?ViewStyle = null; + let inner: ?ViewStyle = null; if (props != null) { // $FlowFixMe[incompatible-exact] Will contain a subset of keys from `props`. diff --git a/packages/react-native/Libraries/Text/Text.js b/packages/react-native/Libraries/Text/Text.js index d689ec478f14..4044f0f6f3e6 100644 --- a/packages/react-native/Libraries/Text/Text.js +++ b/packages/react-native/Libraries/Text/Text.js @@ -10,7 +10,7 @@ import type {HostInstance} from '../../src/private/types/HostInstance'; import type {TextStyleProp} from '../StyleSheet/StyleSheet'; -import type {____TextStyle_Internal as TextStyleInternal} from '../StyleSheet/StyleSheetTypes'; +import type {TextStyle} from '../StyleSheet/StyleSheetTypes'; import type {GestureResponderEvent} from '../Types/CoreEventTypes'; import type {NativeTextProps} from './TextNativeComponent'; import type {PressRetentionOffset, TextProps} from './TextProps'; @@ -186,22 +186,22 @@ const TextImpl: component( let processedStyle = flattenStyle(_style); if (processedStyle != null) { - let overrides: ?{...TextStyleInternal} = null; + let overrides: ?{...TextStyle} = null; if (typeof processedStyle.fontWeight === 'number') { - overrides = overrides || ({} as {...TextStyleInternal}); + overrides = overrides || ({} as {...TextStyle}); overrides.fontWeight = // $FlowFixMe[incompatible-type] - String(processedStyle.fontWeight) as TextStyleInternal['fontWeight']; + String(processedStyle.fontWeight) as TextStyle['fontWeight']; } if (processedStyle.userSelect != null) { _selectable = userSelectToSelectableMap[processedStyle.userSelect]; - overrides = overrides || ({} as {...TextStyleInternal}); + overrides = overrides || ({} as {...TextStyle}); overrides.userSelect = undefined; } if (processedStyle.verticalAlign != null) { - overrides = overrides || ({} as {...TextStyleInternal}); + overrides = overrides || ({} as {...TextStyle}); overrides.textAlignVertical = verticalAlignToTextAlignVerticalMap[processedStyle.verticalAlign]; overrides.verticalAlign = undefined; diff --git a/packages/react-native/ReactNativeApi.d.ts b/packages/react-native/ReactNativeApi.d.ts index e1654b681c24..726f9a2ec46a 100644 --- a/packages/react-native/ReactNativeApi.d.ts +++ b/packages/react-native/ReactNativeApi.d.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<5f853a6c76b0bcd1d2565b0968145e90>> * * This file was generated by scripts/js-api/build-types/index.js. */ @@ -517,7 +517,7 @@ declare type ____DangerouslyImpreciseStyle_Internal = Readonly< ____DangerouslyImpreciseStyle_InternalOverrides > declare type ____DangerouslyImpreciseStyle_InternalCore = Readonly< - ____TextStyle_Internal & { + TextStyle & { objectFit?: "contain" | "cover" | "fill" | "none" | "scale-down" overlayColor?: ColorValue resizeMode?: ImageResizeMode @@ -616,11 +616,8 @@ declare type ____FontWeight_Internal = | 700 | 800 | 900 -declare type ____ImageStyle_Internal = Readonly< - ____ImageStyle_InternalCore & ____ImageStyle_InternalOverrides -> declare type ____ImageStyle_InternalCore = Readonly< - Omit<____ViewStyle_Internal, "overflow"> & { + Omit & { objectFit?: "contain" | "cover" | "fill" | "none" | "scale-down" overflow?: "hidden" | "visible" overlayColor?: ColorValue @@ -630,7 +627,7 @@ declare type ____ImageStyle_InternalCore = Readonly< > declare type ____ImageStyle_InternalOverrides = {} declare type ____ImageStyleProp_Internal = StyleProp< - Readonly> + Readonly> > declare type ____LayoutStyle_Internal = { readonly alignContent?: @@ -741,9 +738,6 @@ declare type ____ShadowStyle_InternalOverrides = {} declare type ____Styles_Internal = { readonly [key: string]: Partial<____DangerouslyImpreciseStyle_Internal> } -declare type ____TextStyle_Internal = Readonly< - ____TextStyle_InternalCore & ____TextStyle_InternalOverrides -> declare type ____TextStyle_InternalBase = { readonly color?: ____ColorValue_Internal readonly fontFamily?: string @@ -775,11 +769,11 @@ declare type ____TextStyle_InternalBase = { readonly writingDirection?: "auto" | "ltr" | "rtl" } declare type ____TextStyle_InternalCore = Readonly< - ____ViewStyle_Internal & ____TextStyle_InternalBase + ViewStyle & ____TextStyle_InternalBase > declare type ____TextStyle_InternalOverrides = {} declare type ____TextStyleProp_Internal = StyleProp< - Readonly> + Readonly> > declare type ____TransformStyle_Internal = { readonly transform?: @@ -844,9 +838,6 @@ declare type ____TransformStyle_Internal = { readonly transformOrigin?: [number | string, number | string, number | string] | string } -declare type ____ViewStyle_Internal = Readonly< - ____ViewStyle_InternalCore & ____ViewStyle_InternalOverrides -> declare type ____ViewStyle_InternalBase = { readonly backfaceVisibility?: "hidden" | "visible" readonly backgroundColor?: ____ColorValue_Internal @@ -907,7 +898,7 @@ declare type ____ViewStyle_InternalCore = Readonly< > declare type ____ViewStyle_InternalOverrides = {} declare type ____ViewStyleProp_Internal = StyleProp< - Readonly> + Readonly> > declare class _TextInputInstance extends ReactNativeElement_default { clear(): void @@ -982,8 +973,19 @@ declare type AccessibilityEventTypes = "click" | "focus" | "viewHoverEnter" | "windowStateChange" declare type AccessibilityInfo = typeof AccessibilityInfo declare interface AccessibilityProps extends Readonly< - AccessibilityPropsAndroid & AccessibilityPropsIOS -> { + AccessibilityPropsAndroid & AccessibilityPropsIOS & AccessibilityPropsCore +> {} +declare type AccessibilityPropsAndroid = { + readonly accessibilityLabelledBy?: + (Array | undefined) | (string | undefined) + readonly accessibilityLiveRegion?: "assertive" | "none" | "polite" + readonly "aria-labelledby"?: string + readonly "aria-live"?: "assertive" | "off" | "polite" + readonly importantForAccessibility?: + "auto" | "no-hide-descendants" | "no" | "yes" + readonly screenReaderFocusable?: boolean +} +declare type AccessibilityPropsCore = { readonly accessibilityActions?: ReadonlyArray readonly accessibilityHint?: string readonly accessibilityLabel?: string @@ -1004,16 +1006,6 @@ declare interface AccessibilityProps extends Readonly< readonly "aria-valuetext"?: AccessibilityValue["text"] readonly role?: Role } -declare type AccessibilityPropsAndroid = { - readonly accessibilityLabelledBy?: - (Array | undefined) | (string | undefined) - readonly accessibilityLiveRegion?: "assertive" | "none" | "polite" - readonly "aria-labelledby"?: string - readonly "aria-live"?: "assertive" | "off" | "polite" - readonly importantForAccessibility?: - "auto" | "no-hide-descendants" | "no" | "yes" - readonly screenReaderFocusable?: boolean -} declare type AccessibilityPropsIOS = { readonly accessibilityElementsHidden?: boolean readonly accessibilityIgnoresInvertColors?: boolean @@ -1104,8 +1096,9 @@ declare type ActivityIndicatorIOSProps = { readonly hidesWhenStopped?: boolean } declare interface ActivityIndicatorProps extends Readonly< - ViewProps & ActivityIndicatorIOSProps -> { + ViewProps & ActivityIndicatorIOSProps & ActivityIndicatorPropsCore +> {} +declare type ActivityIndicatorPropsCore = { readonly animating?: boolean readonly color?: ColorValue readonly size?: IndicatorSize @@ -1660,7 +1653,8 @@ declare type Builtin = ( ) => Date | Error | RegExp | unknown declare type Button = typeof Button declare type ButtonInstance = React.ComponentRef -declare interface ButtonProps { +declare interface ButtonProps extends ButtonPropsCore {} +declare type ButtonPropsCore = { readonly accessibilityActions?: ReadonlyArray readonly accessibilityHint?: string readonly accessibilityLabel?: string @@ -2424,8 +2418,9 @@ declare class ImageBackground extends React.Component { } declare type ImageBackgroundInstance = ImageBackground declare interface ImageBackgroundProps extends Readonly< - Omit -> { + Omit & ImageBackgroundPropsCore +> {} +declare type ImageBackgroundPropsCore = { readonly children?: React.ReactNode readonly imageRef?: React.Ref> readonly imageStyle?: ImageStyleProp @@ -2492,10 +2487,8 @@ declare type ImageProgressEventIOS = NativeSyntheticEvent< Readonly > declare interface ImageProps extends Readonly< - ImagePropsIOS & ImagePropsAndroid & Omit -> { - readonly style?: ImageStyleProp -} + ImagePropsIOS & ImagePropsAndroid & ImagePropsBase & ImagePropsCore +> {} declare type ImagePropsAndroid = { readonly fadeDuration?: number readonly loadingIndicatorSource?: number | Readonly @@ -2505,16 +2498,19 @@ declare type ImagePropsAndroid = { } declare interface ImagePropsBase extends Readonly< Omit< - Omit, + ViewProps, | "accessibilityLabel" | "accessible" | "aria-label" | "aria-labelledby" | "children" | "onLayout" + | "style" | "testID" - > -> { + > & + ImagePropsBaseCore +> {} +declare type ImagePropsBaseCore = { readonly accessibilityLabel?: string readonly accessible?: boolean readonly alt?: string @@ -2548,6 +2544,9 @@ declare interface ImagePropsBase extends Readonly< readonly tintColor?: ColorValue readonly width?: number } +declare type ImagePropsCore = { + readonly style?: ImageStyleProp +} declare type ImagePropsIOS = { readonly defaultSource?: ImageSource readonly onPartialLoad?: () => void @@ -2564,7 +2563,9 @@ declare type ImageSize = { declare type ImageSource = ImageRequireSource | ImageURISource | ReadonlyArray declare type ImageSourcePropType = ImageSource -declare interface ImageStyle extends ____ImageStyle_Internal {} +declare interface ImageStyle extends Readonly< + ____ImageStyle_InternalCore & ____ImageStyle_InternalOverrides +> {} declare type ImageStyleProp = ____ImageStyleProp_Internal declare type ImageType = ImageAndroid | ImageIOS declare interface ImageURISource { @@ -2606,7 +2607,8 @@ declare class Info { } declare type InnerViewInstance = React.ComponentRef declare type InputAccessoryView = typeof InputAccessoryView -declare interface InputAccessoryViewProps { +declare interface InputAccessoryViewProps extends InputAccessoryViewPropsCore {} +declare type InputAccessoryViewPropsCore = { readonly backgroundColor?: ColorValue readonly children: React.ReactNode readonly nativeID?: string @@ -2729,7 +2731,10 @@ declare class KeyboardAvoidingView extends React.Component< render(): React.ReactNode } declare type KeyboardAvoidingViewInstance = KeyboardAvoidingView -declare interface KeyboardAvoidingViewProps extends Readonly { +declare interface KeyboardAvoidingViewProps extends Readonly< + ViewProps & KeyboardAvoidingViewPropsCore +> {} +declare type KeyboardAvoidingViewPropsCore = { readonly behavior?: "height" | "padding" | "position" readonly contentContainerStyle?: ViewStyleProp readonly enabled?: boolean @@ -3007,7 +3012,8 @@ declare type Message = { }> } declare type Modal = typeof Modal -declare interface ModalBaseProps { +declare interface ModalBaseProps extends ModalBasePropsCore {} +declare type ModalBasePropsCore = { animationType?: "fade" | "none" | "slide" backdropColor?: ColorValue modalRef?: React.Ref @@ -3667,7 +3673,8 @@ declare type PressableInstance = HostInstance declare interface PressableProps extends Readonly< Omit & PressableBaseProps > {} -declare interface PressableStateCallbackType { +declare interface PressableStateCallbackType extends PressableStateCallbackTypeCore {} +declare type PressableStateCallbackTypeCore = { readonly pressed: boolean } declare type PressRetentionOffset = { @@ -5193,7 +5200,9 @@ declare type TextPropsIOS = { lineBreakStrategyIOS?: "hangul-word" | "none" | "push-out" | "standard" suppressHighlighting?: boolean } -declare interface TextStyle extends ____TextStyle_Internal {} +declare interface TextStyle extends Readonly< + ____TextStyle_InternalCore & ____TextStyle_InternalOverrides +> {} declare type TextStyleProp = ____TextStyleProp_Internal declare type Timespan = { endExtras?: Extras @@ -5330,37 +5339,38 @@ declare function TouchableWithoutFeedback( props: TouchableWithoutFeedbackProps, ): React.ReactNode declare interface TouchableWithoutFeedbackProps extends Readonly< - TouchableWithoutFeedbackPropsAndroid & + TouchableWithoutFeedbackPropsCore & + TouchableWithoutFeedbackPropsAndroid & TouchableWithoutFeedbackPropsIOS & AccessibilityProps -> { - readonly children?: React.ReactNode - readonly delayLongPress?: number - readonly delayPressIn?: number - readonly delayPressOut?: number - readonly disabled?: boolean - readonly focusable?: boolean - readonly hitSlop?: EdgeInsetsOrSizeProp - readonly id?: string - readonly importantForAccessibility?: - "auto" | "no-hide-descendants" | "no" | "yes" - readonly nativeID?: string - readonly onAccessibilityAction?: (event: AccessibilityActionEvent) => unknown - readonly onBlur?: (event: BlurEvent) => unknown - readonly onFocus?: (event: FocusEvent) => unknown - readonly onLayout?: (event: LayoutChangeEvent) => unknown - readonly onLongPress?: (event: GestureResponderEvent) => unknown - readonly onPress?: (event: GestureResponderEvent) => unknown - readonly onPressIn?: (event: GestureResponderEvent) => unknown - readonly onPressOut?: (event: GestureResponderEvent) => unknown - readonly pressRetentionOffset?: EdgeInsetsOrSizeProp - readonly rejectResponderTermination?: boolean - readonly style?: ViewStyleProp - readonly testID?: string -} +> {} declare type TouchableWithoutFeedbackPropsAndroid = { touchSoundDisabled?: boolean } +declare type TouchableWithoutFeedbackPropsCore = { + children?: React.ReactNode + delayLongPress?: number + delayPressIn?: number + delayPressOut?: number + disabled?: boolean + focusable?: boolean + hitSlop?: EdgeInsetsOrSizeProp + id?: string + importantForAccessibility?: "auto" | "no-hide-descendants" | "no" | "yes" + nativeID?: string + onAccessibilityAction?: (event: AccessibilityActionEvent) => unknown + onBlur?: (event: BlurEvent) => unknown + onFocus?: (event: FocusEvent) => unknown + onLayout?: (event: LayoutChangeEvent) => unknown + onLongPress?: (event: GestureResponderEvent) => unknown + onPress?: (event: GestureResponderEvent) => unknown + onPressIn?: (event: GestureResponderEvent) => unknown + onPressOut?: (event: GestureResponderEvent) => unknown + pressRetentionOffset?: EdgeInsetsOrSizeProp + rejectResponderTermination?: boolean + style?: ViewStyleProp + testID?: string +} declare type TouchableWithoutFeedbackPropsIOS = {} declare type TouchEventProps = { readonly onTouchCancel?: (e: GestureResponderEvent) => void @@ -5569,7 +5579,9 @@ declare type ViewPropsAndroid = { declare type ViewPropsIOS = { readonly shouldRasterizeIOS?: boolean } -declare interface ViewStyle extends ____ViewStyle_Internal {} +declare interface ViewStyle extends Readonly< + ____ViewStyle_InternalCore & ____ViewStyle_InternalOverrides +> {} declare type ViewStyleProp = ____ViewStyleProp_Internal declare type VirtualizedList = typeof VirtualizedList declare class VirtualizedList_default extends StateSafePureComponent_default< @@ -5741,24 +5753,24 @@ export { AccessibilityActionEvent, // a0d4daa0 AccessibilityActionInfo, // db47a917 AccessibilityInfo, // 23a3aa9b - AccessibilityProps, // b703f8d9 + AccessibilityProps, // db9967d1 AccessibilityRole, // f2f2e066 AccessibilityState, // b0c2b3f7 AccessibilityValue, // cf8bcb74 ActionSheetIOS, // b558559e ActionSheetIOSOptions, // 1756eb5a - ActivityIndicator, // 7bb76795 + ActivityIndicator, // 35880f07 ActivityIndicatorInstance, // a82dd4e7 - ActivityIndicatorProps, // e3c81e37 + ActivityIndicatorProps, // 1f6982d0 Alert, // a398a509 AlertButton, // bf1a3b60 AlertButtonStyle, // ec9fb242 AlertOptions, // 8a116d2a AlertType, // 5ab91217 AndroidKeyboardEvent, // e03becc8 - Animated, // b73ca27a + Animated, // 09e033b6 AppConfig, // 35c0ca70 - AppRegistry, // eb82174d + AppRegistry, // 4edd2ed3 AppState, // 12012be5 AppStateEvent, // 80f034c3 AppStateStatus, // 447e5ef2 @@ -5770,9 +5782,9 @@ export { BackPressEventName, // 4620fb76 BlurEvent, // 4ba4f941 BoxShadowValue, // b679703f - Button, // 1618c5dc - ButtonInstance, // b62f6c43 - ButtonProps, // 21c5780c + Button, // 21ca0b0c + ButtonInstance, // 1420469f + ButtonProps, // ac8c2275 Clipboard, // 41addb89 CodegenTypes, // ab4986cc ColorSchemeName, // 6615edd6 @@ -5790,9 +5802,9 @@ export { DimensionsPayload, // 653bc26c DisplayMetrics, // 1dc35cef DisplayMetricsAndroid, // 872e62eb - DrawerLayoutAndroid, // 10f3ab23 + DrawerLayoutAndroid, // 8afda155 DrawerLayoutAndroidInstance, // aa243cbf - DrawerLayoutAndroidProps, // 8144971b + DrawerLayoutAndroidProps, // 34a48ed7 DrawerSlideEvent, // c4ab8fba DropShadowValue, // e9df2606 DynamicColorIOS, // d96c228c @@ -5808,9 +5820,9 @@ export { EventSubscription, // b8d084aa ExtendedExceptionData, // 5a6ccf5a FilterFunction, // bf24c0e3 - FlatList, // 31e4dbb8 - FlatListInstance, // e256df59 - FlatListProps, // d134a60c + FlatList, // 6166d7cc + FlatListInstance, // c60f0b77 + FlatListProps, // fce7aa33 FocusEvent, // 850f1517 FontVariant, // 7c7558bb GestureResponderEvent, // 14d3e77a @@ -5821,17 +5833,17 @@ export { IEventEmitter, // fbef6131 IOSKeyboardEvent, // e67bfe3a IgnorePattern, // ec6f6ece - Image, // 70beaf51 - ImageBackground, // 125f114f - ImageBackgroundInstance, // b32a44b1 - ImageBackgroundProps, // 58c484ed + Image, // 4993d598 + ImageBackground, // ae70e62b + ImageBackgroundInstance, // 94ac9674 + ImageBackgroundProps, // e4415bdf ImageErrorEvent, // 978933f4 ImageInstance, // 9a100753 ImageLoadEvent, // 77f0b718 ImageProgressEventIOS, // 445331a4 - ImageProps, // 0b057370 + ImageProps, // c2c6542a ImagePropsAndroid, // ee00e1d5 - ImagePropsBase, // 360c2972 + ImagePropsBase, // e8c813d3 ImagePropsIOS, // 9e19c85d ImageRequireSource, // 681d683b ImageResizeMode, // d51106e2 @@ -5839,19 +5851,19 @@ export { ImageSize, // 1c47cf88 ImageSource, // ea31cf4a ImageSourcePropType, // f522e093 - ImageStyle, // 23278d38 + ImageStyle, // 85dc694a ImageURISource, // 443d047c - InputAccessoryView, // 69da97d8 - InputAccessoryViewProps, // 6c4ba417 + InputAccessoryView, // ab6e2a66 + InputAccessoryViewProps, // 73685b83 InputModeOptions, // 4e8581b9 Insets, // e7fe432a KeyDownEvent, // 5b147614 KeyEvent, // 20fa4267 KeyUpEvent, // 57f832c5 Keyboard, // 49414c97 - KeyboardAvoidingView, // 86ce3237 - KeyboardAvoidingViewInstance, // 39e5e0cb - KeyboardAvoidingViewProps, // 5ea2df10 + KeyboardAvoidingView, // a4f59a6a + KeyboardAvoidingViewInstance, // a5422c5e + KeyboardAvoidingViewProps, // 3516e037 KeyboardEvent, // c3f895d4 KeyboardEventEasing, // af4091c8 KeyboardEventName, // 59299ad6 @@ -5876,10 +5888,10 @@ export { MeasureInWindowOnSuccessCallback, // a285f598 MeasureLayoutOnSuccessCallback, // 3592502a MeasureOnSuccessCallback, // 82824e59 - Modal, // ddb43746 - ModalBaseProps, // c294cc46 + Modal, // d02a82e4 + ModalBaseProps, // f42d5e75 ModalInstance, // d466ce77 - ModalProps, // a073d560 + ModalProps, // fb675cc4 ModalPropsAndroid, // 515fb173 ModalPropsIOS, // 664ecb7e ModeChangeEvent, // f64bf69d @@ -5915,15 +5927,15 @@ export { PointerEvent, // ff599afe PressabilityConfig, // fea539a5 PressabilityEventHandlers, // c222648b - Pressable, // 73cbe498 + Pressable, // 2ebf23a3 PressableAndroidRippleConfig, // ee32eaca PressableInstance, // eebfe911 - PressableProps, // 573ac60a - PressableStateCallbackType, // 5e0cfa78 + PressableProps, // d3b90ef3 + PressableStateCallbackType, // f83728cd ProcessedColorValue, // 33f74304 - ProgressBarAndroid, // db8f6a6b + ProgressBarAndroid, // b8ae77e8 ProgressBarAndroidInstance, // ab545ef1 - ProgressBarAndroidProps, // 6484d368 + ProgressBarAndroidProps, // 9b7241c1 PublicRootInstance, // 8040afd7 PublicTextInstance, // 6937c7bf PushNotificationEventName, // 84e7e150 @@ -5931,9 +5943,9 @@ export { PushNotificationPermissions, // c2e7ae4f Rationale, // 5df1b1c1 ReactNativeVersion, // abd76827 - RefreshControl, // 1fc5c032 - RefreshControlInstance, // 7cef228c - RefreshControlProps, // c03c6dd3 + RefreshControl, // c4dc78df + RefreshControlInstance, // 14c393da + RefreshControlProps, // 76a43e28 RefreshControlPropsAndroid, // 8ac931ca RefreshControlPropsIOS, // 72a36381 Registry, // 6c39216d @@ -5942,27 +5954,27 @@ export { Role, // af7b889d RootTag, // 3cd10504 RootTagContext, // 38bfc8f6 - RootViewStyleProvider, // a4547094 + RootViewStyleProvider, // eaff83cc Runnable, // 594dd93a Runnables, // 4367c557 - SafeAreaView, // 2a5620cd + SafeAreaView, // eb3edf8f SafeAreaViewInstance, // 21dba39c ScaledSize, // 07e417c7 ScrollEvent, // d7abdd0a - ScrollResponderType, // 4fb54e25 + ScrollResponderType, // 28dbceda ScrollToLocationParamsType, // d7ecdad1 - ScrollView, // 74f481ff - ScrollViewImperativeMethods, // 308dd401 - ScrollViewInstance, // b86e49e8 - ScrollViewProps, // 3bcd863e + ScrollView, // d006f1d5 + ScrollViewImperativeMethods, // 6fa109b3 + ScrollViewInstance, // b3717858 + ScrollViewProps, // ba13218f ScrollViewPropsAndroid, // 02f3df2e ScrollViewPropsIOS, // 807cb4f6 ScrollViewScrollToOptions, // 3313411e SectionBase, // 9f13db00 - SectionList, // f7750d02 + SectionList, // f6c8a865 SectionListData, // 1a4de01a - SectionListInstance, // 6f7c0fa0 - SectionListProps, // d1569771 + SectionListInstance, // 3a4f983c + SectionListProps, // 37613df4 SectionListRenderItem, // 715b2086 SectionListRenderItemInfo, // 4a48a922 Separators, // 6a45f7e3 @@ -5979,19 +5991,19 @@ export { StatusBarProps, // c2a44d88 StatusBarStyle, // 78f53eea StyleProp, // fa0e9b4a - StyleSheet, // 6a67f398 + StyleSheet, // df1ba47c SubmitBehavior, // c4ddf490 - Switch, // cf0d6ce5 + Switch, // 7e2b771a SwitchChangeEvent, // 899635b1 SwitchInstance, // 3c50eec5 - SwitchProps, // 9efb522c + SwitchProps, // 1de46724 Systrace, // 626d178c TVViewPropsIOS, // 330ce7b5 TargetedEvent, // 16e98910 TaskProvider, // 266dedf2 - Text, // 3ccd8020 + Text, // ac56bf90 TextContentType, // 239b3ecc - TextInput, // 89af456b + TextInput, // 38d9b4cf TextInputAndroidProps, // 9ebbc103 TextInputBlurEvent, // b77af40e TextInputChangeEvent, // f55eef98 @@ -6001,44 +6013,44 @@ export { TextInputIOSProps, // fb3c9327 TextInputInstance, // 5a0c0e0d TextInputKeyPressEvent, // 546c5d07 - TextInputProps, // a93c2e69 + TextInputProps, // 87d0121d TextInputSelectionChangeEvent, // e58f2abc TextInputSubmitEditingEvent, // 6bcb2aa5 TextInstance, // 05463a96 TextLayoutEvent, // 3f54186f - TextProps, // 2e3336ca - TextStyle, // d7678842 + TextProps, // 9407ed78 + TextStyle, // 898adfd1 ToastAndroid, // 88a8969a - TouchableHighlight, // edab1b07 + TouchableHighlight, // 2be0ef10 TouchableHighlightInstance, // b510c0eb - TouchableHighlightProps, // 08cd59e1 - TouchableNativeFeedback, // e2791ad5 - TouchableNativeFeedbackInstance, // ce1ad7e9 - TouchableNativeFeedbackProps, // ffc9c1d4 - TouchableOpacity, // 46c89652 + TouchableHighlightProps, // ff78d31e + TouchableNativeFeedback, // 4797811e + TouchableNativeFeedbackInstance, // 0e808653 + TouchableNativeFeedbackProps, // 0976e241 + TouchableOpacity, // 665f9e6a TouchableOpacityInstance, // b186055b - TouchableOpacityProps, // d7c93220 - TouchableWithoutFeedback, // da544b16 - TouchableWithoutFeedbackProps, // a14626e7 + TouchableOpacityProps, // 8a5d6cb9 + TouchableWithoutFeedback, // 630a4cef + TouchableWithoutFeedbackProps, // e8d95570 TransformsStyle, // 65e70f18 TurboModule, // dfe29706 TurboModuleRegistry, // 4ace6db2 UIManager, // afbcdf05 UTFSequence, // ad625158 Vibration, // 31e4bbf8 - View, // 14779d0c + View, // 97793c47 ViewInstance, // ffde5573 - ViewProps, // 46cb2061 + ViewProps, // 329828d7 ViewPropsAndroid, // 55e81851 ViewPropsIOS, // 58ee19bf - ViewStyle, // e75eec1e + ViewStyle, // 4e2746d6 VirtualViewMode, // 6be59722 VirtualizedList, // 68c7345e VirtualizedListInstance, // 423ee7c0 - VirtualizedListProps, // 89659fe0 + VirtualizedListProps, // dacc8843 VirtualizedSectionList, // 9fd9cd61 VirtualizedSectionListInstance, // 12b706d5 - VirtualizedSectionListProps, // 52c34787 + VirtualizedSectionListProps, // c9c8ed40 WrapperComponentProvider, // 9ef54e61 codegenNativeCommands, // 628a7c0a codegenNativeComponent, // 520daa94 From 62e60c352147d2fcc08e3ee87d4b6c8f56d11d5e Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Mon, 5 Oct 2026 17:21:13 +0000 Subject: [PATCH 34/35] Release 0.88.0-rc.4 #publish-packages-to-npm&next --- package.json | 4 ++-- packages/asset-utils/package.json | 2 +- packages/assets-registry/package.json | 2 +- packages/babel-plugin-codegen/package.json | 4 ++-- packages/community-cli-plugin/package.json | 8 ++++---- packages/debugger-frontend/package.json | 2 +- packages/debugger-shell/bin/react-native-devtools | 12 ++++++------ packages/debugger-shell/package.json | 2 +- packages/dev-middleware/package.json | 8 ++++---- packages/eslint-config-react-native/package.json | 4 ++-- packages/eslint-plugin-react-native/package.json | 2 +- packages/eslint-plugin-specs/package.json | 4 ++-- packages/gradle-plugin/package.json | 2 +- packages/jest-preset/package.json | 4 ++-- packages/metro-config/package.json | 6 +++--- packages/new-app-screen/package.json | 4 ++-- packages/normalize-color/package.json | 2 +- packages/polyfills/package.json | 2 +- packages/react-native-babel-preset/package.json | 4 ++-- .../react-native-babel-transformer/package.json | 4 ++-- packages/react-native-codegen/package.json | 2 +- .../react-native-compatibility-check/package.json | 4 ++-- .../react-native-popup-menu-android/package.json | 6 +++--- .../Libraries/Core/ReactNativeVersion.js | 2 +- packages/react-native/React/Base/RCTVersion.m | 2 +- .../react-native/ReactAndroid/gradle.properties | 2 +- .../react/modules/systeminfo/ReactNativeVersion.kt | 2 +- .../ReactCommon/cxxreact/ReactNativeVersion.h | 2 +- packages/react-native/package.json | 14 +++++++------- .../generate-artifacts-executor-test.js.snap | 8 ++++---- packages/rn-tester/package.json | 8 ++++---- packages/typescript-config/package.json | 2 +- packages/virtualized-lists/package.json | 4 ++-- private/helloworld/package.json | 12 ++++++------ .../package.json | 2 +- 35 files changed, 77 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index 3c48180e81cc..d8c06bf3b4cb 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,8 @@ "@jest/create-cache-key-function": "^29.7.0", "@microsoft/api-extractor": "^7.52.2", "@octokit/rest": "^22.0.0", - "@react-native/metro-babel-transformer": "0.88.0-rc.3", - "@react-native/metro-config": "0.88.0-rc.3", + "@react-native/metro-babel-transformer": "0.88.0-rc.4", + "@react-native/metro-config": "0.88.0-rc.4", "@tsconfig/node22": "22.0.2", "@types/react": "^19.1.0", "@typescript-eslint/parser": "^8.59.2", diff --git a/packages/asset-utils/package.json b/packages/asset-utils/package.json index 120a692be7db..20eeb0ce7b45 100644 --- a/packages/asset-utils/package.json +++ b/packages/asset-utils/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/asset-utils", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Asset path utilities for React Native.", "license": "MIT", "repository": { diff --git a/packages/assets-registry/package.json b/packages/assets-registry/package.json index 2aa77f613217..5e44d1938547 100644 --- a/packages/assets-registry/package.json +++ b/packages/assets-registry/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/assets-registry", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Asset support code for React Native.", "license": "MIT", "repository": { diff --git a/packages/babel-plugin-codegen/package.json b/packages/babel-plugin-codegen/package.json index 78bb73437f3c..2a952033653f 100644 --- a/packages/babel-plugin-codegen/package.json +++ b/packages/babel-plugin-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-plugin-codegen", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Babel plugin to generate native module and view manager code for React Native.", "license": "MIT", "repository": { @@ -26,7 +26,7 @@ ], "dependencies": { "@babel/traverse": "^7.29.0", - "@react-native/codegen": "0.88.0-rc.3" + "@react-native/codegen": "0.88.0-rc.4" }, "devDependencies": { "@babel/core": "^7.25.2" diff --git a/packages/community-cli-plugin/package.json b/packages/community-cli-plugin/package.json index dbb244934646..454129f44764 100644 --- a/packages/community-cli-plugin/package.json +++ b/packages/community-cli-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/community-cli-plugin", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Core CLI commands for React Native", "keywords": [ "react-native", @@ -31,8 +31,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.3", - "@react-native/dev-middleware": "0.88.0-rc.3", + "@react-native/asset-utils": "0.88.0-rc.4", + "@react-native/dev-middleware": "0.88.0-rc.4", "commander": "^12.0.0", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -44,7 +44,7 @@ }, "peerDependencies": { "@react-native-community/cli": "*", - "@react-native/metro-config": "0.88.0-rc.3" + "@react-native/metro-config": "0.88.0-rc.4" }, "peerDependenciesMeta": { "@react-native-community/cli": { diff --git a/packages/debugger-frontend/package.json b/packages/debugger-frontend/package.json index d68ab8408b81..a21bcfc3a691 100644 --- a/packages/debugger-frontend/package.json +++ b/packages/debugger-frontend/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/debugger-frontend", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Debugger frontend for React Native based on Chrome DevTools", "keywords": [ "react-native", diff --git a/packages/debugger-shell/bin/react-native-devtools b/packages/debugger-shell/bin/react-native-devtools index 0dd373dfa94e..bfc680482acf 100755 --- a/packages/debugger-shell/bin/react-native-devtools +++ b/packages/debugger-shell/bin/react-native-devtools @@ -1,6 +1,6 @@ #!/usr/bin/env dotslash -// @generated SignedSource<<1c6ca2efc5c75d6d1e01202633fc89cd>> +// @generated SignedSource<<5e67cdd7a78f826c9a5ab808c32517e3>> { @@ -12,7 +12,7 @@ "digest": "020eea3cf10f77b8f4e1ae4a2aaa7d78a77c3802de6b00448866aa9c860509c4", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-linux-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.4/React.Native.DevTools-linux-aarch64.tar.gz" }, { "type": "http", @@ -28,7 +28,7 @@ "digest": "933aa98eb68da7f8d1b6e83e611e51f66d026f3b410dc13577faa6adf1b0f75c", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-linux-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.4/React.Native.DevTools-linux-x86_64.tar.gz" }, { "type": "http", @@ -44,7 +44,7 @@ "digest": "4a1c234b1cf27f1ff006fafce6628b8ef6993d7d3298c6ed2127e3055c93dcc6", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-macos-aarch64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.4/React.Native.DevTools-macos-aarch64.tar.gz" }, { "type": "http", @@ -60,7 +60,7 @@ "digest": "9f1de3cb78688befaea4d9e5f640a66833dd44ad58b05590a7e07bce279bf532", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-macos-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.4/React.Native.DevTools-macos-x86_64.tar.gz" }, { "type": "http", @@ -76,7 +76,7 @@ "digest": "5b56e22828549f12be49f0431fd74c54dcebfbfb4277e4b87573ec1ab084c288", "providers": [ { - "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.3/React.Native.DevTools-windows-x86_64.tar.gz" + "url": "https://github.com/facebook/react-native/releases/download/v0.88.0-rc.4/React.Native.DevTools-windows-x86_64.tar.gz" }, { "type": "http", diff --git a/packages/debugger-shell/package.json b/packages/debugger-shell/package.json index 5acb2f81d5b1..5af52ec8ec89 100644 --- a/packages/debugger-shell/package.json +++ b/packages/debugger-shell/package.json @@ -1,7 +1,7 @@ { "name": "@react-native/debugger-shell", "productName": "React Native DevTools", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Experimental debugger shell for React Native for use with @react-native/debugger-frontend", "keywords": [ "react-native", diff --git a/packages/dev-middleware/package.json b/packages/dev-middleware/package.json index 0adf644172dd..f2e7c04e9fa5 100644 --- a/packages/dev-middleware/package.json +++ b/packages/dev-middleware/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/dev-middleware", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Dev server middleware for React Native", "keywords": [ "react-native", @@ -32,8 +32,8 @@ }, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.88.0-rc.3", - "@react-native/debugger-shell": "0.88.0-rc.3", + "@react-native/debugger-frontend": "0.88.0-rc.4", + "@react-native/debugger-shell": "0.88.0-rc.4", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", @@ -43,7 +43,7 @@ "ws": "^7.5.10" }, "devDependencies": { - "@react-native/debugger-shell": "0.88.0-rc.3", + "@react-native/debugger-shell": "0.88.0-rc.4", "selfsigned": "^5.5.0", "undici": "^6.23.0", "wait-for-expect": "^3.0.2" diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index 9d4f446fbb61..bcdde42d739a 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-config", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "ESLint config for React Native", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", - "@react-native/eslint-plugin": "0.88.0-rc.3", + "@react-native/eslint-plugin": "0.88.0-rc.4", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", "eslint-config-prettier": "^8.5.0", diff --git a/packages/eslint-plugin-react-native/package.json b/packages/eslint-plugin-react-native/package.json index 0ecae7c1786d..29daddb09a36 100644 --- a/packages/eslint-plugin-react-native/package.json +++ b/packages/eslint-plugin-react-native/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "ESLint rules for @react-native/eslint-config", "license": "MIT", "repository": { diff --git a/packages/eslint-plugin-specs/package.json b/packages/eslint-plugin-specs/package.json index 85dd8a9e2168..79a7cef95074 100644 --- a/packages/eslint-plugin-specs/package.json +++ b/packages/eslint-plugin-specs/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/eslint-plugin-specs", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "ESLint rules to validate NativeModule and Component Specs", "license": "MIT", "repository": { @@ -32,7 +32,7 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@react-native/codegen": "0.88.0-rc.3", + "@react-native/codegen": "0.88.0-rc.4", "make-dir": "^2.1.0", "pirates": "^4.0.1", "flow-parser": "0.327.0", diff --git a/packages/gradle-plugin/package.json b/packages/gradle-plugin/package.json index ac047cb62396..49ecee40ed6e 100644 --- a/packages/gradle-plugin/package.json +++ b/packages/gradle-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/gradle-plugin", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Gradle Plugin for React Native", "license": "MIT", "repository": { diff --git a/packages/jest-preset/package.json b/packages/jest-preset/package.json index 56ea651cb9ca..64d8cb5233ab 100644 --- a/packages/jest-preset/package.json +++ b/packages/jest-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/jest-preset", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Jest preset for React Native apps", "keywords": [ "jest", @@ -29,7 +29,7 @@ ], "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/js-polyfills": "0.88.0-rc.3", + "@react-native/js-polyfills": "0.88.0-rc.4", "babel-jest": "^29.7.0", "jest-environment-node": "^29.7.0", "regenerator-runtime": "^0.13.2" diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index 2cd74d12014a..e885ad5c14a4 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-config", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Metro configuration for React Native.", "license": "MIT", "repository": { @@ -35,8 +35,8 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/js-polyfills": "0.88.0-rc.3", - "@react-native/metro-babel-transformer": "0.88.0-rc.3", + "@react-native/js-polyfills": "0.88.0-rc.4", + "@react-native/metro-babel-transformer": "0.88.0-rc.4", "metro-config": "^0.87.1", "metro-runtime": "^0.87.1" } diff --git a/packages/new-app-screen/package.json b/packages/new-app-screen/package.json index a4de81f40e8f..27ff18c49a36 100644 --- a/packages/new-app-screen/package.json +++ b/packages/new-app-screen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/new-app-screen", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "NewAppScreen component for React Native", "keywords": [ "react-native" @@ -22,7 +22,7 @@ "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.3" + "react-native": "0.88.0-rc.4" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/normalize-color/package.json b/packages/normalize-color/package.json index b03ff51b9103..070ba4fba258 100644 --- a/packages/normalize-color/package.json +++ b/packages/normalize-color/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/normalize-colors", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Color normalization for React Native.", "license": "MIT", "repository": { diff --git a/packages/polyfills/package.json b/packages/polyfills/package.json index ea38fd6166f1..666b13f71b80 100644 --- a/packages/polyfills/package.json +++ b/packages/polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/js-polyfills", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Polyfills for React Native.", "license": "MIT", "repository": { diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 1c43f108d587..4b6ad5db35c8 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/babel-preset", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Babel preset for React Native applications", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@react-native/babel-plugin-codegen": "0.88.0-rc.3", + "@react-native/babel-plugin-codegen": "0.88.0-rc.4", "flow-parser": "0.327.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" diff --git a/packages/react-native-babel-transformer/package.json b/packages/react-native-babel-transformer/package.json index 6828adff8c32..92396682658c 100644 --- a/packages/react-native-babel-transformer/package.json +++ b/packages/react-native-babel-transformer/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/metro-babel-transformer", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Babel transformer for React Native applications.", "repository": { "type": "git", @@ -27,7 +27,7 @@ ], "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.88.0-rc.3", + "@react-native/babel-preset": "0.88.0-rc.4", "flow-parser": "0.327.0", "nullthrows": "^1.1.1" }, diff --git a/packages/react-native-codegen/package.json b/packages/react-native-codegen/package.json index e0987a52ce54..88788816ec17 100644 --- a/packages/react-native-codegen/package.json +++ b/packages/react-native-codegen/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/codegen", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Code generation tools for React Native", "license": "MIT", "repository": { diff --git a/packages/react-native-compatibility-check/package.json b/packages/react-native-compatibility-check/package.json index 999cc33f35a6..07466754ca59 100644 --- a/packages/react-native-compatibility-check/package.json +++ b/packages/react-native-compatibility-check/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/compatibility-check", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Check a React Native app's boundary between JS and Native for incompatibilities", "license": "MIT", "repository": { @@ -38,7 +38,7 @@ "prepack": "node ../../scripts/build/prepack.js" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.3" + "@react-native/codegen": "0.88.0-rc.4" }, "devDependencies": { "flow-remove-types": "^2.237.2", diff --git a/packages/react-native-popup-menu-android/package.json b/packages/react-native-popup-menu-android/package.json index c1d70fe8047b..80bacb15f682 100644 --- a/packages/react-native-popup-menu-android/package.json +++ b/packages/react-native-popup-menu-android/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/popup-menu-android", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "PopupMenu for the Android platform", "repository": { "type": "git", @@ -26,12 +26,12 @@ }, "license": "MIT", "devDependencies": { - "@react-native/codegen": "0.88.0-rc.3" + "@react-native/codegen": "0.88.0-rc.4" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", - "react-native": "0.88.0-rc.3" + "react-native": "0.88.0-rc.4" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/react-native/Libraries/Core/ReactNativeVersion.js b/packages/react-native/Libraries/Core/ReactNativeVersion.js index d567902f220e..f19df748efbf 100644 --- a/packages/react-native/Libraries/Core/ReactNativeVersion.js +++ b/packages/react-native/Libraries/Core/ReactNativeVersion.js @@ -29,7 +29,7 @@ export default class ReactNativeVersion { static major: number = 0; static minor: number = 88; static patch: number = 0; - static prerelease: string | null = 'rc.3'; + static prerelease: string | null = 'rc.4'; static getVersionString(): string { return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`; diff --git a/packages/react-native/React/Base/RCTVersion.m b/packages/react-native/React/Base/RCTVersion.m index 58da42d4fdb7..3792bcfc1e1f 100644 --- a/packages/react-native/React/Base/RCTVersion.m +++ b/packages/react-native/React/Base/RCTVersion.m @@ -24,7 +24,7 @@ RCTVersionMajor: @(0), RCTVersionMinor: @(88), RCTVersionPatch: @(0), - RCTVersionPrerelease: @"rc.3", + RCTVersionPrerelease: @"rc.4", }; }); return __rnVersion; diff --git a/packages/react-native/ReactAndroid/gradle.properties b/packages/react-native/ReactAndroid/gradle.properties index dd5cdd00be48..df7876a44a97 100644 --- a/packages/react-native/ReactAndroid/gradle.properties +++ b/packages/react-native/ReactAndroid/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.88.0-rc.3 +VERSION_NAME=0.88.0-rc.4 react.internal.publishingGroup=com.facebook.react react.internal.hermesPublishingGroup=com.facebook.hermes diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt index 93b54b318463..d0725729761d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt @@ -15,6 +15,6 @@ public object ReactNativeVersion { "major" to 0, "minor" to 88, "patch" to 0, - "prerelease" to "rc.3" + "prerelease" to "rc.4" ) } diff --git a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h index 1c4fe16e13c4..15cdb21442a8 100644 --- a/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h +++ b/packages/react-native/ReactCommon/cxxreact/ReactNativeVersion.h @@ -22,7 +22,7 @@ struct ReactNativeVersionType { int32_t Major = 0; int32_t Minor = 88; int32_t Patch = 0; - std::string_view Prerelease = "rc.3"; + std::string_view Prerelease = "rc.4"; }; constexpr ReactNativeVersionType ReactNativeVersion; diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 94aa881daf7d..38fd6e259b52 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "A framework for building native apps using React", "license": "MIT", "repository": { @@ -154,12 +154,12 @@ } }, "dependencies": { - "@react-native/asset-utils": "0.88.0-rc.3", - "@react-native/codegen": "0.88.0-rc.3", - "@react-native/community-cli-plugin": "0.88.0-rc.3", - "@react-native/gradle-plugin": "0.88.0-rc.3", - "@react-native/normalize-colors": "0.88.0-rc.3", - "@react-native/virtualized-lists": "0.88.0-rc.3", + "@react-native/asset-utils": "0.88.0-rc.4", + "@react-native/codegen": "0.88.0-rc.4", + "@react-native/community-cli-plugin": "0.88.0-rc.4", + "@react-native/gradle-plugin": "0.88.0-rc.4", + "@react-native/normalize-colors": "0.88.0-rc.4", + "@react-native/virtualized-lists": "0.88.0-rc.4", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "flow-parser": "0.327.0", diff --git a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap index 4a0930b2dd28..e7e73c4f43fe 100644 --- a/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap +++ b/packages/react-native/scripts/codegen/__tests__/__snapshots__/generate-artifacts-executor-test.js.snap @@ -79,7 +79,7 @@ exports[`execute test-app "ReactAppDependencyProvider/ReactAppDependencyProvider # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.3\\" +version = \\"0.88.0-rc.4\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -399,7 +399,7 @@ exports[`execute test-app "ReactCodegen/ReactCodegen.podspec" should match snaps # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.3\\" +version = \\"0.88.0-rc.4\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -590,7 +590,7 @@ exports[`execute test-app-legacy "ReactAppDependencyProvider/ReactAppDependencyP # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.3\\" +version = \\"0.88.0-rc.4\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. @@ -882,7 +882,7 @@ exports[`execute test-app-legacy "ReactCodegen/ReactCodegen.podspec" should matc # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. -version = \\"0.88.0-rc.3\\" +version = \\"0.88.0-rc.4\\" source = { :git => 'https://github.com/facebook/react-native.git' } if version == '1000.0.0' # This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in. diff --git a/packages/rn-tester/package.json b/packages/rn-tester/package.json index c29aab13b7ab..883b3cb4dd82 100644 --- a/packages/rn-tester/package.json +++ b/packages/rn-tester/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/tester", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "private": true, "description": "React Native tester app.", "license": "MIT", @@ -26,8 +26,8 @@ "e2e-test-ios": "./scripts/maestro-test-ios.sh" }, "dependencies": { - "@react-native/new-app-screen": "0.88.0-rc.3", - "@react-native/popup-menu-android": "0.88.0-rc.3", + "@react-native/new-app-screen": "0.88.0-rc.4", + "@react-native/popup-menu-android": "0.88.0-rc.4", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "nullthrows": "^1.1.1", @@ -36,7 +36,7 @@ }, "peerDependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.3" + "react-native": "0.88.0-rc.4" }, "codegenConfig": { "name": "AppSpecs", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 0dd6b22ba227..4ffac75accf5 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/typescript-config", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Default TypeScript configuration for React Native apps", "license": "MIT", "repository": { diff --git a/packages/virtualized-lists/package.json b/packages/virtualized-lists/package.json index 13c7eda5662b..45d29e1a9ca3 100644 --- a/packages/virtualized-lists/package.json +++ b/packages/virtualized-lists/package.json @@ -1,6 +1,6 @@ { "name": "@react-native/virtualized-lists", - "version": "0.88.0-rc.3", + "version": "0.88.0-rc.4", "description": "Virtualized lists for React Native.", "license": "MIT", "repository": { @@ -53,7 +53,7 @@ "peerDependencies": { "@types/react": "^19.2.0", "react": "*", - "react-native": "0.88.0-rc.3" + "react-native": "0.88.0-rc.4" }, "peerDependenciesMeta": { "@types/react": { diff --git a/private/helloworld/package.json b/private/helloworld/package.json index cc4af834923f..aefada590221 100644 --- a/private/helloworld/package.json +++ b/private/helloworld/package.json @@ -13,18 +13,18 @@ }, "dependencies": { "react": "19.3.0", - "react-native": "0.88.0-rc.3" + "react-native": "0.88.0-rc.4" }, "devDependencies": { "@babel/core": "^7.25.2", "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", - "@react-native/babel-preset": "0.88.0-rc.3", + "@react-native/babel-preset": "0.88.0-rc.4", "@react-native/core-cli-utils": "*", - "@react-native/eslint-config": "0.88.0-rc.3", - "@react-native/jest-preset": "0.88.0-rc.3", - "@react-native/metro-config": "0.88.0-rc.3", - "@react-native/typescript-config": "0.88.0-rc.3", + "@react-native/eslint-config": "0.88.0-rc.4", + "@react-native/jest-preset": "0.88.0-rc.4", + "@react-native/metro-config": "0.88.0-rc.4", + "@react-native/typescript-config": "0.88.0-rc.4", "@types/jest": "^29.5.14", "commander": "^12.0.0", "eslint": "^8.19.0", diff --git a/private/react-native-codegen-typescript-test/package.json b/private/react-native-codegen-typescript-test/package.json index 88e7b50e3632..5fe958c5faa5 100644 --- a/private/react-native-codegen-typescript-test/package.json +++ b/private/react-native-codegen-typescript-test/package.json @@ -13,7 +13,7 @@ "prepare": "yarn run build" }, "dependencies": { - "@react-native/codegen": "0.88.0-rc.3" + "@react-native/codegen": "0.88.0-rc.4" }, "devDependencies": { "@babel/core": "^7.25.2", From aa78eebfec809ac15c1f0dd54fb2d173dd0d156b Mon Sep 17 00:00:00 2001 From: React Native Bot Date: Tue, 6 Oct 2026 22:41:11 +0000 Subject: [PATCH 35/35] [LOCAL] Bump Podfile.lock --- packages/rn-tester/Podfile.lock | 678 ++++++++++++++++---------------- 1 file changed, 339 insertions(+), 339 deletions(-) diff --git a/packages/rn-tester/Podfile.lock b/packages/rn-tester/Podfile.lock index 5cbc5af1f68b..fcda4bca6a1d 100644 --- a/packages/rn-tester/Podfile.lock +++ b/packages/rn-tester/Podfile.lock @@ -2,13 +2,13 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) - fast_float (8.0.0) - - FBLazyVector (0.88.0-rc.3) + - FBLazyVector (0.88.0-rc.4) - fmt (12.1.0) - glog (0.3.5) - hermes-engine (260318099.0.4): - hermes-engine/Pre-built (= 260318099.0.4) - hermes-engine/Pre-built (260318099.0.4) - - MyNativeView (0.88.0-rc.3): + - MyNativeView (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -37,7 +37,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - NativeCxxModuleExample (0.88.0-rc.3): + - NativeCxxModuleExample (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -86,29 +86,29 @@ PODS: - fast_float (= 8.0.0) - fmt (= 12.1.0) - glog - - RCTDeprecation (0.88.0-rc.3) - - RCTRequired (0.88.0-rc.3) - - RCTSwiftUI (0.88.0-rc.3) - - RCTSwiftUIWrapper (0.88.0-rc.3): + - RCTDeprecation (0.88.0-rc.4) + - RCTRequired (0.88.0-rc.4) + - RCTSwiftUI (0.88.0-rc.4) + - RCTSwiftUIWrapper (0.88.0-rc.4): - RCTSwiftUI - - RCTTypeSafety (0.88.0-rc.3): - - FBLazyVector (= 0.88.0-rc.3) - - RCTRequired (= 0.88.0-rc.3) - - React-Core (= 0.88.0-rc.3) - - React (0.88.0-rc.3): - - React-Core (= 0.88.0-rc.3) - - React-Core/DevSupport (= 0.88.0-rc.3) - - React-Core/RCTWebSocket (= 0.88.0-rc.3) - - React-RCTActionSheet (= 0.88.0-rc.3) - - React-RCTAnimation (= 0.88.0-rc.3) - - React-RCTBlob (= 0.88.0-rc.3) - - React-RCTImage (= 0.88.0-rc.3) - - React-RCTLinking (= 0.88.0-rc.3) - - React-RCTNetwork (= 0.88.0-rc.3) - - React-RCTSettings (= 0.88.0-rc.3) - - React-RCTText (= 0.88.0-rc.3) - - React-RCTVibration (= 0.88.0-rc.3) - - React-bridging (0.88.0-rc.3): + - RCTTypeSafety (0.88.0-rc.4): + - FBLazyVector (= 0.88.0-rc.4) + - RCTRequired (= 0.88.0-rc.4) + - React-Core (= 0.88.0-rc.4) + - React (0.88.0-rc.4): + - React-Core (= 0.88.0-rc.4) + - React-Core/DevSupport (= 0.88.0-rc.4) + - React-Core/RCTWebSocket (= 0.88.0-rc.4) + - React-RCTActionSheet (= 0.88.0-rc.4) + - React-RCTAnimation (= 0.88.0-rc.4) + - React-RCTBlob (= 0.88.0-rc.4) + - React-RCTImage (= 0.88.0-rc.4) + - React-RCTLinking (= 0.88.0-rc.4) + - React-RCTNetwork (= 0.88.0-rc.4) + - React-RCTSettings (= 0.88.0-rc.4) + - React-RCTText (= 0.88.0-rc.4) + - React-RCTVibration (= 0.88.0-rc.4) + - React-bridging (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -120,12 +120,12 @@ PODS: - React-jsi - React-timing - SocketRocket - - React-callinvoker (0.88.0-rc.3): - - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.3) + - React-callinvoker (0.88.0-rc.4): + - React-callinvoker/callinvokerUmbrella (= 0.88.0-rc.4) - React-cxxstableapi - - React-callinvoker/callinvokerUmbrella (0.88.0-rc.3): + - React-callinvoker/callinvokerUmbrella (0.88.0-rc.4): - React-cxxstableapi - - React-Core (0.88.0-rc.3): + - React-Core (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -135,7 +135,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.3) + - React-Core/Default (= 0.88.0-rc.4) - React-cxxreact - React-featureflags - React-hermes @@ -150,7 +150,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.88.0-rc.3): + - React-Core/CoreModulesHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -175,7 +175,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (0.88.0-rc.3): + - React-Core/Default (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -199,7 +199,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (0.88.0-rc.3): + - React-Core/DevSupport (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -209,8 +209,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.3) - - React-Core/RCTWebSocket (= 0.88.0-rc.3) + - React-Core/Default (= 0.88.0-rc.4) + - React-Core/RCTWebSocket (= 0.88.0-rc.4) - React-cxxreact - React-featureflags - React-hermes @@ -225,7 +225,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.88.0-rc.3): + - React-Core/RCTActionSheetHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -250,7 +250,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.88.0-rc.3): + - React-Core/RCTAnimationHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -275,7 +275,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.88.0-rc.3): + - React-Core/RCTBlobHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -300,7 +300,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.88.0-rc.3): + - React-Core/RCTImageHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -325,7 +325,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.88.0-rc.3): + - React-Core/RCTLinkingHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -350,7 +350,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.88.0-rc.3): + - React-Core/RCTNetworkHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -375,7 +375,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTPushNotificationHeaders (0.88.0-rc.3): + - React-Core/RCTPushNotificationHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -400,7 +400,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.88.0-rc.3): + - React-Core/RCTSettingsHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -425,7 +425,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.88.0-rc.3): + - React-Core/RCTTextHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -450,7 +450,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.88.0-rc.3): + - React-Core/RCTVibrationHeaders (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -475,7 +475,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.88.0-rc.3): + - React-Core/RCTWebSocket (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -485,7 +485,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.88.0-rc.3) + - React-Core/Default (= 0.88.0-rc.4) - React-cxxreact - React-featureflags - React-hermes @@ -500,7 +500,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (0.88.0-rc.3): + - React-CoreModules (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -508,11 +508,11 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 0.88.0-rc.3) - - React-Core/CoreModulesHeaders (= 0.88.0-rc.3) + - RCTTypeSafety (= 0.88.0-rc.4) + - React-Core/CoreModulesHeaders (= 0.88.0-rc.4) - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing @@ -520,12 +520,12 @@ PODS: - React-networking - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.88.0-rc.3) + - React-RCTImage (= 0.88.0-rc.4) - React-runtimeexecutor - React-utils - ReactCommon - SocketRocket - - React-cxxreact (0.88.0-rc.3): + - React-cxxreact (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -534,29 +534,29 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.3) - - React-debug (= 0.88.0-rc.3) - - React-jserrorhandler (= 0.88.0-rc.3) - - React-jsi (= 0.88.0-rc.3) + - React-callinvoker (= 0.88.0-rc.4) + - React-debug (= 0.88.0-rc.4) + - React-jserrorhandler (= 0.88.0-rc.4) + - React-jsi (= 0.88.0-rc.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.88.0-rc.3) - - React-perflogger (= 0.88.0-rc.3) + - React-logger (= 0.88.0-rc.4) + - React-perflogger (= 0.88.0-rc.4) - React-runtimeexecutor - - React-timing (= 0.88.0-rc.3) + - React-timing (= 0.88.0-rc.4) - React-utils - SocketRocket - - React-cxxstableapi (0.88.0-rc.3) - - React-debug (0.88.0-rc.3): + - React-cxxstableapi (0.88.0-rc.4) + - React-debug (0.88.0-rc.4): - React-cxxstableapi - - React-debug/debugUmbrella (= 0.88.0-rc.3) - - React-debug/redbox (= 0.88.0-rc.3) - - React-debug/debugUmbrella (0.88.0-rc.3): + - React-debug/debugUmbrella (= 0.88.0-rc.4) + - React-debug/redbox (= 0.88.0-rc.4) + - React-debug/debugUmbrella (0.88.0-rc.4): - React-cxxstableapi - - React-debug/redbox (0.88.0-rc.3): + - React-debug/redbox (0.88.0-rc.4): - React-cxxstableapi - - React-defaultsnativemodule (0.88.0-rc.3): + - React-defaultsnativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -582,7 +582,7 @@ PODS: - React-webperformancenativemodule - SocketRocket - Yoga - - React-domnativemodule (0.88.0-rc.3): + - React-domnativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -604,7 +604,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (0.88.0-rc.3): + - React-Fabric (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -620,25 +620,25 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/animated (= 0.88.0-rc.3) - - React-Fabric/animationbackend (= 0.88.0-rc.3) - - React-Fabric/animations (= 0.88.0-rc.3) - - React-Fabric/attributedstring (= 0.88.0-rc.3) - - React-Fabric/bridging (= 0.88.0-rc.3) - - React-Fabric/componentregistry (= 0.88.0-rc.3) - - React-Fabric/componentregistrynative (= 0.88.0-rc.3) - - React-Fabric/components (= 0.88.0-rc.3) - - React-Fabric/consistency (= 0.88.0-rc.3) - - React-Fabric/core (= 0.88.0-rc.3) - - React-Fabric/dom (= 0.88.0-rc.3) - - React-Fabric/imagemanager (= 0.88.0-rc.3) - - React-Fabric/leakchecker (= 0.88.0-rc.3) - - React-Fabric/mounting (= 0.88.0-rc.3) - - React-Fabric/observers (= 0.88.0-rc.3) - - React-Fabric/scheduler (= 0.88.0-rc.3) - - React-Fabric/telemetry (= 0.88.0-rc.3) - - React-Fabric/uimanager (= 0.88.0-rc.3) - - React-Fabric/viewtransition (= 0.88.0-rc.3) + - React-Fabric/animated (= 0.88.0-rc.4) + - React-Fabric/animationbackend (= 0.88.0-rc.4) + - React-Fabric/animations (= 0.88.0-rc.4) + - React-Fabric/attributedstring (= 0.88.0-rc.4) + - React-Fabric/bridging (= 0.88.0-rc.4) + - React-Fabric/componentregistry (= 0.88.0-rc.4) + - React-Fabric/componentregistrynative (= 0.88.0-rc.4) + - React-Fabric/components (= 0.88.0-rc.4) + - React-Fabric/consistency (= 0.88.0-rc.4) + - React-Fabric/core (= 0.88.0-rc.4) + - React-Fabric/dom (= 0.88.0-rc.4) + - React-Fabric/imagemanager (= 0.88.0-rc.4) + - React-Fabric/leakchecker (= 0.88.0-rc.4) + - React-Fabric/mounting (= 0.88.0-rc.4) + - React-Fabric/observers (= 0.88.0-rc.4) + - React-Fabric/scheduler (= 0.88.0-rc.4) + - React-Fabric/telemetry (= 0.88.0-rc.4) + - React-Fabric/uimanager (= 0.88.0-rc.4) + - React-Fabric/viewtransition (= 0.88.0-rc.4) - React-featureflags - React-graphics - React-jsi @@ -650,7 +650,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animated (0.88.0-rc.3): + - React-Fabric/animated (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -678,7 +678,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animationbackend (0.88.0-rc.3): + - React-Fabric/animationbackend (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -705,7 +705,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (0.88.0-rc.3): + - React-Fabric/animations (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -732,7 +732,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (0.88.0-rc.3): + - React-Fabric/attributedstring (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -759,7 +759,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/bridging (0.88.0-rc.3): + - React-Fabric/bridging (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -786,7 +786,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (0.88.0-rc.3): + - React-Fabric/componentregistry (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -813,7 +813,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (0.88.0-rc.3): + - React-Fabric/componentregistrynative (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -840,7 +840,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (0.88.0-rc.3): + - React-Fabric/components (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -856,11 +856,11 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.3) - - React-Fabric/components/root (= 0.88.0-rc.3) - - React-Fabric/components/scrollview (= 0.88.0-rc.3) - - React-Fabric/components/view (= 0.88.0-rc.3) - - React-Fabric/components/viewUmbrella (= 0.88.0-rc.3) + - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0-rc.4) + - React-Fabric/components/root (= 0.88.0-rc.4) + - React-Fabric/components/scrollview (= 0.88.0-rc.4) + - React-Fabric/components/view (= 0.88.0-rc.4) + - React-Fabric/components/viewUmbrella (= 0.88.0-rc.4) - React-featureflags - React-graphics - React-jsi @@ -872,7 +872,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.3): + - React-Fabric/components/legacyviewmanagerinterop (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -899,7 +899,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (0.88.0-rc.3): + - React-Fabric/components/root (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -926,7 +926,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (0.88.0-rc.3): + - React-Fabric/components/scrollview (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -953,7 +953,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (0.88.0-rc.3): + - React-Fabric/components/view (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -982,7 +982,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/components/viewUmbrella (0.88.0-rc.3): + - React-Fabric/components/viewUmbrella (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1009,7 +1009,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/consistency (0.88.0-rc.3): + - React-Fabric/consistency (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1036,7 +1036,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (0.88.0-rc.3): + - React-Fabric/core (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1063,7 +1063,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (0.88.0-rc.3): + - React-Fabric/dom (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1090,7 +1090,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (0.88.0-rc.3): + - React-Fabric/imagemanager (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1117,7 +1117,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (0.88.0-rc.3): + - React-Fabric/leakchecker (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1144,7 +1144,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (0.88.0-rc.3): + - React-Fabric/mounting (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1172,7 +1172,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (0.88.0-rc.3): + - React-Fabric/observers (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1188,10 +1188,10 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/observers/events (= 0.88.0-rc.3) - - React-Fabric/observers/intersection (= 0.88.0-rc.3) - - React-Fabric/observers/mutation (= 0.88.0-rc.3) - - React-Fabric/observers/resize (= 0.88.0-rc.3) + - React-Fabric/observers/events (= 0.88.0-rc.4) + - React-Fabric/observers/intersection (= 0.88.0-rc.4) + - React-Fabric/observers/mutation (= 0.88.0-rc.4) + - React-Fabric/observers/resize (= 0.88.0-rc.4) - React-featureflags - React-graphics - React-jsi @@ -1203,7 +1203,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (0.88.0-rc.3): + - React-Fabric/observers/events (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1230,7 +1230,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/intersection (0.88.0-rc.3): + - React-Fabric/observers/intersection (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1257,7 +1257,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/mutation (0.88.0-rc.3): + - React-Fabric/observers/mutation (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1284,7 +1284,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/resize (0.88.0-rc.3): + - React-Fabric/observers/resize (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1311,7 +1311,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (0.88.0-rc.3): + - React-Fabric/scheduler (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1343,7 +1343,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (0.88.0-rc.3): + - React-Fabric/telemetry (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1370,7 +1370,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (0.88.0-rc.3): + - React-Fabric/uimanager (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1386,7 +1386,7 @@ PODS: - React-cxxreact - React-cxxstableapi - React-debug - - React-Fabric/uimanager/consistency (= 0.88.0-rc.3) + - React-Fabric/uimanager/consistency (= 0.88.0-rc.4) - React-featureflags - React-graphics - React-jsi @@ -1399,7 +1399,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (0.88.0-rc.3): + - React-Fabric/uimanager/consistency (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1427,7 +1427,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/viewtransition (0.88.0-rc.3): + - React-Fabric/viewtransition (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1454,7 +1454,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (0.88.0-rc.3): + - React-FabricComponents (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1470,8 +1470,8 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components (= 0.88.0-rc.3) - - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.3) + - React-FabricComponents/components (= 0.88.0-rc.4) + - React-FabricComponents/textlayoutmanager (= 0.88.0-rc.4) - React-featureflags - React-graphics - React-jsi @@ -1484,7 +1484,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (0.88.0-rc.3): + - React-FabricComponents/components (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1500,16 +1500,16 @@ PODS: - React-cxxstableapi - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.3) - - React-FabricComponents/components/iostextinput (= 0.88.0-rc.3) - - React-FabricComponents/components/modal (= 0.88.0-rc.3) - - React-FabricComponents/components/rncore (= 0.88.0-rc.3) - - React-FabricComponents/components/safeareaview (= 0.88.0-rc.3) - - React-FabricComponents/components/switch (= 0.88.0-rc.3) - - React-FabricComponents/components/text (= 0.88.0-rc.3) - - React-FabricComponents/components/textinput (= 0.88.0-rc.3) - - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.3) - - React-FabricComponents/components/virtualview (= 0.88.0-rc.3) + - React-FabricComponents/components/inputaccessory (= 0.88.0-rc.4) + - React-FabricComponents/components/iostextinput (= 0.88.0-rc.4) + - React-FabricComponents/components/modal (= 0.88.0-rc.4) + - React-FabricComponents/components/rncore (= 0.88.0-rc.4) + - React-FabricComponents/components/safeareaview (= 0.88.0-rc.4) + - React-FabricComponents/components/switch (= 0.88.0-rc.4) + - React-FabricComponents/components/text (= 0.88.0-rc.4) + - React-FabricComponents/components/textinput (= 0.88.0-rc.4) + - React-FabricComponents/components/unimplementedview (= 0.88.0-rc.4) + - React-FabricComponents/components/virtualview (= 0.88.0-rc.4) - React-featureflags - React-graphics - React-jsi @@ -1522,7 +1522,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.88.0-rc.3): + - React-FabricComponents/components/inputaccessory (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1550,7 +1550,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.88.0-rc.3): + - React-FabricComponents/components/iostextinput (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1578,7 +1578,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.88.0-rc.3): + - React-FabricComponents/components/modal (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1606,7 +1606,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.88.0-rc.3): + - React-FabricComponents/components/rncore (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1634,7 +1634,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.88.0-rc.3): + - React-FabricComponents/components/safeareaview (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1662,7 +1662,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/switch (0.88.0-rc.3): + - React-FabricComponents/components/switch (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1690,7 +1690,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (0.88.0-rc.3): + - React-FabricComponents/components/text (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1718,7 +1718,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.88.0-rc.3): + - React-FabricComponents/components/textinput (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1746,7 +1746,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.88.0-rc.3): + - React-FabricComponents/components/unimplementedview (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1774,7 +1774,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (0.88.0-rc.3): + - React-FabricComponents/components/virtualview (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1802,7 +1802,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.88.0-rc.3): + - React-FabricComponents/textlayoutmanager (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1830,7 +1830,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (0.88.0-rc.3): + - React-FabricImage (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1839,22 +1839,22 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 0.88.0-rc.3) - - RCTTypeSafety (= 0.88.0-rc.3) + - RCTRequired (= 0.88.0-rc.4) + - RCTTypeSafety (= 0.88.0-rc.4) - React-cxxstableapi - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.88.0-rc.3) + - React-jsiexecutor (= 0.88.0-rc.4) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (0.88.0-rc.3): + - React-featureflags (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1863,9 +1863,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-cxxstableapi - - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.3) + - React-featureflags/featureflagsUmbrella (= 0.88.0-rc.4) - SocketRocket - - React-featureflags/featureflagsUmbrella (0.88.0-rc.3): + - React-featureflags/featureflagsUmbrella (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1875,7 +1875,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-featureflagsnativemodule (0.88.0-rc.3): + - React-featureflagsnativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1891,7 +1891,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (0.88.0-rc.3): + - React-graphics (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1906,7 +1906,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-hermes (0.88.0-rc.3): + - React-hermes (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1915,19 +1915,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.3) + - React-cxxreact (= 0.88.0-rc.4) - React-cxxstableapi - React-jsi - - React-jsiexecutor (= 0.88.0-rc.3) + - React-jsiexecutor (= 0.88.0-rc.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-oscompat - - React-perflogger (= 0.88.0-rc.3) + - React-perflogger (= 0.88.0-rc.4) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (0.88.0-rc.3): + - React-idlecallbacksnativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1945,7 +1945,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (0.88.0-rc.3): + - React-ImageManager (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1961,7 +1961,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-intersectionobservernativemodule (0.88.0-rc.3): + - React-intersectionobservernativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1984,7 +1984,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-jserrorhandler (0.88.0-rc.3): + - React-jserrorhandler (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -1999,7 +1999,7 @@ PODS: - React-featureflags - React-jsi - SocketRocket - - React-jsi (0.88.0-rc.3): + - React-jsi (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2009,7 +2009,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (0.88.0-rc.3): + - React-jsiexecutor (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2031,7 +2031,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspector (0.88.0-rc.3): + - React-jsinspector (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2046,11 +2046,11 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.88.0-rc.3) + - React-perflogger (= 0.88.0-rc.4) - React-runtimeexecutor - React-utils - SocketRocket - - React-jsinspectorcdp (0.88.0-rc.3): + - React-jsinspectorcdp (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2060,7 +2060,7 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - SocketRocket - - React-jsinspectornetwork (0.88.0-rc.3): + - React-jsinspectornetwork (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2071,7 +2071,7 @@ PODS: - React-cxxstableapi - React-jsinspectorcdp - SocketRocket - - React-jsinspectortracing (0.88.0-rc.3): + - React-jsinspectortracing (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2087,7 +2087,7 @@ PODS: - React-timing - React-utils - SocketRocket - - React-jsitooling (0.88.0-rc.3): + - React-jsitooling (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2096,19 +2096,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.88.0-rc.3) + - React-cxxreact (= 0.88.0-rc.4) - React-cxxstableapi - React-debug - - React-jsi (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - React-utils - SocketRocket - - React-jsitracing (0.88.0-rc.3): + - React-jsitracing (0.88.0-rc.4): - React-jsi - - React-logger (0.88.0-rc.3): + - React-logger (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2117,7 +2117,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (0.88.0-rc.3): + - React-Mapbuffer (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2127,9 +2127,9 @@ PODS: - RCT-Folly/Fabric - React-cxxstableapi - React-debug - - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.3) + - React-Mapbuffer/mapbufferUmbrella (= 0.88.0-rc.4) - SocketRocket - - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.3): + - React-Mapbuffer/mapbufferUmbrella (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2140,7 +2140,7 @@ PODS: - React-cxxstableapi - React-debug - SocketRocket - - React-microtasksnativemodule (0.88.0-rc.3): + - React-microtasksnativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2155,7 +2155,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-mutationobservernativemodule (0.88.0-rc.3): + - React-mutationobservernativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2178,7 +2178,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-NativeModulesApple (0.88.0-rc.3): + - React-NativeModulesApple (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2199,7 +2199,7 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - React-networking (0.88.0-rc.3): + - React-networking (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2213,9 +2213,9 @@ PODS: - React-performancetimeline - React-timing - SocketRocket - - React-oscompat (0.88.0-rc.3): + - React-oscompat (0.88.0-rc.4): - React-cxxstableapi - - React-perflogger (0.88.0-rc.3): + - React-perflogger (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2224,7 +2224,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancecdpmetrics (0.88.0-rc.3): + - React-performancecdpmetrics (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2239,7 +2239,7 @@ PODS: - React-runtimeexecutor - React-timing - SocketRocket - - React-performancetimeline (0.88.0-rc.3): + - React-performancetimeline (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2254,9 +2254,9 @@ PODS: - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (0.88.0-rc.3): - - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.3) - - React-RCTAnimatedModuleProvider (0.88.0-rc.3): + - React-RCTActionSheet (0.88.0-rc.4): + - React-Core/RCTActionSheetHeaders (= 0.88.0-rc.4) + - React-RCTAnimatedModuleProvider (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2271,7 +2271,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTAnimation (0.88.0-rc.3): + - React-RCTAnimation (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2288,7 +2288,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (0.88.0-rc.3): + - React-RCTAppDelegate (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2324,7 +2324,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (0.88.0-rc.3): + - React-RCTBlob (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2343,7 +2343,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (0.88.0-rc.3): + - React-RCTFabric (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2381,7 +2381,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.88.0-rc.3): + - React-RCTFBReactNativeSpec (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2396,10 +2396,10 @@ PODS: - React-Core - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.3) + - React-RCTFBReactNativeSpec/components (= 0.88.0-rc.4) - ReactCommon - SocketRocket - - React-RCTFBReactNativeSpec/components (0.88.0-rc.3): + - React-RCTFBReactNativeSpec/components (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2424,7 +2424,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTImage (0.88.0-rc.3): + - React-RCTImage (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2440,14 +2440,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (0.88.0-rc.3): - - React-Core/RCTLinkingHeaders (= 0.88.0-rc.3) - - React-jsi (= 0.88.0-rc.3) + - React-RCTLinking (0.88.0-rc.4): + - React-Core/RCTLinkingHeaders (= 0.88.0-rc.4) + - React-jsi (= 0.88.0-rc.4) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.88.0-rc.3) - - React-RCTNetwork (0.88.0-rc.3): + - ReactCommon/turbomodule/core (= 0.88.0-rc.4) + - React-RCTNetwork (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2467,14 +2467,14 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTPushNotification (0.88.0-rc.3): + - React-RCTPushNotification (0.88.0-rc.4): - RCTTypeSafety - React-Core/RCTPushNotificationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (0.88.0-rc.3): + - React-RCTRuntime (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2496,7 +2496,7 @@ PODS: - React-RuntimeHermes - React-utils - SocketRocket - - React-RCTSettings (0.88.0-rc.3): + - React-RCTSettings (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2511,7 +2511,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTTest (0.88.0-rc.3): + - React-RCTTest (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2519,15 +2519,15 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-Core (= 0.88.0-rc.3) - - React-CoreModules (= 0.88.0-rc.3) - - React-jsi (= 0.88.0-rc.3) - - ReactCommon/turbomodule/core (= 0.88.0-rc.3) + - React-Core (= 0.88.0-rc.4) + - React-CoreModules (= 0.88.0-rc.4) + - React-jsi (= 0.88.0-rc.4) + - ReactCommon/turbomodule/core (= 0.88.0-rc.4) - SocketRocket - - React-RCTText (0.88.0-rc.3): - - React-Core/RCTTextHeaders (= 0.88.0-rc.3) + - React-RCTText (0.88.0-rc.4): + - React-Core/RCTTextHeaders (= 0.88.0-rc.4) - Yoga - - React-RCTVibration (0.88.0-rc.3): + - React-RCTVibration (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2541,11 +2541,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (0.88.0-rc.3) - - React-renderercss (0.88.0-rc.3): + - React-rendererconsistency (0.88.0-rc.4) + - React-renderercss (0.88.0-rc.4): - React-debug - React-utils - - React-rendererdebug (0.88.0-rc.3): + - React-rendererdebug (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2555,7 +2555,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-resizeobservernativemodule (0.88.0-rc.3): + - React-resizeobservernativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2579,7 +2579,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-RuntimeApple (0.88.0-rc.3): + - React-RuntimeApple (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2609,7 +2609,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (0.88.0-rc.3): + - React-RuntimeCore (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2632,7 +2632,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (0.88.0-rc.3): + - React-runtimeexecutor (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2642,10 +2642,10 @@ PODS: - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.4) - React-utils - SocketRocket - - React-RuntimeHermes (0.88.0-rc.3): + - React-RuntimeHermes (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2667,7 +2667,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-runtimescheduler (0.88.0-rc.3): + - React-runtimescheduler (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2691,14 +2691,14 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (0.88.0-rc.3): + - React-timing (0.88.0-rc.4): - React-cxxstableapi - React-debug - - React-timing/timingUmbrella (= 0.88.0-rc.3) - - React-timing/timingUmbrella (0.88.0-rc.3): + - React-timing/timingUmbrella (= 0.88.0-rc.4) + - React-timing/timingUmbrella (0.88.0-rc.4): - React-cxxstableapi - React-debug - - React-utils (0.88.0-rc.3): + - React-utils (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2708,9 +2708,9 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-debug - - React-jsi (= 0.88.0-rc.3) + - React-jsi (= 0.88.0-rc.4) - SocketRocket - - React-viewtransitionnativemodule (0.88.0-rc.3): + - React-viewtransitionnativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2728,7 +2728,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-webperformancenativemodule (0.88.0-rc.3): + - React-webperformancenativemodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2747,9 +2747,9 @@ PODS: - React-runtimeexecutor - ReactCommon/turbomodule/core - SocketRocket - - ReactAppDependencyProvider (0.88.0-rc.3): + - ReactAppDependencyProvider (0.88.0-rc.4): - ReactCodegen - - ReactCodegen (0.88.0-rc.3): + - ReactCodegen (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2775,7 +2775,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (0.88.0-rc.3): + - ReactCommon (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2783,9 +2783,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 0.88.0-rc.3) + - ReactCommon/turbomodule (= 0.88.0-rc.4) - SocketRocket - - ReactCommon-Samples (0.88.0-rc.3): + - ReactCommon-Samples (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2802,7 +2802,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - ReactCommon/turbomodule (0.88.0-rc.3): + - ReactCommon/turbomodule (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2811,13 +2811,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.88.0-rc.3) - - React-jsi (= 0.88.0-rc.3) - - React-logger (= 0.88.0-rc.3) - - React-perflogger (= 0.88.0-rc.3) - - ReactCommon/turbomodule/core (= 0.88.0-rc.3) + - React-callinvoker (= 0.88.0-rc.4) + - React-jsi (= 0.88.0-rc.4) + - React-logger (= 0.88.0-rc.4) + - React-perflogger (= 0.88.0-rc.4) + - ReactCommon/turbomodule/core (= 0.88.0-rc.4) - SocketRocket - - ReactCommon/turbomodule/core (0.88.0-rc.3): + - ReactCommon/turbomodule/core (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -2827,16 +2827,16 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-bridging - - React-callinvoker (= 0.88.0-rc.3) - - React-cxxreact (= 0.88.0-rc.3) - - React-debug (= 0.88.0-rc.3) - - React-featureflags (= 0.88.0-rc.3) - - React-jsi (= 0.88.0-rc.3) - - React-logger (= 0.88.0-rc.3) - - React-perflogger (= 0.88.0-rc.3) - - React-utils (= 0.88.0-rc.3) + - React-callinvoker (= 0.88.0-rc.4) + - React-cxxreact (= 0.88.0-rc.4) + - React-debug (= 0.88.0-rc.4) + - React-featureflags (= 0.88.0-rc.4) + - React-jsi (= 0.88.0-rc.4) + - React-logger (= 0.88.0-rc.4) + - React-perflogger (= 0.88.0-rc.4) + - React-utils (= 0.88.0-rc.4) - SocketRocket - - ScreenshotManager (0.88.0-rc.3): + - ScreenshotManager (0.88.0-rc.4): - boost - DoubleConversion - fast_float @@ -3152,94 +3152,94 @@ SPEC CHECKSUMS: boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: ea9b230e7e868bf13b5cea5b4b19274fb747e7cc + FBLazyVector: 52452b7ca11b5f7a4d2e01903cee4a490c00af24 fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: e56ede4028c4b7418e6b1195a36b1656bb35e225 hermes-engine: 6a00d96909f1648698fe5419972fe3c9e628755e - MyNativeView: e01161f4b1a1635aec0f759ef6811fadf50b3155 - NativeCxxModuleExample: edb24a6862fddee49c950a27cb3ad41b706c935c + MyNativeView: 429162271b8f940cb574265f0ba290f8ae459c04 + NativeCxxModuleExample: c2a6f9a83f201f30d0c311966f624aa599623ba4 OCMock: 589f2c84dacb1f5aaf6e4cec1f292551fe748e74 RCT-Folly: 36c4f904fb6cd0219dcb76b94e9502d2a72fab0b - RCTDeprecation: 1d1a94a247818610796b6ecb790d50272b92074d - RCTRequired: 4917cf98f463f9ad12309b27e78e37b8ad2a3d58 - RCTSwiftUI: d96b5197f7ccba00f28e13359a9c2cc77400b989 - RCTSwiftUIWrapper: 8c99c93a4563499f9803819b3c24621d940b1c2b - RCTTypeSafety: 09bc56757c7d70f3673c07e370026e5362f8b708 - React: 8481ff37bcd808e18b85af345ce2657c36b710e6 - React-bridging: e4e8989ad05eaad067ede6d8521ee3fdb6f20b3f - React-callinvoker: 98b9100df52d588a4165ee6c8968d2aaede63bd2 - React-Core: edfa0f33a182e298bc8a71575f8ea1e61a8a0cea - React-CoreModules: 7514e89fa1ab26154ee271af5ddcbf599561af0e - React-cxxreact: 6345f3a4b2ed7b5c47bd57c6cc994d1fd972e988 - React-cxxstableapi: 9c7d9d86f4dd92682f9cafb111be48fea68196fa - React-debug: b32296ce291625314457c208842af04a6d78ecff - React-defaultsnativemodule: 556d5ef8de7eb1f293be1b6d48f7112534db5d91 - React-domnativemodule: 17ff1366cfd82f21d13bf802e535564d945349f7 - React-Fabric: a16edcdd5bceec6f9387a6293a9cac5b88a93957 - React-FabricComponents: e75ea2328efc2ea02ed42ecc02051eebdf8ddc49 - React-FabricImage: b08f75d7f12e1c6a375c757c7cbf135278106ed2 - React-featureflags: 98a66611e38f29a355b04dc7bbaa3fffb266b142 - React-featureflagsnativemodule: c1da4d15f21237d2e5e965d724de2343b98ff831 - React-graphics: 84b1a5f4e70ec04c261637a223fbf91534559605 - React-hermes: 1bd4244c807fea0625f896f9fb913a050ac185f5 - React-idlecallbacksnativemodule: f10df9e7493930d468672749dafcb81ebc147c44 - React-ImageManager: a063e0f23e35295eae6023c6834df31d61d4bd6b - React-intersectionobservernativemodule: 610ad10cdf2b4519091fea852e8973bf22bdf360 - React-jserrorhandler: 062de56d545492062289e54ec4c0bc1f75fef32c - React-jsi: 5ee7eeceba1bd4f399df8b7fae5f262c5d023dfc - React-jsiexecutor: 9b3a86c2135abe450de87df4a24d2fb9021df391 - React-jsinspector: 9d55e364b80b2d900c1492c7b29450a446af5dcb - React-jsinspectorcdp: 2a7b37cb580d6e59258fe44a5e69086530575622 - React-jsinspectornetwork: b8a9a41f5961d4b9869850034d3c1257835af531 - React-jsinspectortracing: 6efea0c24c0d1a45bfae8de2e76f792653191d91 - React-jsitooling: b147ee402adc3046c0b12719a12be0ea42612e8f - React-jsitracing: 9a6ddd540634a1b834bcee35c170d9fdb2cb08b3 - React-logger: 44b18898ab189ecf53a817dec092e6202fd7aa74 - React-Mapbuffer: 73dd8eef245d1b90428d4499908a393ad26edeb2 - React-microtasksnativemodule: 73e65759d4abe6467179d1a1d360835b03a98531 - React-mutationobservernativemodule: 05804c1d14ec1000ae99e8b7668ca12cf8e1656e - React-NativeModulesApple: ea373ec661bbec657d00aca0a1206bc1b7ccc2de - React-networking: 23b6563161943fd639cafaf8d2a446d932fc3178 - React-oscompat: 070f927db94332cea0f0f288dd5d9d91530dfacb - React-perflogger: 69839f5d9e147b5edf0e0c73581f88aed69f3dfa - React-performancecdpmetrics: e601ff949648adf6c21a5b36177eb398e4fc691d - React-performancetimeline: 0eedcc73fae3c6f7300249fca253cb2a7403580e - React-RCTActionSheet: a3f69d475497566461e06137c0ceccaa49e82252 - React-RCTAnimatedModuleProvider: 945c200a1b507b23379a29b10757575de50e0c49 - React-RCTAnimation: 661a034e60aee0d0025f1cb78a21869bad31fa65 - React-RCTAppDelegate: 7892fc185e1a45e63e85e9250aa8b83a49f58ba0 - React-RCTBlob: 12b8f1e0ec850405dda376c4cd7f5fdc3e5183e6 - React-RCTFabric: 5d571709c8ac6a2130ac62ce2ced7e6bb1ae3181 - React-RCTFBReactNativeSpec: 37695f8cfb144831127fb3aae8053ed5fd103462 - React-RCTImage: 79d7c5357222e73e748e55fa1fc1ccf38fa2eeff - React-RCTLinking: 9eb3c5c6e41508339898e05b008c9722a8a18e05 - React-RCTNetwork: 6f1a695b129e9046e6bd60ba45147f5e68345dc9 - React-RCTPushNotification: 03d6b57b2c799ea0cae944b8bab05d708b9ca858 - React-RCTRuntime: b1b688ed2cc3556ddc80b20c6e25db06a47120d3 - React-RCTSettings: 20c02a4cdaf930b78281b103a474714a318958b3 - React-RCTTest: e86cce9da1a41796ac765a448e33142dd43121f6 - React-RCTText: 73ba82716dd67c6fd71d9e88dc571b3bb48893e3 - React-RCTVibration: a6b3f2eafccb6645a2e862d6dc36d5984c1b7f33 - React-rendererconsistency: 21edaab59872cf6e8e7f88a1eb8776bdcde9b40c - React-renderercss: e87b204d46a9741444db979377d6f9be64861793 - React-rendererdebug: 2ed06b3c5a04db1cde6918711b775ea70b556185 - React-resizeobservernativemodule: 7241ff2b1707d2976f069bc3cb9c44fb54a87c77 - React-RuntimeApple: 52df3db096993b8a04c04ae1c5f40a4cfaf70be3 - React-RuntimeCore: 9d5c9a0e60126abe9cc0ed6b39dc17c511e31272 - React-runtimeexecutor: 8df10f178687b9f2d6efd7871c0f997709fc5068 - React-RuntimeHermes: 797a778b240714067135692a25517fd83986734d - React-runtimescheduler: 4488a8be500e5e5af0035276a3c55a1173d7ecbd - React-timing: 802fc6c8c1fe87ac0a300ea5bf7fc78ded49d0c2 - React-utils: 5a89beb54c076cd4727e1c9eef4537644dbe5fef - React-viewtransitionnativemodule: 8f6e4492817296f7ff063367d6d6b25d90d03de9 - React-webperformancenativemodule: c6fdb2d10cee9b0b8f1cfa91348cfd1b21251b86 - ReactAppDependencyProvider: 7a86900b342815446f0d353a877f2b777597c365 - ReactCodegen: 7691c14d2a24af0fee635a6f9790dbaa9ff71240 - ReactCommon: a917082dd662fb88a33515fab74f5972aed80e0e - ReactCommon-Samples: 73e7f7dd75608a5e1d1d1e317f80f537872b1e62 - ScreenshotManager: 0e4dd1945472c1e81cd0007b8c856609b48e4983 + RCTDeprecation: 61a9e4c13319b596ab6f3d4d3df26c4c9b25f520 + RCTRequired: f5e2a2ee44797f7481179693920321bb15998b79 + RCTSwiftUI: 8814fa4fa6de09aa02796c8c84a4c33066103745 + RCTSwiftUIWrapper: 1a4342f9401fd3b569098776112cc505ed2c4d0d + RCTTypeSafety: aefe75890558dce75559fcf47a18a547c685ff7f + React: bec1c8775e9ad1059938a7d1b871d8b9625ce123 + React-bridging: d43593b52d2c7c54bea5187ce15707a021c30a8d + React-callinvoker: 2e28af34ccc9826fa101bb0e742d5d0da80f34a6 + React-Core: 51b576a85646273337db19e81d7aca99f971138e + React-CoreModules: d4507580fb26f083eed9491cf4b9ddea622b6353 + React-cxxreact: 03991ffe86525169e6733bc4da3543553d673066 + React-cxxstableapi: c4a46b778e20bad8d3b96f25d64879620187143c + React-debug: 2869e90cc218e582685cac6c83b9ee1d188af2ae + React-defaultsnativemodule: 608298271aef9736a0c2e54823c300b0d42d110e + React-domnativemodule: 13134e0177e831feca5c9a1b23d5dcede456489d + React-Fabric: 95e7525fdde49d792521a7788ac6ce88859f64d7 + React-FabricComponents: 7d0dd11a73eb1cd64dd7acb12e8357adbc026660 + React-FabricImage: afed03f9540cd5d35694815a6f5c5d66e454d254 + React-featureflags: 78982fa6036bb0dadd0302c51675bf437da9ffdf + React-featureflagsnativemodule: 097106ddda28cab7b4ac1b5ee430eb1d73b7e5c0 + React-graphics: 302816ff31aa8558492702764393287c26c07cd7 + React-hermes: 06914ced4edfcc5317e7a6cc67e10aec7b040b61 + React-idlecallbacksnativemodule: 31392320f7adb923e20760762203c85e018592e0 + React-ImageManager: a01fea3fe702d4cc0a7fd333d1aeadd666c3d343 + React-intersectionobservernativemodule: 377eb2f7e82f7c9078d21708d0d05672918ab84e + React-jserrorhandler: de474af261ac5fed3afda174b2c7160e40ea2e48 + React-jsi: 41c2ee5c64615d228040f6affc42af1abb43dd5f + React-jsiexecutor: f5aff02a8dcc4997a042fc9244720a4f9fec230d + React-jsinspector: 5e75d1d055bef4ca391b212fec1af37c74aed0c4 + React-jsinspectorcdp: 013cdf6521638306c5e858e4a28c938da2b04a5d + React-jsinspectornetwork: 0fca8308220f323d97f94997590448695ef64569 + React-jsinspectortracing: 91755de62842f61a143371fef02856d741a8d6d9 + React-jsitooling: 9d7da42d2fac468a4b7c8b83f793e57e0a847d2b + React-jsitracing: d40e551ef93907c45da07ac315b82cfbd62a6e17 + React-logger: 44cd57194c956431c151119eabdaf8064063dcc0 + React-Mapbuffer: 829351118d2d601b689363adedbed16f3b0149a1 + React-microtasksnativemodule: 9b104d73684a392acb05825c68084549c44d4a35 + React-mutationobservernativemodule: 8fcfd61cdc9df6a23261a76b72737d62c04a0039 + React-NativeModulesApple: 53037aca6874275a7437afcbc299680831c55080 + React-networking: eead19a5f1a16d141279cdb2d9b3a652b3c8f101 + React-oscompat: b8aa70ad5f2753b62bea2cab962ddc087f546113 + React-perflogger: 5f04f39b816e5e50505df5176a10c6dd09d84e42 + React-performancecdpmetrics: 25c2a9bc5bade2a58be2a881b115e023d56c2b7c + React-performancetimeline: c08ad5a95095d63363bb003822c6375c819e341c + React-RCTActionSheet: 33ef3c0f7c0e839daacf970dcbb9e8f92a230cb9 + React-RCTAnimatedModuleProvider: eaee8cc99b9f7fade0a2287f4f347faf390b7429 + React-RCTAnimation: 2840bda2cbe290715d813c818e5e69d6e8740ffa + React-RCTAppDelegate: ce40df9e0c45b654d534ecd5d1cdebd481886a5d + React-RCTBlob: a26a710e1d8368b542c004928c8b40c98a955248 + React-RCTFabric: 44b7c392d89786e69fb8d442d9a981cc63c78924 + React-RCTFBReactNativeSpec: 93b5e0917384ec26b4122113d9bfbc330d1075e6 + React-RCTImage: 60eb1f7b4951777e6c7172d7f75a63ae9904361c + React-RCTLinking: 24d4315c464f7d63ab1d82c8c5bc4983a0c0fa12 + React-RCTNetwork: 80345ace734879072486d4bc72e1bc190e7e3dc8 + React-RCTPushNotification: aad6034b631cdee662fec92c99954d82aeb0e106 + React-RCTRuntime: bd8d14cc8dd0081e5a274d6f7bbecd31142d81c7 + React-RCTSettings: 18cc21dbc1683aa0391fb65000c2ec9ea5b16c62 + React-RCTTest: cfea583bacc2ebb8979f66248ad4251992dd47a8 + React-RCTText: 8fe6b759c7f28ca637013016943d559cef6dd2bf + React-RCTVibration: e8f051a04e2e7138c544564b05ee88adbc03b9c2 + React-rendererconsistency: 97d7ab87cf77e287d40b9145149298e2302bc64f + React-renderercss: e4fc65dacd4818647a30fdf191d4b410135e5b20 + React-rendererdebug: aeeb4bdfe51c8bacbabed077afabf23ef0da45e5 + React-resizeobservernativemodule: 43384b04428165d3686a15dfdfd89055c2a457c1 + React-RuntimeApple: 67ed3324a10012fc773a7a77149deebf860a43d3 + React-RuntimeCore: 52f5fd349d23a0b16888a6e96bbf169f5b1f57f3 + React-runtimeexecutor: b3509a2badfa50c45c00b1c3b1f13b36aac6b655 + React-RuntimeHermes: 926ba0618e8f6b1827de361626dbcf4562b890f8 + React-runtimescheduler: e42d8f423dba080b1d9cfc0e361143812afbd8b3 + React-timing: dce68ffe0475e365a24616e03dc159d49cb3be1c + React-utils: ae9f13f7a4763df8d2223b288e5628bf45993e30 + React-viewtransitionnativemodule: 0a9949ef85ca45121b4573514df25d7fb0f551c7 + React-webperformancenativemodule: 6d50f06add78af40af4baed548f51cbaf4150100 + ReactAppDependencyProvider: 47129a082ee412288c084230ebbced7636dacd60 + ReactCodegen: a20c186f184ccd7c4419507117cbc11eb4a4fe8e + ReactCommon: 8c8bf5898a800938673f61edb38ce7550ccd709d + ReactCommon-Samples: 449110c04c03f73f5d0da6625213b289984a6f37 + ScreenshotManager: f21c551cd26b71852a337208228aa7a45824633e SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 54249c61111e792ca81fe3557b84004459bbcdb4 + Yoga: 8d204784087ca6f1884f8395bb1cdaa293c476fa PODFILE CHECKSUM: 59f1e7d58cffbfafbeb3df31151743dd4c9a52e8