Rubén Norte
90d · built 2026-09-08
Performance
What Rubén Norte shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
−0.3engineers
delivers like 0.7 (0.7x pre-AI)
Output (ETV)
7.9ETV
+51.1% vs 5.2 prior
Features share
21.6%
−8.0 pp vs prior window
Fixes share
3.9%
−7.0 pp vs prior window
Work mix
21.6% Features14.4% Maintenance56.5% Tests3.6% Docs3.9% Fixes
43 commits over 90 days, ending 2026-09-08.
Daily performance
Daily ETV, stacked by Features, Maintenance, Tests, Docs and Fixes.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
| Repo | Commits | ETV |
|---|---|---|
| react-native | 43 | 7.9 |
Most impactful commits
Top 10 by ETV in the last 90 days.
- 1.5ETVAdd Fantom integration tests for core public APIs (#57466) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57466 Adds Fantom `-itest.js` coverage for maintained, public React Native APIs that were previously untested or thinly tested, driving both the JavaScript logic and the underlying cross-platform C++ through the public `react-native` package surface. To make JavaScript-driven animations deterministic under the test runner, this also introduces a small timing indirection in `Animated`: - New module `Animated/AnimationTimingUtils.js` exports `getCurrentAnimationTime` (returns `Date.now()` by default) and `setAnimationTimeProvider` (overrides the time source; pass `null` to restore the default). - `TimingAnimation`, `SpringAnimation` and `DecayAnimation` now read the current time from `getCurrentAnimationTime()` instead of calling `Date.now()` directly. The default behavior is unchanged. With this, a test can override the provider with a clock that advances one frame per read, which drives the JS-driver animation at the same cadence as the native frame clock. The spring and decay tests use this to verify the actual animation curve (overshoot for an underdamped spring, exponential deceleration for decay), not just the final value, and to run a single unified code path for both the JS and native drivers. New test files: - `Animated/__tests__/SpringAnimation-itest.js`, `DecayAnimation-itest.js`, `AnimatedColor-itest.js`, `AnimatedComposition-itest.js` — spring/decay curve shape (both drivers), `Animated.Color` value semantics, and the composition nodes (`add`/`subtract`/`multiply`/`divide`/`modulo`/`diffClamp`/tracking). `AnimatedFantomTestUtils.js` holds the shared trajectory helper. - `Components/View/__tests__/View-nativeCSSParsing-itest.js` — string-valued CSS (color functions, transform, gradients) parsed via native CSS parsing. - `Pressability/__tests__/Pressability-touch-itest.js` — press in/out/press, long press, press delay, and responder termination via touch events and the deterministic timer mock. - `Interaction/__tests__/PanResponder-itest.js` — grant/move/release/terminate and gesture state across touch sequences. - `LayoutAnimation/__tests__/LayoutAnimation-itest.js` — `configureNext`/`create`/presets applying the resulting layout. - `Network/__tests__/Network-itest.js` — synchronous `XMLHttpRequest` lifecycle and validation. Extended test files: - `Components/TextInput/__tests__/TextInput-itest.js` — `onSelectionChange`/`onSubmitEditing`/`onKeyPress`/`onEndEditing` events. - `Lists/__tests__/FlatList-itest.js` — `onViewableItemsChanged` across all `viewabilityConfig` options (`itemVisiblePercentThreshold`, `viewAreaCoveragePercentThreshold`, `minimumViewTime`, `waitForInteraction`). - `Text/__tests__/Text-itest.js` — `letterSpacing`, `lineHeight`, and `fontVariant` styles. The runtime behavior of `Animated` is unchanged; the new timing indirection defaults to `Date.now()`. Changelog: [Internal] Reviewed By: javache, zeyap Differential Revision: D110784436 fbshipit-source-id: 886c5fa735adb01b107ffba7c52c96f2a31b8909github.com-facebook-react-native · 17e55f6b · 2026-07-14
- 1.2ETVAdd an interactive REPL for Fantom (yarn fantom-cli) (#57387) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57387 Adds `yarn fantom-cli`, an interactive REPL that evaluates JavaScript against the same native tester binary and Hermes runtime that Fantom tests run in. State persists across lines, input goes through Metro/Babel (so `import`, JSX and Flow all work), and the environment is set up the same way tests set it up — `React`, `ReactNative` and the `Fantom` API are available globally, so you can render surfaces and drive them interactively from the prompt. The native tester gains an `--interactive` mode that loads a warm-up bundle without running tests and then evaluates length-prefixed snippets read from stdin, reporting results, console output and errors back as newline-delimited JSON. A Node driver hosts a Metro server, builds the warm-up bundle, spawns the binary, and bridges each line of input into the live runtime (top-level declarations persist across evaluations). Features: - Console-style output: results are printed with an inspector similar to the Chrome DevTools / Node.js consoles (nested objects/arrays up to a depth limit, quoted strings, functions/classes, `Map`/`Set`/`RegExp`/`Date`/`Error`, class instances, circular references, multi-line wrapping), colorized by type when stdout is a terminal. Inspecting a property never aborts the result or leaks into later evaluations: a property whose getter fails renders as `[Thrown: <error>]`, including getters that fail asynchronously through the runtime's global error handler (e.g. accessing a `react-native` export backed by a TurboModule that isn't registered). - Autocompletion: pressing Tab completes global identifiers, in-scope bindings and object properties (property names are listed without invoking getters). - Node-like CLI: with no arguments it starts the REPL; `-e <code>` evaluates a snippet and exits; a filename runs that script and exits. In the non-interactive modes the value of a trailing expression is not printed (use `console.log`) and a thrown error exits with a non-zero status code. Also documents the REPL in the Fantom README. Changelog: [Internal] Reviewed By: javache, sammy-SC Differential Revision: D110187712 fbshipit-source-id: 3e76c498ae04b8b1ce9e0e27e5ce6b6a0cd11e09github.com-facebook-react-native · 2bb7dbb4 · 2026-07-01
- 0.8ETVRemove ReactNativeElement from Fantom tests (nullthrows/HostInstance/HTMLElement) (#57468) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57468 Removes the `ensureInstance(ref.current, ReactNativeElement)` pattern from Fantom tests. Host refs are typed as `HostInstance` and read with `nullthrows(ref.current)`; component-specific instance types (e.g. `React.ElementRef<typeof TextInput>`, `React.ElementRef<typeof ScrollView>`) are kept only where a test actually uses a component's imperative API (`focus`/`blur`/`clear`, `getInnerViewRef`, etc.). This drops the `ReactNativeElement`/`ensureInstance` imports from tests that only needed a non-null host instance. Where a test genuinely needs a runtime type check, `instanceof ReactNativeElement` / `toBeInstanceOf(ReactNativeElement)` is replaced with the standard `instanceof HTMLElement` (a global), since React Native elements are instances of `HTMLElement` at runtime. This also covers the internal `-itest.fb.js` tests and the shared ShadowNode test utilities (`ShadowNodeReferenceCounter`/`ShadowNodeRevisionGetter`), which now type their refs as `HostInstance`. Known follow-up: the RN Flow global type definitions still need to be fixed. At the type level `HTMLElement` does not match `HostInstance` yet, even though the runtime values do. Because of this, `HTMLElement` cannot be used where a narrowed value flows into RN-internal APIs typed as `HostInstance`/`ReadOnlyNode` (e.g. `VirtualView`, which instead types its helper params as `HostInstance` directly and passes them through without a narrowing check). Aligning the `HTMLElement` global definition with `HostInstance` would let those remaining spots use `HTMLElement` too. This is a test-only change with no runtime or user-facing impact. Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D110888634 fbshipit-source-id: c570700ed82fd8333093ee01816e872c486f3e8fgithub.com-facebook-react-native · 5e64e907 · 2026-07-08
- 0.7ETVAdd deterministic timer mock to Fantom (#57274) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57274 Fantom could not deterministically fire delayed JS timers: the timer registry it used scheduled timers on a real background thread with real wall-clock delays, so `setTimeout(fn, 100)`/`setInterval` callbacks never fired within a synchronous test. This adds a mockable timer registry and a public Fantom API to control it from JS, similar to `installHighResTimeStampMock`. - New `Fantom.installTimerMock()` returns a controller with `advanceTimersByTime(ms)`, `runAllTimers()`, `getPendingTimerCount()`, and `uninstall()` (jest fake-timer style). While installed, `setTimeout`/`setInterval` callbacks only fire when the virtual clock is advanced. - New deterministic `FantomTimerRegistry` (no background thread) keyed off a virtual clock, injected via a new optional `platformTimerRegistryFactory` seam on `ReactInstanceConfig` (the default registry is unchanged for all other consumers). - `PlatformTimerRegistry` gains a virtual `setTimerManager` (default no-op) so the registry can be wired polymorphically. - Control flows from JS through new `NativeFantom` methods, the same way the high-res timestamp mock works. Default (non-mock) behavior is preserved: zero-delay `setTimeout` still fires on the next work loop, and existing tests are unaffected. Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D109017304 fbshipit-source-id: 8afe6fb2a39f470ae293038f6592c46535442dc2github.com-facebook-react-native · 2d491c0c · 2026-06-19
- 0.4ETVMigrate Components, FlatList, and Modal Jest tests to Fantom (#57268) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57268 Migrates component unit tests from regular Jest (`-test.js`) to Fantom (`-itest.js`) so they render through the real React Native runtime (Fabric/Yoga) instead of a mocked renderer. Folded missing cases into existing Fantom tests (`View`, `ScrollView`, `Pressable`, `ActivityIndicator`, `Button`, `TouchableOpacity`, `TouchableWithoutFeedback`, `Modal`, `FlatList`) and added new Fantom tests for `TouchableNativeFeedback` and `InputAccessoryView`. Obsolete file snapshots that captured the old mocked output were removed; assertions now compare against the real Fabric output. A few component tests remain on Jest for now because they depend on capabilities Fantom does not provide (module mocks of native modules / mock-based event simulation): `AccessibilityInfo`, `DrawerAndroid`, `Keyboard`, `StatusBar`, and `Pressability`. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D108759082 fbshipit-source-id: 7b8e13cc73cf18444a6c68742ff09e9a44cffbbcgithub.com-facebook-react-native · f5c7510a · 2026-06-18
- 0.3ETVMigrate Image, Text, and NativeComponent Jest tests to Fantom (#57262) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57262 Migrates `Image`, `Text`, and `NativeComponent` unit tests from regular Jest (`-test.js`) to Fantom (`-itest.js`). Folded missing cases into the existing `Image`, `ImageBackground`, and `Text` Fantom tests (asserting real Fabric output such as `rn-image`/`rn-paragraph` instead of the previously mocked `RCTImageView`/`RCTText`), and migrated the pure-logic helpers `AssetUtils`, `ImageSourceUtils`, `assetRelativePathInSnapshot`, and `StaticViewConfigValidator`. Obsolete mocked-output snapshots were removed. `resolveAssetSource` remains on Jest because it relies on `jest.resetModules` to reset module-level state between cases, which Fantom does not support. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D108759081 fbshipit-source-id: 5863056c3f7a754f37e3ebe6d6f646a0f7a4da5egithub.com-facebook-react-native · 5198778d · 2026-06-18
- 0.3ETVAdd direct-event fast path to EventTarget dispatch (rnIsDirect) (#57448) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57448 Direct events (those that neither bubble nor capture, such as `onLayout`) were still dispatched through the full W3C event-path algorithm when using the EventTarget-based dispatcher: the path was built by walking every ancestor up to the root, and the capture phase then iterated over all of them, even though a direct event only ever fires on its target. This made direct-event dispatch scale with tree depth (O(depth)). This introduces a "direct" event mode on `Event`: - A new RN-specific `rnIsDirect` option on `EventInit` (with a matching `rnIsDirect` getter). A direct event has only an `AT_TARGET` phase and an event path containing just the target node. - Construction validation: an event cannot be both `rnIsDirect` and `bubbles`; the constructor throws a `TypeError` for that combination. - When `rnIsDirect` is set, the event path is restricted to the target, so dispatch skips the ancestor walk and capture-phase traversal (O(1)). The renderer opts native direct events into this fast path (behind a runtime gate) by tagging them with `rnIsDirect` at the dispatch site. Bubbling events that merely skip bubbling (e.g. `onPointerEnter`) still have a capture phase and are intentionally not treated as direct. This is gated and defaults off, so there is no behavior change by default. Benchmark results (median dispatch latency for the new `onLayout` direct-event benchmarks; all use the same stable-tree setup so depth is directly comparable): | onLayout dispatch | EventTarget off (baseline) | EventTarget on, direct off | EventTarget on, direct on | | --- | --- | --- | --- | | flat (1 handler) | 12.7us | 20.7us | 18.2us | | nested 10 deep | 12.7us | 33.4us | 18.1us | | nested 50 deep | 12.7us | 82.2us | 18.2us | Without the fast path, EventTarget dispatch of a direct event scales with tree depth (20.7us -> 33.4us -> 82.2us). The fast path restores O(1): dispatch cost is flat across depth (~18us) and the nested-50-deep case drops from ~82.2us to ~18.2us (~4.5x faster), approaching the legacy baseline (~12.7us). The EventTarget-off numbers are unchanged by the direct-events flag, confirming the flag is correctly gated. Changelog: [Internal] Reviewed By: javache Differential Revision: D110759162 fbshipit-source-id: f6b2a7ece9bf4a00c6534a69c89c84bc713233d2github.com-facebook-react-native · ef146290 · 2026-07-07
- 0.3ETVMigrate Animated Jest tests to Fantom (#57265) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57265 Migrates 10 Animated unit tests from regular Jest (`-test.js`) to Fantom (`-itest.js`) so they run on Hermes in the real React Native runtime. Migrated: `Easing`, `bezier`, `Interpolation`, `AnimatedObject`, `AnimatedValue`, `AnimatedMock`, `TimingAnimation`, `createAnimatedPropsHook`, `createAnimatedPropsMemoHook`. The two `Libraries/Animated/nodes/AnimatedProps` cases were folded into the existing `AnimatedProps-itest.js` (importing the same module), with no loss of coverage. Adaptations (no behavioral coverage weakened): - Drove animation timing with Fantom scheduling instead of jest fake timers, and asserted against the real native animated backend rather than mocking it. - Replaced `react-test-renderer` rendering with Fantom `createRoot` + `runTask`, asserting real Fabric output / element refs. Four Animated tests intentionally remain on Jest because they depend on capabilities Fantom does not provide (jest fake timers and/or module mocks of the native animated module): `Animated`, `Animated-web`, `AnimatedNative`, and `NativeAnimatedAllowlist`. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D108759083 fbshipit-source-id: ef689787a8cfcf582111b01455f0bfc11ebb2e98github.com-facebook-react-native · 36ba5a24 · 2026-06-18
- 0.3ETVMigrate Utilities and EventEmitter Jest tests to Fantom (#57267) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57267 Migrates 17 unit tests from regular Jest (`-test.js`) to Fantom (`-itest.js`) under `Libraries/Utilities` (and `Libraries/Utilities/differ`) and `Libraries/vendor/emitter`, so this runtime client code is tested on Hermes in the real React Native runtime. Migrated: `binaryToBase64`, `deepFreezeAndThrowOnMutationInDev`, `DeviceInfo`, `Dimensions`, `logError`, `mapWithSeparator`, `PixelRatio`, `Platform`, `SceneTracker`, `stringifySafe`, `useColorScheme`, `useMergeRefs`, `useRefEffect`, `warnOnce`, `differ/deepDiffer`, `differ/matricesDiffer`, and `EventEmitter`. Adaptations (no behavioral coverage weakened): - Replaced `jest.spyOn(console, ...)` with manual save/replace/restore capture of the `console` method. - Replaced hook/component tests that used `react-test-renderer` with Fantom rendering (`createRoot` + `runTask`), reading hook return values via a small probe component and ref identity via `ensureInstance`. - Adapted a few expected values to the real Hermes/Android runtime (e.g. function `toString` output, `useColorScheme` returning null when native Appearance is unavailable). - Replaced node-only `TextEncoder`/`TextDecoder` usage in `binaryToBase64` with explicit byte construction. Two tests intentionally remain on Jest because they cannot be expressed without module mocking / the test-renderer tree API (both unsupported by Fantom): `codegenNativeComponent` (mocks native component registration) and `ReactNativeTestTools` (tests jest helpers built on the `react-test-renderer` instance tree). Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D108759079 fbshipit-source-id: fb1a2fce2a9faa6b314a230adae5e261340530b1github.com-facebook-react-native · 379f4779 · 2026-06-18
- 0.2ETVRethrow event listener errors synchronously for native event dispatch (#57207) Summary: Pull Request resolved: https://github.com/react/react-native/pull/57207 Under the EventTarget-based event dispatch path, an error thrown by an event handler (e.g. `onPress`, `onScroll`) was deferred to a new task via `setTimeout(0)` in `reportListenerError`. This diverged from the legacy plugin path, which collected the first listener error and rethrew it synchronously at the end of the dispatch (React's `runEventsInBatch` + `rethrowCaughtError`). As a result, handler errors escaped the synchronous dispatch flow — they were no longer catchable by React error boundaries or the native event call, and instead surfaced as deferred, uncaught global errors. This restores the legacy contract for native event dispatch: - `dispatchTrustedEvent` gains an opt-in `rethrowListenerErrors` argument. `dispatch()` threads a per-dispatch error holder through `invoke`/`invokeListeners`; when the flag is set it records the first listener error and rethrows it synchronously after the event has been fully cleaned up. - The renderer's native event dispatch (`dispatchNativeEvent`) opts in, so listener errors propagate synchronously again. The responder lifecycle `rethrowCaughtError()` is moved into a `finally` so a pending responder error can never leak into a later dispatch if the normal dispatch throws. - The public `dispatchEvent` API and other `EventTarget` consumers (e.g. `XMLHttpRequest`) are unchanged: they keep the DOM contract of reporting listener errors to the global error handler without throwing. - Re-enabled the previously skipped event-dispatch error-handling integration tests so they run in both dispatch modes. Changelog: [Internal] Reviewed By: javache Differential Revision: D108622141 fbshipit-source-id: 941500d12e217da6c0be1cb48e4dcae5537666c9github.com-facebook-react-native · 9984cf8e · 2026-06-16