Skip to content

Commit e46b4fa

Browse files
authored
Update dependencies (#29461)
* Update dependencies * Bump @react-native sub-deps to 0.86.1 * Allow minor bumps for @react-native sub-deps in update-dependencies skill * Document why expo-image-picker options are built lazily Module-scope enum access crashes desktop where the bundler nulls the package out; the lazy fix landed on master, this adds the constraint comment.
1 parent c3b1e05 commit e46b4fa

5 files changed

Lines changed: 112 additions & 63 deletions

File tree

shared/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,12 @@
157157
"@react-native-community/cli": "20.2.0",
158158
"@react-native-community/cli-platform-android": "20.2.0",
159159
"@react-native-community/cli-platform-ios": "20.2.0",
160-
"@react-native/babel-preset": "0.86.0",
161-
"@react-native/eslint-config": "0.86.0",
162-
"@react-native/metro-config": "0.86.0",
160+
"@react-native/babel-preset": "0.86.1",
161+
"@react-native/eslint-config": "0.86.1",
162+
"@react-native/metro-config": "0.86.1",
163163
"@rolldown/plugin-babel": "0.2.3",
164-
"@storybook/react": "10.5.3",
165-
"@storybook/react-vite": "10.5.3",
164+
"@storybook/react": "10.5.4",
165+
"@storybook/react-vite": "10.5.4",
166166
"@testing-library/dom": "10.4.1",
167167
"@testing-library/react": "16.3.2",
168168
"@types/google-libphonenumber": "7.4.30",
@@ -197,7 +197,7 @@
197197
"jest-environment-jsdom": "30.4.1",
198198
"patch-package": "8.0.1",
199199
"react-refresh": "0.18.0",
200-
"storybook": "10.5.3",
200+
"storybook": "10.5.4",
201201
"typescript": "6.0.3",
202202
"typescript-eslint": "8.65.0",
203203
"typescript-native": "npm:typescript@7.0.2",

shared/util/expo-image-picker.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import * as ImagePicker from 'expo-image-picker'
22

3+
// built lazily: on desktop expo-image-picker is nulled out by the bundler, so
4+
// dereferencing its enums at module scope crashes at import time
35
const getDefaultOptions = () => ({
46
allowsEditing: false,
57
exif: false,

shared/yarn.lock

Lines changed: 79 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3197,10 +3197,18 @@
31973197
"@babel/traverse" "^7.29.0"
31983198
"@react-native/codegen" "0.86.0"
31993199

3200-
"@react-native/babel-preset@0.86.0":
3201-
version "0.86.0"
3202-
resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.86.0.tgz#28d066d5a97491188fcce23625a41c9497cdce39"
3203-
integrity sha512-bYQcWiPySNvF4dns9Ls9gMmwgq66ohvM9Fwc/Kn8r85t66UNHxch3p1QwPiSorDelFauZwJbgo9+ReibTgvpbA==
3200+
"@react-native/babel-plugin-codegen@0.86.1":
3201+
version "0.86.1"
3202+
resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.86.1.tgz#3293f2099aae6e27dc04d0b42619937bf7539a3c"
3203+
integrity sha512-e9adw9nOIhiqGVHLgL2uz3sc84yqjpl61hDZOAu2VqRQveakRod0bJMX+c/0iQzfZ1/N7Jcly4X7fv8DSk5+nA==
3204+
dependencies:
3205+
"@babel/traverse" "^7.29.0"
3206+
"@react-native/codegen" "0.86.1"
3207+
3208+
"@react-native/babel-preset@0.86.1":
3209+
version "0.86.1"
3210+
resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.86.1.tgz#98096c6692ba9285f4d4c852f2d4f5f94e123863"
3211+
integrity sha512-OMrBf+AoPyD4QXx/BSFNpG5JWKjux7lfJsdKE5E++yPV0sO+RZovVZAoy8MhsnqGyENn4bl9tbsNfAt0cc36WQ==
32043212
dependencies:
32053213
"@babel/core" "^7.25.2"
32063214
"@babel/plugin-proposal-export-default-from" "^7.24.7"
@@ -3231,7 +3239,7 @@
32313239
"@babel/plugin-transform-runtime" "^7.24.7"
32323240
"@babel/plugin-transform-typescript" "^7.25.2"
32333241
"@babel/plugin-transform-unicode-regex" "^7.24.7"
3234-
"@react-native/babel-plugin-codegen" "0.86.0"
3242+
"@react-native/babel-plugin-codegen" "0.86.1"
32353243
babel-plugin-syntax-hermes-parser "0.36.0"
32363244
babel-plugin-transform-flow-enums "^0.0.2"
32373245
react-refresh "^0.14.0"
@@ -3249,6 +3257,19 @@
32493257
tinyglobby "^0.2.15"
32503258
yargs "^17.6.2"
32513259

3260+
"@react-native/codegen@0.86.1":
3261+
version "0.86.1"
3262+
resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.86.1.tgz#db083d5f2181a67f493e90d4cedb635e21a6d430"
3263+
integrity sha512-APPYi/X/Db5R6xHv86Il6ZW+fXW0j4YYMlGhq7jFW6zYZU0AkYYgtM2nY0mF7rRlWbnNqXxZuZJyhVp1T6+VjQ==
3264+
dependencies:
3265+
"@babel/core" "^7.25.2"
3266+
"@babel/parser" "^7.29.0"
3267+
hermes-parser "0.36.0"
3268+
invariant "^2.2.4"
3269+
nullthrows "^1.1.1"
3270+
tinyglobby "^0.2.15"
3271+
yargs "^17.6.2"
3272+
32523273
"@react-native/community-cli-plugin@0.86.0":
32533274
version "0.86.0"
32543275
resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.86.0.tgz#f18fb8cb6f792eb1d3e5fba7b0a08c8709273bf5"
@@ -3294,14 +3315,14 @@
32943315
serve-static "^1.16.2"
32953316
ws "^7.5.10"
32963317

3297-
"@react-native/eslint-config@0.86.0":
3298-
version "0.86.0"
3299-
resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.86.0.tgz#472f895858ab5643e39fbc564e3864f78991caa2"
3300-
integrity sha512-N7dtRMx6eVOScVkZ4+4SCGMWRh+nIbUmdc/yIPWvQdPLHKe5NLHYoyPGZvkwWN0Wj26OJwpXNTp53qE5ZiIjKQ==
3318+
"@react-native/eslint-config@0.86.1":
3319+
version "0.86.1"
3320+
resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.86.1.tgz#fd2fd667096863eccf3e63f9c7240d3b73242a68"
3321+
integrity sha512-rqoqNGcbd1QRBMhMHT1uKW7FEnIBMnJFry9yhV3BJwm3IkKRxXpVHgDUGTQUq+piSSizpAFDL7XfMl4NoFk70g==
33013322
dependencies:
33023323
"@babel/core" "^7.25.2"
33033324
"@babel/eslint-parser" "^7.25.1"
3304-
"@react-native/eslint-plugin" "0.86.0"
3325+
"@react-native/eslint-plugin" "0.86.1"
33053326
"@typescript-eslint/eslint-plugin" "^8.36.0"
33063327
"@typescript-eslint/parser" "^8.36.0"
33073328
eslint-config-prettier "^8.5.0"
@@ -3312,10 +3333,10 @@
33123333
eslint-plugin-react-hooks "^7.0.1"
33133334
eslint-plugin-react-native "^5.0.0"
33143335

3315-
"@react-native/eslint-plugin@0.86.0":
3316-
version "0.86.0"
3317-
resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.86.0.tgz#6ddf39db66225f2ae9e6704d0e71f0d6b13270c4"
3318-
integrity sha512-v0zZAO9tfB72RdluTGHZcYDe5fIH6hf/bk8jATTCdwNNWcvPEjHdzuA2O6M4OAEmC+UDq/kURb+LY5f2fGGRGg==
3336+
"@react-native/eslint-plugin@0.86.1":
3337+
version "0.86.1"
3338+
resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.86.1.tgz#5431ce62e73e8c8c6762ef7686c189ecb96fe92f"
3339+
integrity sha512-G7Az2S0dnjqYXXy575rOLIfmGmkq7sy7oF5QXht1zu1CB4OFV7DSdAkQh9ZRc81u9gH/rZu1akHKZrdflxG+EA==
33193340

33203341
"@react-native/gradle-plugin@0.86.0":
33213342
version "0.86.0"
@@ -3327,23 +3348,28 @@
33273348
resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.86.0.tgz#d289e1720f79c31291b1e27c39e9fa153309692a"
33283349
integrity sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==
33293350

3330-
"@react-native/metro-babel-transformer@0.86.0":
3331-
version "0.86.0"
3332-
resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.86.0.tgz#9f4b2a03c5ebbe0358e2f704eb1b45777fbe0e77"
3333-
integrity sha512-SjKej3E5qIahqo/G+rSOrmJUQM44RyKtWtO+VfmKAAMoJWkBFomM22hTLKCIS5cdbIAJ9COAmU+KAi2wVSO0wQ==
3351+
"@react-native/js-polyfills@0.86.1":
3352+
version "0.86.1"
3353+
resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.86.1.tgz#8fed74afbfc2327d85f8e1c4c57bded0db595aa9"
3354+
integrity sha512-mQJcMQu5/bLdwFljF/zDjKpKH6/wzQ33FiewoGfcLC/QU0ke0vdUcJ4kBAB98Du1sT1ddAHUvhjnDRo7PFzzrQ==
3355+
3356+
"@react-native/metro-babel-transformer@0.86.1":
3357+
version "0.86.1"
3358+
resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.86.1.tgz#d81c3050ae443a17919efe2a9c69a15ae3c5806b"
3359+
integrity sha512-PECHU8dWa0tMAjSzeXbrXynZG9S4K3IXDXfTcmi+3FaV5ITU180T0KyvcQuc1QSLJNDlzxFH0F3JlfvfgKZ8Qw==
33343360
dependencies:
33353361
"@babel/core" "^7.25.2"
3336-
"@react-native/babel-preset" "0.86.0"
3362+
"@react-native/babel-preset" "0.86.1"
33373363
hermes-parser "0.36.0"
33383364
nullthrows "^1.1.1"
33393365

3340-
"@react-native/metro-config@0.86.0":
3341-
version "0.86.0"
3342-
resolved "https://registry.yarnpkg.com/@react-native/metro-config/-/metro-config-0.86.0.tgz#04009d8cb7cab14304f8fb64b633bc2a911eedd7"
3343-
integrity sha512-7v+xbTeEci9ZcQ/Z1OqI4RXcqN69wSMDYL5BAMvOReZ7U04+aDQ0/SQhClYPn6x2/RxM4WzMKSAuNyLKqvYVtw==
3366+
"@react-native/metro-config@0.86.1":
3367+
version "0.86.1"
3368+
resolved "https://registry.yarnpkg.com/@react-native/metro-config/-/metro-config-0.86.1.tgz#bf8b5beab3d6313e74ad25b6d30facb1c8e2062f"
3369+
integrity sha512-K7HMxEaKxOzKP7qGRnuft7g4uQ5d/WlBrq+/hmY2Qy63tALzEV8+U1yokSzI7bF2IAS2glOBuB8W1sFCaRC+xQ==
33443370
dependencies:
3345-
"@react-native/js-polyfills" "0.86.0"
3346-
"@react-native/metro-babel-transformer" "0.86.0"
3371+
"@react-native/js-polyfills" "0.86.1"
3372+
"@react-native/metro-babel-transformer" "0.86.1"
33473373
metro-config "^0.84.3"
33483374
metro-runtime "^0.84.3"
33493375

@@ -3588,18 +3614,18 @@
35883614
color "^5.0.2"
35893615
text-hex "1.0.x"
35903616

3591-
"@storybook/builder-vite@10.5.3":
3592-
version "10.5.3"
3593-
resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-10.5.3.tgz#4c0f5a11390222369da9b01409ecf7aace756e3f"
3594-
integrity sha512-qX1jb1nbG1mWJrCn3YrDkpbii+KA1uxdVgENeNusD80RrWCwVG8ce+awjZxKuT8qjYyALSAPBvTHUqZ4C1b7Pg==
3617+
"@storybook/builder-vite@10.5.4":
3618+
version "10.5.4"
3619+
resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-10.5.4.tgz#736aedcfbe496d142fd7a4b1e6a5612944fcaebd"
3620+
integrity sha512-eXdgow+brSzZrG3CnG18YwxZwEYNAZIh2G5qKwNoZf0uk2ZCPgLRQwtVAcd7BiiEDGnXUHm9pycAS+UiF4F4Mg==
35953621
dependencies:
3596-
"@storybook/csf-plugin" "10.5.3"
3622+
"@storybook/csf-plugin" "10.5.4"
35973623
ts-dedent "^2.0.0"
35983624

3599-
"@storybook/csf-plugin@10.5.3":
3600-
version "10.5.3"
3601-
resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-10.5.3.tgz#0818709c2761910f1e42710f6231f773eb97fb41"
3602-
integrity sha512-mkPq6zru8fN5+46uC1cZEbKW2ws1hh9KvF4g4/Gu8pNbKnvqULPhk0/Bf0ZCtlr7zI7DvcFhyCy3dbvN+2n4Gw==
3625+
"@storybook/csf-plugin@10.5.4":
3626+
version "10.5.4"
3627+
resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-10.5.4.tgz#750cb3cb74693e482e48c945f1bd29252ab1dc52"
3628+
integrity sha512-DSp5Z/eZlRnKq0KrKLJE6uoYf/Ysc+FP0Z5DVTGnOrie+z3tC0lNi9I4RB++EXkJeUDS9/4dxvJZVSWjhLlXxw==
36033629
dependencies:
36043630
unplugin "^2.3.5"
36053631

@@ -3613,33 +3639,33 @@
36133639
resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-2.0.2.tgz#765b49b902a2bdf6f3a5a1aa8dc0cdcd3c55c5b5"
36143640
integrity sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==
36153641

3616-
"@storybook/react-dom-shim@10.5.3":
3617-
version "10.5.3"
3618-
resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-10.5.3.tgz#e176a6549aa02002e375cb66467a00c5403745f8"
3619-
integrity sha512-eUWBsRRax5R3MDJVFs/CrFDF1bYS58AMB9tX02lLRuiZe6xy1cKh3CRFS+2xH571l0fNaXQ+7j69TOJ0fk2tmA==
3642+
"@storybook/react-dom-shim@10.5.4":
3643+
version "10.5.4"
3644+
resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-10.5.4.tgz#c92bb6d8b26aaa4523efa5a8b99178a0a76a3d52"
3645+
integrity sha512-YdlppEOReg8MvTECRNuf79gu2zL83JqKDHIR/65eS0M6y+ue9pkpfjYo7hZVIcyOcRd9npBDXMdt2kC92bCuaA==
36203646

3621-
"@storybook/react-vite@10.5.3":
3622-
version "10.5.3"
3623-
resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-10.5.3.tgz#f9b95d26bf5b47d442ad0942885f016005339c20"
3624-
integrity sha512-9cXaeU3+Kos4M3+Ezur2u/eBn3JIkED6ckxi7lhVQ6r2lK9NAGh5tfHSTQ/206KNSjvaHxZMAhPpxJP3/e2vfQ==
3647+
"@storybook/react-vite@10.5.4":
3648+
version "10.5.4"
3649+
resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-10.5.4.tgz#d7fb799ba677cd10733535289a61d493a15e2fd1"
3650+
integrity sha512-iw7EAA98n30vpf+ZSy2Ll4Ne7oyZ/lS6W22u5Sp5UOI2oAkYuklxIWjRIKGqpY0BHP+GqaGYtUGMZQnBqgul2g==
36253651
dependencies:
36263652
"@joshwooding/vite-plugin-react-docgen-typescript" "^0.7.0"
36273653
"@rollup/pluginutils" "^5.0.2"
3628-
"@storybook/builder-vite" "10.5.3"
3629-
"@storybook/react" "10.5.3"
3654+
"@storybook/builder-vite" "10.5.4"
3655+
"@storybook/react" "10.5.4"
36303656
empathic "^2.0.0"
36313657
magic-string "^0.30.0"
36323658
react-docgen "^8.0.2"
36333659
resolve "^1.22.8"
36343660
tsconfig-paths "^4.2.0"
36353661

3636-
"@storybook/react@10.5.3":
3637-
version "10.5.3"
3638-
resolved "https://registry.yarnpkg.com/@storybook/react/-/react-10.5.3.tgz#878720f72ed83cb86441f254cb296d87c07c4a88"
3639-
integrity sha512-d/CK78xgA7DDvqnxkqcYmiTjomE4ch2TWvk0O8/xHQWW6y0nMjKtsZbmUBfZ0QcdYdWq7dErzfbG7YAzxDi7Ig==
3662+
"@storybook/react@10.5.4":
3663+
version "10.5.4"
3664+
resolved "https://registry.yarnpkg.com/@storybook/react/-/react-10.5.4.tgz#0371b370739dfeb9ec92ea3a93fc51ccbbb36059"
3665+
integrity sha512-tOxfVgbYcaVsArN8XTDkJfdsnsnHh1LxjRHVpJ/N+VEkz4FveK/XH3jOLV0YqgrG8yXza7+CteDP4FfPVQY/mw==
36403666
dependencies:
36413667
"@storybook/global" "^5.0.0"
3642-
"@storybook/react-dom-shim" "10.5.3"
3668+
"@storybook/react-dom-shim" "10.5.4"
36433669
react-docgen "^8.0.2"
36443670
react-docgen-typescript "^2.2.2"
36453671

@@ -12321,10 +12347,10 @@ stop-iteration-iterator@^1.1.0:
1232112347
es-errors "^1.3.0"
1232212348
internal-slot "^1.1.0"
1232312349

12324-
storybook@10.5.3:
12325-
version "10.5.3"
12326-
resolved "https://registry.yarnpkg.com/storybook/-/storybook-10.5.3.tgz#72ee7cc02e3b6353eeec9633c2367437cf2ac86e"
12327-
integrity sha512-c8Wumu5qz0N2fnzWBxcPzUsY+8BpKBKChNyl4BEh9qhMV6KW587gL8il8emRB+4Hay+zMjDHA7cIeTkl4FKYuw==
12350+
storybook@10.5.4:
12351+
version "10.5.4"
12352+
resolved "https://registry.yarnpkg.com/storybook/-/storybook-10.5.4.tgz#3190fc10568053bd32f198ef164c045904cd2582"
12353+
integrity sha512-bmLxPsxVSPnbeiZqYQpozyNOiJXfk+pf7WfHZflvPkwT6Y+rvYz3Cj/D6H4Kf2jHpuDNiMXBKO3yawLN2OWirg==
1232812354
dependencies:
1232912355
"@storybook/global" "^5.0.0"
1233012356
"@storybook/icons" "^2.0.2"

skill/update-dependencies/SKILL.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ These are pinned to the Expo SDK version — do not touch:
1111

1212
- `react`, `react-dom`, `react-is`, `react-test-renderer` — must match Expo SDK
1313
- `react-native` — must stay on the minor version Expo SDK expects (e.g., Expo 56 → react-native 0.85.x). Do NOT update across minor versions.
14-
- `@react-native/babel-preset`, `@react-native/eslint-config`, `@react-native/metro-config` — must match the `react-native` version (e.g., react-native 0.85.x → these stay at 0.85.x). Do NOT update across minor versions.
14+
- `@react-native/babel-preset`, `@react-native/eslint-config`, `@react-native/metro-config` — must stay on `react-native`'s major version line (react-native 0.86.x → these stay 0.86.x), but minor bumps within it ARE fine (0.86.0 → 0.86.1) — take them on routine passes. Never cross to 0.87.x while react-native is 0.86.x. The check script caps these automatically.
15+
16+
> Version terminology in this project (all packages, not just react-native): a version-line change like 0.86 → 0.87 is a **major**; the last number (0.86.0 → 0.86.1) is a **minor**.
1517
1618
`expo` and `expo-*` packages **can** be updated, but update them all together in one pass since they are versioned in sync.
1719

skill/update-dependencies/check-outdated.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
deps.update(pkg.get('devDependencies', {}))
1212

1313
SKIP = {'react-native-kb'}
14-
PINNED = {'react', 'react-dom', 'react-is', 'react-test-renderer',
15-
'react-native', '@react-native/babel-preset', '@react-native/eslint-config', '@react-native/metro-config'}
14+
PINNED = {'react', 'react-dom', 'react-is', 'react-test-renderer', 'react-native'}
15+
# Project terminology: a version-line change (0.86 -> 0.87) is a MAJOR, the
16+
# last number (.1, .2) is minor. These must stay on react-native's major
17+
# (0.86), but minor bumps within it are allowed (0.86.0 -> 0.86.1, never 0.87.x).
18+
RN_MAJOR_PINNED = {'@react-native/babel-preset', '@react-native/eslint-config', '@react-native/metro-config'}
1619

1720
import re as _re
1821

@@ -52,9 +55,14 @@ def _is_prerelease(v):
5255
def get_latest(name, current):
5356
if name in SKIP or current.startswith(('file:', 'link:', 'github:')):
5457
return name, current, current, 'skip', current
58+
# npm: alias (e.g. typescript-native -> "npm:typescript@7.0.2"): query the
59+
# real package; report under the alias name with the real version.
60+
query_name = name
61+
if current.startswith('npm:'):
62+
query_name, current = current[4:].rsplit('@', 1)
5563
is_pre = _is_prerelease(current)
5664
try:
57-
r = subprocess.run(['yarn', 'info', name, 'versions', '--json'],
65+
r = subprocess.run(['yarn', 'info', query_name, 'versions', '--json'],
5866
capture_output=True, text=True, timeout=15)
5967
if r.returncode != 0:
6068
raise RuntimeError(f'yarn info exited {r.returncode}: {r.stderr.strip() or r.stdout.strip()}')
@@ -64,6 +72,17 @@ def get_latest(name, current):
6472
parsed = json.loads(raw)
6573
all_versions = parsed.get('data', [])
6674
cur_major = _parse_semver(current)[0]
75+
if name in RN_MAJOR_PINNED:
76+
# Cap at react-native's major (0.86) — minor bumps only.
77+
cur_rn_major = _parse_semver(current)[1]
78+
candidates = [v for v in all_versions if not _is_prerelease(v)
79+
and _parse_semver(v)
80+
and _parse_semver(v)[0] == cur_major
81+
and _parse_semver(v)[1] == cur_rn_major]
82+
latest = max(candidates, key=semver_key) if candidates else current
83+
if semver_key(latest) < semver_key(current):
84+
latest = current
85+
return name, current, latest, 'rn-major-pinned', latest
6786
if is_pre:
6887
# Consider all versions on the same major — pre or stable.
6988
# This handles graduation (e.g. 56.0.0-preview.x → 56.0.5 stable).

0 commit comments

Comments
 (0)