sootsim 0.1.310 → 0.1.311

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist-cli/bin.js +5 -5
  2. package/dist-cli/chunks/{agent-CPD4GIXP.js → agent-KOPVOZ7G.js} +2 -2
  3. package/dist-cli/chunks/{agent-wrapper-JZTNUUZE.js → agent-wrapper-KVAIIK7K.js} +2 -2
  4. package/dist-cli/chunks/{app-fonts-CFIBFEVF.js → app-fonts-5ZX2IRBS.js} +2 -2
  5. package/dist-cli/chunks/{assert-C5WAWJ6I.js → assert-NRKM4ZIK.js} +2 -2
  6. package/dist-cli/chunks/{auth-UY7RPLPH.js → auth-MSLDV5HR.js} +2 -2
  7. package/dist-cli/chunks/{beta-NM7T7MDN.js → beta-L5QKFHWI.js} +2 -2
  8. package/dist-cli/chunks/{camera-4YUYYYJI.js → camera-5JUNQPSI.js} +2 -2
  9. package/dist-cli/chunks/{chunk-RYPPRVBM.js → chunk-3Y6476ZM.js} +2 -2
  10. package/dist-cli/chunks/{chunk-GQVBLBUJ.js → chunk-5V5MOREL.js} +2 -2
  11. package/dist-cli/chunks/{chunk-FT2XATWO.js → chunk-6JYTKF5O.js} +1 -1
  12. package/dist-cli/chunks/{chunk-LKAAQBT6.js → chunk-6QZY6YO2.js} +1 -1
  13. package/dist-cli/chunks/{chunk-TAQV44LZ.js → chunk-6SICKWPQ.js} +3 -3
  14. package/dist-cli/chunks/{chunk-Z6H5FR3U.js → chunk-75KNNHMR.js} +2 -2
  15. package/dist-cli/chunks/{chunk-YRRUK3EK.js → chunk-75YOUNTE.js} +1 -1
  16. package/dist-cli/chunks/chunk-7PHOEBKV.js +4 -0
  17. package/dist-cli/chunks/{chunk-S7WXPIOY.js → chunk-7W63IKAP.js} +2 -2
  18. package/dist-cli/chunks/chunk-CJKSD5BZ.js +5 -0
  19. package/dist-cli/chunks/{chunk-SY7E43UY.js → chunk-CKMQ2YXQ.js} +3 -3
  20. package/dist-cli/chunks/{chunk-QPZVGHRV.js → chunk-CUVLXG63.js} +1 -1
  21. package/dist-cli/chunks/{chunk-7RJEULWN.js → chunk-EHBHUE6S.js} +2 -2
  22. package/dist-cli/chunks/{chunk-NLTJE335.js → chunk-F2WH6XM7.js} +2 -2
  23. package/dist-cli/chunks/{chunk-63JWRDM6.js → chunk-GEUU2WIL.js} +2 -2
  24. package/dist-cli/chunks/{chunk-ZNK3ZAA5.js → chunk-GFKP5JIA.js} +2 -2
  25. package/dist-cli/chunks/{chunk-6UXXOG6P.js → chunk-GLECQIGB.js} +2 -2
  26. package/dist-cli/chunks/{chunk-3S7UEXZW.js → chunk-HI5MWY32.js} +1 -1
  27. package/dist-cli/chunks/{chunk-GH2OE6F6.js → chunk-J6ZKDIRN.js} +2 -2
  28. package/dist-cli/chunks/{chunk-PJKCYUT3.js → chunk-JGFIT5X5.js} +2 -2
  29. package/dist-cli/chunks/{chunk-3EO5JEG7.js → chunk-KGIXNUUM.js} +2 -2
  30. package/dist-cli/chunks/{chunk-BFNAFH27.js → chunk-KKXSWEYS.js} +1 -1
  31. package/dist-cli/chunks/{chunk-EPMLSKSB.js → chunk-NBNEISXX.js} +2 -2
  32. package/dist-cli/chunks/{chunk-EWRPLFYI.js → chunk-P7MI3VFY.js} +1 -1
  33. package/dist-cli/chunks/{chunk-YIJFCR5T.js → chunk-PHFRI2QF.js} +1 -1
  34. package/dist-cli/chunks/{chunk-RMIKUUCO.js → chunk-PJ27D3WO.js} +1 -1
  35. package/dist-cli/chunks/{chunk-MUQDPJUP.js → chunk-QCEMDWL4.js} +1 -1
  36. package/dist-cli/chunks/{chunk-2TRPGEZE.js → chunk-QILKSUH6.js} +2 -2
  37. package/dist-cli/chunks/{chunk-WWIQEYHT.js → chunk-QMHUIADD.js} +1 -1
  38. package/dist-cli/chunks/{chunk-66Z2ADUQ.js → chunk-QUAY5AZB.js} +2 -2
  39. package/dist-cli/chunks/{chunk-C3GMSIRT.js → chunk-RATCQLQA.js} +2 -2
  40. package/dist-cli/chunks/{chunk-C3O6UUPY.js → chunk-RHGVZJIY.js} +3 -3
  41. package/dist-cli/chunks/{chunk-BMIIHY6K.js → chunk-RIT4KI4Y.js} +3 -3
  42. package/dist-cli/chunks/{chunk-4XMPRQGE.js → chunk-S5U22PVL.js} +1 -1
  43. package/dist-cli/chunks/{chunk-XBBNRESY.js → chunk-SKGITCWL.js} +1 -1
  44. package/dist-cli/chunks/{chunk-RX4CFOVV.js → chunk-ULJT3HDO.js} +1 -1
  45. package/dist-cli/chunks/{chunk-XMOULANJ.js → chunk-VAFDFOE6.js} +2 -2
  46. package/dist-cli/chunks/{chunk-M2LP2VYQ.js → chunk-VJMY2MX6.js} +2 -2
  47. package/dist-cli/chunks/{chunk-IS5OOCN5.js → chunk-VNS6KYRJ.js} +1 -1
  48. package/dist-cli/chunks/{chunk-R7AS52NA.js → chunk-W4S7GGPG.js} +3 -3
  49. package/dist-cli/chunks/{chunk-YMD6WWI7.js → chunk-WIYIQQQS.js} +2 -2
  50. package/dist-cli/chunks/{chunk-VAGUPECL.js → chunk-WTNKX7QD.js} +2 -2
  51. package/dist-cli/chunks/{chunk-STWCCIBA.js → chunk-Y5O5GK2Q.js} +11 -11
  52. package/dist-cli/chunks/{chunk-YZPSUNTO.js → chunk-Y7RQGSZD.js} +2 -2
  53. package/dist-cli/chunks/{chunk-XKAXZ4DS.js → chunk-YOIHAHR5.js} +1 -1
  54. package/dist-cli/chunks/{chunk-ZS7OXPHR.js → chunk-YS7YDOGW.js} +1 -1
  55. package/dist-cli/chunks/{chunk-CORSX7M5.js → chunk-YTP5VCDL.js} +1 -1
  56. package/dist-cli/chunks/{chunk-2KSLGBIU.js → chunk-ZB3UAYJ4.js} +2 -2
  57. package/dist-cli/chunks/{chunk-EPZUFQMX.js → chunk-ZDQO6TJQ.js} +2 -2
  58. package/dist-cli/chunks/{chunk-C4O4VRN5.js → chunk-ZHPLBK34.js} +2 -2
  59. package/dist-cli/chunks/{cleanup-2ZM4QSDV.js → cleanup-436GW67Y.js} +2 -2
  60. package/dist-cli/chunks/{cli-version-WXOEWZDA.js → cli-version-BY3A3SBN.js} +2 -2
  61. package/dist-cli/chunks/{compat-MGY3FZSI.js → compat-DDJSQ3WI.js} +2 -2
  62. package/dist-cli/chunks/{config-3W5VNME6.js → config-XFLK4XZN.js} +2 -2
  63. package/dist-cli/chunks/{control-7LNRM2BK.js → control-W6KUVHYU.js} +2 -2
  64. package/dist-cli/chunks/daemon-E5MGIR55.js +4 -0
  65. package/dist-cli/chunks/{debug-4CMFC2CO.js → debug-PHSYXSNH.js} +3 -3
  66. package/dist-cli/chunks/{desktop-Q6CZSS4R.js → desktop-6V5ALYCZ.js} +3 -3
  67. package/dist-cli/chunks/{detox-2AF4MXXN.js → detox-SA27XGTO.js} +2 -2
  68. package/dist-cli/chunks/{device-E2WCI2N2.js → device-XURVFXBT.js} +2 -2
  69. package/dist-cli/chunks/{diagnose-CZGCKNVY.js → diagnose-HMUQWQOK.js} +2 -2
  70. package/dist-cli/chunks/disk-cleanup-KYAFCV6S.js +4 -0
  71. package/dist-cli/chunks/drivers-INII4IWR.js +4 -0
  72. package/dist-cli/chunks/{film-UDSAJZXL.js → film-3UM6EUYF.js} +3 -3
  73. package/dist-cli/chunks/flow-RP4UVYUA.js +4 -0
  74. package/dist-cli/chunks/help-STHBZD6I.js +4 -0
  75. package/dist-cli/chunks/{hidden-runtime-alias-CHAB56GM.js → hidden-runtime-alias-DVVAGM4I.js} +2 -2
  76. package/dist-cli/chunks/{home-paths-WFCI5ORX.js → home-paths-LVGGR4AJ.js} +2 -2
  77. package/dist-cli/chunks/inspect-5W52ZHKD.js +4 -0
  78. package/dist-cli/chunks/install-desktop-H4HLLT7K.js +4 -0
  79. package/dist-cli/chunks/{login-57UP2EKB.js → login-2QTBTTGJ.js} +4 -4
  80. package/dist-cli/chunks/{logout-UYNCJTOC.js → logout-PUBLDHVY.js} +2 -2
  81. package/dist-cli/chunks/{maestro-QMAPXPZ7.js → maestro-2UJ27MKD.js} +3 -3
  82. package/dist-cli/chunks/{maestro-generate-N2BJXJDH.js → maestro-generate-P4MDFYMV.js} +3 -3
  83. package/dist-cli/chunks/{mode-SY5G7WQD.js → mode-RRHPX23W.js} +2 -2
  84. package/dist-cli/chunks/{optional-demo-registry-DH3L6FFX.js → optional-demo-registry-5IRF7M7Z.js} +2 -2
  85. package/dist-cli/chunks/{perf-NZ6VEDLA.js → perf-BOLWOAKV.js} +2 -2
  86. package/dist-cli/chunks/{permissions-EMH2K5LX.js → permissions-ZIOTIBPV.js} +2 -2
  87. package/dist-cli/chunks/{record-44PMWGYY.js → record-DU2IKPFK.js} +3 -3
  88. package/dist-cli/chunks/{report-issue-PLGMRWXG.js → report-issue-4CQDUWT2.js} +2 -2
  89. package/dist-cli/chunks/runtime-QWPQ3M7H.js +4 -0
  90. package/dist-cli/chunks/{screenshot-command-GJT5XS7P.js → screenshot-command-XEN26NJV.js} +3 -3
  91. package/dist-cli/chunks/{screenshot-layers-4JSTS5VY.js → screenshot-layers-CRCQ4CEF.js} +2 -2
  92. package/dist-cli/chunks/{screenshots-capture-AQQISSQD.js → screenshots-capture-XGQFYINL.js} +2 -2
  93. package/dist-cli/chunks/{serve-TJMO4KGX.js → serve-UBSRDYA3.js} +2 -2
  94. package/dist-cli/chunks/{setup-7ZSYCUX6.js → setup-AKYIOBVO.js} +2 -2
  95. package/dist-cli/chunks/{skills-GRQPAAD5.js → skills-V5WV4LWH.js} +2 -2
  96. package/dist-cli/chunks/{storage-GWRZNBAU.js → storage-3PJPIHNM.js} +2 -2
  97. package/dist-cli/chunks/store-A27JYIGF.js +4 -0
  98. package/dist-cli/chunks/telemetry-LLD24AVX.js +4 -0
  99. package/dist-cli/chunks/{timeline-2FXM7HEU.js → timeline-OHQNHG52.js} +2 -2
  100. package/dist-cli/chunks/{upgrade-AV7UOK2X.js → upgrade-Q2TYYVIX.js} +2 -2
  101. package/dist-cli/chunks/upload-57FIDO2B.js +4 -0
  102. package/dist-cli/chunks/{version-C72O2LMS.js → version-SW6VCJVI.js} +2 -2
  103. package/dist-cli/chunks/{web-4V3YGWNC.js → web-BXVM3HJ3.js} +2 -2
  104. package/dist-cli/chunks/{what-happened-RGD2DOQI.js → what-happened-H62ASSI5.js} +2 -2
  105. package/dist-lib/agent-daemon-client.cjs +1 -1
  106. package/dist-lib/agent-events.cjs +1 -1
  107. package/dist-lib/agent-identity.cjs +1 -1
  108. package/dist-lib/agent-sessions.cjs +1 -1
  109. package/dist-lib/attached-projects.cjs +1 -1
  110. package/dist-lib/auth/shared-session.cjs +1 -1
  111. package/dist-lib/backend-origin.cjs +1 -1
  112. package/dist-lib/beta.cjs +1 -1
  113. package/dist-lib/beta.mjs +1 -1
  114. package/dist-lib/bridge-constants.cjs +1 -1
  115. package/dist-lib/cli-constants.cjs +1 -1
  116. package/dist-lib/config.cjs +1 -1
  117. package/dist-lib/detox/index.cjs +20 -16
  118. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  119. package/dist-lib/home-paths.cjs +1 -1
  120. package/dist-lib/host/bridge-host.cjs +164 -102
  121. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  122. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  123. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  124. package/dist-lib/host/websocket-proxy.cjs +1 -1
  125. package/dist-lib/index.cjs +1 -1
  126. package/dist-lib/jump-to-source-babel.cjs +1 -1
  127. package/dist-lib/menu.cjs +1 -1
  128. package/dist-lib/menu.mjs +1 -1
  129. package/dist-lib/metro.cjs +1 -1
  130. package/dist-lib/profiles.cjs +1 -1
  131. package/dist-lib/render-mode.cjs +1 -1
  132. package/dist-lib/scripts/dev-server-scanner.cjs +43 -23
  133. package/dist-lib/sdk.cjs +1 -1
  134. package/dist-lib/sdk.mjs +1 -1
  135. package/dist-lib/skills.cjs +277 -206
  136. package/dist-lib/vite.cjs +1 -1
  137. package/package.json +1 -1
  138. package/scripts/dev-server-scanner.ts +34 -8
  139. package/dist-cli/chunks/chunk-63EKEKDF.js +0 -4
  140. package/dist-cli/chunks/chunk-OQO3HU4Y.js +0 -5
  141. package/dist-cli/chunks/daemon-ZNCVHOWJ.js +0 -4
  142. package/dist-cli/chunks/disk-cleanup-4T6MDZBA.js +0 -4
  143. package/dist-cli/chunks/drivers-NEB27ZKQ.js +0 -4
  144. package/dist-cli/chunks/flow-GXXVEHEW.js +0 -4
  145. package/dist-cli/chunks/help-3RVUJUAN.js +0 -4
  146. package/dist-cli/chunks/inspect-4H4VNQJ4.js +0 -4
  147. package/dist-cli/chunks/install-desktop-RGCBPM4J.js +0 -4
  148. package/dist-cli/chunks/runtime-CUSKTS2J.js +0 -4
  149. package/dist-cli/chunks/store-MLODFZBM.js +0 -4
  150. package/dist-cli/chunks/telemetry-XL3UDJSE.js +0 -4
  151. package/dist-cli/chunks/upload-6DXF4DAQ.js +0 -4
@@ -0,0 +1,4 @@
1
+ /*! sootsim v0.1.311 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ import { createRequire as __sootsimCreateRequire } from 'node:module'
3
+ var require = __sootsimCreateRequire(import.meta.url)
4
+ var u=new Set(["react-native-firebase","react-native-camera","react-native-in-app-purchase"]);var f=["All","Essentials","Navigation","Animation","Image","Keyboard","Lists & Sheets","UI Components","Media","Maps","Storage & Data","Auth & Payments","Notifications","Networking","Device & Platform","Health","Calendar","ML","Expo SDK","Analytics","Internationalization"],m={"react-native-reanimated":{category:"Essentials",stubType:"native",proofCoverage:.75,versions:[{range:">=2.0.0 <3.0.0",coverage:.6,note:"basic shared values + timing"},{range:">=3.0.0 <4.0.0",coverage:.75,note:"scroll handlers, layout animations"},{range:">=4.0.0",coverage:.97,note:"core animations, gestures, scroll, layout transitions, keyboard, sensors, reduced motion, native view property reads, and direct static style snapshots",working:"useSharedValue, useAnimatedStyle/Props/Reaction, useDerivedValue, useAnimatedScrollHandler, useScrollViewOffset, useFrameCallback, useAnimatedRef, useAnimatedKeyboard, useAnimatedSensor, useReducedMotion, entering/exiting/layout transitions, withTiming/Spring/Decay/Delay/Sequence/Repeat/Clamp, interpolate, interpolateColor, runOnJS/UI, measure, scrollTo, getViewProp (layout, opacity, zIndex, backgroundColor, boxShadow), direct setViewStyle snapshots, Easing, createAnimatedComponent, Animated.View/Text/Image/ScrollView/FlatList",missing:"Reanimated 4 native CSS keyframes and transitions remain incomplete"}]},"react-native-gesture-handler":{category:"Essentials",stubType:"native",proofCoverage:.75,versions:[{range:">=2.0.0 <2.30.0",coverage:.7,note:"tap, pan, long press"},{range:">=2.30.0",coverage:.9,note:"tap, pan, pinch, rotation, fling, long press, race, manual, simultaneous",working:"GestureDetector, Gesture.Tap/Pan/Pinch/Rotation/Fling/LongPress/Manual/Race/Simultaneous/Exclusive/Hover, simultaneousWithExternalGesture/requireExternalGestureToFail/blocksExternalGesture, ScrollView/FlatList, Switch/RefreshControl, Pressable/Text, Touchables, BaseButton/RawButton/RectButton/BorderlessButton/PureNativeButton, Swipeable, ReanimatedSwipeable, DrawerLayout (the upstream component running on this seam: renderNavigationView, drawerPosition/drawerType/drawerWidth/edgeWidth, openDrawer/closeDrawer, edge-swipe drag, onDrawerOpen/onDrawerClose/onDrawerStateChanged), GestureHandlerRootView, createNativeWrapper, gestureHandlerRootHOC, PointerType/MouseButton/HoverEffect exports, velocity tracking, activeOffsets, multi-tap",missing:"Gesture.ForceTouch() is absent; ForceTouchGestureHandler renders its children and reports forceTouchAvailable false, as upstream does on hardware without 3D Touch"}]},"react-native-screens":{category:"Essentials",stubType:"native",proofCoverage:.8,versions:[{range:">=3.0.0 <4.0.0",coverage:.6,note:"basic screen container"},{range:">=4.0.0",coverage:.9,note:"screen container, stack, header config, search bar, navigation props",working:"Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, native header bar buttons/menus/badges, crossfade), formSheet custom initial detents/corner radius/grabber/undimmed range and stacked sheets, useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",missing:"replaceAnimation differentiation, interactive drag between formSheet detents, integrated search bar placements"}]},"react-native-safe-area-context":{category:"Essentials",stubType:"native",proofCoverage:.7,versions:[{range:">=4.0.0",coverage:.95,note:"live device/system-bar/ime metrics, edges/mode padding, hooks",working:"SafeAreaProvider with live Android system-bar and IME-resized frame metrics, SafeAreaView (edges/mode padding/margin), useSafeAreaInsets, useSafeAreaFrame, SafeAreaInsetsContext, SafeAreaFrameContext, initialWindowMetrics, SafeAreaListener onInsetsChange, withSafeAreaInsets HOC",missing:"rotation-specific provider frame deltas"}]},"react-native-svg":{category:"Image",stubType:"native",proofCoverage:.65,versions:[{range:">=13.0.0",coverage:.85,note:"full CanvasKit rendering for shapes/text/XML; SVG filter elements skipped",working:"Svg, Path, Circle, Rect, Line, Ellipse, Polygon, Polyline, G, Text, TSpan, Defs, LinearGradient and RadialGradient with objectBoundingBox/userSpaceOnUse coordinates, focal points and gradientTransform, Stop, SvgXml, SvgUri, SvgFromXml, SvgCss, shape transforms, fill/stroke/opacity/dasharray, currentColor, viewBox scaling",missing:"SVG filter primitives (Filter, FeBlend, FeColorMatrix, FeGaussianBlur, FeComposite, etc) are skipped; ClipPath, Mask, Use, Pattern, Symbol, Marker, ForeignObject, TextPath, and Image are also skipped by the renderer"}]},"@react-native-async-storage/async-storage":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"native-seam only \u2014 upstream AsyncStorage JS runs from the bundle and resolves RNCAsyncStorage, which persists through tenant localStorage"}]},"react-native-webview":{category:"Essentials",stubType:"native",proofCoverage:.3,versions:[{range:">=11.0.0",coverage:.5,note:"native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface. the iframe keeps loading while parked behind a canvas placeholder and becomes interactive when promoted live.",working:"source.uri/source.html, document-start ReactNativeWebView bootstrap and injectedJavaScriptBeforeContentLoaded/injectedJavaScript on source.html and percent-encoded data: URI pages, strict ReactNativeWebView.postMessage bridge envelope, onMessage synthetic event with navigation fields, onLoad/Start/End, onNavigationStateChange, ref.reload/stopLoading/injectJavaScript/postMessage, renderLoading, javaScriptEnabled sandbox, layout, inherited clipping and visibility, parked/live presentation",missing:"iframe pixels in canvas screenshots, script injection and ReactNativeWebView bootstrap for remote pages, which get no bridge at all because a browser cannot script a cross-origin frame, the re-encoded data: URI a page reports as its own location.href, so onMessage carries the re-encoded url while onLoad and onNavigationStateChange carry the original where iOS reports one identical url for all three, cross-origin ref.goBack/goForward and truthful canGoBack/canGoForward values, failed HTTP/refused navigation callbacks (onError/onHttpError and renderError), onShouldStartLoadWithRequest, allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, originWhitelist enforcement"}]},"@metamask/react-native-webview":{category:"Essentials",stubType:"native",proofCoverage:.3,versions:[{range:">=14.0.0 <15.0.0",coverage:.5,note:"native-seam only: the maintained scoped fork runs unchanged against the shared RNCWebView host view and RNCWebViewModule implementation",working:"the react-native-webview host view, command, event, loading, message, layout, and presentation behavior supported by the shared seam",missing:"the browser iframe limitations documented for react-native-webview apply to this fork too"}]},"@expo/dom-webview":{category:"Essentials",stubType:"native",versions:[{range:">=55.0.0 <56.0.0",coverage:.3,note:"native-seam only: the published Expo wrapper resolves ExpoDomWebViewModule to the shared hosted webview implementation.",working:"DomWebView/WebView exports, source.uri rendering, document-start ReactNativeWebView bootstrap on percent-encoded data: URI pages, onMessage, ref.injectJavaScript and ref.scrollTo, layout and parked/live presentation",missing:"reload and injectedJavaScriptObject, Expo modules bridge, any bridge at all on a remote page because a browser cannot script a cross-origin frame, cross-origin scrolling, the re-encoded data: URI a page reports as its own location.href, exact native scroll physics and native-only media/keyboard props, iframe pixels in canvas screenshots"},{range:">=56.0.0 <58.0.0",coverage:.35,note:"native-seam only: the published Expo wrapper resolves ExpoDomWebViewModule to the shared hosted webview implementation.",working:"DomWebView/WebView exports, source.uri rendering, onMessage data/url/title, ref.reload/injectJavaScript/scrollTo, document-start ReactNativeWebView bootstrap on percent-encoded data: URI pages, and reload-on-update behavior for injectedJavaScriptObject/injectedJavaScript, layout and parked/live presentation",missing:"document-start timing for injectedJavaScriptObject on URI pages, Expo modules bridge, any bridge at all on a remote page because a browser cannot script a cross-origin frame, cross-origin scrolling, the re-encoded data: URI a page reports as its own location.href, exact native scroll physics and native-only media/keyboard props, iframe pixels in canvas screenshots"}]},"@shopify/flash-list":{category:"Lists & Sheets",stubType:"native",shipsNativeCode:!1,versions:[{range:">=1.0.0 <2.0.0",coverage:.7,note:"real upstream v1 JS (recyclerlistview-backed) runs from the bundle; its two native views resolve as plain engine views, so recycling still works but native layout correction does not",working:"FlashList, MasonryFlashList, ref methods, recyclerlistview virtualization and cell recycling (all pure JS), CellContainer renders as a view",missing:"the AutoLayoutView native pass \u2014 post-layout gap correction between recycled cells and the onBlankArea callback it feeds; overrideItemLayout precision on iOS-specific paths"},{range:">=2.0.0",coverage:.95,note:"real upstream package \u2014 v2 is pure JS with no native views, so nothing is intercepted and the full recycling engine runs on the engine ScrollView",working:"the entire published API runs unmodified: FlashList with its real recycling/virtualization engine, AnimatedFlashList, FlashListRef imperative methods, masonry prop, useLayoutState, useRecyclingState, useMappingHelper, useFlashListContext, LayoutCommitObserver, viewability/ViewToken, the benchmark helpers",missing:"nothing package-level \u2014 remaining gaps are engine ScrollView fidelity, not flash-list"}]},"@react-native-community/netinfo":{category:"Device & Platform",stubType:"native",versions:[{range:">=9.0.0",coverage:.95,note:"navigator.onLine backed with online/offline event listeners",working:"fetch, useNetInfo, addEventListener, NetInfoStateType",missing:'details field always null (no connection type subtype), type always "wifi" or "none" (no cellular/ethernet detection)'}]},"react-native-keyboard-controller":{category:"Keyboard",stubType:"native",proofCoverage:.55,versions:[{range:">=1.0.0",coverage:.88,note:"native bindings stubbed (KeyboardControllerNative, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents, KeyboardControllerView + sibling native views); upstream pure-JS components, hooks, animated module, and KeyboardAvoidingView resolve from node_modules unchanged",working:"every upstream JS export \u2014 KeyboardProvider, KeyboardAvoidingView, KeyboardStickyView, KeyboardAwareScrollView, KeyboardToolbar, KeyboardGestureArea, useReanimatedKeyboardAnimation, useKeyboardAnimation, useKeyboardHandler, useGenericKeyboardHandler, useKeyboardController, useKeyboardState, useKeyboardContext, useReanimatedFocusedInput, useFocusedInputHandler, useResizeMode, useWindowDimensions, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents resize events, KeyboardController (dismiss/setFocusTo/isVisible/state/preload/setInputMode/setDefaultMode), KeyboardControllerView, OverKeyboardView, KeyboardBackgroundView, KeyboardExtender, ClippingScrollView, KeyboardToolbarGroupView, AndroidSoftInputModes \u2014 all run upstream code through reanimated worklets",missing:"preload is a noop; KeyboardGestureArea, OverKeyboardView, KeyboardBackgroundView, and KeyboardExtender are passthrough views without their native platform effects"}]},"@react-native-masked-view/masked-view":{category:"Essentials",stubType:"native",versions:[{range:">=0.2.0",coverage:1,note:"engine-level masked-view node with canvaskit saveLayer + BlendMode.DstIn alpha compositing",working:"MaskedView component renders sootsim-masked-view host element with __sootsimMaskSlot alpha-mask pipeline (saveLayer + DstIn in canvaskit-renderer), maskElement, children, style, pointerEvents, accessible, accessibilityLabel, nativeID, testID"}]},"@react-native-community/masked-view":{category:"Essentials",stubType:"native",versions:[{range:">=0.1.0 <0.2.0",coverage:.9,note:"the retired package name resolves to the same RNCMaskedView-compatible engine node as its renamed successor",working:"default MaskedView component, alpha-channel maskElement compositing, children, View props and refs, and the upstream invalid-mask warning plus unmasked View fallback",missing:"the retired package publishes a class declaration that TypeScript 5.9 cannot use as JSX with current React 19 types; native iOS and Android compositor timing under animated masks"}]},"lucide-react-native":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0 <2.0.0",coverage:.95,note:"the real pure-JavaScript package runs unmodified from the guest bundle and composes the upstream react-native-svg components",working:"generated named icon exports and aliases, per-icon deep entrypoints, createLucideIcon, LucideProvider/useLucideContext, size/color/strokeWidth/absoluteStrokeWidth props, children, testID forwarding, and the circle/ellipse/group/line/path/polygon/polyline/rect icon primitives",missing:"a per-glyph visual audit of the complete generated icon catalog and className styling through arbitrary React Native CSS interop transformers"}]},"react-native-bottom-tabs":{category:"Navigation",stubType:"native",versions:[{range:">=0.10.0",coverage:.8,note:"TabView default export with navigationState/renderScene + custom tabBar render prop, plus BottomTabBarHeightContext/useBottomTabBarHeight/SceneMap; route title/focusedIcon/unfocusedIcon/testID defaults; legacy TabBarView retained",working:"TabView (default export), navigationState + renderScene, custom tabBar render prop, onIndexChange, getLazy/getLabelText/getIcon/getBadge/getTestID/getFreezeOnBlur/getSceneStyle, route focusedIcon/unfocusedIcon/testID defaults, BottomTabBarHeightContext + useBottomTabBarHeight, SceneMap, legacy TabBarView still exported, scenes mount/unmount, focused scene gets pointer events",missing:"sidebarAdaptable, minimizeBehavior, tabBarActiveTintColor/tintColors applied to default bar, renderBottomAccessoryView, on-native tab-long-press wiring, tabBarStyle.backgroundColor applied to default bar"}]},"@callstack/react-native-bottom-tabs":{category:"Navigation",stubType:"native",versions:[{range:">=0.1.0",coverage:.85,note:"renders the platform bottom tab bar with badge/label/sfSymbol",working:"TabBarView, items/selectedIndex/onItemPressed, badge, labeled, sfSymbol, hapticFeedbackEnabled accepted; the default bar follows the device platform (iOS 26 floating liquid-glass pill, android material bottom navigation)",missing:"TabView (navigationState/renderScene pattern), SceneMap, useBottomTabBarHeight, sidebarAdaptable, minimizeBehavior, tabBarActiveTintColor/InactiveTintColor, getIcon/getLazy/getRole/getHidden/getFreezeOnBlur getters"}]},"react-native-worklets":{category:"Animation",stubType:"native",versions:[{range:">=0.1.0",coverage:.97,note:"core RN\u2194UI thread bridging, isolated named Worker runtimes, runtime-kind guards, UI-runtime-id execution, shareable/synchronizable guards, custom serializable registration, and feature flag readers use SootSim worker runtimes.",working:"createWorkletRuntime with isolated named Worker execution and lifecycle teardown, runOnRuntime/runOnRuntimeAsync/scheduleOnRuntime with scheduleOnRN callback return, runOnJS, runOnUI/Sync/Async, scheduleOnRN/UI, UI-runtime runOnRuntimeSyncWithId/scheduleOnRuntimeWithId, makeShareable, createShareable (3-arg form with hostDecorator), createSerializable, createSynchronizable, isShareable, isSynchronizable, isWorkletFunction, isShareableRef, isSerializableRef, makeShareableCloneRecursive/OnUIRecursive, executeOnUIRuntimeSync, callMicrotasks, WorkletsModule, RuntimeKind enum, getRuntimeKind, isRNRuntime, isUIRuntime, isWorkerRuntime, isWorkletRuntime, UIRuntimeId, getUIRuntimeHolder, getUISchedulerHolder, registerCustomSerializable, getStaticFeatureFlag, getDynamicFeatureFlag, setDynamicFeatureFlag, Worklets namespace",missing:"synchronous named-runtime results, runtime-id scheduling into named workers, custom queue/event-loop configuration, cross-runtime structured-clone hooks for custom registered classes, dynamic feature flag fan-out across the tenant\u2194shell split"}]},"expo-constants":{category:"Expo SDK",stubType:"native",proofCoverage:1,versions:[{range:">=14.0.0",coverage:.95,note:"package-local wrapper registers only ExponentConstants; upstream expo-constants JS computes the public Constants object unchanged.",working:"ExponentConstants native module constants matching the bare iOS dictionary: sessionId, executionEnvironment, appOwnership, debugMode, deviceName, isHeadless, statusBarHeight, systemFonts, platform.ios.buildNumber, expoConfig/manifest from the resolved app config, getWebViewUserAgentAsync, and the AppOwnership / ExecutionEnvironment / UserInterfaceIdiom enums from upstream JS",missing:"real binary-derived embedded app config, Expo Updates manifest2, expoGoConfig/easConfig, physical-device status bar and system font enumeration. the Expo Go fields deviceYearClass, expoVersion, expoRuntimeVersion, experienceUrl, isDevice, linkingUri and the deprecated platform.ios model/platform/systemVersion/userInterfaceIdiom are intentionally absent, matching a bare iOS app where the native constants dictionary never publishes them; read device metadata from expo-device instead"}]},"expo-asset":{category:"Expo SDK",stubType:"native",versions:[{range:">=50.0.0",coverage:.95,note:"web-aligned asset loader \u2014 Asset resolves URIs and downloadAsync returns the original URL. browser has no metro asset cache filesystem, so MD5/cache-validation maps onto sootsim asset registry instead.",working:"Asset.fromURI, Asset.fromModule for string/object sources, Asset.fromMetadata, Asset.loadAsync, Asset.downloadAsync, module downloadAsync, useAssets",missing:"Metro numeric asset registry lookup by id (sootsim uses asset descriptors instead), image dimension probing on cold-load (browsers measure async via decode())"}]},"expo-font":{category:"Expo SDK",stubType:"native",versions:[{range:">=11.0.0",coverage:.95,note:"runtime font registry backed by CSS FontFace where available",working:"useFonts (URL/object/require sources), loadAsync, isLoaded, getLoadedFonts, isLoading, unloadAsync, unloadAllAsync, processFontFamily",missing:"renderToImageAsync (native-only), exact Expo asset integration for numeric bundled font ids"}]},"expo-haptics":{category:"Expo SDK",stubType:"native",versions:[{range:">=12.0.0",coverage:.95,note:"every haptic call routes to a real navigator.vibrate pattern with per-style/per-type duration variation: Light/Soft 5-6ms, Medium 10ms, Rigid/Heavy 13-18ms; notificationAsync emits Success=tick, Warning=double-pulse, Error=triple-pulse via vibrate pattern arrays; performAndroidHapticsAsync maps each AndroidHaptics enum value to a discrete duration or pattern that matches its semantic intent (Confirm=tick+pulse, Reject=triple-pulse, Long_Press=longer single, etc.). Apps that vary haptic by intent feel different to the user; on browsers without vibrate (iOS Safari) this is a safe no-op matching the upstream behavior on web.",working:"impactAsync (vibration fallback), notificationAsync, selectionAsync, performAndroidHapticsAsync, ImpactFeedbackStyle enum including Soft/Rigid, NotificationFeedbackType enum, AndroidHaptics enum",missing:"real CHHapticEngine fidelity on iOS hardware (web vibration is binary on/off, not amplitude/sharpness curves) \u2014 unbridgeable in any browser-based simulator"}]},"expo-image":{category:"Image",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"sootsim-image element rendering with onLoad/onError event normalization",working:"Image component, ImageBackground, useImage hook, ImageRef class, contentFit, tintColor, onLoad/onLoadStart/onLoadEnd/onError callbacks, source normalization (string/object/array), prefetch, clearMemoryCache, clearDiskCache, getCachePathAsync, configureCache, generateBlurhashAsync, generateThumbhashAsync, loadAsync",missing:"transition/animation effects, placeholder rendering, blurRadius, contentPosition, sfEffect/SFSymbol, allowDownscaling, autoplay (GIF), responsivePolicy"}]},"expo-linking":{category:"Expo SDK",stubType:"native",versions:[{range:">=5.0.0",coverage:.95,note:"core linking and scheme helpers implemented for the browser simulator URL model. canOpenURL/openURL resolve through window.location; getInitialURL sees sootsim deep-link state.",working:"getInitialURL (sootsim-aware), addEventListener, canOpenURL, openURL, openSettings noop, sendIntent noop, getLinkingURL, parseInitialURLAsync, createURL, parse, useURL, useLinkingURL, hasCustomScheme, collectManifestSchemes, hasConstantsManifest, resolveScheme",missing:"native iOS Settings.app launch + Android intent dispatch (OS-level surfaces \u2014 unavailable from any browser sandbox)"}]},"expo-splash-screen":{category:"Expo SDK",stubType:"native",versions:[{range:">=0.17.0",coverage:1,note:"full splash wired to the sootsim canvas boot splash, including the app's REAL configured artwork. the config plugin's image + backgroundColor (+ imageWidth, resizeMode, dark variant) and the legacy expo.splash / expo.ios.splash blocks are parsed and painted on boot exactly like the native splash window. setOptions({fade,duration}) is honored: hideAsync()/hide() cross-dissolve the splash over the configured duration (default 400ms, fade default off \u2014 mirroring ios/SplashScreenManager.swift hide()); preventAutoHideAsync holds the splash until the app hides it. matches upstream index.native.ts semantics.",working:"preventAutoHideAsync (holds splash), hideAsync, hide (sync), setOptions (fade + duration drive the real canvas fade), configured splash image + backgroundColor + imageWidth + resizeMode + dark variant painted on boot (config plugin + legacy expo.splash), SplashScreenOptions type"}]},"expo-clipboard":{category:"Expo SDK",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"the published SDK 57 package runs unchanged against a real tenant navigator.clipboard seam for text, URL, and image content",working:"getStringAsync, setStringAsync, setString, hasStringAsync, getUrlAsync, setUrlAsync, hasUrlAsync, getImageAsync returning base64 and dimensions, setImageAsync, hasImageAsync, listener subscription lifecycle, and isPasteButtonAvailable=false",missing:"clipboard-change event delivery, ClipboardPasteButton native UI, Firefox image read, and rich-text clipboard payloads"}]},"expo-file-system":{category:"Storage & Data",stubType:"native",versions:[{range:">=15.0.0",coverage:.9,note:"both APIs implemented over one shared synchronous localStorage VFS: the SDK-18+ class-based File/Directory/Paths API (the bare `expo-file-system` export on SDK 18+) and the legacy async API (`expo-file-system/legacy`), with real network ops via fetch + navigator.storage. legacy and new interoperate on the same filesystem.",working:"SDK-18+ class API: Paths (document/cache/bundle, join/basename/extname/dirname), File (exists, size, md5, name, extension, parentDirectory, create, write text|bytes, text(Sync), base64(Sync), bytes(Sync), arrayBuffer, slice, stream, delete, info, copy, move/rename, open FileHandle, static downloadFileAsync/pickFileAsync), Directory (exists, create, createFile, createDirectory, list, info, delete, copy, move, static pickDirectoryAsync). Legacy API: documentDirectory, cacheDirectory, bundleDirectory, EncodingType, FileSystemSessionType, FileSystemUploadType, FileSystemAcceptedUploadHttpMethod, readAsStringAsync, writeAsStringAsync, deleteAsync, getInfoAsync, makeDirectoryAsync, readDirectoryAsync, copyAsync, moveAsync, downloadAsync, createDownloadResumable, uploadAsync (real fetch with binary or multipart body), createUploadTask, UploadTask class (uploadAsync, cancelAsync, fires completion callback), getFreeDiskStorageAsync (navigator.storage.estimate quota - usage), getTotalDiskCapacityAsync (navigator.storage.estimate quota), getContentUriAsync (returns uri unchanged \u2014 Android-only behavior), StorageAccessFramework namespace stub (Android-only methods throw with platform error). All upstream legacy types exported: FileSystemUploadOptions, FileSystemUploadResult, UploadProgressData, DownloadProgressData, FileSystemNetworkTaskProgressCallback.",missing:"DownloadResumable as a real cancelable class (only object returned today), chunked upload progress events (browsers do not expose per-chunk upload progress on fetch)"}]},"expo-crypto":{category:"Expo SDK",stubType:"native",versions:[{range:">=12.0.0",coverage:.95,note:"upstream package JS runs against ExpoCrypto and ExpoCryptoAES native-module seams",working:"upstream Crypto.ts/Crypto.types/aes wrappers, getRandomBytes, getRandomBytesAsync, getRandomValues, digestStringAsync (hex/base64), digest ArrayBuffer, randomUUID, AES-GCM key generation/import/export, encrypt/decrypt, sealed data helpers",missing:"MD2/MD4/MD5 digest algorithms are unavailable through Web Crypto; AES-192 is browser-dependent and not guaranteed"}]},"expo-secure-store":{category:"Auth & Payments",stubType:"native",proofCoverage:1,versions:[{range:">=12.0.0",coverage:.95,note:"upstream expo-secure-store JS runs unchanged; package-local wrapper only registers the ExpoSecureStore native module backed by tenant-scoped IndexedDB records encrypted with AES-GCM via WebCrypto. Bun/test environments without IndexedDB use the same encrypted record format in memory. (same golden-rule native-seam tier as expo-crypto / expo-network: upstream JS runs unmodified, every gap is a physically-absent-on-an-iOS-sim feature.)",working:"upstream validation and constants, getItem/setItem sync APIs over the hydrated in-process cache, getItemAsync/setItemAsync/deleteItemAsync async APIs, isAvailableAsync, canUseBiometricAuthentication false, keychainService/accessGroup/requireAuthentication storage partitioning, AES-GCM encrypted storage records with per-record salt/iv and tenant-scoped PBKDF2 key derivation, persists across reloads when IndexedDB is available",missing:"canUseBiometricAuthentication always false (no biometric prompt available on web \u2014 correct unavailable shape), requireAuthentication not enforced beyond storage partitioning/encryption (no biometric prompt to require), keychainAccessible does not affect browser storage access. sync reads cannot synchronously cold-load IndexedDB after a fresh worker boot; async reads hydrate the cache. all of these are honest absent-on-web semantics \u2014 apps with graceful-degradation paths behave correctly."}]},"expo-web-browser":{category:"Expo SDK",stubType:"native",versions:[{range:">=12.0.0",coverage:.65,note:"the published package runs unchanged; openBrowserAsync hands the URL to the host browser and browser-list and lifecycle methods preserve their public result shapes",working:"openBrowserAsync host handoff, dismissBrowser result, warmUpAsync, coolDownAsync, mayInitWithUrlAsync, empty getCustomTabsSupportingBrowsersAsync result, and upstream enums and option processing",missing:"an embedded SFSafariViewController or Chrome Custom Tab, closing the host browser tab from dismissBrowser, working auth-session completion and redirect delivery, cookie isolation, and native styling controls"}]},"expo-network":{category:"Device & Platform",stubType:"native",proofCoverage:1,versions:[{range:">=50.0.0",coverage:.95,note:"upstream expo-network JS runs unchanged; package-local wrapper only registers the ExpoNetwork native module.",working:"getNetworkStateAsync, getIpAddressAsync, addNetworkStateListener/useNetworkState through upstream Network.ts/Network.types; connected browser hosts report UNKNOWN when NWPath interface subtype data is unavailable",missing:"real IP lookup, cellular/wifi/ethernet subtype detection, Android-only airplane mode detection"}]},"expo-blur":{category:"UI Components",stubType:"native",versions:[{range:">=12.0.0",coverage:.95,note:"backdrop-filter blur via sootsim canvas, all BlurTint values with correct iOS opacity",working:"BlurView, BlurTargetView, tint (all 22 BlurTint values with real iOS rgba values), intensity, blurReductionFactor, experimentalBlurMethod, blurMethod props",missing:"actual gaussian blur rendering (approximated by backdrop-filter), Animated.createAnimatedComponent integration fidelity"}]},"expo-linear-gradient":{category:"UI Components",stubType:"native",versions:[{range:">=12.0.0",coverage:1,note:"CanvasKit gradient shader via _gradientColors style prop, full API",working:"LinearGradient, colors, start, end, locations, dither, normalizeColor, getLinearGradientBackgroundImage utility"}]},"@gorhom/bottom-sheet":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=5.0.0",coverage:1,note:"pure JS sheet built on gesture-handler + reanimated \u2014 runs as-is from bundle, no native modules",working:"BottomSheet, BottomSheetModal, BottomSheetModalProvider, useBottomSheet, useBottomSheetModal, BottomSheetView/ScrollView/FlatList/TextInput, BottomSheetBackdrop, BottomSheetHandle, BottomSheetFooter, snap points, imperative open/close/expand/collapse"}]},"react-native-teleport":{category:"Navigation",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"full portal API via sootsim RNTPortalView/RNTPortalHostView custom elements",working:"Portal (hostName/name/style/children), PortalHost (name/style/children), PortalProvider, usePortal (removePortal), NativePortal, NativePortalHost"}]},"react-native-launch-arguments":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:1,note:"reads SOOTSIM_LAUNCH_ARGUMENTS env or globalThis.__sootsim_launch_arguments with JSON parse",working:"LaunchArguments.value<T>()"}]},"expo-status-bar":{category:"Expo SDK",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS over React Native StatusBar - runs upstream code via sootsim RN",working:"upstream StatusBar component and imperative setters route through sootsim's React Native StatusBar shim"}]},"expo-device":{category:"Expo SDK",stubType:"native",versions:[{range:">=6.0.0",coverage:.95,note:"all properties and async functions implemented with realistic iOS 16 Pro mock values",working:"isDevice, brand, manufacturer, modelName, modelId, designName, productName, deviceYearClass, totalMemory, supportedCpuArchitectures, osName, osVersion, osBuildId, osInternalBuildId, platformApiLevel, deviceName, deviceType, DeviceType enum, getDeviceTypeAsync, getUptimeAsync, getMaxMemoryAsync, isRootedExperimentalAsync, isSideLoadingEnabledAsync, getPlatformFeaturesAsync, hasPlatformFeatureAsync",missing:"osBuildFingerprint property"}]},"expo-image-picker":{category:"Image",stubType:"native",versions:[{range:">=14.0.0",coverage:.93,note:"real browser file-input picker for library; camera uses capture attribute. Full PermissionStatus + ImagePickerErrorResult + writeOnly parity with upstream. Video selection probes a hidden <video> element's loadedmetadata for real width/height/duration (in ms, matching upstream). Image selection reads naturalWidth/naturalHeight; base64 read via FileReader runs in parallel with the metadata probe so the picker returns quickly. Unknown-MIME files fall back to a video probe before giving up.",working:"launchImageLibraryAsync, launchCameraAsync, requestMediaLibraryPermissionsAsync (with writeOnly), getMediaLibraryPermissionsAsync (with writeOnly), requestCameraPermissionsAsync, getCameraPermissionsAsync, useMediaLibraryPermissions ({ writeOnly }), useCameraPermissions, getPendingResultAsync (returns ImagePickerResult | ImagePickerErrorResult | null), base64 read, multi-select, real video duration + width/height via loadedmetadata probe, MediaTypeOptions, CameraType, PermissionStatus enums, ImagePickerErrorResult type",missing:"exif data extraction (returns null on web \u2014 would need a real exif reader), orderedSelection ordering signal (browser file dialog does not expose user selection order), HEIC support (conversion to JPG would need a wasm decoder)"}]},"expo-document-picker":{category:"Storage & Data",stubType:"native",versions:[{range:">=12.0.0",coverage:.95,note:'real browser <input type="file"> picker with full asset metadata',working:"getDocumentAsync (real file picker with multiple/type filter), returns uri (blob URL), name, size, mimeType, lastModified, file object, output FileList, canceled state, isAvailableAsync",missing:"copyToCacheDirectory option has no effect (blob URLs are already local), wildcard type mapping could be more complete"}]},"expo-application":{category:"Expo SDK",stubType:"native",proofCoverage:1,versions:[{range:">=5.0.0",coverage:.95,note:"upstream expo-application JS runs unchanged; package-local wrapper only registers the ExpoApplication native module, whose identity constants follow the live Expo config.",working:"upstream constants and platform availability checks, applicationName, applicationId, nativeApplicationVersion, nativeBuildVersion, getIosIdForVendorAsync (localStorage-backed), getIosApplicationReleaseTypeAsync SIMULATOR, ApplicationReleaseType enum, getInstallationTimeAsync, getIosPushNotificationServiceEnvironmentAsync",missing:"bare/frozen apps without resolved Expo config use simulator metadata; Android id/install referrer on non-Android platforms; push entitlement inspection"}]},"expo-battery":{category:"Expo SDK",stubType:"native",proofCoverage:.9,versions:[{range:">=9.0.0",coverage:.9,note:"package-local wrapper registers only the ExpoBattery native module; upstream expo-battery JS runs unchanged with iOS-simulator values.",working:'upstream isAvailableAsync/getBatteryLevelAsync/getBatteryStateAsync/isLowPowerModeEnabledAsync/isBatteryOptimizationEnabledAsync/getPowerStateAsync/hooks run unchanged; requireNativeModule("ExpoBattery") provides isSupported=false, -1 battery level, UNKNOWN state, lowPowerMode=false, listener subscriptions; upstream JS handles the iOS-missing isBatteryOptimizationEnabledAsync method',missing:"real battery telemetry and change events are unavailable in the browser worker; mirrors iOS simulator unavailability rather than physical-device state"}]},"expo-brightness":{category:"Device & Platform",stubType:"native",proofCoverage:.9,versions:[{range:">=14.0.0",coverage:.8,note:"package-local wrapper registers only the ExpoBrightness native module; upstream expo-brightness JS runs unchanged with iOS-simulator brightness semantics.",working:'upstream isAvailableAsync/getBrightnessAsync/setBrightnessAsync/getSystemBrightnessAsync/setSystemBrightnessAsync/restoreSystemBrightnessAsync/isUsingSystemBrightnessAsync/getSystemBrightnessModeAsync/setSystemBrightnessModeAsync/getPermissionsAsync/requestPermissionsAsync/usePermissions run unchanged; requireNativeModule("ExpoBrightness") provides granted permission responses, the iOS simulator brightness value, and native iOS no-op system-brightness methods',missing:"does not change real display brightness from the worker; system brightness mode follows upstream iOS JS as UNKNOWN and brightness-change events only fire when the underlying screen brightness changes"}]},"expo-cellular":{category:"Device & Platform",stubType:"native",proofCoverage:.6,versions:[{range:">=7.0.0",coverage:.8,note:"package-local wrapper registers only the ExpoCellular native module; upstream expo-cellular JS runs unchanged with iOS-simulator radio state.",working:'upstream getCellularGenerationAsync/allowsVoipAsync/getIsoCountryCodeAsync/getCarrierNameAsync/getMobileCountryCodeAsync/getMobileNetworkCodeAsync/getPermissionsAsync/requestPermissionsAsync/usePermissions run unchanged; requireNativeModule("ExpoCellular") provides UNKNOWN generation while upstream iOS JS provides null carrier helpers and granted permission shape',missing:"real CoreTelephony radio access technology, carrier, SIM, MCC/MNC, and Android phone-state permission data"}]},"expo-screen-capture":{category:"Device & Platform",stubType:"native",proofCoverage:.8,versions:[{range:">=8.0.0",coverage:.85,note:"upstream expo-screen-capture JS runs unchanged; package-local wrapper only registers the ExpoScreenCapture native module.",working:"isAvailableAsync, preventScreenCaptureAsync/allowScreenCaptureAsync tag bookkeeping, usePreventScreenCapture, enableAppSwitcherProtectionAsync/disableAppSwitcherProtectionAsync, addScreenshotListener/removeScreenshotListener/useScreenshotListener, getPermissionsAsync/requestPermissionsAsync/usePermissions through upstream ScreenCapture.ts",missing:"actual browser screenshot/recording prevention and app-switcher privacy blur are unavailable from the worker; screenshot events never fire automatically"}]},"expo-speech":{category:"Media",stubType:"native",proofCoverage:.25,versions:[{range:">=13.0.0",coverage:.82,note:"package-local wrapper registers only the ExpoSpeech native module; upstream expo-speech JS runs unchanged with evented simulator speech completion.",working:'upstream speak/getAvailableVoicesAsync/isSpeakingAsync/stop/pause/resume/maxSpeechInputLength exports run unchanged; requireNativeModule("ExpoSpeech") provides speak, getVoices, stop, pause, resume, isSpeaking, and started/done/stopped event callbacks',missing:"no audible AVSpeechSynthesizer or browser speechSynthesis from the tenant worker; voices list is empty and boundary/error events do not fire"}]},"expo-glass-effect":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:1,note:"liquid glass via the calibrated glassEffect materials (same oracle-diffed presets as @expo/ui glassEffect); availability helpers covered",working:"GlassView, GlassContainer, isLiquidGlassAvailable, isGlassEffectAPIAvailable, colorScheme, glassEffectStyle (clear/regular/none + GlassEffectStyleConfig), isInteractive, tintColor (applied as the material glassTint)"}]},"expo-symbols":{category:"UI Components",stubType:"native",versions:[{range:">=55.0.0",coverage:.9,note:"SymbolView renders the shared SootSim SF Symbol vector and preserves the requested system name for frozen Design replay. Unknown names use the supplied fallback. unstable_getMaterialSymbolSourceAsync returns a stable URI/size shape so apps that gate on the source resolve correctly.",working:"SymbolView, name object/string selection (string | { ios, android, web }), size/tintColor styling, fallback rendering, unstable_getMaterialSymbolSourceAsync",missing:"bundled SF Symbols font (Apple license), bundled Material Symbols font (size budget), animation/effect modifiers (.bounce, .scale)"}]},"expo-liquid-glass-view":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.8,note:"liquid glass via the calibrated glassEffect materials; structural layout works, physics/animation missing",working:"ExpoLiquidGlassView, ExpoLiquidGlassContainer, LiquidGlassView alias, LiquidGlassType enum (Clear/Tint/Regular/Interactive/Identity \u2014 Identity renders no material, Interactive maps to the interactive material), CornerStyle enum, cornerRadius, tint (applied as the material glassTint), type prop",missing:"CornerStyle.Continuous smooth corner animation, interactive tap visual feedback, morph prop on container"}]},"@expo/ui":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.93,note:"both halves covered: SwiftUI components render as pixel-faithful canvas equivalents with iOS 26 Liquid Glass, and the Jetpack Compose components run their real upstream JavaScript against Material 3 Android views",working:"swift-ui: Host, Form/Section/List, Button (default/bordered/borderedProminent/destructive via buttonStyle modifier), Toggle, Slider, Stepper, Picker (segmented/menu/inline via selection + tag children), ColorPicker, ProgressView, Gauge, DatePicker, TextField/SecureField, LabeledContent, Label, Image (SF Symbols), HStack/VStack/ZStack, DisclosureGroup, ContentUnavailableView, ContextMenu/Menu, glassEffect (regular/clear), GlassEffectContainer. jetpack-compose: Host with a seeded Material 3 palette, Box/Row/Column/FlowRow/Spacer/LazyColumn/LazyRow, all five Button variants and the icon/toggle/floating-action button families, Card/ElevatedCard/OutlinedCard, Surface, the assist/filter/input/suggestion Chip family, Switch/Checkbox/TriStateCheckbox/RadioButton/Slider, single- and multi-choice SegmentedButton rows, ListItem, Badge/BadgedBox, linear and circular progress, ModalBottomSheet, AlertDialog, DropdownMenu and ExposedDropdownMenu, TooltipBox, SnackbarHost, NavigationBar, HorizontalFloatingToolbar, AnimatedVisibility with the enter/exit transition builders, PullToRefreshBox, HorizontalPager, the carousels, SearchBar/DockedSearchBar, TextField/OutlinedTextField/BasicTextField, and the full modifier surface including clickable/combinedClickable/selectable/toggleable ripples and the onSizeChanged/onGloballyPositioned/onVisibilityChanged callbacks",missing:"native SwiftUI spring animations, haptic feedback, exact iOS Liquid Glass shader calibration; on jetpack-compose: Material You palettes seeded from a colour other than the Material 3 baseline seed, DatePickerDialog/TimePickerDialog/DateTimePicker, the LoadingIndicator polygon morph, swept-arc geometry on the determinate circular indicator, Compose rounded-polygon shapes (Shape.Star/PillStar/Polygon and Shapes.Material.*), cut-corner bevels, and the graphicsLayer/innerShadow/blur/menuAnchor/semantics modifiers \u2014 see docs/expo-ui-jetpack-compose-inventory.md"}]},"expo-location":{category:"Expo SDK",stubType:"native",versions:[{range:">=17.0.0",coverage:.5,note:"the published SDK 57 package runs unchanged against an ExpoLocation native seam backed by tenant geolocation and the shared app-scoped permission registry; restricted browser contexts use the simulator fallback position",working:"upstream enums, validation and permission hooks; getProviderStatusAsync, getCurrentPositionAsync, getLastKnownPositionAsync, foreground/background permission getters and requests, and hasServicesEnabledAsync",missing:"the SDK 57 subscriber-native contract for watchPositionAsync, heading, geocoding, motion activity, background location, geofencing, and Android network-provider enablement"}]},"expo-notifications":{category:"Notifications",stubType:"native",versions:[{range:">=0.20.0",coverage:.93,note:'real local notification delivery via browser Notification + sootsim in-engine overlay; full upstream API surface present; matches iOS-simulator behavior where APNs registration silently fails. per docs/compat-scoring.md "score it high only when the full public API surface is present and returns the same unavailable/clean state an app should expect in development."',working:"getPermissionsAsync/requestPermissionsAsync through the shared system permission registry, scheduleNotificationAsync (fires real browser Notification when host capability allows, plus the in-engine banner), cancelScheduledNotificationAsync, cancelAllScheduledNotificationsAsync, getAllScheduledNotificationsAsync, getPresentedNotificationsAsync, dismissNotificationAsync, dismissAllNotificationsAsync, setBadgeCountAsync (navigator.setAppBadge if available), getBadgeCountAsync, addNotificationReceivedListener/ResponseReceivedListener/DroppedListener/PushTokenListener, getLastNotificationResponseAsync + sync, clearLastNotificationResponseAsync + sync, useLastNotificationResponse hook, getNextTriggerDateAsync, setNotificationHandler, presentNotificationAsync, channel + channel-group CRUD, category CRUD, AndroidImportance/AndroidNotificationVisibility/IosAuthorizationStatus/PermissionStatus enums",missing:"real push token registration (getDevicePushTokenAsync returns a placeholder UUID \u2014 there is no FCM/APNs provisioning, service-worker push subscription, or backend-uploadable token); background task delivery (registerTaskAsync/unregisterTaskAsync/isTaskRegisteredAsync are noops \u2014 service-worker push wiring is not implemented); scheduled-notification persistence across reload (setTimeout-only \u2014 page refresh drops the queue); subscribeToTopicAsync/unsubscribeFromTopicAsync FCM topic binding; setAutoServerRegistrationEnabledAsync"}]},"react-native-ios-context-menu":{category:"Navigation",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"full menu rendering with long-press, items/submenus/groups, all lifecycle callbacks",working:"ContextMenuView, ContextMenuButton, menuConfig (actions/submenus/inline groups), onPressMenuItem, onMenuWillShow/Hide/Cancel/Did*, isContextMenuEnabled, openOnPress, dismissMenu/presentMenu ref, IconTypes/MenuOptions/MenuElementAtrributes/MenuElementState enums",missing:"renderPreview, renderAuxiliaryPreview, auxiliaryPreviewConfig, isAuxiliaryPreviewEnabled, onRequestDeferredElement, ContextMenuViewContext, ContextMenuButtonContext, useMenuContext, useMenuButtonContext, WrapperView re-export, previewConfig"}]},"react-native-ios-utilities":{category:"Navigation",stubType:"native",versions:[{range:">=4.0.0",coverage:.75,note:"core wrapper views and types covered; RNIDetachedView imperative API is noop",working:"RNIWrapperView, RNIContextMenuView, RNIDetachedView (renders children), RNIModalView, RNIImageItem, resolveColor, isDynamicColor, createImageItemConfig, ComputableLayout/ColorConfig/DynamicColor/ImageItemConfig types",missing:"RNIDetachedView.attachToWindow/presentInModal/getDetachedSubviewsMap, RNIUtilitiesModule native module, UIBlurEffectStyles/UIVibrancyEffectStyles constants, example_components, Helpers class, SharedAnimationEvents, onDidSetViewID/onViewWillRecycle lifecycle events"}]},burnt:{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.9,note:"shell-owned iOS-style toast + alert with SF Symbol icon support; Android routes toast and alert fallback through ToastAndroid",working:"iOS toast (title, message, preset: done/error/none/custom, duration, haptic, from, layout), iOS alert (preset: heart/done/error/none/spinner/custom, shouldDismissByTap), Android toast/title-only alert fallback via ToastAndroid.showWithGravityAndOffset, dismissAllAlerts, IconParams, all type exports",missing:"drag-to-dismiss gesture interaction on iOS toast, Android message/icon/haptic/layout customization because upstream Android Burnt ignores those fields"}]},"react-native-mmkv":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:.94,note:"localStorage-backed native MMKV seam with v2 class and v4 createMMKV instance APIs; persists across reloads in the tenant browser scope",working:"MMKV constructor (id, path, encryptionKey/readOnly config), createMMKV, existsMMKV, deleteMMKV, set (bool/string/number/ArrayBuffer/Uint8Array), getString/Number/Boolean/Buffer, contains, remove/delete, getAllKeys, clearAll, importAllFrom, recrypt (noop), trim (noop), size (approximate), same-tab and storage-event addOnValueChangedListener, useMMKV/useMMKVString/Number/Boolean/Buffer/Object/Keys/Listener/Storage",missing:"real mmap/encryption semantics, Mode enum, multi-process locking"}]},"react-native-permissions":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:.93,note:"always returns GRANTED; full PERMISSIONS/RESULTS enum, most methods covered",working:"check, request, checkMultiple, requestMultiple, checkNotifications, requestNotifications, openSettings, openPhotoPicker, PERMISSIONS (IOS/ANDROID/WINDOWS proxy), RESULTS",missing:"checkLocationAccuracy, requestLocationAccuracy, canScheduleExactAlarms, canUseFullScreenIntent not stubbed"}]},"@react-native-menu/menu":{category:"UI Components",stubType:"native",versions:[{range:">=0.7.0",coverage:.9,note:"MenuView renders real iOS-style canvas menu via sootsim ContextMenu",working:"MenuView, actions (title, subtitle, id, state, attributes: disabled/destructive/hidden), subactions (nested menus), onPressAction, shouldOpenOnLongPress, themeVariant, isAnchoredToRight, NativeActionEvent",missing:"keepsMenuPresented attribute (iOS 16+), image/imageColor rendering in menu items, inline element actions"}]},"@expo/ui/community/menu":{category:"UI Components",stubType:"native",versions:[{range:">=57.0.0",coverage:.9,note:"MenuView renders a real iOS-style canvas menu. this is the backend @tamagui/native/setup-expo-ui-menu registers, so it also powers @tamagui/menu and @tamagui/context-menu in native mode",working:"MenuView (named + default export), actions (id defaulting to title, title, image as SF Symbol\u2192unicode, state on/off checkmark, attributes destructive/disabled/hidden), subactions (nested submenus), displayInline (inline sections), title, shouldOpenOnLongPress (UIContextMenuInteraction lift vs tap dropdown), onPressAction, ref.show() no-op matching the iOS oracle",missing:"ImageSourcePropType icons (SF Symbol names only), imageColor tint, onOpenMenu/onCloseMenu (android-only upstream, never fired on iOS)"}]},"react-native-pager-view":{category:"Navigation",stubType:"native",versions:[{range:">=6.0.0",coverage:.85,note:"CSS scroll-snap with horizontal/vertical orientation, imperative ref, scroll callbacks",working:"PagerView (default + named), initialPage, scrollEnabled, orientation (horizontal/vertical), onPageSelected, onPageScroll, onPageScrollStateChanged, setPage/setPageWithoutAnimation/setScrollEnabled via ref",missing:"overdrag (accepted but ignored), offscreenPageLimit (accepted but ignored), pageMargin, keyboardDismissMode, native scroll fidelity (momentum physics differ)"}]},"posthog-react-native":{category:"Analytics",stubType:"native",shipsNativeCode:!1,versions:[{range:">=2.0.0",coverage:.95,note:"full noop \u2014 no HTTP requests sent; PostHogProvider renders but captures nothing",working:"PostHogProvider, usePostHog returns client, all feature flag hooks return undefined/false (safe defaults), PostHog class shape matches 3.x API, getDistinctId/getAnonymousId/getSessionId return stub IDs",missing:"all capture/identify/screen/group calls drop data; reloadFeatureFlags is noop; session replay, surveys, SurveyQuestionType not stubbed"}]},"react-native-bootsplash":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"real package JS (index.ts hide/isVisible + the pure-JS useHideAnimation hook) runs unmodified from the bundle against the RNBootSplash native seam. the app's configured logo + background (+ logoWidth, dark variant) from the bootsplash config plugin are parsed and painted on the canvas boot splash. RNBootSplash is manual-hide (no content-appeared auto-hide); hide(fade) drives it: cross-dissolve over a fixed 250ms when fade is set, snap otherwise (mirrors ios/RNBootSplash.mm). isVisible() reflects real splash state; getConstants() returns { darkModeEnabled } exactly as the iOS constantsToExport (logoSizeRatio/navigationBarHeight/statusBarHeight are android-only, defaulted in the hook).",working:"configured logo + background + logoWidth + dark variant painted on boot, hide(fade) (real canvas fade/snap), isVisible() (true while splash visible), getConstants() (darkModeEnabled), useHideAnimation hook (logo/brand layout from manifest, runs from bundle)",missing:"the optional brand/darkBrand image (a secondary bottom-anchored logo) is not painted \u2014 only the primary logo + background"}]},"expo-sqlite":{category:"Storage & Data",stubType:"native",versions:[{range:">=13.0.0",coverage:.94,note:"real SQLite via lazy-loaded bedrock-sqlite (~1MB WASM) \u2014 full SQL support including joins, transactions, prepared statements, RETURNING. WASM ships in the runtime tarball and loads with the expo-sqlite compatibility chunk, so synchronous APIs are ready as soon as the module import resolves. memfs persists to IDB via Module._memfs (requires the bedrock-sqlite build with the memfs-on-module export from orez/sqlite-wasm); reloads restore the prior state \u2014 verified end-to-end via the orbstack/published-runtime probe across 3 page reloads.",working:"openDatabaseAsync / openDatabaseSync (real bedrock instance), execAsync / execSync, prepareAsync / prepareSync, runAsync / runSync, getFirstAsync / getFirstSync, getAllAsync / getAllSync, getEachAsync / getEachSync, withTransactionAsync / withTransactionSync, withExclusiveTransactionAsync, isInTransactionAsync / isInTransactionSync, closeAsync / closeSync, deleteDatabaseAsync / deleteDatabaseSync, SQLiteStatement.executeAsync / executeSync / executeForRawResultAsync / executeForRawResultSync / getColumnNames* / finalize*, SQLiteProvider, useSQLiteContext, defaultDatabaseDirectory, async iteration via for-await-of, RETURNING clauses",missing:"serializeAsync (bedrock does not expose sqlite3_serialize through its module surface), backupDatabaseAsync, addDatabaseChangeListener (no sqlite3_update_hook bindings), createSessionAsync, loadExtensionAsync, SQLiteTaggedQuery (Bun-style template literal API)"}]},"expo-media-library":{category:"Media",stubType:"native",versions:[{range:">=15.0.0",coverage:.92,note:"full upstream API surface; photo-library reads route through SootSim.bridges.photoLibrary when present; without a bridge, returns empty/noop in the exact shape upstream's web build does \u2014 same response an app would see from a freshly-installed iOS sim with no granted photo permission. Apps with graceful-degradation paths take the right branch.",working:"getPermissionsAsync/requestPermissionsAsync (granted), usePermissions hook, MediaType/SortBy constants, getAssetsAsync (real bridge or empty), getAssetInfoAsync, createAssetAsync (real bridge or stub echo), deleteAssetsAsync (no-op success), getAlbumsAsync (empty), getAlbumAsync (null), createAlbumAsync (stub album shape), saveToLibraryAsync (noop), addAssetsToAlbumAsync/removeAssetsFromAlbumAsync (false), deleteAlbumsAsync (false), getMomentsAsync (empty PagedInfo), migrateAlbumIfNeededAsync/albumNeedsMigrationAsync (noop/false), setAssetFavoriteAsync (false), presentPermissionsPickerAsync (noop), isAvailableAsync (true when bridge present, else false), addListener/removeSubscription/removeAllListeners (real registration; no fan-out without a system event feed), MediaLibraryAssetsChangeEvent + EventSubscription types",missing:"photo-library mutation across the bridge (saveToLibrary, addAssetsToAlbum, removeAssetsFromAlbum, deleteAlbums, deleteAssets, setAssetFavorite \u2014 would need a write-capable photoLibrary bridge), system-wide assets-change events (no browser equivalent feed), Moments grouping (iOS-only, no bridge today)"}]},"expo-mesh-gradient":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.9,note:"Canvas 2D radial gradients layered at mesh points, CSS fallback for pre-render",working:"MeshGradient, colors, points, columns, rows, smoothsColors, style, children; canvas 2D rendering with radial gradient blending; CSS background fallback",missing:"true bilinear mesh interpolation (approximated), GPU-accelerated Metal/Skia path"}]},"react-native-device-info":{category:"Device & Platform",stubType:"native",versions:[{range:">=10.0.0",coverage:1,note:"comprehensive live-device mock \u2014 hardware fields follow the active device spec and app identity fields follow the live Expo config",working:"all sync and async getters: uniqueId, model, brand, systemName/Version, live bundleId/buildNumber/version/appName, deviceName, deviceType, manufacturer, carrier, totalMemory, diskCapacity, freeDiskStorage, fontScale, isEmulator, isTablet, hasNotch, hasDynamicIsland, isLandscape, brightness, getBatteryLevel and ~60 more"}]},"react-native-default-preference":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"suite-scoped NSUserDefaults-style string storage backed by localStorage or in-memory storage",working:"default export, get, set, clear, getMultiple, setMultiple, clearMultiple, getAll, clearAll, setName, getName",missing:"sharing values with real native UserDefaults/app groups outside the sootsim runtime"}]},"react-native-file-viewer":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.1.0",coverage:.85,note:'native-seam only \u2014 the real upstream open() (Platform.OS branch, currentId counter, RNFileViewerDidOpen/DidDismiss listener bookkeeping, normalize() helper) runs from the bundle. sootsim registers the RNFileViewer TurboModule; open() hands the URL to `window.open(..., "_blank")` (the browser routes to QuickLook on macOS, Preview/Adobe on Windows, etc.) and emits DidOpen + DidDismiss with the requested id so upstream\'s promise + onDismiss resolve correctly.',working:"real upstream open() running from the bundle, Promise resolution via RNFileViewerDidOpen, onDismiss via RNFileViewerDidDismiss, file:// normalization with decodeURI in upstream, browser window handoff to the OS's native viewer chain, displayName / showAppsSuggestions / showOpenWithDialog options accepted (no-op on web)",missing:"native QuickLook preview UI presentation, Android content provider / MIME intent resolution, app suggestions / open-with dialog (we hand off to browser default which has its own UI)"}]},"react-native-gzip":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"native-seam only \u2014 the real upstream 31-line wrapper (`Gzip.inflate(base64)` / `Gzip.deflate(data)` with a LINKING_ERROR fallback proxy) runs from the bundle. sootsim registers the Gzip TurboModule backed by the browser's CompressionStream/DecompressionStream for real gzip round-trips (matches upstream's iOS Gzip.mm contract).",working:"real upstream JS wrapper running from the bundle, deflate UTF-8 strings to base64 gzip, inflate base64 gzip back to strings, round-trips unicode content",missing:"exact native gzip header timestamp/metadata bytes may differ, but decompressed payloads are equivalent"}]},"react-native-rate":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.2.0",coverage:.85,note:"native-seam only \u2014 the upstream Rate class, option defaults/filtering, platform selection, AndroidMarket constants, and Linking fallbacks run from the bundle. the RNRate iOS module opens the requested App Store review URL through the browser handoff when preferInApp is false; because StoreKit review UI is suppressed in the simulator, preferInApp follows the native post-delay fallback exactly, either opening the store and reporting true or reporting false when openAppStoreIfInAppFails is disabled.",working:"default Rate class, AndroidMarket constants, filterOptions, rate callback, exact itms-apps review URL construction, direct App Store browser handoff, preferInApp delay and openAppStoreIfInAppFails success/failure behavior, Android/fallback URL helpers from upstream JS",missing:"no visible SKStoreReviewController or Google Play in-app review dialog; App Store URLs are handed to the browser/host rather than UIApplication"}]},"react-native-i18n":{category:"Internationalization",stubType:"native",versions:[{range:">=2.0.0",coverage:.8,note:"upstream package JS runs unchanged against NativeModules.RNI18n preferred-language constants",working:"NativeModules.RNI18n.languages, getConstants, getLanguages; react-native-i18n sets i18n-js locale from preferred browser/device language tags",missing:"native project localization bundle inspection and platform-specific legacy pre-iOS-9 underscore conversion"}]},"react-native-dark-mode":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.2.0",coverage:.85,note:"native-seam only. real package JS runs from the bundle against NativeModules.RNDarkMode constants and NativeEventEmitter shape",working:"initialMode, supportsDarkMode, getConstants, RCTEventEmitter addListener/removeListeners contract; useDarkMode/useDarkModeContext initialize from a concrete light/dark value",missing:"live currentModeChanged fan-out from host color-scheme changes"}]},"react-native-background-fetch":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.4.0",coverage:.75,note:"static BackgroundFetch API with status constants, task scheduling state, callback wiring, and finish/start/stop semantics",working:"STATUS_* and NETWORK_TYPE_* constants, configure, scheduleTask, registerHeadlessTask, start, stop, finish, status promise/callback forms, fetch/timeout callback dispatch",missing:"actual iOS/Android background execution, BGTaskScheduler/TSBackgroundFetch wakeups, headless JS launch while suspended"}]},"react-native-tts":{category:"Media",stubType:"native",versions:[{range:">=4.1.0",coverage:.8,note:"TextToSpeech package surface backed by browser speechSynthesis when available, with native-shaped events and validation",working:"default Tts instance, getInitStatus, requestInstallEngine/Data, setDucking, setDefaultVoice/Rate/Pitch/Language, setIgnoreSilentSwitch, voices, engines, speak, stop, pause, resume, add/remove event listeners",missing:"AVAudioSession silent-switch behavior, exact AVSpeechSynthesizer voice catalog, and guaranteed audible speech in runtimes without browser speechSynthesis"}]},"react-native-sound":{category:"Media",stubType:"native",versions:[{range:">=0.13.0",coverage:.85,note:"native-seam only. real react-native-sound runs from the bundle (Sound class wrapping numeric keys, MAIN_BUNDLE/DOCUMENT/LIBRARY/CACHES path helpers, NativeEventEmitter wiring). sootsim only stubs the RNSound TurboModule with a key \u2192 HTMLAudioElement table; play/pause/stop emit upstream onPlayChange events so Sound._playing tracks.",working:"Sound constructor + onError callback path (prepare returns real duration via loadedmetadata), play (with onEnd callback fired on ended/error), pause, stop, release, reset, setVolume (max of L/R channel args), setSpeed (HTMLMediaElement.playbackRate), setNumberOfLoops (-1 \u2192 loop, else clear), setPitch (approximated via preservesPitch), setCurrentTime, getCurrentTime (returns currentTime + isPlaying), MAIN_BUNDLE/NSDocumentDirectory/NSLibraryDirectory/NSCachesDirectory constants",missing:"AVAudioSession category/mode/active/silentMode no-ops (no browser equivalent), system volume always returns 1 + setSystemVolume no-op, setPan no-op (would need StereoPannerNode), exact AVAudioPlayer channel count (reports 2), Android resource-name resolution, finite loop counts beyond 1 (HTMLAudioElement.loop is boolean), speakerphone routing"}]},"react-native-sound-player":{category:"Media",stubType:"native",versions:[{range:">=0.14.5 <1.0.0",coverage:.85,note:"native-seam only \u2014 the published 0.14.5 wrapper runs unchanged against an HTMLAudioElement-backed RNSoundPlayer module with its upstream NativeEventEmitter contract",working:"playUrl/loadUrl and resolved playAsset/loadAsset URLs, load/play/pause/resume/stop/seek, volume clamping, finite and infinite loop bookkeeping, delayed play, getInfo currentTime/duration, FinishedLoading/URL/File, FinishedPlaying, and OnSetupError events",missing:"iOS main-bundle and Documents resource-name lookup for playSoundFile, AVAudioSession speaker/mix routing, background playback, and exact native codec support"}]},"react-native-sensors":{category:"Device & Platform",stubType:"native",versions:[{range:">=7.0.0",coverage:.7,note:"observable sensor streams with browser DeviceMotion/DeviceOrientation wiring and deterministic fallback samples",working:"SensorTypes, accelerometer/gyroscope/magnetometer/barometer/orientation/gravity observables, subscribe/unsubscribe, pipe pass-through, setUpdateIntervalForType, setLogLevelForType",missing:"real native CoreMotion pressure/magnetometer availability, RxJS Observable internals beyond subscribe/pipe, permission prompts, high-frequency continuous native sampling in worker-only runtimes"}]},"react-native-image-colors":{category:"Media",stubType:"native",versions:[{range:">=2.4.0",coverage:.85,note:"iOS-shaped image palette API with upstream cache semantics and browser image/canvas color sampling",working:"default and named getColors/cache exports, #fff/#ffffff fallback validation and expansion, cache get/set/remove/clear, cache key length error, iOS result keys, quality and pixelSpacing sampling, header-aware fetch in browser runtimes",missing:"exact UIImageColors palette algorithm, local native asset resolution through Image.resolveAssetSource, SwiftDraw SVG rasterization outside browser image decoders"}]},"react-native-share":{category:"Essentials",stubType:"native",versions:[{range:">=9.0.0",coverage:.95,note:"native-seam only \u2014 the real RNShare object (Button/ShareSheet/Overlay/Sheet components, Social map merged from native getConstants() with the upstream enum fallback, normalizeShareOpenOptions / normalizeSingleShareOptions, checkPermissions, isAndroid/isIOS branches) runs from the bundle. sootsim provides the RNShare TurboModule (open/shareSingle/isPackageInstalled/isBase64File/getConstants); open() and shareSingle() route through `SootSim.bridges.shareSheet` \u2014 the same on-canvas UIActivityViewController core RN Share / ActionSheetIOS / expo-sharing present.",working:"real upstream Button/ShareSheet/Overlay/Sheet UI components, full Social constants table from getConstants(), open (title/message/subject, urls[] folded into the body like UIActivityViewController, failOnCancel, completed/dismissed result with activityType\u2192app), shareSingle (presents the same share sheet, INSTAGRAM_STORIES appId guard, normalize helpers), isPackageInstalled shape, isBase64File true for data: URIs, dismissedAction conversion in upstream JS",missing:"social-specific app routing \u2014 correctly absent (no real third-party social apps exist in SootSim to deep-link into); native sharing of file content (the bridge takes message/url/subject; binary attachment paths would need a deeper share-sheet bridge upgrade)"}]},"@sentry/react-native":{category:"Analytics",stubType:"native",versions:[{range:">=5.0.0",coverage:.95,note:"development noop \u2014 API surface is load-safe and no events are sent from sootsim",working:"init, wrap, captureException/Message/Event, ErrorBoundary/withErrorBoundary, withScope/configureScope, all scope setters, startTransaction, startSpan/startInactiveSpan/continueTrace, metrics namespace, hub/client/transport shape, modern integration factories, Severity enum",missing:"real event transport to DSN, native crash/session replay capture, breadcrumb persistence; intentionally absent for development simulator"}]},"sift-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=0.1.0",coverage:.95,note:"native-seam only. Upstream JavaScript runs from the bundle; Sift configuration and identity methods are accepted without collecting or delivering fraud telemetry.",working:"setSiftConfig, setUserId, unsetUserId, upload, setPageName",missing:"no Sift device fingerprint collection, lifecycle collection, or backend delivery; intentionally absent for the development simulator"}]},"@react-native-clipboard/clipboard":{category:"Essentials",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam only: the published Clipboard object, NativeEventEmitter wiring, and useClipboard hook run from the bundle. RNCClipboard routes text through navigator.clipboard and images through ClipboardItem where the browser exposes it.",working:"published Clipboard object and two-item useClipboard hook, getString/setString/hasString, getImage/getImagePNG/getImageJPG/setImage/hasImage, hasURL/hasWebURL/hasNumber, load-safe listener methods",missing:"external-app clipboard-change events because browsers expose no matching event; setStrings joins values and getStrings returns one browser text item rather than preserving multiple pasteboard strings; Firefox image read because Clipboard.read is unavailable"}]},"@react-native-cookies/cookies":{category:"Networking",stubType:"native",versions:[{range:">=6.0.0 <7.0.0",coverage:.82,note:"native-seam only: the real platform-selecting package wrapper runs from the guest bundle against stateful in-memory iOS and Android cookie stores",working:"set/get with host-only or domain cookies, path filtering, secure and httpOnly attributes, expiration, setFromResponse, iOS getAll/clearByName and separate WebKit store, Android flush/removeSessionCookies, clearAll, native-module identity on both platforms, and upstream platform error behavior",missing:"cookie persistence across simulator-worker restarts, integration with a real WKWebView/NSHTTPCookieStorage or Android CookieManager, native eviction limits and ordering, and full Set-Cookie parsing edge cases such as quoted attributes and combined Expires headers"}]},"react-native-view-shot":{category:"Image",stubType:"native",versions:[{range:">=3.0.0",coverage:.82,note:"captureRef/captureScreen return REAL captured pixels: the tenant resolves the target node's absolute rect (unstable_getBoundingClientRect), shell routes the native request, and the compositor pixel owner crops + re-encodes that region of the active app surface (createImageBitmap(offscreen, sx,sy,sw,sh) + OffscreenCanvas convertToBlob). The data-uri is coerced into the requested result shape (tmpfile blob URL / base64 / data-uri). validateOptions mirrors upstream src/index.tsx warning text; ViewShot exposes capture() with mount/continuous/update captureMode; releaseCapture revokes tracked blob URLs. When compositor cannot sample the surface (no painted pixels or fully out of bounds), it falls back to a validly-encoded placeholder of the right size so uploads/share/<Image> still get a working result \u2014 one fallback path, no toggle.",working:"captureRef (real pixels of the target subtree region via shell snapshot), captureScreen (full app-surface snapshot), tmpfile/base64/data-uri results, png/jpg/webp formats with quality for lossy, explicit width/height as output dims, validateOptions parity with upstream warning text, ViewShot component with capture() ref method, captureMode mount/continuous/update, releaseCapture revoking tracked blob URLs",missing:"true subtree isolation (the compositor crops a screen rectangle, so an overlapping sibling/overlay inside the bbox is included \u2014 real captureRef renders only the target's hierarchy), presentation-layer transforms (getBoundingClientRect reports the laid-out rect, not an animated/transformed on-screen position), zip-base64 falls back to plain base64, raw format falls back to png, snapshotContentContainer (full scroll content beyond the viewport \u2014 only the painted surface region is available)"}]},"react-native-keychain":{category:"Auth & Payments",stubType:"native",versions:[{range:">=8.0.0",coverage:.93,note:"full generic/internet credential CRUD via the NativeKeychainManager seam with all upstream constants. browsers have no Keychain access groups or biometric-gated reads, so the unavailable shape (canImplyAuthentication=true / getSupportedBiometryType=FACE_ID, the biometric prompt simply not gating the read) is consistent with how an iOS sim without enrolled biometrics behaves \u2014 apps with graceful-degradation paths take the right branch. every remaining gap is a physically-absent-on-an-iOS-sim feature (same tier as expo-secure-store).",working:"setGenericPassword/getGenericPassword/resetGenericPassword/hasGenericPassword/getAllGenericPasswordServices, setInternetCredentials/getInternetCredentials/resetInternetCredentials/hasInternetCredentials, all constants (SECURITY_LEVEL, ACCESSIBLE, ACCESS_CONTROL, BIOMETRY_TYPE, STORAGE_TYPE)",missing:"setSharedWebCredentials/requestSharedWebCredentials noop (Apple-website-association needed), ACCESS_CONTROL enforcement not real (no biometric gate), real biometric prompt before reads (would need WebAuthn through host bridge)"}]},"react-native-fast-image":{category:"Image",stubType:"native",versions:[{range:">=8.0.0",coverage:.9,note:"renders through the engine image component with load/error callbacks and tint support",working:"FastImage component, resizeMode, priority, cacheControl constants, source uri forwarding, load/error callback wiring, tintColor, preload (noop), clearMemoryCache, clearDiskCache, FastImageSource type",missing:"custom request headers/cache policy are not enforced, source as bundled asset number is passthrough-only"}]},"@d11/react-native-fast-image":{category:"Image",stubType:"native",versions:[{range:">=8.0.0",coverage:.9,note:"alias of react-native-fast-image routed through the same engine image stub",working:"FastImage component, resizeMode, priority, cacheControl constants, source uri forwarding, load/error callback wiring, tintColor, preload (noop), clearMemoryCache, clearDiskCache, FastImageSource type",missing:"custom request headers/cache policy are not enforced, source as bundled asset number is passthrough-only"}]},"lottie-react-native":{category:"Animation",stubType:"native",versions:[{range:">=5.0.0",coverage:.93,note:"real package JS runs unchanged; sootsim registers the codegen native LottieAnimationView and renders JSON/sourceURL animations through CanvasKit Skottie. Fabric codegen commands dispatch to the host instance, so play/reset/pause/resume and autoplay follow upstream iOS command semantics. onAnimationLoaded/onAnimationFailure/onAnimationFinish are emitted through the upstream native event wrappers.",working:"real LottieView class component, source JSON and sourceURL loading, Skottie visual rendering, resizeMode contain/cover/center, progress prop seeking without pausing, speed/loop/autoplay, play/reset/pause/resume imperative API via codegenNativeCommands, segment playback when both startFrame and endFrame are provided, colorFilters mapped to iOS-style keypath.**.Color, onAnimationFinish/onAnimationLoaded/onAnimationFailure callbacks",missing:"dotLottie archives, named native asset catalogs, external imageAssetsFolder images, textFiltersIOS/textFiltersAndroid, Android-only safe-mode/cache/merge-path toggles, web-only hover/onAnimationLoop"}]},"react-native-vision-camera":{category:"Media",stubType:"native",versions:[{range:">=3.0.0",coverage:.93,note:"real navigator.mediaDevices-backed camera (same real-getUserMedia + canvas-photo + MediaRecorder tier as expo-camera@0.85, with a larger surface). Camera mounts a <video> bound to a getUserMedia stream (facingMode from device.position), takePhoto draws a frame to OffscreenCanvas \u2192 PNG blob URL, startRecording/stopRecording use MediaRecorder with mp4/webm fallback honoring videoBitRate, useCameraDevice(s) enumerate via mediaDevices.enumerateDevices, useCameraPermission/useMicrophonePermission read navigator.permissions.query, front camera mirrored via CSS scaleX(-1). useCodeScanner now REALLY scans: while the camera is active the live video is polled with the native BarcodeDetector API (the same API the @react-native-ml-kit/barcode-scanning seam uses) and onCodeScanned fires with BarcodeDetector formats mapped to vision-camera codeTypes. remaining gaps are genuine browser MediaStreamTrack-capability limitations (faithful, not sootsim deficiencies).",working:"Camera component live preview through getUserMedia, takePhoto returning a real PNG blob URL with correct dimensions, startRecording/stopRecording/pauseRecording/resumeRecording via MediaRecorder, onRecordingFinished/onRecordingError callbacks fire correctly, useCameraDevice/useCameraDevices via enumerateDevices, useCameraPermission/useMicrophonePermission read + request real permission state, useCameraFormat returns a sensible default format, isActive toggles stream start/stop, position prop switches facingMode, onInitialized/onStarted/onStopped/onError fire at correct lifecycle moments, useCodeScanner performs real BarcodeDetector scanning on the live preview (onCodeScanned fires with mapped codeTypes), useFrameProcessor type-correct passthrough",missing:"tap-to-focus (browser tracks have no focus point API), real torch/flash control (no MediaStreamTrack constraint for torch on most devices), zoom slider, exposure compensation, frame processor callback never fires per-frame (browser has no native frame-level callback comparable to Vision frameworks) \u2014 all genuine browser MediaStreamTrack limitations, faithful (not sootsim-specific)"}]},"react-native-video":{category:"Media",stubType:"native",versions:[{range:">=5.0.0",coverage:.93,note:"HTML5 <video> wired with the full upstream callback contract: loadedmetadata \u2192 onLoad with naturalSize/duration, timeupdate \u2192 onProgress at progressUpdateInterval with playable/seekable durations from buffered ranges, ended \u2192 onEnd, error \u2192 onError with MediaError code/message, waiting/playing \u2192 onBuffer, ratechange \u2192 onPlaybackRateChange, volumechange \u2192 onVolumeChange, canplay \u2192 onReadyForDisplay, play/pause \u2192 onPlaybackStateChanged. ref.seek sets currentTime + emits onSeek with seekTime. requestFullscreen/exitFullscreen drive the will/did present/dismiss callbacks. setPlaybackRate/setVolume on the ref. paused/volume/rate prop changes sync to the element after mount.",working:"Video component, source.uri/type/headers/startPosition, paused/muted/volume/rate/repeat/resizeMode/controls/poster props, ref.seek/setPlaybackRate/setVolume/presentFullscreenPlayer/dismissFullscreenPlayer/save, all on* callbacks (onLoad/onLoadStart/onProgress/onSeek/onEnd/onBuffer/onError/onPlaybackRateChange/onVolumeChange/onReadyForDisplay/onPlaybackStateChanged + fullscreen will/did present/dismiss)",missing:"DRM (widevine/playready/clearkey/fairplay would need EME bindings), audioTracks/textTracks/videoTracks (HLS/DASH-specific \u2014 would need hls.js or shaka-player), pictureInPicture (some browsers expose requestPictureInPicture but not all), preventsDisplaySleepDuringVideoPlayback (Wake Lock API path not wired), ignoreSilentSwitch (iOS-only)"}]},"@react-native-firebase/app":{category:"Analytics",stubType:"native",versions:[{range:">=18.0.0",coverage:.95,note:"upstream @react-native-firebase/app JS runs unchanged against a synthetic RNFBAppModule native app record",working:"initializeApp, getApp, getApps, app/apps default export shape, delete, native app registry constants, preferences/event listener native methods",missing:"real Firebase backend initialization, GoogleService-Info.plist/google-services.json data, service persistence/network transport"}]},"@react-native-firebase/messaging":{category:"Notifications",stubType:"native",versions:[{range:">=18.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: development noop : push API surface resolves without real FCM delivery. imports and API shape receive no behavior credit",working:"default messaging(), getToken/deleteToken, requestPermission/hasPermission AUTHORIZED, onMessage/onNotificationOpenedApp/onTokenRefresh subscriptions, getInitialNotification null, setBackgroundMessageHandler, topic subscribe/unsubscribe, auto-init/device registration helpers, AuthorizationStatus constants",missing:"real FCM token, actual message receipt, background handler execution, notification-open events; intentionally absent for browser simulator"}]},"@react-native-firebase/analytics":{category:"Analytics",stubType:"native",versions:[{range:">=18.0.0",coverage:.95,note:"development noop \u2014 analytics calls resolve and intentionally send nothing",working:"default analytics(), getAnalytics, logEvent, logScreenView, logLogin, logSignUp, logSearch, logShare, logPurchase, logAddToCart, logSelectContent, logSelectItem, logViewItem, logViewItemList, logBeginCheckout, setUserId, setUserProperty, setUserProperties, collection/session/default parameter helpers, getAppInstanceId",missing:"real Google Analytics transport and native app instance id; initiateOnDeviceConversionMeasurement not stubbed"}]},"@react-native-firebase/auth":{category:"Auth & Payments",stubType:"native",versions:[{range:">=18.0.0",coverage:.65,note:"native-seam only \u2014 upstream RNFirebase auth JS runs from the bundle; RNFBAuthModule provides constants, listener noops, deterministic anonymous sign-in, current-user/token methods",working:"default auth(), firebase.app().auth(), getAuth, provider exports, currentUser, signInAnonymously, signOut, updateProfile, getIdToken, getIdTokenResult, onAuthStateChanged, onIdTokenChanged",missing:"real Firebase Auth backend, token refresh, email/password and OAuth provider sign-in, provider linking, phone auth, MFA, persistence across reloads"}]},"@react-native-firebase/firestore":{category:"Storage & Data",stubType:"native",versions:[{range:">=18.0.0",coverage:.6,note:"upstream @react-native-firebase/firestore JS runs unchanged against noop RNFBFirestore{,Collection,Document,Transaction}Module native seams \u2014 reads resolve empty snapshots, writes resolve, listeners never emit",working:"full public API surface from the real package: default firestore(), getFirestore, modular helpers, collection/doc references, queries with where/orderBy/limit modifiers, get() returning structurally-correct empty document/query snapshots, set/update/delete/batch resolving, onSnapshot unsubscribe, count/aggregate (0), transactions, write batches, FieldValue/FieldPath/Timestamp/GeoPoint statics, settings/network/persistence/emulator config",missing:"real document storage, query filtering/order/limit results, realtime sync events, transaction read-modify-write semantics, offline persistence"}]},"@react-native-firebase/crashlytics":{category:"Analytics",stubType:"native",versions:[{range:">=18.0.0",coverage:.95,note:"upstream @react-native-firebase/crashlytics JS runs unchanged against a noop RNFBCrashlyticsModule native seam",working:"default callable export, getCrashlytics, modular helpers, crash, log, recordError, setAttribute, setAttributes, setUserId, collection enablement, unsent report helpers, didCrashOnPreviousExecution",missing:"native crash capture, report persistence, upload to Firebase Crashlytics"}]},"@react-native-firebase/perf":{category:"Analytics",stubType:"native",versions:[{range:">=18.0.0",coverage:.95,note:"development noop \u2014 performance tracing API is present and records nothing",working:"trace/newTrace/startTrace, Trace start/stop/attributes/metrics, HttpMetric start/stop/attributes/payload metadata, collection enablement",missing:"native app start/network instrumentation, trace persistence, upload to Firebase Performance"}]},"@react-native-firebase/remote-config":{category:"Storage & Data",stubType:"native",versions:[{range:">=18.0.0",coverage:.8,note:"safe defaults \u2014 remote config calls resolve and return static empty values",working:"setDefaults, setConfigSettings, fetch, fetchAndActivate, activate, ensureInitialized, getAll, getBoolean, getNumber, getString, getValue, reset",missing:"remote fetch/activate against Firebase backend, persisted defaults, realtime config updates"}]},"@react-native-firebase/storage":{category:"Storage & Data",stubType:"native",versions:[{range:">=18.0.0",coverage:.55,note:"upstream @react-native-firebase/storage JS runs unchanged against a noop RNFBStorageModule native seam \u2014 uploads resolve a success snapshot without moving bytes, reads resolve empty metadata/lists",working:"full public API surface from the real package: default storage(), ref/refFromURL, child/parent refs, put/putString/putFile/writeToFile upload+download tasks resolving success snapshots, StorageTask pause/resume/cancel, getDownloadURL stub URI, getMetadata/updateMetadata structurally-correct empty metadata, list/listAll empty results, delete, retry-time constants and setters, emulator config",missing:"real upload/download bytes, resumable tasks, live progress events, Firebase Storage rules/auth integration"}]},"@react-native-firebase/functions":{category:"Storage & Data",stubType:"native",versions:[{range:">=18.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: noop callable functions : calls resolve with {data:null}. imports and API shape receive no behavior credit",working:"default functions(), httpsCallable, useEmulator",missing:"real HTTPS callable transport, emulator networking, error code mapping"}]},"@react-native-firebase/installations":{category:"Device & Platform",stubType:"native",versions:[{range:">=18.0.0",coverage:0,note:"the reference iOS simulator creates real Firebase installation identifiers and tokens when configured. SootSim returns fixed placeholder strings, so import safety receives no behavior credit",working:"default installations(), getId, getToken, delete",missing:"real Firebase installation registration and token lifecycle"}]},"@react-native-firebase/app-check":{category:"Device & Platform",stubType:"native",versions:[{range:">=18.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: development token noop : App Check API shape resolves with stub tokens. imports and API shape receive no behavior credit",working:"default appCheck(), activate, setTokenAutoRefreshEnabled, getToken, onTokenChanged",missing:"real attestation provider, token refresh, enforcement with Firebase services"}]},"react-native-iap":{category:"Auth & Payments",stubType:"native",versions:[{range:">=12.0.0",coverage:.35,note:"partial JS-reimpl stub \u2014 covers ~40% of upstream surface; useIAP hook, withIAPContext, IAPManagerAndroid, getStorefrontIOS etc. missing. should be migrated to native-seam pattern so real package runs against an RNIapIos/RNIapAndroid TurboModule shim",working:"initConnection resolves true, purchaseErrorListener/purchaseUpdatedListener return removable subscriptions, endConnection resolves",missing:"getProducts/getSubscriptions always [], requestPurchase/requestSubscription always undefined, getAvailablePurchases [], finishTransaction noop, validateReceiptIos/Android return {}, no IAPManagerAndroid/withIAPContext, useIAP hook missing"}]},"react-native-plaid-link-sdk":{category:"Auth & Payments",stubType:"native",versions:[{range:">=11.0.0",coverage:.55,note:"upstream package JS runs unchanged against RNLinksdk/PlaidAndroid native module seams",working:"TurboModuleRegistry RNLinksdk/PlaidAndroid provides createPlaidLink, open, destroy/dismiss, submit, syncFinanceKit, listener bookkeeping, and browser popup URL construction; upstream Types/PlaidLink wrappers stay in the app bundle",missing:"real Plaid LinkKit UI, OAuth handoff/deep-link completion, embedded LinkKit webview, Android activity result routing, real FinanceKit authorization"}]},"react-native-fs":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"comprehensive IndexedDB-backed FS sharing one byte store with react-native-blob-util (a file written via RNFS is readable via blob-util and vice-versa), with real fetch-based download (streaming begin/progress/abort), real fetch-based uploadFiles, and native-shaped hashing. covers the entire upstream react-native-fs API surface; base64/hex/ascii read+write decode/encode correctly through the shared blob-util codec.",working:"readFile, writeFile, appendFile, read (byte-accurate position/length slicing with utf8/base64/hex/ascii encoding), write, readDir, stat, exists, mkdir, unlink, copyFile, moveFile, hash (MD5/SHA-1/256/384/512), downloadFile (streaming progress/begin callbacks, abort), stopDownload, uploadFiles, stopUpload, getFSInfo, touch, scanFile, getAllExternalFilesDirs, all path constants \u2014 the complete upstream surface (verified against react-native-fs FS.common.js; readStream/writeStream are NOT part of upstream RNFS)",missing:"no Android background download manager (browser fetch has no OS-level parallel) \u2014 the only genuinely-absent capability; everything else upstream RNFS exposes is implemented"}]},"react-native-file-access":{category:"Storage & Data",stubType:"native",versions:[{range:">=3.0.0",coverage:.85,note:"upstream package JS runs unchanged against FileAccess TurboModule backed by sootsim storage and browser fetch",working:"FileAccess native module getConstants, readFile/writeFile/appendFile/readFileChunk/concatFiles, cp/mv/unlink/mkdir/exists/ls/isDir/stat/statDir, hash, df, cpAsset/cpExternal, hardlink/symlink/unzip approximations, fetch events with response headers",missing:"real native document providers/content URIs, Android scoped-storage picker flows, real bundled assets/resources, true hardlinks/symlinks/zip extraction, streaming fetch cancellation parity"}]},"@rnmapbox/maps":{category:"Device & Platform",stubType:"native",versions:[{range:">=10.0.0",coverage:.82,note:"real MapLibre tiles via the host native seam (map-host.ts). the package JS runs from the bundle; RNMBX* host components and every enforcing TurboModule imported by the native entrypoint are seam-provided. MapView ref reads and takeSnap consume the same host camera feedback and compositor pixels as the rendered map. keyless: Mapbox vector styles fall back to OpenFreeMap, while official Mapbox satellite styles use Esri World Imagery.",working:"MapView (upstream native wrapper, real vector tiles, keyless satellite imagery, mercator/globe projection, pinch-zoom + pan, onCameraChanged/onMapIdle and legacy region payloads), Camera (centerCoordinate/zoomLevel/bounds/pitch/heading via the stop prop \u2192 camera/fit), MapView ref getCenter/getZoom/getPointInView/getCoordinateFromView/getVisibleBounds/takeSnap/clearData, ShapeSource (geojson), LineLayer/CircleLayer/FillLayer/SymbolLayer/HeatmapLayer/FillExtrusionLayer/BackgroundLayer (reactStyle \u2192 GL paint/layout), PointAnnotation/MarkerView (host pin), setAccessToken/setWellKnownTileServer (no-op, keyless)",missing:"custom PointAnnotation/MarkerView child views, queryRenderedFeaturesAtPoint/queryRenderedFeaturesInRect/querySourceFeatures, feature-state/source-visibility/terrain queries, projection reads with bearing/pitch, standalone RasterSource/VectorSource/ImageSource components, terrain/sky/atmosphere, map/style/render lifecycle callbacks, location/user-location, offline/tile-store/viewport/shape-animator APIs, snapshotManager; MapView.takeSnap crops the visible screen rectangle (so an overlapping sibling can be included) and writeToDisk returns a browser blob URI rather than file://"}]},"@react-native-community/datetimepicker":{category:"UI Components",stubType:"native",versions:[{range:">=6.0.0",coverage:.9,note:"engine UIDatePicker wheels back both paths: the JS-surface stub renders them directly, and bundles running the real package JS resolve codegenNativeComponent('RNDateTimePicker') to the same wheel via a registered host view. onChange delivers upstream's (event, date) with { timestamp, utcOffset }.",working:"DateTimePicker (value, mode date/time/datetime, onChange, minimumDate, maximumDate, minuteInterval, locale, timeZoneOffsetInMinutes, textColor, themeVariant, disabled), DateTimePickerMode, DateTimePickerDisplay, AndroidEvent constants, DateTimePickerAndroid (open/dismiss shape)",missing:"displayIOS 'default'/'compact'/'inline' calendar styles (all render as wheels), countdown mode renders the time wheel, timeZoneName (use timeZoneOffsetInMinutes), accentColor, onPickerDismiss"}]},"@react-native-community/slider":{category:"UI Components",stubType:"native",versions:[{range:">=4.0.0",coverage:.93,note:"real HTML range input element backing all core slider props with full event surface (onValueChange/onSlidingStart/onSlidingComplete). custom-image / custom-component visual props are documented absent; consumer style props for track tint land correctly.",working:"value, minimumValue, maximumValue, step, onValueChange, onSlidingStart, onSlidingComplete, disabled, minimumTrackTintColor, lowerLimit, upperLimit, testID",missing:"thumbImage / minimumTrackImage / maximumTrackImage (would need an absolute-positioned overlay since native-input thumbs can't take an image source on web), StepMarker / renderStepNumber custom-render slots"}]},"@react-native-picker/picker":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.9,note:"engine UIPickerView wheel (selection capsule, edge fade, drag/fling/snap) backing the Picker/PickerIOS surface; Picker.Item is data-only like upstream iOS. itemStyle color/fontSize honored, per-item color via Picker.Item color.",working:"Picker, PickerIOS, Picker.Item (label, value, color), selectedValue, onValueChange(value, index), enabled, itemStyle color/fontSize, MODE_DIALOG, MODE_DROPDOWN constants",missing:"android dialog/dropdown presentation (mode/prompt/dropdownIconColor render as the iOS wheel), focus()/blur() imperative handle, onFocus/onBlur"}]},"@react-native-camera-roll/camera-roll":{category:"Image",stubType:"native",versions:[{range:">=5.0.0",coverage:.85,note:"native-seam only \u2014 the real CameraRoll class, useCameraRoll hook, and iOS permission helpers run from the bundle. sootsim provides RNCCameraRoll + RNCCameraRollPermission TurboModules; getPhotos/saveToCameraRoll proxy through `SootSim.bridges.photoLibrary` when mounted (returning upstream-shaped PhotoIdentifier records), and authorization uses the shared app-scoped photo-library registry.",working:"real upstream CameraRoll class + useCameraRoll hook running from the bundle, GroupTypesOptions/AssetTypeOptions/AlbumTypeOptions, getPhotos via the permission-gated bridge, save/saveAsset/saveToCameraRoll via bridge.createAsset, deletePhotos no-op, iosGetImageDataById/getPhotoThumbnail shape-correct, iosReadGalleryPermission/iosRequestReadWriteGalleryPermission/iosRequestAddOnlyGalleryPermission through the shared registry, iosRefreshGallerySelection through the limited picker, cameraRollEventEmitter via NativeEventEmitter, addListener/removeListeners shape",missing:"album enumeration/mutation (getAlbums returns []), real PHAsset internal id lookup, real thumbnail base64 generation (returns empty string), progress update events"}]},"@react-native-community/geolocation":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:.92,note:"native-seam only \u2014 the real upstream implementation.native.ts runs from the bundle (subscriptions map keyed by watch id, configuration normalization, requestAuthorization \u2192 setRNConfiguration \u2192 getCurrentPosition flow, GeolocationEventEmitter listener bookkeeping with `geolocationDidChange`/`geolocationError`, stopObserving cleanup walk). sootsim registers the RNCGeolocation TurboModule backed by real navigator.geolocation \u2014 apps get real user-granted coordinates and proper PERMISSION_DENIED / POSITION_UNAVAILABLE / TIMEOUT codes from the browser.",working:"real upstream JS running from the bundle, setRNConfiguration (no-op \u2014 Android FusedLocation provider choice has no browser equivalent), requestAuthorization through the shared app-scoped location registry, getCurrentPosition via the registry followed by navigator.geolocation.getCurrentPosition with timeout/maximumAge/enableHighAccuracy, watchPosition via the registry and navigator.geolocation.watchPosition with subscription bookkeeping in upstream JS, clearWatch via navigator.geolocation.clearWatch, stopObserving cleanup",missing:"distanceFilter (no browser equivalent), useSignificantChanges (iOS-specific significant-location-change service has no browser counterpart), enableBackgroundLocationUpdates (browsers can't observe in the background)"}]},"react-native-geolocation-service":{category:"Device & Platform",stubType:"native",versions:[{range:">=5.0.0",coverage:.8,note:"shared system-location authorization followed by browser navigator.geolocation, with RNFusedLocation-style callbacks and permission status",working:"default Geolocation export, PositionError constants, requestAuthorization, getCurrentPosition, watchPosition, clearWatch, stopObserving, setRNConfiguration",missing:"native fused provider accuracy modes, Android Google Play Services resolution dialogs, significant-change monitoring, background updates"}]},"@react-native-community/push-notification-ios":{category:"Notifications",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe \u2014 local notification scheduling, badge state, permission shape, and event listeners all work in-memory via the browser Notification API. real APNs delivery is intentionally absent (same constraint as every push SDK in a browser sim)",working:"default PushNotificationIOS class, FetchResult, AuthorizationStatus, requestPermissions/checkPermissions/abandonPermissions, addEventListener/removeEventListener, presentLocalNotification, scheduleLocalNotification, addNotificationRequest, pending/delivered notification queries/removal, badge count, notification instance getters",missing:"real APNs registration/delivery, OS notification center UI, background fetch completion callbacks, attachment download/storage, notification category action behavior"}]},"react-native-maps":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam over a real host-thread maplibre-gl driver (render-worker/map-host.ts), NOT an OSM iframe. the package JS (MapView/Marker/Callout/AnimatedRegion/createFabricMap) runs unchanged; only the RNMapsMapView/RNMapsMarker host components + the RNMapsAirModule TurboModule are ours. maplibre renders keyless OpenFreeMap vector tiles at device scale on the host and ships each frame to the shell painter via the live-frame channel. Childless Markers render as real maplibre circle layers; custom Marker child views render in the tenant overlay and reproject from host camera feedback. Pinch (focal-point zoom) + pan are forwarded from the tenant responder, and maplibre camera changes return through the host\u2192tenant channel for region callbacks and current imperative reads. The imperative ref API works: getCamera/getMapBoundaries/getPointForCoordinate/getCoordinateForPoint answer from web-mercator math over the seam's tracked camera; animateCamera/animateToRegion/setCamera/fitToCoordinates/fitToElements route through codegenNativeCommands \u2192 __dispatchCommandImpl \u2192 the maplibre easeTo/jumpTo/fitBounds host commands. takeSnapshot captures and encodes the visible map viewport through the compositor pixel owner, including png/jpg, quality, base64/blob-uri results, and requested output dimensions.",working:"MapView with real maplibre vector-tile rendering at device scale, initialRegion/region/camera honored, Marker (real map pins via maplibre circle layers, pinColor; custom child views with anchor positioning and pan reprojection), pinch+pan gestures with focal-point zoom, onRegionChangeStart/onRegionChange/onRegionChangeComplete with region + isGesture, getCamera/getMapBoundaries (web-mercator unproject of the view corners), getPointForCoordinate/getCoordinateForPoint (projection round-trip), getMarkersFrames, animateCamera/animateToRegion/setCamera (easeTo/jumpTo), fitToCoordinates/fitToElements/fitToSuppliedMarkers (fitBounds), takeSnapshot of the visible viewport (real compositor pixels, png/jpg + quality, file/base64 result, requested output scaling), onMapReady, MapView ref API, Callout/CalloutSubview/AnimatedRegion/MAP_TYPES/PROVIDER_GOOGLE/DEFAULT/enableLatestRenderer exports",missing:"custom Marker child projection does not yet account for bearing/pitch, shape overlays (Polyline/Polygon/Circle/Overlay/Heatmap/Geojson/UrlTile/WMSTile/LocalTile render null \u2014 the GL style reconcile path exists in map-host but react-native-maps does not emit it yet, only @rnmapbox/maps does), takeSnapshot region override and isolated native-subtree capture (the visible screen rectangle can include an overlapping sibling; file result is a browser blob URI rather than file://), getAddressFromCoordinates (no reverse geocoder), showsUserLocation tracking, gesture-based onPress/onLongPress"}]},"react-native-image-picker":{category:"Image",stubType:"native",versions:[{range:">=5.0.0",coverage:.93,note:"real browser file-input picker for both library and camera (capture attribute) with full upstream callback + promise APIs. base64 read, selectionLimit, mediaType filter, video duration/dimensions all wired through real File / Blob / video metadata reads. maxWidth/maxHeight/quality now apply a real aspect-preserving OffscreenCanvas downscale + JPEG re-compression on picked images, matching upstream ImageResizer.",working:"launchImageLibrary, launchCamera (with capture attribute), callback and promise APIs, base64 option, selectionLimit, mediaType filter, video duration/dimensions, maxWidth/maxHeight/quality image resize+recompress (real OffscreenCanvas, downscale-only, aspect-preserving, JPEG output \u2014 updates uri/base64/fileSize/dimensions), ErrorCode/MediaType constants",missing:"saveToPhotos noop (no write-capable photo library bridge today), includeExtra metadata (EXIF reader needed), assetRepresentationMode (iOS-only HEIC/JPEG selection \u2014 browsers expose what File.type says), formatAsMp4 ignored (browsers can't transcode video on the fly without WebCodecs)"}]},"react-native-image-size":{category:"Image",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"native-seam: the real package runs from the bundle and RNImageSize resolves dimensions through the engine image decoder",working:"getSize for browser-decodable remote, file, blob, and data image URIs; decoded dimensions include browser-applied EXIF orientation",missing:"the explicit Android rotation field is normalized to zero after browser decoding applies orientation"}]},"react-native-config":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"proxy reads all keys from process.env; supports any key via Proxy ownKeys/get",working:"Config proxy (all keys via process.env), default and named Config export"}]},"react-native-localize":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"upstream react-native-localize JS runs unchanged against the RNLocalize NativeModule provided by sootsim",working:"getLocales, getNumberFormatSettings, getCalendar, getCalendars, getCurrencies, getCountry, getTemperatureUnit, getTimeZone, uses24HourClock, usesMetricSystem, usesAutoDateAndTime, usesAutoTimeZone, addEventListener, removeEventListener, findBestLanguageTag, findBestAvailableLanguage",missing:"locale change events never fire (browser doesn't emit them)"}]},"expo-screen-orientation":{category:"Expo SDK",stubType:"native",proofCoverage:.8,versions:[{range:">=7.0.0",coverage:.5,note:"the lock state and events work, but the viewport never rotates while the reference iOS simulator applies the requested orientation",working:"getOrientationAsync (returns the locked orientation), getOrientationLockAsync, getPlatformOrientationLockAsync, lockAsync (with upstream TypeError validation), lockPlatformAsync, unlockAsync, supportsOrientationLockAsync, addOrientationChangeListener/remove (events fire on lock), all enums; validated through real RN + sootsim for landscape/portrait/platform-mask/unlock",missing:"the device frame does not visually re-lay-out on lock \u2014 faithful to the browser/fixed-sim-frame limitation (identical to react-native-orientation-locker, not a sootsim-specific gap); there is no physical rotation sensor on a fixed sim device so DeviceOrientationEvent-driven auto-rotation is intentionally absent (matches a locked iOS device)"}]},"expo-sensors":{category:"Expo SDK",stubType:"native",proofCoverage:.8,versions:[{range:">=13.0.0",coverage:.85,note:"package-local wrapper registers only expo-sensors native modules; upstream expo-sensors JS runs unchanged.",working:"upstream DeviceSensor/Pedometer wrappers, listener bookkeeping, update intervals, permissions, availability booleans, Gravity constant, ExponentAccelerometer/Gyroscope/Magnetometer/MagnetometerUncalibrated/DeviceMotion streams, ExpoBarometer stream, and ExponentPedometer counts",missing:"real CoreMotion/browser sensor hardware, true step counting, and physical-device motion variability"}]},"expo-sharing":{category:"Expo SDK",stubType:"native",proofCoverage:0,versions:[{range:">=12.0.0",coverage:.85,note:"upstream expo-sharing JS runs unchanged; package-local wrapper only registers the ExpoSharing native module. an empty incoming-share inbox is the state a browser preview should report, so the share-into surface scores as present.",working:"isAvailableAsync (real browser check), shareAsync calls navigator.share({url,title}) when available and safely noops otherwise, getSharedPayloads/getResolvedSharedPayloadsAsync/clearSharedPayloads report an empty incoming-share inbox",missing:"native share sheet UI, native file readability validation, incoming share extension app-group storage. the share-into functions also diverge on a misconfigured app: iOS throws FailedToResolveAppGroupIdException from all three when the app declares no ExpoShareIntoAppGroupId (expo-sharing/ios/SharingModule.swift:4-11) where sootsim returns the empty inbox, so an app that redboxes on device previews cleanly"}]},"expo-updates":{category:"Expo SDK",stubType:"native",versions:[{range:">=0.20.0",coverage:.45,note:"stub \u2014 the published expo-updates constants, validation, result transformation, event fan-out, and useUpdates hook run unchanged against a disabled-development-build ExpoUpdates native seam",working:"disabled embedded-launch constants and currentlyRunning/useUpdates state; no-update check/fetch results; empty log read/clear; in-session get/set/unset extra params; upstream enums",missing:"OTA server checks, update download and storage, applying a downloaded bundle, reload-screen UI, native state-machine events, manifests, request overrides, and persistence"}]},"expo-calendar":{category:"Expo SDK",stubType:"native",proofCoverage:.7,versions:[{range:">=13.0.0",coverage:.8,note:'native-seam: upstream expo-calendar JS runs from the bundle over an in-memory EventKit-shaped store seeded faithfully to a fresh iOS Simulator \u2014 a writable local "Calendar" on the "Default" local source plus the always-present read-only "Birthdays" calendar, so getCalendarsAsync/getDefaultCalendarAsync match what a real RN app sees on the conformance Simulator (no sootsim brand names leak into guest calendar pickers). create/read/update/delete then mutate that store like EKEventStore.',working:'reference-Simulator default calendar set (writable "Calendar" + read-only "Birthdays", faithful "Default" local source); real RN + sootsim validated event permission/create/read/update/range-query/attendee-read/delete smoke, upstream enums and JS validation, create/update/delete calendars, create/list/get/update/delete events with date-range filtering, attendee reads, create/list/get/update/delete reminders, open/edit dialog functions safely resolve, all permission functions',missing:'real EventKit / CalendarContract access (the in-memory store does not surface events the user actually owns), calendar sync across processes/reloads, native calendar UI dialogs (presentEvent/createEventDialog), recurrence rule expansion (RRULE), attendee response/availability semantics, exact per-iOS-version Simulator calendar set (the seeded "Calendar"/"Birthdays" pair is the stable baseline)'}]},"expo-av":{category:"Media",stubType:"native",versions:[{range:">=13.0.0",coverage:.93,note:"native-seam only. real expo-av package runs from the bundle (Audio.Sound + Audio.Recording classes, AVPlaybackStatus shape, PitchCorrectionQuality enum, RecordingOptionsPresets, Video component). sootsim only stubs the ExponentAV native module via web-faithful upstream-ported element-keyed methods (loadForSound/setStatusForSound/replaySound + prepare/start/pause/stop/unloadAudioRecorder + permissions via getUserMedia probe).",working:"Audio.Sound (createAsync/loadAsync/unloadAsync/play/pause/stop/seek/setRate/setVolume/setMuted/setLooping/setProgressUpdateInterval/setOnPlaybackStatusUpdate via element-keyed seam), Audio.Recording (prepareToRecordAsync/startAsync/pauseAsync/stopAndUnloadAsync/getStatusAsync/getURI via singleton MediaRecorder), Video ref API (playAsync/pauseAsync/setPositionAsync/setStatusAsync/setRate/setVolume/setIsMuted/setIsLooping), real getUserMedia permission probe with PermissionStatus reflection, didUpdatePlaybackStatus + ExponentAV.onError events via DeviceEventEmitter, RecordingOptionsPresets, PitchCorrectionQuality enum (Low/Medium/High), ResizeMode",missing:"setAudioModeAsync is noop (no browser equivalent for AVAudioSession), audio metering/analyzer data absent (would need AnalyserNode), Video fullscreen helpers no-op (no Fullscreen API integration), shouldDuckAndroid / playThroughEarpieceAndroid ignored"}]},"expo-camera":{category:"Media",stubType:"native",versions:[{range:">=14.0.0",coverage:.93,note:"real getUserMedia preview + canvas-backed photo capture with base64 + MediaRecorder-backed video recording. recordAsync starts a MediaRecorder against the live stream (mp4 with webm fallback when video/mp4 is not supported), maxDuration auto-stops, stopRecording returns a real blob URL via URL.createObjectURL. Permissions go through navigator.permissions + getUserMedia probes. Barcode scanning, flash/torch/zoom remain documented unavailable.",working:"CameraView (live video stream via getUserMedia), facing/mirror support, takePictureAsync (canvas capture with base64), recordAsync via MediaRecorder with mp4/webm fallback returning a blob URL, stopRecording, maxDuration auto-stop, useCameraPermissions, useMicrophonePermissions, getCameraPermissionsAsync, requestCameraPermissionsAsync, getMicrophonePermissionsAsync, requestMicrophonePermissionsAsync, pausePreview/resumePreview, getAvailablePictureSizesAsync (real video.videoWidth/videoHeight), Camera.Constants compat, enums (CameraType/FlashMode/AutoFocus/CameraMode/VideoQuality/PermissionStatus)",missing:"barcode scanning (would need BarcodeDetector \u2014 Chrome only), scanFromURLAsync (no browser equivalent without an external library), flash/torch/zoom (browser MediaTrackConstraints expose torch on Android Chrome only \u2014 not wired), maxFileSize honoring (would need stream-size accounting)"}]},"expo-localization":{category:"Expo SDK",stubType:"native",versions:[{range:">=14.0.0",coverage:.95,note:"comprehensive \u2014 backed by Intl and navigator.language; locale listeners are noop",working:"getLocales, getCalendars, useLocales, useCalendars, locale, locales, timezone, isoCurrencyCodes, region, isRTL, isMetric, currency, decimalSeparator, digitGroupingSeparator, getLocalizationAsync, addLocaleListener, addCalendarListener, removeSubscription",missing:"OS-level locale change events (browser limitation; addLocaleListener is a noop)"}]},"expo-local-authentication":{category:"Auth & Payments",stubType:"native",versions:[{range:">=13.0.0",coverage:.95,note:'native-seam: the LocalAuthentication.js wrapper + AuthenticationType/SecurityLevel enums + types run from the real bundle; only the ExpoLocalAuthentication expo module is ours, and it mirrors expo iOS LocalAuthenticationModule.swift exactly for the reference simulator (iPhone 16 Face ID device, no biometrics enrolled, no passcode): hasHardwareAsync true, isEnrolledAsync false, supportedAuthenticationTypesAsync [FACIAL_RECOGNITION], getEnrolledLevelAsync NONE, authenticateAsync resolves {success:false,error:"passcode_not_set"|"not_enrolled"} per disableDeviceFallback \u2014 the exact convertErrorCode path. cancelAuthenticate is deliberately absent so the wrapper faithfully throws UnavailabilityError on iOS (it is @platform android upstream). this IS the complete faithful contract on the reference device, same tier as react-native-exit-app / react-native-orientation-locker: a default iOS Simulator equally cannot run a real biometric prompt.',working:"full ExpoLocalAuthentication native surface with upstream-exact iOS-simulator semantics \u2014 hasHardwareAsync, isEnrolledAsync, supportedAuthenticationTypesAsync, getEnrolledLevelAsync, authenticateAsync (disableDeviceFallback-aware error codes); real package enums/types/wrapper run from the bundle so SecurityLevel.BIOMETRIC alias + UnavailabilityError guards behave exactly as upstream; iOS/android platform divergence (cancelAuthenticate) preserved",missing:"no real biometric prompt can succeed \u2014 but neither can the reference iOS Simulator (no enrolled biometrics, no secure enclave); a real success path would require physical biometric hardware that browsers and simulators alike do not expose"}]},"expo-video":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.88,note:"native-seam only \u2014 upstream expo-video JS runs unchanged; a host/page-thread HTMLVideoElement owns decode and timing, exact ExpoVideo player event payloads return through the host-service bridge, and transferable ImageBitmap frames enter the compositor live-frame mirror",working:"upstream VideoView/useVideoPlayer/createVideoPlayer and source parsing; real media metadata and first-frame rendering; play/pause/seekBy/replay/replace/release; statusChange, playingChange, playbackRateChange, volumeChange, mutedChange, playToEnd, timeUpdate, sourceChange, and sourceLoad object payloads; currentTime/duration/bufferedPosition synchronization; loop/mute/volume/rate/pitch properties; request headers; cache API noops and isPictureInPictureSupported=false",missing:"DRM, native controls, selectable audio/video/subtitle tracks, AirPlay, fullscreen and picture-in-picture presentation, live-stream latency/timestamps, thumbnail generation, and persistent video cache"}]},"react-native-date-picker":{category:"UI Components",stubType:"native",versions:[{range:">=5.0.0",coverage:.9,note:"native-seam only \u2014 the real package JS runs from the bundle; requireNativeComponent('RNDatePicker') resolves to the engine's UIDatePickerStyleWheels implementation (canvas wheel columns with drag/fling/snap physics, selection capsule, edge fade, locale-ordered date parts via Intl, light/dark/auto theme). onChange emits the upstream { timestamp: ms } contract on wheel settle.",working:"DatePicker (inline), date, onDateChange, mode (date/time/datetime), locale (month names, y/m/d column order, 12/24h cycle, day-period labels), minimumDate, maximumDate (settle-clamp bounce), minuteInterval, timeZoneOffsetInMinutes, textColor, theme",missing:"modal/open mode (NativeModules.RNDatePicker openPicker seam is a no-op; onConfirm/onCancel never fire), wheel wrap-around for month/day columns, cylindrical row compression (edge fade only), datetime day wheel spans min/max or \xB12 years instead of the UIKit range"}]},"react-native-blob-util":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.18.0",coverage:.93,note:"fetch-based HTTP + IndexedDB file storage; binary read/write with base64 supported. fs.ls now enumerates IDB keys honestly, fs.df reports navigator.storage.estimate quotas, fs.readStream/writeStream/slice/lstat fill the rest of upstream's fs surface.",working:"fs.readFile, fs.writeFile (with base64), fs.appendFile, fs.exists, fs.unlink, fs.mkdir (noop \u2014 flat IDB), fs.stat, fs.lstat, fs.cp, fs.mv, fs.slice (byte range copy), fs.hash (Web Crypto SubtleCrypto with sha1/256/384/512; md5 falls back to sha1 with warning shape), fs.isDir (true when any key has the path as strict prefix \u2014 directories are virtual in IDB), fs.ls (honest IDB-key enumeration filtered by path prefix, returns immediate-child basenames), fs.df (navigator.storage.estimate quota / free), fs.readStream (queues a single onData chunk in encoded form, then onEnd; respects bufferSize chunking for utf8 strings), fs.writeStream (in-memory accumulator flushed on close; honors utf8/ascii/base64 encodings), dirs constants, fetch (via ReactNativeBlobUtil.fetch), config().fetch with fileCache/path, wrap, base64.encode/decode, session (noop shape), polyfill",missing:"real chunked progress events on fetch (browsers don't expose per-chunk fetch progress), net namespace (Android Download Manager has no browser equivalent), Android-specific options (trusty, wifiOnly \u2014 no parallel on web)"}]},"react-native-haptic-feedback":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.93,note:"package-local wrapper registers only the RNHapticFeedback TurboModule; upstream react-native-haptic-feedback JS runs unchanged against the browser vibration API where available. full upstream API surface \u2014 every documented entry point lands on either real navigator.vibrate work or correct unavailable shape.",working:"sootsim validated upstream trigger, stop, isSupported, triggerPattern, getSystemHapticStatus, setEnabled, isEnabled, impact, HapticFeedbackTypes, Patterns, pattern/PATTERN_CHARS, and TouchableHaptic; RNHapticFeedback TurboModule uses navigator.vibrate for trigger/triggerPattern/stop and reports browser support shape",missing:"actual Core Haptics/UIKit haptic engine, AHAP file playback, hardware-specific intensity/sharpness rendering \u2014 these are unavailable on web (browser vibration API only honors duration patterns); apps that gate on isSupported take the no-haptic branch correctly"}]},"react-native-get-random-values":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"side-effect polyfill \u2014 browser already has crypto.getRandomValues, noop is correct",working:"polyfills globalThis.crypto.getRandomValues if absent (Math.random fallback)"}]},"react-native-securerandom":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"native RNSecureRandom seam backed by Web Crypto random bytes",working:"upstream generateSecureRandom(length) runs unchanged; RNSecureRandom.generateSecureRandomAsBase64(length) returns cryptographically secure base64 bytes"}]},"react-native-randombytes":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:1,note:"native RNRandomBytes seam backed by Web Crypto random bytes",working:"upstream randomBytes(length), randomBytes(length, callback), seedSJCL, and seed initialization run unchanged; RNRandomBytes.seed and RNRandomBytes.randomBytes(length, callback) return base64 secure random bytes"}]},"@react-native-google-signin/google-signin":{category:"Auth & Payments",stubType:"native",versions:[{range:">=10.0.0",coverage:.8,note:"package-local RNGoogleSignin TurboModule seam; upstream JS runs unchanged for signed-out iOS flows, with RN oracle documenting the upstream new-arch provider gap",working:"upstream GoogleSignin, GoogleSigninButton, statusCodes, and helper predicates run unchanged; configure, hasPlayServices, hasPreviousSignIn, getCurrentUser, addScopes, signInSilently no-saved response, getTokens signed-out rejection, clearCachedAccessToken, signOut/revokeAccess, and codegen native button press render through the RNGoogleSignin seam",missing:"real Google OAuth popup/redirect flow, token exchange, keychain-backed current user persistence, successful scope grants, One Tap / web credential support, and upstream iOS new-arch module provider registration in the RN oracle app"}]},"@invertase/react-native-apple-authentication":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.4,note:'performRequest returns deterministic simulated credentials \u2014 a fake JWT-shaped `identityToken` and `authorizationCode` that look real but fail any downstream Apple-public-key verification. consumer code that ships its own token verifier (which is the recommended SIWA pattern) hits a confusing "invalid signature" error rather than the unavailable-on-web branch. expo-apple-authentication dropped to 0.2 (PR #38) for the same pattern \u2014 this one is slightly higher only because the AppleButton component + enums + Android WebView signIn shape are still present.',working:"AppleButton component with upstream string Style/Type constants, appleAuth support flags, Error/Operation/Scope/State/UserStatus aliases, performRequest validation, getCredentialStateForUser, credential revoke listeners, appleAuthAndroid configure/signIn/Scope/ResponseType/Error",missing:"real Sign-in-with-Apple OAuth flow via AppleID JS SDK (Service ID + HTTPS); real Apple-signed identityToken (current token is a fabricated JWT that fails consumer-side signature verification against Apple's public keys); real authorizationCode that a backend can exchange; AppleIDProvider availability detection; keychain-backed credential state across reloads; Android WebView OAuth redirect interception; native cancellation/error code propagation"}]},"expo-apple-authentication":{category:"Auth & Payments",stubType:"native",versions:[{range:">=50.0.0",coverage:.2,note:`unavailable-on-web shape per docs/compat-scoring.md ("keep low unless we add a real browser OAuth flow"): enums and button render, isAvailableAsync returns false, signInAsync/refreshAsync/signOutAsync reject with ERR_NOT_AVAILABLE matching how an unavailable native module behaves. Apps with graceful-degradation paths take the right branch. Returning a fake credential here would lie to consumer code that may try to verify the identityToken against Apple's keys.`,working:"isAvailableAsync (false), AppleAuthenticationButton render (sign in / continue / sign up, WHITE/WHITE_OUTLINE/BLACK styles), all enum exports (Scope, Operation, CredentialState, UserDetectionStatus, ButtonType, ButtonStyle), formatFullName, getCredentialStateAsync (NOT_FOUND), addRevokeListener",missing:"real Sign-in-with-Apple OAuth flow (would need AppleID JS SDK + Service ID + HTTPS)"}]},"@stripe/stripe-react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.20.0",coverage:.93,note:"real Stripe.js delegation \u2014 initStripe() lazy-loads https://js.stripe.com/v3/ on first call (no upfront network cost), then every payment op (createPaymentMethod, confirmPayment, confirmSetupIntent, createToken, retrievePaymentIntent / SetupIntent, handleNextAction, verifyMicrodepositsForPayment / Setup) delegates to the real Stripe instance and talks to api.stripe.com over HTTPS. tokenization, payment intents, setup intents, and 3DS are the real implementation; errors are mapped into upstream StripeError shape. <CardField> / <CardForm> / <AuBECSDebitForm> / <PaymentMethodMessagingElement> mount real Stripe Elements iframes (PCI-compliant card collection). Apple Pay / Google Pay route through stripe.paymentRequest (the cross-platform abstraction). native PaymentSheet, CustomerSheet, AddressSheet, AddToWalletButton, and openApplePaySetup remain documented-unavailable (no web equivalents for the native bottom sheets / PassKit setup).",working:"real Stripe.js tokenization + intent flow \u2014 initStripe (loads js.stripe.com/v3 lazily, caches Stripe instance per publishableKey), createPaymentMethod (real), confirmPayment (real, via stripe.confirmCardPayment), confirmSetupIntent (real, via stripe.confirmCardSetup), createToken (real, via stripe.createToken \u2014 bank_account / pii / account; Card requires a mounted CardField), retrievePaymentIntent / retrieveSetupIntent (real), handleNextAction (real, via stripe.handleCardAction), handleNextActionForSetup (real, via stripe.handleNextAction), verifyMicrodepositsForPayment / Setup (real). real Stripe Elements: CardField / CardForm / AuBECSDebitForm / PaymentMethodMessagingElement mount stripe.elements().create(...) DOM iframes when wrapped in a StripeProvider. platform pay paths (confirmPlatformPayPayment / confirmPlatformPaySetupIntent / createPlatformPayPaymentMethod) route through stripe.paymentRequest \u2014 Apple Pay + Google Pay flow through the same browser PaymentRequest sheet Stripe.js abstracts. feature detection: isPlatformPaySupported via window.ApplePaySession.canMakePayments() + window.PaymentRequest. all upstream React surface: StripeProvider, useStripe / usePaymentSheet / usePlatformPay / useConfirmPayment / useConfirmSetupIntent / useApplePay / useGooglePay / useFinancialConnectionsSheet / useOnramp / useCustomerSheet hooks; StripeContainer / AddToWalletButton / AddressSheet / PlatformPayButton / CustomerSheet / ConnectComponentsProvider components; loadConnectAndInitialize, Constants (ApplePayContactFieldsType, ApplePayMerchantCapability, ApplePayShippingType, AndroidGooglePayButtonStyle / Type, IosGooglePayButtonType), all upstream error enums (Confirm/CardAction/Setup/CreatePayment/CreateToken/RetrievePayment/RetrieveSetup/ApplePay/PaymentSheet/Onramp/GooglePay/VerifyMicrodeposits/CollectBankAccount/AddressSheet/CustomerSheet/PlatformPay/Radar), CardBrand enum, PaymentMethodLayout, StripeError + ErrorType + MissingRoutingNumber",missing:'native PaymentSheet UI (the iOS-styled bottom drawer; web has stripe.elements().create("payment") as a primitive but the styled chrome differs). CustomerSheet / AddressSheet UI (no clean web equivalent). AddToWalletButton + openApplePaySetup (PassKit-only operations). createTokenForCVCUpdate (requires a mounted CardCvcElement). collectBankAccount* APIs (require a Financial Connections session token from the merchant server). raw Stripe Connect embedded components (would need @stripe/connect-js dep). when running inside the sootsim tenant worker (no `document`), Stripe.js cannot load \u2014 a future SootSim.bridges.stripe host helper would proxy DOM ops; the stub surfaces a typed error in that case so consumer code branches through error UI.'}]},"@swan-io/react-native-browser":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.1.0",coverage:.8,note:"upstream package JS runs unchanged against RNSwanBrowser native module backed by window.open",working:"TurboModuleRegistry RNSwanBrowser provides open/close, listener bookkeeping, popup URL opening; upstream openBrowser/closeBrowser/processColor/onClose wrapper stays in the app bundle",missing:"real SFSafariViewController/Chrome Custom Tabs UI, native modal transition behavior, Custom Tabs package selection/fallbacks, OS-level user dismissal detection"}]},"@notifee/react-native":{category:"Notifications",stubType:"native",versions:[{range:">=7.0.0",coverage:.15,note:"all noop \u2014 full API surface stubbed with correct shapes, no real notifications fire",working:"all constants (AndroidImportance, AndroidVisibility, EventType, AuthorizationStatus, TriggerType, RepeatFrequency), requestPermission returns AUTHORIZED shape, createChannel returns id, onForegroundEvent returns unsubscribe",missing:"actual notification display, real channel state, badge persistence, power manager info, background event execution, trigger scheduling"}]},"@segment/analytics-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"real upstream package \u2014 not intercepted (its JS stub was dropped in 0a4ce9faf0 for omitting EventPlugin). the AnalyticsReactNative native module is absent and the SDK degrades without it, so createClient and track complete normally. UNLIKE the analytics SDKs sootsim does intercept, delivery is NOT suppressed here: a configured writeKey reaches the network from the preview.",working:"the whole published API runs unmodified: createClient, AnalyticsProvider, useAnalytics, Plugin/DestinationPlugin/EventPlugin base classes, EventType/PluginType/UpdateType enums, track/identify/screen/group/alias/flush, and the sovran store peer",missing:"the AnalyticsReactNative native module \u2014 device/app context fields it would supply fall back to defaults"}]},"@metamask/react-native-search-api":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"iOS Search API wrapper with in-memory Spotlight/app-history state and native event helper surface",working:"default SearchApi instance, spotlight/app-history event listener helpers, indexSpotlightItem(s), delete by identifiers/domains, deleteAll, indexAppHistoryItem",missing:"real CoreSpotlight indexing, NSUserActivity handoff/continueUserActivity delivery from iOS, and public index integration"}]},"expo-keep-awake":{category:"Expo SDK",stubType:"native",versions:[{range:">=14.0.0",coverage:.55,note:"stub \u2014 upstream package JS runs against an ExpoKeepAwake seam that tracks activation tags and listener lifecycles but does not acquire a screen wake lock",working:'upstream activateKeepAwake/activateKeepAwakeAsync/deactivateKeepAwake/useKeepAwake/addListener run unchanged; requireNativeModule("ExpoKeepAwake") provides activate, deactivate, isAvailableAsync, addListenerForTag',missing:"actual Screen Wake Lock API acquisition and release events are not available in the canvas worker; isAvailableAsync only reflects browser wakeLock support"}]},"react-native-keep-awake":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS runtime applies UIApplication.isIdleTimerDisabled when the component mounts. SootSim registers the module but activate and deactivate do nothing, so import safety receives no behavior credit",working:"real upstream KeepAwake React.Component class running from the bundle, static activate / static deactivate, mount activates / final unmount deactivates with correct refcount, render returns null",missing:'actual UIApplication.idleTimerDisabled / browser Wake Lock acquisition from the tenant worker (would need host bridging \u2014 but consumer code reads the same "request acknowledged" no-throw signal either way)'}]},"react-native-settings":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream index.js is the NativeModules.RNSettings export. sootsim registers the iOS-shaped RNSettings module with LOCATION_SETTING/DISABLED/ENABLED constants and getSetting(LOCATION_SETTING), resolving from the browser geolocation capability without prompting for permission.",working:"RNSettings default export, LOCATION_SETTING/DISABLED/ENABLED constants, getConstants, getSetting(LOCATION_SETTING) resolves ENABLED when geolocation exists and DISABLED otherwise, unknown setting rejection",missing:"Android-only AIRPLANE_MODE_SETTING/CAPTIONING_SETTINGS/openSetting/event receivers; not part of the iOS SootSim contract"}]},"react-native-timezone":{category:"Internationalization",stubType:"native",versions:[{range:">=3.0.0",coverage:.95,note:"native-seam only \u2014 upstream JS runs from the bundle and normalizes the Timezone TurboModule values. sootsim returns the real Intl timezone, locale-derived region, null for iOS telephony when no carrier data is available, and null for Android-only auto-timezone status.",working:"getTimeZone, getRegionByLocale, getRegionByTelephony (null on browser/iOS without carrier APIs), isAutoTimeZoneEnabled (null on iOS), upstream region normalization",missing:"real CoreTelephony carrier region when a physical iOS device exposes SIM/network country data"}]},"react-native-version-check":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.4.0",coverage:.8,note:"bundle metadata, store-url builders, provider-based latest-version lookup, and needUpdate version comparison",working:"default export, getCountry, getPackageName, getCurrentBuildNumber, getCurrentVersion, getAppStoreUrl, getPlayStoreUrl, getStoreUrl, getLatestVersion with function/object/appStore/playStore providers, needUpdate",missing:"native app bundle values are simulator defaults; app-store/play-store lookups depend on runtime fetch/CORS and external store availability"}]},"expo-mail-composer":{category:"Device & Platform",stubType:"native",proofCoverage:.9,versions:[{range:">=15.0.0",coverage:.85,note:"upstream expo-mail-composer JS runs unchanged; package-local wrapper only registers the ExpoMailComposer native module with clean unavailable simulator state.",working:"isAvailableAsync, getClients, composeAsync, MailComposerStatus enum, and types through upstream MailComposer.ts/MailComposer.types; simulator state reports unavailable with no installed mail clients",missing:"cannot present native MFMailComposeViewController or query installed mail apps from the worker; composeAsync rejects when unavailable, matching iOS simulator behavior"}]},"expo-navigation-bar":{category:"Expo SDK",stubType:"native",versions:[{range:">=4.0.0",coverage:.5,note:"the published SDK 57 package runs unchanged; SootSim iOS follows its upstream unsupported-platform implementation and returns hidden visibility while component/static setters remain load-safe",working:"SDK 57 NavigationBar component and setStyle/setHidden statics through the published iOS entry",missing:"Android navigation-bar visibility and style effects, visibility events, OS contrast enforcement, and per-emulator navigation-bar dimensions"}]},"expo-print":{category:"Expo SDK",stubType:"native",proofCoverage:.4,versions:[{range:">=14.0.0",coverage:.8,note:"printAsync routes through real window.print() (browser print dialog). printToFileAsync now produces a REAL, structurally-valid PDF (verified by `file`/macOS as com.adobe.pdf) carrying the html's text content + a real page count, written to the same in-memory cache the expo-file-system stub serves \u2014 so the returned `file:///sootsim-cache/Print/*.pdf` URI resolves to genuine PDF bytes (readAsStringAsync / FormData upload / Sharing / Print preview all work), and base64 (when requested) decodes to those bytes. This replaces the old `mock://print.pdf` dangling URI that broke every consumer. Fidelity caveat: the worker has no WebView render engine, so the PDF reproduces the document's TEXT (paginated, escaped) but NOT CSS/image layout \u2014 a degraded-but-real simulation of iOS's WKWebView\u2192UIPrintPageRenderer output.",working:"upstream validation and concurrency guard, printAsync (real window.print), printToFileAsync (real PDF bytes: %PDF header, catalog/pages tree, xref, paginated text content, real numberOfPages, real file:// uri + base64), selectPrinterAsync, Orientation enum",missing:"CSS/image/font layout fidelity in the generated PDF (text-only render \u2014 needs a worker WebView engine to match WKWebView pixel output), useMarkupFormatter (same text path), printerUrl/AirPrint physical printing, native printer selection sheet (selectPrinterAsync returns undefined)"}]},"expo-store-review":{category:"Expo SDK",stubType:"native",proofCoverage:.3,versions:[{range:">=8.0.0",coverage:.95,note:"upstream expo-store-review JS runs unchanged; package-local wrapper only registers the ExpoStoreReview native module.",working:"isAvailableAsync returns iOS-simulator available, hasAction/storeUrl computed by upstream JS, requestReview resolves without a browser StoreKit prompt",missing:"real iOS StoreKit review prompt presentation"}]},"expo-system-ui":{category:"Expo SDK",stubType:"native",versions:[{range:">=4.0.0",coverage:.65,note:"the published two-function package runs unchanged and its native seam round-trips and clears the processed root background color in both document and render-worker contexts",working:"setBackgroundColorAsync and getBackgroundColorAsync, including null clearing and React Native processed-color conversion",missing:"the background color is not applied to the CanvasKit device-frame root, and the value does not persist across simulator restarts"}]},"expo-tracking-transparency":{category:"Expo SDK",stubType:"native",proofCoverage:.6,versions:[{range:">=3.0.0",coverage:.9,note:"upstream expo-tracking-transparency JS runs unchanged; package-local wrapper only registers the ExpoTrackingTransparency native module.",working:"getAdvertisingId returns null for the simulator zero IDFA, getTrackingPermissionsAsync reports undetermined, requestTrackingPermissionsAsync resolves denied, isAvailable, PermissionStatus/useTrackingPermissions exports from upstream JS",missing:"real iOS ATT consent sheet and authorized IDFA access"}]},"expo-image-manipulator":{category:"Image",stubType:"native",versions:[{range:">=11.0.0",coverage:.93,note:"real worker-safe implementation via OffscreenCanvas + createImageBitmap + convertToBlob; both legacy manipulateAsync and v12+ class-based ImageManipulator/Context/Image APIs are wired through to actual pixel work. Output bytes are real PNG/JPEG/WEBP, base64 is real, Context chaining produces correct intermediate frames, SaveFormat/FlipType enums match upstream identity. The remaining gap is SharedObject identity (not a functional difference in pixel output) and a slightly different resize algorithm (OffscreenCanvas drawImage with imageSmoothingQuality=high vs. upstream JS Hermite resampler \u2014 outputs match iOS bicubic in practice).",working:"manipulateAsync (resize/rotate/flip/crop/extent + JPEG/PNG/WEBP output + base64), ImageManipulator.manipulate, useImageManipulator hook, Context chaining (resize/rotate/flip/crop/extent/reset/renderAsync/release), Image.saveAsync with quality, FlipType/SaveFormat enums, all type exports",missing:"SharedRef identity across cross-module boundaries (expo-modules-core SharedObject) \u2014 we mirror the public API surface but consumer code that compares ref identity across modules will see different objects"}]},"expo-auth-session":{category:"Auth & Payments",stubType:"works",versions:[{range:">=5.0.0",coverage:.75,note:"pure JS package runs upstream; auth browser callback depends on expo-web-browser support",working:"upstream AuthRequest/AuthSession/useAuthRequest/useAutoDiscovery, makeRedirectUri, discovery fetch, PKCE generation, token exchange/refresh/revoke helpers, provider helpers",missing:"native/web-browser auth-session callback loop is not complete in sootsim; true external app/deep-link return semantics depend on expo-web-browser and expo-linking stubs"}]},"expo-task-manager":{category:"Expo SDK",stubType:"native",proofCoverage:1,versions:[{range:">=11.0.0",coverage:.93,note:"package-local wrapper registers only the ExpoTaskManager native module; upstream expo-task-manager JS runs unchanged. isAvailableAsync returns false on web per upstream's documented unavailable shape (TaskManager.ts:286), so apps with graceful-degradation paths skip background-task registration correctly. SootSim is exactly as capable here as real expo-on-web (full JS surface + the same documented unavailable shape) \u2014 the only gaps are background execution primitives no browser has.",working:"upstream defineTask/isTaskDefined validation, native EVENT_NAME, isAvailableAsync (false on web), isTaskRegisteredAsync, getTaskOptionsAsync, getRegisteredTasksAsync, unregisterTaskAsync, unregisterAllTasksAsync, notifyTaskFinishedAsync, native task execution events",missing:"persistent native EXTaskService storage, app relaunch/headless execution, real task execution while the browser tab is suspended (browsers do not have iOS Background Fetch / Android WorkManager)"}]},"@datadog/mobile-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"full noop \u2014 Datadog RUM/Logs/Trace require native agent, no web SDK bridged",missing:"all DdSdkReactNative, DdLogs, DdRum, DdTrace methods present but discard all data; DatadogProvider renders children without initialization"}]},"react-native-in-app-review":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:1,note:"native-seam only \u2014 the real upstream InAppReview class (Platform.OS branching + native-module presence checks) runs from the bundle. sootsim registers RNInAppReviewIOS (isAvailable: true, requestReview => true) and InAppReviewModule (show / showInAppCommentHMS => true) TurboModules. correct since the AppStore review prompt has no browser equivalent.",working:"real upstream InAppReview JS class + isModuleAvailable() running from the bundle, RequestInAppReview (resolves true), isAvailable (returns true on iOS via isAvailable getter, true on Android via Platform.Version >= 21 check), requestInAppCommentAppGallery on Android via showInAppCommentHMS"}]},"react-native-inappbrowser-reborn":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:.85,note:"native-seam only \u2014 real react-native-inappbrowser-reborn package runs unchanged from the bundle (InAppBrowser facade, openBrowserAsync / openAuthSessionAsync, Linking-based redirect resolution, iOS/Android option types). sootsim provides the RNInAppBrowser NativeModule with browser-equivalent behavior: open/openAuth use real window.open and resolve when the popup closes, isAvailable returns true, warmup is a noop, close/closeAuth close the popup. apps that race the auth popup against a Linking deep-link redirect take their success branch when the IdP redirects to the redirectUrl; popup cross-origin redirect detection can still fail on hostile IdPs (inherent browser limitation, same as react-native-app-auth).",working:"RNInAppBrowser native module: isAvailable, open (window.open + close-detection), openAuth (window.open + close-detection), close, closeAuth, warmup, mayLaunchUrl. real upstream InAppBrowser JS surface, redirect handling via Linking, all type/option exports",missing:"no SFSafariViewController / Chrome Custom Tabs presentation styling (browser popup chrome is what it is), forceCloseOnRedirection ignored, Linking-based redirect race depends on a registered deep-link scheme"}]},"react-native-restart":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.0.1",coverage:1,note:"tenant-worker calls route through devMenu.reload \u2192 host window.location.reload(); host-thread callers reload directly",working:"restart(), Restart() (both forms exported)"}]},"react-native-vector-icons":{category:"UI Components",stubType:"native",versions:[{range:">=9.0.0",coverage:.92,note:'NOT stubbed \u2014 the real pure-JS package (createIconSet, the named MaterialIcons/FontAwesome/Ionicons/\u2026 exports with their own bundled glyph maps, the Text-based Icon component) runs unmodified from the bundle. sootsim provides only the native parts: all 19 icon TTFs are shipped as engine assets and registered with the CanvasKit font provider under every fontFamily spelling upstream passes (the iOS UIAppFonts native-linking analog), so `<MaterialIcons name="home"/>` renders the real glyph with no `loadFont()` call; the RNVectorIcons/RNVectorIconsManager/RNVectorIconsModule native names back getImageSource/getImageSourceSync (real OffscreenCanvas glyph rasterisation) and loadFont.',working:"every named export (MaterialIcons, FontAwesome, Ionicons, MaterialCommunityIcons, Feather, AntDesign, Entypo, EvilIcons, Foundation, Octicons, SimpleLineIcons, Zocial, Fontisto, FontAwesome5 brand/regular/solid, FontAwesome6 brand/regular/solid) renders real glyphs via the bundled+registered TTFs; createIconSet / createIconSetFromFontello / createIconSetFromIcoMoon (upstream pure-JS, runs from bundle); Icon.Button; getImageSource / getImageSourceSync (real rasterised glyph via OffscreenCanvas + FontFace); loadFont / loadFontWithFileName; hasIcon / getRawGlyphMap / getFontFamily (upstream)",missing:"FontAwesome 5/6 Pro faces (license-restricted, cannot bundle \u2014 Free brand/regular/solid work); getImageSource returns a worker blob: URL rather than a native file:// path (functionally equivalent for <Image source>); custom-font flows still depend on the consumer registering their own TTF via expo-font/metro asset (handled by those seams)"}]},"react-native-pdf":{category:"UI Components",stubType:"native",versions:[{range:">=6.0.0",coverage:.93,note:`real PDF rendering via browser-native <embed type="application/pdf"> \u2014 uses the browser's built-in PDF viewer (Chromium PDFium / Firefox pdf.js / Safari PDFKit) with full scrolling, zoom, search, and selection UI for free. page prop honored via #page=N URL fragment per PDF Open Parameters spec. ref.setPage(n) and ref.reload() implemented. onLoadComplete fires with numberOfPages=0 (unknown \u2014 embed exposes no load event with metadata). Works for the 95% of consumer code that wants to display a PDF.`,working:"Pdf component with real PDF rendering, source.uri (http/blob/data URIs all work), page prop \u2192 #page=N fragment, ref.setPage/ref.reload imperative API, onLoadComplete/onError lifecycle (microtask ordering), all prop types accepted (scale/horizontal/fitWidth/spacing/password/etc. as documented even though most are non-controllable from outside the embed)",missing:"reliable numberOfPages reporting (browser PDF viewers do not expose page count to surrounding script), onPageChanged firing during user scroll/swipe, onScaleChanged firing during pinch-zoom, password-protected PDF prompt is the browser's default not a custom UI, annotation editing, fitPolicy/fitWidth granular control"}]},"react-native-contacts":{category:"Device & Platform",stubType:"native",versions:[{range:">=7.0.0",coverage:.82,note:"native-seam only \u2014 the real upstream index.ts (an async wrapper around `NativeModules.Contacts ?? TurboModuleRegistry.get('RCTContacts')`) runs from the bundle. sootsim provides a deterministic in-memory address book against the Contacts TurboModule (every consumer method delegates here): add/update/delete operate on an in-process Map keyed by recordID; getContactsByPhoneNumber/Email/MatchingString filter that store; checkPermission/requestPermission use the shared app-scoped system permission registry; the groups subsurface (addGroup/getGroup/contactsInGroup/etc.) is wired against an in-process group store so consumers can exercise the full membership round-trip.",working:"real upstream JS wrapper running from the bundle, getAll/getAllWithoutPhotos, getContactById, getContactsByPhoneNumber/Email/MatchingString, getCount, getPhotoForId, addContact/openContactForm/openExistingContact/viewExistingContact/editExistingContact/updateContact/deleteContact, writePhotoToPath, iosEnableNotesUsage, checkPermission/requestPermission, getGroups/getGroup/addGroup/updateGroup/deleteGroup/contactsInGroup/addContactsToGroup/removeContactsFromGroup",missing:"real OS contacts database access (no browser AddressBook API), native iOS/Android contacts UI for openContactForm presentation, thumbnail photo writing to disk, container/source routing"}]},"react-native-biometrics":{category:"Auth & Payments",stubType:"native",versions:[{range:">=3.0.0",coverage:.05,note:"full class shape but every method returns unavailable/false \u2014 no WebAuthn backing",working:"ReactNativeBiometrics class instantiates, BiometryTypes constants, all method signatures present",missing:"isSensorAvailable always false, createKeys returns empty publicKey, biometricKeysExist always false, createSignature always fails, simplePrompt always fails, deleteKeys noop \u2014 no WebAuthn integration"}]},"react-native-blue-crypto":{category:"Auth & Payments",stubType:"native",shipsNativeCode:!1,versions:[{range:">=1.0.0",coverage:.95,note:"native-seam only: the real package wrapper runs unchanged against an asynchronous RFC 7914 scrypt implementation",working:"iOS promise-based scrypt and Android callback-based scrypted with caller-supplied N, r, p, and derived-key length",missing:"the browser implementation does not use the package native C acceleration, so large work factors can complete more slowly"}]},"react-native-quick-base64":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:1,note:"native-seam only \u2014 the real upstream JS (byteLength, toByteArray, fromByteArray, btoa, atob, shim, every getLens/uint8ArrayToString/stringToArrayBuffer helper) runs from the bundle. sootsim registers the QuickBase64 TurboModule; `install()` mounts `globalThis.base64FromArrayBuffer` + `globalThis.base64ToArrayBuffer` backed by browser-native atob/btoa, which is what upstream JS reaches for on every conversion. url-safe + standard base64 + linebreak stripping all handled in the seam.",working:"real upstream JS exports + helpers running from the bundle, byteLength, toByteArray, fromByteArray (incl. urlSafe), btoa, atob, shim (mounts global btoa/atob), QuickBase64.install() returns true so the upstream module-init branch runs once"}]},"react-native-performance":{category:"Analytics",stubType:"native",versions:[{range:">=5.0.0",coverage:.8,note:"real implementation \u2014 delegates to browser performance.now/mark/measure/getEntries APIs",working:"now(), mark(), measure(), getEntries(), getEntriesByName(), getEntriesByType(), clearMarks(), clearMeasures(), PerformanceObserver uses native globalThis.PerformanceObserver",missing:"RN-native startup timing metrics (bundle load, JS thread init), NativePerformance module, onPerformanceEntry callback; observe() falls back to noop if native PerformanceObserver unavailable"}]},"@shopify/react-native-performance":{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"performance-analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 PerformanceProfiler/PerformanceMeasureView pass children through, all hooks return disabled-state values, full Logger/States/LogLevel surface. delivery intentionally absent in browser preview.",working:"PerformanceProfiler and PerformanceMeasureView render children, all hooks return noop/disabled values (useStartProfiler / useUxStartProfiler / useResetFlow / useRenderTimer / useStateController / useFlowReporter), Logger class present, States/LogLevel/RenderPassReport constants, FlowReporter/ProfilerListener interfaces",missing:"no TTI/render-pass measurement delivery \u2014 same constraint as every performance-analytics SDK in browser preview"}]},"@react-native-community/blur":{category:"UI Components",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"CanvasKit backdrop blur approximation with full current BlurType enum",working:"BlurView, VibrancyView, blurType, blurAmount, blurRadius, overlayColor, enabled, autoUpdate, all 22 BlurType values, reducedTransparencyFallbackColor",missing:"native vibrancy behavior, Android downsample/autoupdate semantics, reduced transparency system setting integration"}]},"react-native-blur-view":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"CanvasKit backdrop blur approximation for christianbaroni/react-native-blur-view",working:"BlurView, BlurViewStyles, blurStyle plain/variable/standard/material names, blurIntensity, gradientPoints/feather accepted, saturationIntensity accepted",missing:"native variable-gradient blur mask, exact UIVisualEffectView material recipe, saturation rendering"}]},"@sbaiahmed1/react-native-blur":{category:"UI Components",stubType:"native",versions:[{range:">=4.6.1",coverage:.7,note:"CanvasKit backdrop-blur + engine liquid-glass material for the full latest component surface; 40-material iOS color table drives per-blurType overlay tint",working:"BlurView/VibrancyView/ProgressiveBlurView render real backdropFilter (sigma from blurAmount) over a per-material rgba overlay from the full iOS material constant table (xlight\u2026systemChromeMaterialDark); LiquidGlassView/LiquidGlassContainer drive the calibrated glassEffect materials (glassType, glassTintColor as the material glassTint, glassOpacity scaling the calibrated body opacity, isInteractive, cornerRadius); BlurSwitch is a real interactive switch (value/onValueChange/disabled, switch a11y role+state, track color); all native component export aliases",missing:"progressive gradient direction (direction/startOffset accepted but ignored \u2014 renders uniform blur), exact iOS 26 liquid glass behavior, Android QmBlurView behavior, reduced-transparency system-setting fallback color"}]},"react-native-linear-gradient":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.93,note:"CanvasKit gradient shader via _gradientColors style prop",working:"LinearGradient, colors, start, end, locations, style, children",missing:"useAngle/angle/angleCenter props (accepted but not applied to gradient calculation), animated gradient"}]},"react-native-document-picker":{category:"Storage & Data",stubType:"native",versions:[{range:">=9.0.0",coverage:.85,note:'native browser <input type="file"> for real picking; comprehensive MIME mapping',working:"pick (single and multi), pickSingle, isCancel, isInProgress, releaseSecureAccess, types constants (allFiles/images/audio/pdf/zip/csv/doc/docx/xls/xlsx/ppt/pptx/plainText), mode/presentationStyle accepted",missing:"pickDirectory (returns null, browser support limited), fileCopyUri always null (no actual file copy), copyTo not implemented, video type not in types"}]},"@react-native-documents/picker":{category:"Storage & Data",stubType:"native",versions:[{range:">=10.0.0",coverage:.93,note:'successor document picker backed by browser <input type="file"> plus local-copy helpers',working:"pick (single and multi), pickDirectory cancel shape, saveDocuments echo shape, keepLocalCopy, isKnownType, releaseLongTermAccess, errorCodes/types constants, isCancel/isErrorWithCode",missing:"native iCloud/Drive providers, long-term bookmarks, virtual file conversion, true directory picking"}]},"react-native-exception-handler":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.5,note:"the JavaScript exception handler works, but the native exception handler is a noop while native exceptions are observable in the reference iOS simulator",working:"real upstream JS module running from the bundle, setJSExceptionHandler (validates arg types, gates on __DEV__/allowedInDevMode, installs via global.ErrorUtils.setGlobalHandler), getJSExceptionHandler (via global.ErrorUtils.getGlobalHandler), console.error rerouting through ErrorUtils.reportError, setNativeExceptionHandler shape (Platform.OS-aware arg-count branch resolves to the same no-op registration)",missing:"real native-crash interception (no browser equivalent \u2014 canvas worker can't observe C++/Objective-C exceptions). apps that depend on JS-only error reporting (Sentry, custom reporters) get full coverage; apps that need native-crash dumps need a different path on web."}]},"react-native-mixpanel":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 all 1.x Mixpanel methods accepted; delivery intentionally absent in browser preview.",working:"init stores token, all method signatures match 1.x API (track, identify, alias, reset, flush, superProperties, timeEvent, optIn/Out), people object with set/setOnce/increment/append/union/deleteUser/trackCharge",missing:"no event delivery to Mixpanel \u2014 same constraint as every analytics SDK in browser preview"}]},"mixpanel-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=3.0.0",coverage:.95,note:"development noop \u2014 official Mixpanel SDK API is present and intentionally drops events",working:"Mixpanel constructor/static init, init, identify, alias, track, trackWithGroups, people/group APIs, super properties, opt in/out, distinct/device ids, flush",missing:"native Mixpanel SDK integration, JS fallback network transport, persistence of ids/super properties"}]},"react-native-zip-archive":{category:"Storage & Data",stubType:"native",versions:[{range:">=6.0.0",coverage:.6,note:"real zip/unzip via fflate over the shared compat VFS; only password/AES variants unsupported (no browser zip-crypto codec)",working:"zip/zipFolder/zipFiles (real DEFLATE, basename + folder-relative entries), unzip (real inflate to VFS), isPasswordProtected (reads GP encryption bit), getUncompressedSize (sums central-directory sizes, -1 on parse error), zipArchiveProgressEvent (0%/per-entry/100%) into subscribe()",missing:"zipWithPassword / unzipWithPassword / zipFilesWithPassword / zipFolderWithPassword \u2014 fflate has no ZipCrypto/AES codec, so these reject with the native zip_error/unzip_error shape; unzipAssets (no native asset bundle); unzip of an encrypted archive rejects"}]},"react-native-wheel-pick":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"HTML select + date/time input elements; no spinning wheel UX",working:"Picker (with data, selectedValue, onValueChange), DatePicker (with date, minimumDate, maximumDate, onDateChange, mode: date/time/datetime)",missing:"native spinning wheel animation/UX, isLoop behavior, itemStyle rendering, touch-drag gesture"}]},"react-native-splash-screen":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:1,note:"package JS is just `export default NativeModules.SplashScreen`; the real package runs from the bundle against the SplashScreen native seam. hide() snap-hides the sootsim canvas boot splash (mirrors ios/RNSplashScreen.m removeFromSuperview, no fade); show() returns immediately without re-showing, exactly as the booted-app native path where `waiting` is already false.",working:"hide() (snap-hides the canvas splash), show() (no-op in a booted app, faithful)"}]},"expo-audio":{category:"Media",stubType:"native",versions:[{range:">=0.1.0",coverage:.93,note:"native-seam only. real expo-audio package runs from the bundle (enums, hooks, prototype patches, RecordingPresets) \u2014 sootsim only stubs the ExpoAudio native module, backing AudioPlayer with html5 <audio> and AudioRecorder with MediaRecorder+getUserMedia via the shared compat/audio html5 driver.",working:"AudioPlayer (play/pause/seek/loop/volume/rate/mute/replace/remove/setPlaybackRate/setAudioSamplingEnabled), AudioRecorder (prepareToRecordAsync/record/pause/stop with real MediaRecorder+getUserMedia, optional AnalyserNode-backed metering), AudioPlaylist (next/previous/skipTo/add/insert/remove), useAudioPlayer, useAudioPlayerStatus, useAudioRecorder, useAudioRecorderState, useAudioPlaylist, useAudioSampler, useEvent-based status, setAudioModeAsync, preload/clearPreloadedSource, RecordingPresets, AudioMode, AudioQuality, IOSOutputFormat, lock-screen-controls no-op, playbackStatusUpdate / recordingStatusUpdate / audioSampleUpdate events",missing:"requestRecordingPermissionsAsync resolves granted without a real permission probe (browsers prompt at first getUserMedia call), AudioStream PCM source is a no-op (no equivalent web stream API), lock-screen controls map to nothing (mediaSession integration deferred \u2014 only one player can own it)"}]},"react-native-code-push":{category:"Analytics",stubType:"native",versions:[{range:">=5.0.0",coverage:.5,note:"JS-reimpl noop stub \u2014 codePush HOC, sync (UP_TO_DATE), checkForUpdate (null), notifyAppReady/allowRestart/disallowRestart/clearUpdates, all enums. real OTA delivery never made sense in a browser sim but the shape is here. should be migrated to native-seam so the real codePush JS runs against the CodePush native module shim",working:"codePush HOC returns component unchanged (both direct and options-first patterns), sync resolves UP_TO_DATE, checkForUpdate resolves null, all enums exported, notifyAppReady/allowRestart/disallowRestart/clearUpdates resolve",missing:"no OTA delivery to browser sim \u2014 fundamentally inapplicable in a browser-hosted simulator"}]},"react-native-onesignal":{category:"Notifications",stubType:"native",versions:[{range:">=5.0.0",coverage:0,note:"the reference iOS simulator receives simulated notifications and presents configured OneSignal in-app messages. SootSim returns no token, displays no message, and fires no events, so import safety receives no behavior credit",working:"initialize/login/logout/setConsentGiven/setConsentRequired (log to console), User tag/alias/email/sms add-remove (noop), User.getTags (empty), InAppMessages trigger (log to console), Debug.setLogLevel, LiveActivities.enter/exit, Session outcome methods, event listener registration",missing:"real push permission, actual subscription token/id (always null), opted-in status (always false), real in-app message display, location sharing, push opt-in actually working"}]},"jail-monkey":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:.9,note:"upstream package JS runs against clean simulator NativeModules/TurboModuleRegistry shape",working:"JailMonkey native module is available through NativeModules and TurboModuleRegistry.getEnforcing; isJailBroken/canMockLocation/trustFall/hookDetected/isOnExternalStorage/AdbEnabled return false, async debug/development checks resolve false, rootedDetectionMethods returns empty object",missing:"real jailbreak/root/hook/mock-location detection, Android external-storage/ADB signals, native debug/development-settings inspection"}]},"react-native-appsflyer":{category:"Analytics",stubType:"native",versions:[{range:">=6.0.0",coverage:.95,note:"noop with console.log \u2014 initSdk/logEvent log but send nothing",working:"initSdk returns resolved promise with stub string, logEvent resolved, getAppsFlyerUID callback invoked with stub UID, generateInviteLink callback invoked with stub URL, all event listener registrations return unsubscribe",missing:"real attribution data, deep link events, install conversion data; validateAndTrackInAppPurchase not stubbed; SKAN/ATT handling not real"}]},"react-native-branch":{category:"Analytics",stubType:"native",versions:[{range:">=5.0.0",coverage:.95,note:"noop with console.log \u2014 BranchEvent.logEvent and setIdentity/logout log but send nothing",working:"BranchEvent class with all standard event name constants, createBranchUniversalObject resolves with stub object (generateShortUrl returns stub URL), subscribe returns unsubscribe, getLatestReferringParams/getFirstReferringParams resolve with empty objects",missing:"real deep link attribution, actual short URL generation, real referral params; link schema validation not stubbed"}]},"react-native-adjust":{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"attribution-analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 Adjust.create/trackEvent accepted, all config/event class shapes present, getter callbacks invoke with stub values. delivery is intentionally absent in the browser preview.",working:'AdjustConfig/AdjustEvent/AdjustAdRevenue/AdjustThirdPartySharing class shapes, all getter callbacks invoked with stub values (getAdid returns "stub-adid"), isEnabled returns false, trackEvent/trackAdRevenue/trackThirdPartySharing accepted, addSessionPartnerParameter / addSessionCallbackParameter, setOfflineMode',missing:"no real attribution delivery \u2014 same constraint as every analytics SDK in browser preview; getIdfa/getIdfv return empty (per docs, intentional and acceptable); validatePurchase deferred (real receipt validation needs Apple/Google endpoints)"}]},"react-native-fbsdk-next":{category:"Auth & Payments",stubType:"native",versions:[{range:">=12.0.0",coverage:0,note:"the reference iOS simulator presents Facebook login, share, message, and game-request flows when configured. SootSim cancels every dialog and returns no token or profile, so import safety receives no behavior credit",working:"Settings.setAppID/setClientToken/setGraphAPIVersion/setAutoLogAppEventsEnabled/setAdvertiserIDCollectionEnabled all accept calls, AppEventsLogger.logEvent/logPurchase log to console, all type shapes",missing:"logInWithPermissions always returns isCancelled:true, AccessToken.getCurrentAccessToken always null, Profile.getCurrentProfile always null, ShareDialog/MessageDialog/GameRequestDialog always isCancelled, no real Graph API, initializeSDK is noop"}]},"react-native-push-notification":{category:"Notifications",stubType:"native",versions:[{range:">=8.0.0",coverage:.6,note:"load-safe \u2014 local notifications and scheduling actually fire via the browser Notification API, permission flow real, channels stub. remote push (FCM/APNs) delivery is intentionally absent in browser preview",working:"configure (calls onRegister, requests Notification permission), localNotification (fires real browser Notification), localNotificationSchedule (setTimeout-backed), requestPermissions (real Notification.requestPermission), checkPermissions, cancelLocalNotification/cancelAllLocalNotifications, setApplicationIconBadgeNumber, createChannel/channelExists/channelBlocked/getChannels stubs, Importance/Priority/RepeatType enums",missing:"remote push registration, FCM/APNs integration, getScheduledLocalNotifications (always empty), getDeliveredNotifications (always empty), real badge read-back, subscribeToTopic/unsubscribeFromTopic (noop), repeat scheduling"}]},"react-native-background-timer":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.9,note:"native-seam only \u2014 the real upstream BackgroundTimer class (uniqueId counter, callbacks map keyed by timer id, runBackgroundTimer/backgroundClockMethod, setTimeout/clearTimeout/setInterval/clearInterval multiplexing through NativeEventEmitter) runs from the bundle. sootsim registers the RNBackgroundTimer TurboModule; setTimeout(id, timeout) schedules a real browser setTimeout that emits `backgroundTimer.timeout` carrying the id (NativeEventEmitter consumes via the __sootsimEmitBus slot), clearTimeout cancels.",working:"real upstream BackgroundTimer class running from the bundle, runBackgroundTimer / stopBackgroundTimer (start + listener bookkeeping), start, stop, setTimeout / clearTimeout (multiplexed by id, real browser scheduling), setInterval / clearInterval (re-arming via the same id), backgroundClockMethod recursive scheduling",missing:"background execution not possible in browser \u2014 timers pause when tabs are backgrounded (inherent platform limit, identical to iOS losing its background-execution budget)"}]},expo:{category:"Expo SDK",stubType:"native",versions:[{range:">=49.0.0",coverage:.93,note:"upstream Expo JS runs; native bridge resolves through expo-modules-core stubs",working:"upstream Expo.ts/Expo.fx/registerRootComponent/useEvent/useEventListener, expo/virtual/env, expo/virtual/rsc, Expo Go detection, expo-modules-core re-exports",missing:"native Expo Go module is absent, full winter runtime/native fetch is not installed, async bundle loading is mapped to sootsim single-bundle behavior"}]},"expo-modules-core":{category:"Expo SDK",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"core bridge infrastructure with explicit native-module registry",working:"EventEmitter, NativeModule, LegacyEventEmitter, NativeModulesProxy, registerWebModule, requireNativeModule, requireOptionalNativeModule, requireNativeViewManager, Platform, createPermissionHook, PermissionStatus, CodedError, UnavailabilityError, SharedObject, SharedRef, uuid, useReleasingSharedObject",missing:"reloadAppAsync, useEvent, useEventListener, installOnUIRuntime, complete native-module catalog is still incremental"}]},"expo-modules-jsi":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=57.0.4 <58.0.0",coverage:1,note:"build-only \u2014 the published JavaScript entry exports null, and the npm package exists solely to autolink the native Swift/C++ ExpoModulesJSI framework used transitively by expo-modules-core; there is no runtime JavaScript API for SootSim to provide"}]},"expo-age-range":{category:"Expo SDK",stubType:"native",versions:[{range:">=57.0.3 <58.0.0",coverage:.7,note:"native-seam only \u2014 the published wrapper runs unchanged; ExpoAgeRange mirrors the documented unsupported-device fallback for the reference simulator",working:"all five published APIs; requestAgeRangeAsync returns { lowerBound: 18, upperBound: null, activeParentalControls: [] }; eligibility, regulatory-feature, and age-signal requests return null; significant-update acknowledgment resolves without UI",missing:"iOS Declared Age Range prompt and real user/region data, iOS 26.4 acknowledgment UI, Android Play Age Signals consent and metadata"}]},"react-native-edge-to-edge":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"SystemBars + stack API fully implemented for web (Android-only feature)",working:"SystemBars (component + pushStackEntry/popStackEntry/replaceStackEntry/setStyle/setHidden), NavigationBar, StatusBar"}]},"react-native-image-crop-picker":{category:"Image",stubType:"native",versions:[{range:">=0.40.0",coverage:.5,note:"the file picker works, but cropping passes the original image through while the reference iOS simulator presents and applies the crop UI",working:"openPicker (single/multiple, mediaType filter, base64, maxFiles), openCamera (with capture attribute), clean, cleanSingle, all Image/Options types",missing:"openCropper does no actual cropping (returns path as-is), compressImageMaxWidth/Height/Quality ignored, exif data not populated, freeStyleCropEnabled/cropperCircleOverlay have no effect"}]},"react-native-orientation-locker":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: all lock/unlock are noops : orientation cannot be forced in browser. imports and API shape receive no behavior credit",working:"lockToPortrait, lockToLandscape, lockToLandscapeLeft/Right, lockToPortraitUpsideDown, lockToAllOrientationsButUpsideDown, unlockAllOrientations, getOrientation (returns PORTRAIT), getAutoRotateState (returns true), all add/remove listener methods, orientation constants",missing:"lockAsync not wired to browser ScreenOrientation API"}]},"@shopify/react-native-skia":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.92,note:"real canvaskit-wasm backing via the engine instance (`globalThis.__sootsimCanvasKit`); declarative <Canvas> snapshots each commit through an offscreen SkSurface and mounts the encoded PNG as a host image. zero second canvaskit bundle.",working:"<Canvas> with offscreen SkSurface paint\u2192PNG\u2192host <Image>, <Path>/<Rect>/<RoundedRect>/<Circle>/<Oval>/<Line>/<Fill>/<Image>/<Text>/<Paragraph>/<Picture>/<Group> primitives, shared-value group transforms, rect/rrect group clipping, <LinearGradient>/<RadialGradient>/<SweepGradient>/<ColorShader> paint shaders, <BlurMask>/<Blur>/<Mask>/<Shadow> mask + image filters, <BackdropFilter>/<BackdropBlur>, <DashPathEffect>/<DiscretePathEffect>/<CornerPathEffect>, Skia.Path/Paint/Color/Shader/MaskFilter/ImageFilter/ColorFilter/Font/Typeface/FontMgr/ParagraphBuilder factories, built paragraph layout/paint/metrics, Skia.MakeImageFromEncoded, Skia.XYWHRect/LTRBRect/RRectXY/Point/Matrix, vec/rect and 4x4 scale/translate/multiply helpers, useImage (fetches+decodes through canvaskit), useFont (loads typeface from ArrayBuffer / URL), useFonts (URL, module, and Metro asset-id sources with matchFamilyStyle), useCanvasRef + ref.makeImageSnapshot, useValue/useDerivedValue/useComputedValue/useValueEffect/useClockValue listener model, BlendMode/StrokeCap/StrokeJoin/FillType/PaintStyle/TileMode/BlurStyle/FontWeight/FontStyle/FontSlant/FontWidth/ClipOp/PathVerb/PathOp/TextAlign/TextDirection enums.",missing:"<RuntimeShader> SkSL compilation+uniform-binding pipeline, <Points>/<TextPath>/<Glyphs>/<ImageSVG>/<Vertices>/<Patch>/<Atlas>/<FitBox>/<Box>/<BoxShadow> (each logs a one-time hint and renders null), path-shaped group clipping, <Paint> as a declarative component, useTouchHandler full gesture state machine (we forward a minimal touch handler shape; consumers should use Pressable wrappers for hit-testing), reanimated worklet-driven canvas redraws (`useSharedValueEffect` subscribes only to the local SkiaValue listener shape; Canvas display-list encoding and setTick/setDataUrl updates remain owned by React useLayoutEffect, so redraws still reconcile through React), advanced ParagraphBuilder run/style APIs beyond pushStyle/pop/addText/reset and built paragraph layout/paint/metrics, Skia.SVG.MakeFromString (canvaskit-wasm omits svg parsing in the size-tuned builds we ship), GPU SkSurface backing on offscreen paints (we use software MakeSurface so each Canvas paint runs on cpu; deferred until a real engine host element owns its own GrDirectContext for paint-only animation)."}]},"@miblanchard/react-native-slider":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"real upstream package runs unmodified on the engine View/Animated/PanResponder surface",working:"the whole published API: single and multi-thumb (array) value, onValueChange/onSlidingStart/onSlidingComplete with the upstream array payload, renderAboveThumbComponent, renderBelowThumbComponent, renderThumbComponent, renderMinimumTrackComponent, renderMaximumTrackComponent, renderTrackMarkComponent, trackMarks, thumbImage, vertical, startFromZero, trackClickable, animateTransitions with spring/timing animationConfig, thumbTouchSize, all style props"}]},"expo-contacts":{category:"Expo SDK",stubType:"native",versions:[{range:">=13.0.0",coverage:.8,note:"native-seam: upstream expo-contacts JS runs from the bundle; the seam now seeds the standard Apple sample address book the bare reference iOS Simulator ships (Kate Bell, Daniel Higgins, John Appleseed, Anna Haro, Hank Zakroff, David Taylor \u2014 the long-stable *@mac.com sample set), so getContactsAsync/getContactByIdAsync return the same contacts a real RN app sees on the conformance Simulator instead of an empty list. add/update/remove then mutate that store like CNContactStore.",working:"reference-Simulator default address book seeded (queryable by name/id, sorted/paginated); upstream enums/constants and JS validation, add/update/remove contacts, getContactsAsync/getPagedContactsAsync with query/sort/pagination, getContactByIdAsync, hasContactsAsync, presentFormAsync, presentContactPickerAsync, writeContactToFileAsync data URI, containers/default container, permission functions; validated through real RN and sootsim add/update/query/remove smoke",missing:"contact-change observer (CNContactStoreDidChange) callbacks, real image fetching for contact thumbnails (imageAvailable false), vCard import/export fidelity beyond JSON-as-data-URI, groups membership persistence, limited-access picker semantics, exact field-format parity with a specific live iOS build (names/emails are the stable documented sample set; phone/address formatting may vary by iOS version), no cross-reload persistence"}]},"@bsky.app/react-native-mmkv":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"re-exports react-native-mmkv stub directly \u2014 all MMKV APIs covered via alias",working:"MMKV class, set, getString/Number/Boolean/Buffer, contains, delete, getAllKeys, clearAll, recrypt, trim, size, addOnValueChangedListener (with bsky scoped overload), useMMKVString/Number/Boolean/Object/Storage",missing:"isReadOnly getter, Mode enum (SINGLE_PROCESS/MULTI_PROCESS)"}]},"@bitdrift/react-native":{category:"Analytics",stubType:"native",versions:[{range:">=0.1.0",coverage:.95,note:"full noop \u2014 bitdrift is native crash/log forwarder with no web SDK",missing:"init, log, addField, removeField, identify, track, flush, startSpan, Logger.logInfo/Debug/Warning/Error \u2014 all present as stubs but send no data"}]},"@mattermost/react-native-paste-input":{category:"Keyboard",stubType:"native",versions:[{range:">=0.3.0",coverage:.9,note:"paste-aware TextInput with file detection via clipboard API",working:"PasteInput (default + named), onPaste with file array, onChangeText, value, multiline, numberOfLines, maxLength, editable, autoFocus, secureTextEntry, placeholder, onFocus, onBlur, disableCopyPaste (accepted, no-op), testID",missing:"onKeyPress, onSelectionChange, onContentSizeChange, onChange (accepted but silently dropped \u2014 not wired to DOM events)"}]},"expo-intent-launcher":{category:"Expo SDK",stubType:"native",proofCoverage:.9,versions:[{range:">=11.0.0",coverage:.75,note:"upstream expo-intent-launcher JS runs unchanged; iOS unavailable behavior matches its Android-only native module",working:"upstream ActivityAction and ResultCode constants, iOS UnavailabilityError behavior for startActivityAsync/openApplication/getApplicationIconAsync, package-local wrapper that preserves upstream argument validation and public exports",missing:"real Android Activity result lifecycle, package manager icon extraction, Android settings/app intents, browser URL launch fallback intentionally removed to match iOS sootsim parity"}]},"expo-sms":{category:"Expo SDK",stubType:"native",proofCoverage:.4,versions:[{range:">=12.0.0",coverage:.85,note:'native-seam: the upstream expo-sms JS (SMS.js wrapper, attachment processing, argument validation, the {result} resolution path) runs unchanged from the bundle; only the ExpoSMS expo module is ours, mirroring ExpoSMSModule.swift on the reference iOS Simulator EXACTLY \u2014 isAvailableAsync returns false because MFMessageComposeViewController.canSendText() is false on the Simulator, and sendSMSAsync throws the verbatim SMSUnavailableException reason "SMS service is not available" (the !canSendText() guard). this IS the complete faithful contract on the reference device: the iOS Simulator genuinely cannot send SMS, so an app calling expo-sms there already gets exactly this. same faithful "the platform/sim cannot do this, and that is correct" tier as react-native-exit-app / expo-local-authentication.',working:'isAvailableAsync (false \u2014 exact MFMessageComposeViewController.canSendText() on the Simulator), sendSMSAsync (rejects with the verbatim SMSUnavailableException reason); real upstream wrapper handles argument validation/attachment processing and would resolve {result:"sent"|"cancelled"|"unknown"} on a device that can send',missing:"no real Messages compose UI can present \u2014 but neither can the reference iOS Simulator (MFMessageComposeViewController.canSendText() is false there); a real send path needs physical SMS capability the Simulator and browser alike do not expose"}]},"expo-video-thumbnails":{category:"Media",stubType:"native",proofCoverage:.9,versions:[{range:">=8.0.0",coverage:.85,note:"package-local wrapper registers only the ExpoVideoThumbnails native module; upstream expo-video-thumbnails JS runs unchanged with browser video/canvas thumbnail extraction where available.",working:'real RN + sootsim validated repeated getThumbnailAsync calls, upstream getThumbnailAsync runs unchanged; requireNativeModule("ExpoVideoThumbnails") provides getThumbnail(sourceFilename, options), time seeking, jpeg quality, header fetch, data/cache uri, unique cache uri generation, and width/height result shape',missing:"native AVAsset/MediaMetadataRetriever decode paths, real file-system writes, worker-context video decode dimensions, content:// access, cross-origin videos that browsers cannot decode, exact native error codes"}]},"@mozzius/expo-dynamic-app-icon":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: noop icon switching : correct for browser, useDynamicAppIcon hook is functional. imports and API shape receive no behavior credit",working:"setAppIcon, getAppIcon, useDynamicAppIcon"}]},"@bsky.app/expo-image-crop-tool":{category:"Image",stubType:"native",versions:[{range:">=0.5.0",coverage:.85,note:"native-seam only \u2014 the real upstream wrapper and types run from the bundle against the ExpoImageCropTool expo module; sootsim loads file:// images from the shared VFS, performs a real centered aspect/circle crop in worker-safe canvas, encodes jpeg/png with quality, and persists the result to cache with the upstream result shape",working:"openCropperAsync, imageUri file inputs, aspectRatio fixed crop, circle defaults to square crop, jpeg/png output, compressImageQuality, returned path/mimeType/size/width/height, cache-VFS persistence; Bluesky camera/profile flows that pass a fixed aspect ratio get real cropped bytes",missing:"interactive Mantis crop UI, user-adjusted crop rectangle, rotation controls, localized button text display, animated full-screen native presentation"}]},"@pnthach95/react-native-root-view-background":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"native-seam only \u2014 the real package JS runs from the bundle, parses colors with colord, and calls the RootViewBackground TurboModule. sootsim accepts and records the r/g/b/a native call; the visual root background remains owned by the rendered RN root view because there is no separate UIKit root view behind the canvas tenant tree.",working:"setRootViewBackgroundColor, colord parsing in upstream JS, RootViewBackground.setBackground(r,g,b,a) native call shape, channel clamping/acceptance",missing:"actual UIKit rootViewController.view.backgroundColor mutation behind the canvas surface; use the RN root view style for visible background color in SootSim"}]},"@thehale/react-native-keep-awake":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.2.0",coverage:0,note:"the reference iOS runtime applies the idle-timer flag through activate and deactivate. SootSim accepts both calls without changing that flag, so import safety receives no behavior credit",working:"activate, deactivate, useKeepAwake, KeepAwake component, KeepAwake TurboModule shape",missing:"actual UIApplication.idleTimerDisabled / browser Wake Lock acquisition from the tenant worker"}]},"react-native-compressor":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.78,note:"native-seam: real package JS runs from the bundle; the Compressor TurboModule is browser-backed (canvas raster compression, HTMLVideoElement metadata/thumbnail, fetch upload/download)",working:"Image.compress loads uri/base64 inputs, preserves aspect ratio, resizes/re-encodes jpg/png, returns uri or base64; getImageMetaData/getVideoMetaData report real dimensions+size; createVideoThumbnail captures the first frame; clearCache resolves (composer onClose); Video.compress passes through and drives progress to completion; backgroundUpload/download use fetch",missing:"native cache file paths, EXIF preservation, ph:// assets, native video/audio transcoding, granular byte-level progress events, background execution beyond browser fetch"}]},"react-native-device-attest":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.1.0",coverage:.7,note:"native-seam only \u2014 the real expo package (DeviceAttestBase + the platform-selected ReactNativeDeviceAttest subclass) runs unchanged from the bundle. sootsim provides the ReactNativeDeviceAttest expo module. its iOS native side (ReactNativeDeviceAttestModule.swift) defines only getDeviceCheckToken, and Apple's DeviceCheck is unavailable on a simulator (DCDevice.current.isSupported === false), so the seam rejects with code DEVICECHECK_NOT_SUPPORTED and message 'DeviceCheck is not supported on this device' \u2014 the exact behavior a real iOS simulator produces. apps that catch that code take their unsupported branch.",working:'getDeviceCheckToken rejects with the real simulator error (code DEVICECHECK_NOT_SUPPORTED) instead of throwing "is not a function"',missing:"no real DeviceCheck token (impossible on a simulator, matching iOS); android Play-Integrity warmupIntegrity/getIntegrityToken are not part of the iOS native contract"}]},"@expo/app-integrity":{category:"Device & Platform",stubType:"native",versions:[{range:">=57.0.1 <58.0.0",coverage:.7,note:"native-seam only \u2014 the published wrapper runs unchanged; the reference iOS simulator reports isSupported=false, and every App Attest call rejects with the upstream ERR_APP_INTEGRITY_FEATURE_UNSUPPORTED code and message",working:"all nine public exports: isSupported=false; generateKeyAsync, attestKeyAsync, and generateAssertionAsync reject with the real iOS-simulator unsupported error; Android-only methods take the upstream wrapper platform-error or false branches on iOS",missing:"real App Attest keys, attestations, and assertions; Android Play Integrity tokens and hardware-backed key attestation"}]},"react-native-uitextview":{category:"UI Components",stubType:"native",proofCoverage:.6,versions:[{range:">=1.0.0",coverage:.9,note:"renders as sootsim-text so canvas engine handles measurement and drawing",working:"UITextView, children, style, selectable (prop accepted), uiTextView (prop accepted), testID, forwardRef",missing:"native UITextView text selection handles, copy/paste menu, selectable text interaction in canvas"}]},"react-native-web":{category:"Essentials",stubType:"native",shipsNativeCode:!1,versions:[{range:">=0.21.0 <0.22.0",coverage:.2,note:"SootSim's generic browser adapter preserves react-native-web's web platform identity while routing its validated React Native-compatible APIs through the canvas engine",working:"Platform.OS, Platform.select, Platform.Version, StyleSheet.create/flatten, PixelRatio.get, and processColor",missing:"DOM component rendering, ReactDOM render/unmount APIs, unstable_createElement, accessibility and responder DOM events, browser stylesheet injection and SSR, DOM measurement behavior, and package export parity beyond the validated subset"}]},axios:{category:"Networking",stubType:"works",versions:[{range:">=0.20.0 <0.21.0",coverage:.45,note:"real package code runs from the guest bundle; the validated subset covers the request pipeline without claiming the default platform transport",working:"create with instance defaults, request and response interceptors, POST request transformation, custom adapters, JSON response transformation, response metadata, params, and headers",missing:"default XMLHttpRequest transport, redirects, cancellation, error and timeout behavior, progress events, authentication, multipart payloads, proxying, and Node HTTP adapters are not yet exercised"}]},lodash:{category:"Storage & Data",stubType:"works",versions:[{range:">=4.0.0 <5.0.0",coverage:.1,note:"real package code runs from the guest bundle; the validated subset is merge and orderBy",working:"root import, merge, orderBy",missing:"the rest of the large collection, object, function, language, math, number, string, and utility API surface is not yet exercised"}]},"react-redux":{category:"Storage & Data",stubType:"works",versions:[{range:">=9.0.0 <10.0.0",coverage:.6,note:"real React Native conditional export runs from the guest bundle; Provider and hooks update from a Redux store",working:"Provider, useSelector subscription and rerender, useDispatch",missing:"connect, useStore, custom contexts, server-state hydration, and selector development checks are not yet exercised"}]},dayjs:{category:"Internationalization",stubType:"works",versions:[{range:">=1.0.0 <2.0.0",coverage:.3,note:"real package code runs from the guest bundle; deterministic parse, calendar addition, and formatting are validated",working:"default import, ISO date parsing, add, format",missing:"plugins, locales, duration, timezone, UTC, and custom parsing are not yet exercised"}]},redux:{category:"Storage & Data",stubType:"works",versions:[{range:">=5.0.0 <6.0.0",coverage:.45,note:"real package code runs from the guest bundle; the core store dispatch and state-read contract is validated",working:"legacy_createStore, reducer initialization, dispatch, getState",missing:"subscribe, replaceReducer, combineReducers, bindActionCreators, compose, and middleware are not yet exercised"}]},zustand:{category:"Storage & Data",stubType:"works",versions:[{range:">=5.0.0 <6.0.0",coverage:.5,note:"real React Native conditional export runs from the guest bundle; a hook store updates and rerenders through set",working:"create, selector hook subscription, state setter, React rerender",missing:"vanilla stores, middleware, persistence, shallow selectors, traditional adapters, and SSR behavior are not yet exercised"}]},"redux-persist":{category:"Storage & Data",stubType:"works",versions:[{range:">=6.0.0 <7.0.0",coverage:.4,note:"real package code runs from the guest bundle; core persistence is validated with the package storage-adapter contract",working:"persistReducer, persistStore, bootstrap subscription, dispatch, flush, serialized storage writes",missing:"the separate React Native AsyncStorage adapter, PersistGate, migrations, transforms, reconciliation variants, purge, and pause-to-resume behavior are not yet exercised"}]},uuid:{category:"Storage & Data",stubType:"works",versions:[{range:">=14.0.0 <15.0.0",coverage:.35,note:"real package code runs from the guest bundle against the guest Web Crypto globals",working:"v4 generation and validation, deterministic v5 generation with the URL namespace",missing:"v1, v3, v6, v7, v8, MAX, NIL, parse, stringify, version, and custom random sources are not yet exercised"}]},"date-fns":{category:"Internationalization",stubType:"works",versions:[{range:">=4.0.0 <5.0.0",coverage:.05,note:"real ESM package code runs from the guest bundle; addDays and format are validated across a calendar boundary",working:"named ESM imports, addDays, format",missing:"the remaining date math, comparison, interval, parsing, locale, duration, timestamp, and functional-programming entry points are not yet exercised"}]},semver:{category:"Storage & Data",stubType:"works",versions:[{range:">=7.0.0 <8.0.0",coverage:.15,note:"real CommonJS package code resolves and runs from the guest bundle; range satisfaction and version incrementing are validated",working:"default import interop, satisfies, inc for a minor version",missing:"parsing classes, comparison variants, range algebra, coercion, sorting, prerelease handling, and subpath imports are not yet exercised"}]},"@tanstack/react-query":{category:"Storage & Data",stubType:"works",versions:[{range:">=5.0.0 <6.0.0",coverage:.2,note:"real React Native conditional export runs from the guest bundle; a provider-backed async query reaches success and rerenders",working:"QueryClient, QueryClientProvider, useQuery, async query function, pending-to-success rerender",missing:"mutations, invalidation, refetch, retries, cache timing, persistence, hydration, infinite queries, focus and online managers, and React Native lifecycle wiring are not yet exercised"}]},reselect:{category:"Storage & Data",stubType:"works",versions:[{range:">=5.0.0 <6.0.0",coverage:.55,note:"real package code runs from the guest bundle; selector computation and same-input memoization are validated",working:"createSelector, input selectors, result computation, same-input memoization, recomputations",missing:"createSelectorCreator, createStructuredSelector, custom memoizers, development checks, and changed-input recomputation are not yet exercised"}]},url:{category:"Networking",stubType:"works",versions:[{range:">=0.11.0 <1.0.0",coverage:.7,note:"the standalone browser package runs from the guest bundle; its legacy parse, format, and resolve contract is validated",working:"parse with query decoding, hostname and query reads, format, relative URL resolution",missing:"Url construction, resolveObject, authentication, ports, IPv6 hosts, punycode, and malformed-input edge cases are not yet exercised"}]},buffer:{category:"Storage & Data",stubType:"works",versions:[{range:">=6.0.0 <7.0.0",coverage:.2,note:"the standalone browser package runs from the guest bundle; UTF-8 and base64 conversion are validated",working:"Buffer.from for UTF-8 and base64, toString for base64 and UTF-8",missing:"allocation, numeric reads and writes, comparison, copy, concat, slicing, search, swapping, transcoding, and Blob/File helpers are not yet exercised"}]},events:{category:"Storage & Data",stubType:"works",versions:[{range:">=3.0.0 <4.0.0",coverage:.75,note:"the standalone browser package runs from the guest bundle; persistent and one-shot listeners follow the EventEmitter contract",working:"EventEmitter, on, once, emit with arguments, off, listenerCount",missing:"error events, symbols, prependListener, rawListeners, eventNames, max-listener warnings, and static helpers are not yet exercised"}]},moment:{category:"Internationalization",stubType:"works",versions:[{range:">=2.0.0 <3.0.0",coverage:.25,note:"real package code runs from the guest bundle; UTC parsing, calendar addition, and formatting are validated",working:"default import, utc, add, format",missing:"local parsing, locales, durations, relative time, comparisons, calendar output, custom formats, and moment-timezone are not yet exercised"}]},color:{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0 <6.0.0",coverage:.45,note:"real ESM package code runs from the guest bundle; CSS hex parsing and RGB/alpha conversion are validated",working:"default ESM import, hex parsing, hex output, alpha update, RGB conversion, array output",missing:"HSL, HSV, HWB, CMYK, XYZ, LAB, LCH, keyword parsing, mixing, contrast, luminosity, and channel mutators are not yet exercised"}]},he:{category:"Storage & Data",stubType:"works",versions:[{range:">=1.2.0 <2.0.0",coverage:.75,note:"real package code runs from the guest bundle; named HTML entity decoding and encoding are validated",working:"decode named references, encode with named references, ampersand decoding",missing:"strict invalid-code-point errors, attribute context, decimal and hexadecimal output modes, escape, version, astral symbols, and ambiguous ampersands are not yet exercised"}]},"@reduxjs/toolkit":{category:"Storage & Data",stubType:"works",versions:[{range:">=2.0.0 <3.0.0",coverage:.35,note:"real package code runs from the guest bundle; a slice reducer and configured store execute an Immer-backed update",working:"createSlice, generated action type and creator, configureStore, dispatch, reducer state read",missing:"createReducer, createAction, middleware customization, listener middleware, async thunks, entity adapters, selectors, combineSlices, RTK Query, and persistence are not yet exercised"}]},"i18n-js":{category:"Internationalization",stubType:"works",versions:[{range:">=4.0.0 <5.0.0",coverage:.45,note:"real package code runs from the guest bundle; locale lookup, interpolation, and pluralization are validated",working:"I18n construction, locale selection, translation lookup, named interpolation, count pluralization",missing:"fallback locales, missing-translation handlers, custom pluralization, number, currency, percentage, date formatting, and locale registration changes are not yet exercised"}]},i18next:{category:"Internationalization",stubType:"works",versions:[{range:">=26.0.0 <27.0.0",coverage:.4,note:"real package code runs from the guest bundle; an isolated resource instance initializes and changes language",working:"createInstance, synchronous resource initialization, fallbackLng, interpolation configuration, changeLanguage, t",missing:"namespaces, resource mutation, plural and context variants, formatters, language detection, backends, post-processors, caching, cloning, events, and async initialization are not yet exercised"}]},"react-i18next":{category:"Internationalization",stubType:"works",versions:[{range:">=17.0.0 <18.0.0",coverage:.25,note:"real package code runs from the guest bundle; provider context and useTranslation rerender after a language change",working:"I18nextProvider, useTranslation, t, i18n access, language-change subscription and rerender",missing:"Trans, Translation, withTranslation, useSSR, useTranslation namespaces and key prefixes, suspense, server rendering, and TypeScript resource augmentation are not yet exercised"}]},"prop-types":{category:"UI Components",stubType:"works",versions:[{range:">=15.0.0 <16.0.0",coverage:.35,note:"real package code runs from the guest bundle; checkPropTypes invokes a custom validator and built-in required validators resolve",working:"checkPropTypes custom validator dispatch, primitive validator export, isRequired validator export",missing:"built-in validator diagnostics, warning deduplication and reset, node and element types, shape and exact, instanceOf, oneOf, oneOfType, arrayOf, objectOf, production behavior, and direct-call guards are not yet exercised"}]},"react-native-modal":{category:"Navigation",stubType:"works",versions:[{range:">=11.0.0",coverage:1,note:"pure JS \u2014 uses Animated + View overlay, runs unmodified in sootsim"}]},"react-native-gifted-chat":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS chat UI \u2014 FlatList + TextInput + View/Text, no native code"}]},"react-native-calendars":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS calendar \u2014 View + Text + TouchableOpacity, no native code"}]},"react-native-markdown-display":{category:"UI Components",stubType:"works",versions:[{range:">=7.0.0",coverage:1,note:"pure JS markdown \u2192 RN components (View, Text, Image), no native code"}]},"react-native-toast-message":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS toast overlay \u2014 View + Animated, no native code"}]},"react-native-confirmation-code-field":{category:"UI Components",stubType:"works",versions:[{range:">=7.0.0",coverage:1,note:"pure JS OTP code input \u2014 TextInput cells, no native code"}]},"react-native-dropdown-picker":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:1,note:"pure JS dropdown \u2014 View + ScrollView + TouchableOpacity, no native code"}]},"react-native-country-picker-modal":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS country picker \u2014 FlatList + Modal, no native code"}]},"react-native-step-indicator":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS step UI \u2014 View + Text rendering, no native code"}]},"react-native-collapsible":{category:"Animation",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS over RN Animated API \u2014 runs as-is from bundle"}]},"react-native-animatable":{category:"Animation",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS over RN Animated API \u2014 runs as-is from bundle"}]},"react-native-image-zoom-viewer":{category:"Image",stubType:"works",versions:[{range:">=3.0.0",coverage:1,note:"pure JS (PanResponder + Image) \u2014 works from bundle without a stub"}]},"react-native-progress":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:1,note:"pure JS progress bars \u2014 SVG + Animated, no native code"}]},"react-native-gifted-charts":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS charts \u2014 composes RN views, Animated, and react-native-svg without native code",working:"BarChart, LineChart, PieChart, PieChartPro, PopulationPyramid, RadarChart, BubbleChart, animated/gradient chart components",missing:"fidelity is bounded by react-native-svg and Animated coverage"}]},"react-native-svg-charts":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:.95,note:"pure JS d3 + react-native-svg charts \u2014 no native module surface",working:"AreaChart, BarChart, LineChart, PieChart, ProgressCircle, StackedAreaChart, StackedBarChart, XAxis, YAxis, Grid, decorators",missing:"fidelity is bounded by react-native-svg coverage and the package is upstream-unmaintained"}]},"react-native-element-dropdown":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS dropdown/multiselect components \u2014 FlatList, Modal, TextInput, Pressable"}]},"react-native-paper-dates":{category:"UI Components",stubType:"works",versions:[{range:">=0.20.0",coverage:1,note:"pure JS date picker UI built on react-native-paper and date-fns"}]},"react-native-qrcode-svg":{category:"Image",stubType:"works",versions:[{range:">=6.0.0",coverage:1,note:"pure JS QR generator using react-native-svg \u2014 works end-to-end via sootsim SVG engine"}]},"@segment/sovran-react-native":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"JS store runs unmodified; optional native bridge is absent and upstream already degrades to a warning",working:"createStore, dispatch/getState/subscribe queue, registerBridgeStore, AsyncStorage persistor through async-storage stub",missing:"native-to-JS store action bridge events from Sovran native module"}]},"react-native-swiper":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS ScrollView-based carousel \u2014 runs as-is from bundle",working:"Swiper carousel, ScrollView-based paging, dot indicators, autoplay, all standard props"}]},moti:{category:"Animation",stubType:"works",versions:[{range:">=0.20.0",coverage:.7,note:"pure JS, runs from bundle as-is; coverage bound by reanimated stub (0.8)",working:"MotiView, MotiText, MotiImage, MotiScrollView, MotiSafeAreaView, motify, useAnimationState, useDynamicAnimation, AnimatePresence, MotiProgressBar, interactions/skeleton/svg subpaths",missing:"enter/exit layout animations (blocked by reanimated stub gap), useAnimatedSensor-driven animations, any animation requiring real UI-thread worklet execution"}]},"@legendapp/list":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=1.0.0",coverage:.8,note:"pure JS list composing flash-list (which renders as FlatList equivalent in sootsim)",working:"all list rendering via flash-list stub (FlatList equivalent), full Legend list API delegated to flash-list",missing:"inherits flash-list virtualization gap (no native recycling)"}]},"@floating-ui/react-native":{category:"UI Components",stubType:"works",versions:[{range:">=0.10.0",coverage:1,note:"pure JS positioning library \u2014 uses RN layout, no native code"}]},"react-native-switch":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS toggle \u2014 Animated + View, no native code"}]},"@gorhom/portal":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS React-context portal \u2014 runs as-is from bundle, no native modules",working:"Portal, PortalHost, PortalProvider, usePortal, enableLogging"}]},"react-native-render-html":{category:"UI Components",stubType:"works",versions:[{range:">=6.0.0",coverage:1,note:"pure JS HTML to RN components via View/Text/Image, no native code"}]},solito:{category:"Navigation",stubType:"works",versions:[{range:">=4.0.0",coverage:1,note:"pure JS navigation abstraction \u2014 useRouter/useLink delegate to expo-router or react-navigation"}]},"react-native-paper":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:.8,note:"pure JS Material Design \u2014 uses RN primitives + reanimated + svg + safe-area (all stubbed)",missing:"components depending on react-native-svg (Charts, ProgressBar arc), reanimated-driven animations, native ripple effects"}]},"expo-build-properties":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=0.1.0",coverage:1,note:"build-only \u2014 the published main entry exports withBuildProperties, a config plugin that mutates Android Gradle/ProGuard/settings files and iOS build properties during Expo prebuild; it exposes no application runtime API"}]},"expo-dev-client":{category:"Expo SDK",stubType:"native",versions:[{range:">=1.0.0",coverage:.4,note:"stub \u2014 the real package (`export * from 'expo-dev-menu'`) runs from the bundle; ExpoDevMenu exposes load-safe no-op menu controls and callback registration so development clients boot without fabricating a guest dev menu",working:"published openMenu, closeMenu, hideMenu, and registerDevMenuItems calls",missing:"guest dev-menu UI, registered custom items and callbacks, launcher integration, and development-client navigation"}]},"react-native-drawer-layout":{category:"Navigation",stubType:"works",proofCoverage:.8,versions:[{range:">=3.0.0",coverage:.9,note:"pure JS drawer \u2014 runs unmodified, depends on reanimated + gesture-handler",working:"Drawer, DrawerLayout, drawerPosition, drawerType, swipe gestures, open/close callbacks, renderDrawerContent",missing:"gesture fidelity depends on gesture-handler stub completeness"}]},"react-native-tab-view":{category:"Navigation",stubType:"works",proofCoverage:.8,versions:[{range:">=3.0.0",coverage:.9,note:"pure JS \u2014 uses ScrollView-based tab pager, runs unmodified",working:"TabView, SceneMap, TabBar, TabBarItem, renderTabBar, initialLayout, lazy, onIndexChange, onTabPress, swipeEnabled",missing:"swipe fidelity depends on gesture-handler/reanimated stub completeness"}]},"react-native-screen-transitions":{category:"Navigation",stubType:"works",versions:[{range:">=1.0.0",coverage:.9,note:"real upstream package runs from the bundle over the reanimated, gesture-handler, screens, and safe-area-context seams sootsim already provides",working:"withScreenTransitions, createTransitionAwareComponent, createBoundaryComponent, Boundary, the transition-aware View/ScrollView/MaskedView, and the reanimated-driven transition specs",missing:"fidelity is bounded by the reanimated worklet and gesture-handler seams underneath it, not by anything package-level"}]},"@react-native-vector-icons/fontawesome6-pro":{category:"UI Components",stubType:"works",versions:[{range:">=12.0.0",coverage:1,note:"pure JS glyph maps + font files; no native module needed in RN 0.73+"}]},"react-native-draggable-flatlist":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=3.0.0",coverage:.95,note:"pure JS \u2014 composes gesture-handler + reanimated (both stubbed in sootsim)",working:"DraggableFlatList drag-and-drop gesture handling via gesture-handler + reanimated stubs",missing:"fidelity bound by reanimated layout-animation gap"}]},"react-native-email-link":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS \u2014 uses Linking API for mailto: URIs, no stub needed"}]},"react-native-logs":{category:"Device & Platform",stubType:"works",versions:[{range:">=5.0.0",coverage:1,note:"pure JS console wrapper \u2014 runs without a stub"}]},"react-native-select-dropdown":{category:"UI Components",stubType:"works",versions:[{range:">=3.0.0",coverage:1,note:"pure JS \u2014 FlatList + TextInput + Modal, no native code"}]},"react-native-size-matters":{category:"UI Components",stubType:"works",versions:[{range:">=0.3.0",coverage:1,note:"pure JS Dimensions scaling utilities, no native code"}]},"@react-native-community/checkbox":{category:"UI Components",stubType:"native",versions:[{range:">=0.5.0",coverage:1,note:"HTML checkbox input with accentColor tinting",working:"CheckBox, value, onValueChange, disabled, tintColors (true/false), testID"}]},"@react-native-segmented-control/segmented-control":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"iOS RNCSegmentedControl-compatible component with native event payloads and selected segment styling",working:"default forwardRef component, values, selectedIndex, enabled, momentary, tintColor, backgroundColor, fontStyle, activeFontStyle, testIDS, onChange nativeEvent, onValueChange",missing:"actual UISegmentedControl native drawing, native image segment rendering, processColor numeric conversion, macOS support, exact iOS separator/thumb animation behavior"}]},"@bam.tech/react-native-image-resizer":{category:"Image",stubType:"native",versions:[{range:">=3.0.0",coverage:.85,note:"createResizedImage backed by browser image decoding and canvas resizing",working:"default createResizedImage export, PNG/JPEG/WEBP format mapping, contain/cover/stretch sizing, onlyScaleDown, 90-degree rotation, outputPath/name/path response fields, blob/data URI output and size when canvas APIs are available",missing:"native filesystem persistence, EXIF metadata preservation for keepMeta, exact RCTImageLoader asset resolution, platform-specific WEBP availability differences"}]},"react-native-create-thumbnail":{category:"Media",stubType:"native",versions:[{range:">=2.2.0",coverage:.82,note:"native-seam only \u2014 upstream entry is `const { create } = NativeModules.CreateThumbnail; export default CreateThumbnail` and runs from the bundle. sootsim provides the CreateThumbnail TurboModule with browser-equivalent frame extraction: loads the source as an HTMLVideoElement, seeks to the requested timeStamp, paints the frame onto a canvas at the requested maxWidth/maxHeight (aspect-preserving downscale) and encodes as data:image/<format>. caches by cacheName (or url+timestamp) so re-requests return the same data URI without re-decoding. apps that fetch from a CORS-friendly source get real thumbnail bytes; hostile-origin sources fall through to a shape-correct placeholder.",working:"CreateThumbnail native module create() with HTMLVideoElement + canvas-backed real frame extraction, url/timeStamp/format/cacheName/maxWidth/maxHeight/headers options, aspect-preserving downscale, image/jpeg + image/png encoding, cache-by-name reuse, shape-correct {path,size,mime,width,height} result, headers via fetch+objectURL when present, graceful fallback when DOM video/canvas isn\u2019t available",missing:"native cache file persistence (data URI cache only, not /Caches/thumbnails on disk), AVAssetImageGenerator exact frame selection / time-tolerance semantics, Android onlySyncedFrames behavior, cache directory size cleanup, non-DOM worker video decode"}]},"expo-background-task":{category:"Expo SDK",stubType:"native",proofCoverage:1,versions:[{range:">=55.0.0",coverage:.85,note:`native-seam: upstream expo-background-task JS (BackgroundTaskStatus/Result enums, task-name validation, the Restricted-status iOS-Simulator warning path) runs unchanged from the bundle; only the ExpoBackgroundTask expo module is ours, mirroring BackgroundTaskScheduler.swift/BackgroundTaskModule.swift on the reference iOS Simulator EXACTLY \u2014 getStatusAsync returns Restricted (the upstream "if we're on emulator we should definitely return restricted" path) and register/unregisterTaskAsync throw the verbatim simulator exception ("Background Task is not available on simulators. Use a device to test it."). this IS the complete faithful contract on the reference device: BGTaskScheduler does not run on the iOS Simulator at all, so an app calling expo-background-task there already gets exactly this (the upstream JS even has a dedicated Simulator-restricted warning branch). same faithful "the Simulator genuinely cannot do this, and that is correct" tier as expo-sms / react-native-exit-app.`,working:"getStatusAsync (Restricted \u2014 exact upstream emulator path), registerTaskAsync/unregisterTaskAsync (throw the verbatim upstream simulator exception), triggerTaskWorkerForTestingAsync (void), onTasksExpired listener support; upstream enums + task-name validation + the Restricted-status warning path run from the bundle",missing:'real OS background execution windows (BGTaskScheduler/WorkManager) and physical-device "available" status \u2014 but these never work on the reference iOS Simulator either (it reports Restricted by design); a real execution path needs a physical device the Simulator and browser alike do not provide'}]},"expo-background-fetch":{category:"Expo SDK",stubType:"native",proofCoverage:1,versions:[{range:">=13.0.0",coverage:.8,note:"package-local wrapper registers only ExpoBackgroundFetch and ExpoTaskManager native modules; upstream expo-background-fetch JS runs unchanged.",working:"upstream deprecation warning, task-name validation, BackgroundFetchStatus/Result enums, native getStatusAsync, setMinimumIntervalAsync, registerTaskAsync, unregisterTaskAsync, and TaskManager integration",missing:"real suspended-app background execution, Info.plist-driven disabled-mode rejection, BackgroundFetchTaskConsumer scheduling, and physical-device background refresh status changes"}]},"expo-speech-recognition":{category:"Expo SDK",stubType:"native",versions:[{range:">=3.1.0",coverage:.85,note:"native-seam only \u2014 upstream expo-speech-recognition JS (ExpoWebSpeechRecognition, useSpeechRecognitionEvent, constants, and direct module API) runs unchanged from the bundle; SootSim registers only the ExpoSpeechRecognition native module, backed by the host-service SpeechRecognition bridge when available",working:"ExpoSpeechRecognition native module start/stop/abort/state, native event addListener/remove, granted permission helpers, recognition availability, speech services/default-service helpers, supported-locales shape, iOS audio-session getters/setters; upstream ExpoWebSpeechRecognition class, grammar/list classes, hook, and constants stay authoritative",missing:"native SFSpeechRecognizer and Android SpeechRecognizer engines, audioSource transcription, recording persistence, locale installation data, offline model downloads, volume metering"}]},"expo-insights":{category:"Analytics",stubType:"native",versions:[{range:">=55.0.0",coverage:.95,note:"package-local wrapper registers only the ExpoInsights native module; upstream public JS is an empty default export.",working:"default export is the upstream empty object; ExpoInsights native module name resolves after importing expo-insights so inlined expo-modules-core bundles do not fall through to the permissive proxy",missing:"native lifecycle telemetry delivery to i.expo.dev is intentionally absent in sootsim"}]},"react-native-aes-crypto":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:1,note:"fully backed by Web Crypto API (AES-CBC/GCM, PBKDF2, SHA, HMAC, random)",working:"pbkdf2, sha1, sha256, sha512, hmac256, hmac512, randomKey, randomUuid, encrypt, decrypt"}]},"react-native-amplitude-analytics":{category:"Analytics",stubType:"native",versions:[{range:">=0.2.0",coverage:.95,note:"analytics SDK with full noop singleton per the docs/compat-scoring.md rule \u2014 Amplitude.getInstance() works; delivery intentionally absent in browser preview.",working:"singleton via getInstance(), initialize/logEvent/logEventWithTimestamp/setUserId/setUserProperties/logRevenue/setGroup/setOptOut/trackingSessionEvents accepted",missing:"no event delivery \u2014 same constraint as every analytics SDK in browser preview"}]},"react-native-app-auth":{category:"Auth & Payments",stubType:"native",versions:[{range:">=6.0.0",coverage:.88,note:"native-seam only \u2014 real react-native-app-auth package runs unchanged from the bundle (validation, error normalization, AuthConfiguration/AuthorizeResult types, wrapNativeAuthPromise, platform-specific positional argument assembly). sootsim provides the RNAppAuth NativeModule with browser-equivalent OAuth: authorize opens a real window.open popup with PKCE S256 and polls for the redirect URL (parsing both ?query and #fragment), refresh/register POST to the token/registration endpoint with real fetch, logout navigates to the end-session endpoint, prefetchConfiguration fetches /.well-known/openid-configuration via real OIDC discovery so apps that omit serviceConfiguration still resolve the right endpoints. apps wired to a CORS-friendly IdP get real tokens.",working:"authorize() opens popup with PKCE S256, parses both ? and # redirect params, refresh() POSTs to token endpoint, register() dynamic client registration, prefetchConfiguration() fetches /.well-known/openid-configuration, logout() navigates to end-session endpoint",missing:"popup cross-origin redirect interception can still fail on hostile IdPs (inherent browser limitation), logout uses window.location (navigates away)"}]},"react-native-auth0":{category:"Auth & Payments",stubType:"native",versions:[{range:">=5.0.0",coverage:.55,note:"upstream Auth0 JS facade runs unchanged against A0Auth0 TurboModule seam",working:"A0Auth0 native module provides initialize/hasValidInstance, webAuth/logout/cancel/resume, credential save/get/hasValid/clear, API credentials, SSO credentials, DPoP headers, customTokenExchange; upstream Auth0 class/hooks/orchestrators stay in the app bundle",missing:"real hosted-login callback interception, secure Keychain/EncryptedSharedPreferences, biometrics, network refresh-token renewal, Management API persistence, real DPoP signing key material"}]},"@expensify/react-native-live-markdown":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.4,note:"TextInput fallback only \u2014 no actual markdown rendering or syntax highlighting",working:"MarkdownTextInput (plain input), parseExpensiMark (returns []), getWorkletRuntime (returns {})",missing:"actual markdown syntax coloring, formatSelection behavior, worklet-driven inline styling, cursor-aware formatting"}]},"react-native-nitro-cookies":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"document.cookie backed; get/set/remove/clearAll fully functional in browser",working:"get, getAll, set (with path/domain/expires/secure options), remove (with path/domain options), clearAll, Cookie interface",missing:"httpOnly attribute (not settable via document.cookie by design), SameSite option, URL-scoped cookie reading (always reads all document.cookie)"}]},"react-native-nitro-modules":{category:"Essentials",stubType:"native",versions:[{range:">=0.30.0",coverage:.3,note:"native-seam only: the published Nitro Modules entrypoint installs SootSim's HybridObject registry, but no native JSI bindings run",working:"published entrypoint and type exports, NitroModules metadata, registered createHybridObject factories, actionable errors for unregistered HybridObjects, hasHybridObject/getAllHybridObjectNames registry state, isRuntimeAlive false, callback wrapper, getHybridObjectConstructor",missing:"the native JSI framework implementation; package-specific HybridObjects work only where a separate compat seam registers them, and native memory accounting, ArrayBuffer ownership, cross-runtime boxed HybridObjects, and Nitro Views remain absent"}]},"react-native-nitro-sqlite":{category:"Storage & Data",stubType:"native",versions:[{range:">=9.0.0",coverage:.85,note:"adapts the shared bedrock-sqlite backend to Nitro's connection-oriented API. real SQL engine inherited from op-sqlite via the shared backend; error wrapping included.",working:"open, execute/Async, executeBatch/Async, transaction (auto commit/rollback against real BEGIN/COMMIT/ROLLBACK), NitroSQLiteError, NITRO_SQLITE_NULL, isNitroSQLiteNull, isSimpleNullHandlingEnabled, enableSimpleNullHandling, NitroSQLite proxy, close, delete, attach, detach, full SQL surface (JOINs, indexes, transactions, RETURNING)",missing:"attach/detach are noops (single-DB in the shared backend), loadFile (noop), update/commit/rollback hooks (bedrock does not expose sqlite3_update_hook through its module surface)"}]},"@op-engineering/op-sqlite":{category:"Storage & Data",stubType:"native",versions:[{range:">=8.0.0",coverage:.9,note:"real SQLite via the shared bedrock-sqlite WASM backend (~1MB, lazy-loaded on first open) with memfs persisted to IDB. full SQL semantics \u2014 joins, transactions, prepared statements, INSERT\u2026RETURNING, PRAGMA. covers Zero / Replicache patterns natively rather than via regex.",working:"open, openRemote, openSync, OPSQLite proxy, DB.execute / executeAsync / executeRaw / executeRawSync / executeBatch / executeBatchAsync, prepareStatement, transaction (real BEGIN/COMMIT/ROLLBACK), close, delete (memfs unlink), getDbPath, attach, detach, Storage class (real CREATE TABLE / INSERT OR REPLACE / SELECT / DELETE), full SQL surface",missing:"updateHook / commitHook / rollbackHook (bedrock has no sqlite3_update_hook binding), reactiveExecute (subscription returns no-op unsubscribe), loadFile (noop), isSQLCipher always false, moveAssetsDatabase noop, sync execute() throws if invoked before bedrock finishes loading \u2014 await executeAsync or whenOpSqliteReady() first"}]},"@ua/react-native-airship":{category:"Notifications",stubType:"native",versions:[{range:">=19.0.0",coverage:0,note:"the reference iOS simulator presents Airship message-center and preference-center UI when configured. SootSim returns an unconfigured state and presents neither surface, so import safety receives no behavior credit",working:"AirshipRoot constructor + every getter, takeOff, isFlying, push.getNotificationStatus / enableUserNotifications / setForegroundPresentationOptions, contact identify/reset/getNamedUserId, messageCenter list / refresh / dismiss, channel get / addTag / removeTag / setTags, preferenceCenter open, named-user state, iOS.liveActivityManager (every method resolves), addListener / removeAllListeners on UAEventEmitter, all 60+ TurboModule Spec methods accept calls without throwing",missing:"no Urban Airship SAAS backend \u2014 no real push delivery, no remote-config / engage / journey events, no Live Activity binding to ActivityKit, no actual notification permission grant; the seam acknowledges listener registration but never fires events"}]},"react-native-keys":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.7.0",coverage:1,note:"reads keys from SOOTSIM_REACT_NATIVE_KEYS_JSON env or globalThis; URL/token placeholders",working:"KeysTurbo proxy (all public keys), secureFor(name), OSS=true default, injected payload via env/globalThis"}]},"klaviyo-react-native-sdk":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: load-only stub: getConstants returns PROFILE_KEYS / PUSH_TOKEN_VENDOR / EVENT_NAMES so the bundle initializes; calls are no-ops (no real analytics, push, or in-app forms). imports and API shape receive no behavior credit",working:"KlaviyoReactNativeSdk.getConstants(), Klaviyo namespace + Profile/Push/Forms/DeepLink/Geofencing methods (no-op), ProfileProperty enum"}]},"@welldone-software/why-did-you-render":{category:"Device & Platform",stubType:"native",shipsNativeCode:!1,versions:[{range:">=8.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: intentional noop : wdyr mutates React internals and crashes sootsim's bridged React. imports and API shape receive no behavior credit",working:"default export callable as wdyr(React, opts) without error"}]},"react-native-pure-jwt":{category:"Auth & Payments",stubType:"native",versions:[{range:">=3.0.0",coverage:.9,note:"fully functional via Web Crypto \u2014 sign/verify/decode work with HMAC HS256/384/512",working:"decode() (header+payload parsing), sign() (HMAC via crypto.subtle, HS256/384/512), verify() (signature check + exp validation), base64url encode/decode, iat auto-injection",missing:"RS256/ES256 asymmetric algorithms not supported (Web Crypto could but not implemented), skipValidation option in decode has no effect on signature"}]},"react-native-simple-toast":{category:"UI Components",stubType:"native",versions:[{range:">=3.0.0",coverage:1,note:"DOM toast overlay with gravity (top/center/bottom), duration, and offset",working:"show, showWithGravity, showWithGravityAndOffset, SHORT, LONG, TOP, BOTTOM, CENTER constants"}]},"react-navigation":{category:"Navigation",stubType:"works",versions:[{range:">=1.0.0 <5.0.0",coverage:0,note:"legacy all-in-one navigator APIs are not validated; use the scoped @react-navigation packages for supported navigation behavior",missing:"StackNavigator, TabNavigator, DrawerNavigator, createStackNavigator, createBottomTabNavigator, createDrawerNavigator, NavigationActions, StackActions, and legacy container APIs"},{range:">=5.0.0 <6.0.0",coverage:1,note:"the published package is an intentional tombstone; its real package code runs from the guest bundle and throws the upstream unsupported-package error on import",working:"the complete v5 package contract: importing the package throws its published migration error"}]},"@vxrn/native":{category:"Navigation",stubType:"native",versions:[{range:">=1.21.0",coverage:.72,note:"native-seam only for toolbar/menu host views. One's public Stack.Toolbar components use the real @vxrn/native implementation, whose React code runs from the bundle and converts the composition API into native host props and native-stack header items.",working:"StackToolbar header and bottom placements, Button, Label, Icon with SF Symbols/image sources, Badge, fixed/fluid Spacer, View children, nested Menu/MenuAction trees, disabled/selected/destructive actions, visible action callbacks, and native-stack header bar item integration",missing:"Color and zoom-transition native hosts, SplitView gamma host, bottom SearchBarSlot integration with a configured native search controller, exact UIKit shared-background grouping"}]},"@react-navigation/native":{category:"Navigation",stubType:"works",versions:[{range:">=6.0.0",coverage:1,note:"pure JS \u2014 NavigationContainer + linking + theming run unmodified on RN primitives",working:"NavigationContainer, useNavigation, useRoute, useFocusEffect, useIsFocused, useNavigationState, CommonActions, StackActions, DefaultTheme, DarkTheme, ThemeProvider, deep linking, state persistence"}]},"@react-navigation/native-stack":{category:"Navigation",stubType:"works",versions:[{range:">=6.0.0",coverage:.93,note:"pure JS wrapper around react-native-screens (stubbed); push/pop, header, modals, large titles all flow through screens stub",working:"createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right, unstable native header button/menu items), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, formSheet initial custom detents/corner radius/grabber/undimmed range and stacked sheets, push/pop animations, gesture-driven back, freezeOnBlur via react-native-screens, useHeaderHeight",missing:"fidelity bound by react-native-screens stub \u2014 interactive drag between formSheet detents and integrated search bar placements"}]},"@react-navigation/bottom-tabs":{category:"Navigation",stubType:"works",versions:[{range:">=6.0.0",coverage:.95,note:"pure JS \u2014 tab bar + scene rendering on RN primitives; integrates with screens stub",working:"createBottomTabNavigator, Screen, Navigator, tabBar customization, tabBarIcon/Label/Badge, lazy mounting, useBottomTabBarHeight, BottomTabBarHeightContext, blur tabBarBackground, focus/blur events",missing:"native iOS blur effect on tabBarBackground (uses CSS approximation)"}]},"@bottom-tabs/react-navigation":{category:"Navigation",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS React Navigation adapter over react-native-bottom-tabs; native tab rendering flows through the bottom-tabs seam",working:"createNativeBottomTabNavigator, Navigator, Screen options for title/label/icon/badge/lazy/freeze/testID/role, and TabView-level translucent/labeled/haptic/scroll-edge props via react-native-bottom-tabs",missing:"fidelity is bounded by the react-native-bottom-tabs native seam; no separate web tab implementation is provided by this adapter"}]},"@react-navigation/stack":{category:"Navigation",stubType:"works",versions:[{range:">=6.0.0",coverage:.9,note:"pure JS \u2014 JS-driven stack navigator with gesture-handler + reanimated for transitions",working:"createStackNavigator, card/modal presentation, gesture-driven back, header animations, TransitionPresets (Slide, Modal, Fade), interpolators, headerStyleInterpolators, custom transitionSpec",missing:"transition fidelity depends on reanimated stub completeness; some advanced TransitionPresets may render without easing details"}]},"@react-navigation/drawer":{category:"Navigation",stubType:"works",versions:[{range:">=6.0.0",coverage:.9,note:"pure JS \u2014 composes react-native-drawer-layout (stubbed) + gesture-handler + reanimated",working:"createDrawerNavigator, drawerType (front/back/slide/permanent), drawerPosition, swipe to open, drawerContent customization, useDrawerStatus, useDrawerProgress",missing:"gesture/animation fidelity bound by drawer-layout + gesture-handler stub completeness"}]},"@react-navigation/material-top-tabs":{category:"Navigation",stubType:"works",versions:[{range:">=6.0.0",coverage:.9,note:"pure JS \u2014 wraps react-native-tab-view (also pure JS), runs unmodified",working:"createMaterialTopTabNavigator, TabBar, scrollable tabs, tabBarIndicator/Label/Icon, swipeEnabled, lazy mounting",missing:"swipe fidelity inherited from gesture-handler/reanimated stubs"}]},"@react-navigation/elements":{category:"Navigation",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS UI primitives shared by all @react-navigation navigators",working:"Header, HeaderBackButton, HeaderTitle, MissingIcon, PlatformPressable, ResourceSavingView, SafeAreaProviderCompat, getDefaultHeaderHeight, getHeaderTitle, useHeaderHeight, Background"}]},"react-native-is-edge-to-edge":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure JS helper \u2014 upstream exports constant edge-to-edge true checks and a noop validator",working:"isEdgeToEdge, isEdgeToEdgeFromLibrary, isEdgeToEdgeFromProperty, controlEdgeToEdgeValues"}]},"@react-navigation/routers":{category:"Navigation",stubType:"works",versions:[{range:">=7.0.0",coverage:1,note:"pure JS navigation state machines \u2014 no native modules or views",working:"CommonActions, BaseRouter, DrawerRouter/Actions, StackRouter/Actions, TabRouter/Actions"}]},"@react-navigation/core":{category:"Navigation",stubType:"works",versions:[{range:">=7.0.0 <8.0.0",coverage:.25,note:"real package code runs from the guest bundle; URL-to-navigation-state parsing, serialization, and focused-route traversal are validated",working:"getStateFromPath with path parameters and query parameters, getPathFromState round trip, findFocusedRoute",missing:"BaseNavigationContainer, navigation refs and events, createNavigatorFactory, useNavigationBuilder, navigation hooks, prevent-remove behavior, themes, static navigation, action derivation, nested path configs, custom parsing and serialization, and invalid-config diagnostics are not yet exercised"}]},"@expo/vector-icons":{category:"UI Components",stubType:"works",versions:[{range:">=14.0.0",coverage:.85,note:"pure JS icon components over Text plus expo-font; glyph rendering follows loaded font support",working:"icon family components, createIconSet helpers, Button components, glyph maps, loadFont through expo-font, Text-based glyph rendering",missing:"getImageSource/getImageSourceSync depend on expo-font renderToImageAsync/native vector-icon image APIs and may return null or throw"}]},"@expo/metro-runtime":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=55.0.0",coverage:.85,note:"tooling-only \u2014 Metro injects this package into development bundles; SootSim supports its location, server-log, rejection-tracking, refresh, and bootstrap helpers as bundler/runtime infrastructure rather than an application-facing API",working:"runtime entrypoint, location polyfill install, RSC runtime import, web getDevServer path, development log capture and promise rejection tracking on supported globals",missing:"native reload/logbox paths depend on RN DevSettings and internal native LogBox behavior; production app functionality is unaffected"}]},"@expo/router-server":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=55.0.0",coverage:1,note:"build-only \u2014 the published 57.0.x main points to an omitted build/index entry while its shipped subpaths are Node SSR, static-rendering, server-manifest, and typed-route generation utilities; it exposes no application native runtime API"}]},"react-native-url-polyfill":{category:"Essentials",stubType:"works",versions:[{range:">=2.0.0",coverage:.85,note:"pure JS WHATWG URL/URLSearchParams polyfill; NativeModules.BlobModule access is guarded",working:"URL, URLSearchParams, setupURLPolyfill, auto.js web guard, canParse, global URL/URLSearchParams installation",missing:"URLSearchParams.sort does not reorder keys in the published 3.0.0 dependency; React Native BlobModule-specific createObjectURL is absent when BlobModule is unavailable, so browser Blob URLs should use the native URL implementation"}]},"react-native-svg-transformer":{category:"Image",stubType:"build-only",versions:[{range:">=1.0.0",coverage:1,note:"Metro transformer only \u2014 converts SVG files through SVGR at build time"}]},"react-native-swipe-gestures":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS PanResponder wrapper for directional swipe callbacks",working:"GestureRecognizer default export, swipeDirections constants, onSwipe/onSwipeUp/onSwipeDown/onSwipeLeft/onSwipeRight, config thresholds",missing:"fidelity follows the base React Native PanResponder implementation"}]},"react-native-modal-datetime-picker":{category:"UI Components",stubType:"works",versions:[{range:">=17.0.0",coverage:.95,note:"pure JS modal wrapper around @react-native-community/datetimepicker",working:"DateTimePickerModal, iOS modal chrome, confirm/cancel/onHide flow, custom header/buttons/picker hooks, Android wrapper path",missing:"date/time picker fidelity is inherited from @react-native-community/datetimepicker and Modal animation timing"}]},"react-native-uuid":{category:"Device & Platform",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"zero-dependency TypeScript RFC4122 implementation \u2014 no native modules",working:"v1, v3, v4, v5, parse, unparse, validate, version, NIL, DNS, URL, OID, X500"}]},"react-native-keyboard-aware-scroll-view":{category:"Keyboard",stubType:"works",versions:[{range:">=0.9.0",coverage:.85,note:"pure JS keyboard-aware ScrollView/FlatList/SectionList HOC over RN Keyboard and measure APIs",working:"KeyboardAwareScrollView, KeyboardAwareFlatList, KeyboardAwareSectionList, listenable keyboard callbacks, scrollToPosition/scrollToEnd/scrollIntoView helpers",missing:"automatic scroll precision depends on RN Keyboard frame events, UIManager.measureLayout, and TextInput.State fidelity"}]},"react-native-reanimated-carousel":{category:"Animation",stubType:"works",versions:[{range:">=4.0.0",coverage:.8,note:"pure JS carousel built on react-native-reanimated and gesture-handler",working:"Carousel component, Pagination export, renderItem flow, shared-value driven offsets, pan gesture integration, stack/parallax layout calculators",missing:"animation and gesture fidelity inherits reanimated worklet/layout gaps and gesture-handler cross-detector limitations"}]},"@expo/react-native-action-sheet":{category:"UI Components",stubType:"works",versions:[{range:">=4.0.0",coverage:.9,note:"pure JS provider/hook wrapper over RN ActionSheetIOS or a custom RN modal sheet",working:"ActionSheetProvider, connectActionSheet, useActionSheet, showActionSheetWithOptions, custom RN sheet fallback, iOS ActionSheetIOS path through the core RN surface",missing:"native sheet fidelity inherits core ActionSheetIOS and Modal animation differences"}]},"react-native-dotenv":{category:"Essentials",stubType:"build-only",versions:[{range:">=3.0.0",coverage:1,note:"Babel import transformer only \u2014 no runtime React Native API surface"}]},"@tamagui/animations-react-native":{category:"Animation",stubType:"works",versions:[{range:">=1.0.0",coverage:.9,note:"pure JS Tamagui animation driver over React Native Animated",working:"createAnimations, usePresence integration, Animated timing/spring mapping, RN View/Text style animation configs",missing:"fidelity follows the base RN Animated implementation"}]},"@tamagui/animations-moti":{category:"Animation",stubType:"works",versions:[{range:">=1.0.0",coverage:.8,note:"pure JS Tamagui animation driver over react-native-reanimated",working:"createAnimations, shared-value style mapping, timing/spring animation plumbing, presence callbacks",missing:"inherits reanimated worklet/layout animation gaps"}]},"@tamagui/shorthands":{category:"UI Components",stubType:"build-only",versions:[{range:">=1.0.0",coverage:1,note:"static Tamagui shorthand config map \u2014 no native runtime surface"}]},"@tamagui/themes":{category:"UI Components",stubType:"build-only",versions:[{range:">=1.0.0",coverage:1,note:"static Tamagui theme/token data \u2014 no native runtime surface"}]},"@tamagui/config":{category:"UI Components",stubType:"build-only",versions:[{range:">=1.0.0",coverage:1,note:"Tamagui design-system config package consumed at compile/config time"}]},tamagui:{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.9,note:"pure JS component system over React Native primitives and Tamagui runtime",working:"stacks, text, buttons, inputs, forms, portals, popovers, sheets, tabs, dialogs, theme/token runtime, Anchor via RN Linking",missing:"feature fidelity inherits lower-level RN primitives, gesture/animation drivers, and any app-specific Tamagui compiler assumptions"}]},"react-native-redash":{category:"Animation",stubType:"works",versions:[{range:">=18.0.0",coverage:.8,note:"pure JS utility layer over react-native-reanimated plus SVG path math helpers",working:"math/vector/color/path helpers, transition hooks, ReText, withPause/withBouncing helpers, transform utilities",missing:"inherits reanimated defineAnimation/worklet fidelity gaps"}]},"react-native-picker-select":{category:"UI Components",stubType:"works",versions:[{range:">=9.0.0",coverage:.95,note:"pure JS select wrapper around @react-native-picker/picker and RN Modal/TextInput primitives",working:"RNPickerSelect, items/value selection, placeholder, onValueChange, modal input wrapper, Icon/custom input props",missing:"visual fidelity inherits @react-native-picker/picker and Modal behavior"}]},"react-native-sse":{category:"Storage & Data",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS EventSource implementation using XMLHttpRequest-style networking",working:"EventSource constructor, addEventListener/removeEventListener, open/message/error events, close, reconnect options, headers/body config",missing:"streaming fidelity depends on the browser/XHR implementation available to the tenant runtime"}]},"react-native-modal-selector":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.95,note:"pure JS selector modal built from RN Modal, FlatList, Touchable, TextInput, and View",working:"ModalSelector component, data sections/options, onChange, selectedKey/initValue, custom option/section rendering, search input",missing:"fidelity follows core Modal, FlatList, and touch handling"}]},"@react-native-community/hooks":{category:"Device & Platform",stubType:"works",versions:[{range:">=3.0.0",coverage:.95,note:"pure JS React hooks over RN Dimensions, AppState, Keyboard, AccessibilityInfo, and NetInfo-style APIs",working:"useAppState, useKeyboard, useDimensions/useWindowDimensions, useAccessibilityInfo, useDeviceOrientation, useBackHandler, useInteractionManager",missing:"hook fidelity follows the underlying core RN event surfaces"}]},"react-native-ratings":{category:"UI Components",stubType:"works",versions:[{range:">=8.0.0",coverage:.9,note:"pure JS rating controls over RN Animated, PanResponder, Image, Text, and TouchableOpacity",working:"Rating, AirbnbRating, TapRating, SwipeRating, custom images, fractions, readonly and callback props",missing:"swipe/animation fidelity follows PanResponder and Animated"}]},"react-native-confetti-cannon":{category:"Animation",stubType:"works",versions:[{range:">=1.5.0",coverage:.9,note:"pure JS confetti particles rendered with RN Animated and View/Image primitives",working:"ConfettiCannon component, autoStart, fadeOut, explosionSpeed/fallSpeed, origin, colors, onAnimationStart/onAnimationEnd",missing:"animation timing fidelity follows RN Animated"}]},"react-native-google-places-autocomplete":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.9,note:"pure JS autocomplete widget over TextInput, FlatList, fetch, qs, debounce, and react-native-uuid",working:"GooglePlacesAutocomplete component, text input/list rendering, debounce, query serialization, nearby/current-place request paths, callbacks",missing:"network results require a real Google Places key and browser fetch access; location shortcut inherits geolocation support"}]},"expo-checkbox":{category:"UI Components",stubType:"works",versions:[{range:">=55.0.0",coverage:.95,note:"pure JS checkbox built from Pressable, Image, StyleSheet, and Platform",working:"Checkbox component, value/onValueChange, color/disabled/style props, checkmark image rendering",missing:"exact platform-native checkbox accessibility traits are approximated by RN Pressable"}]},"react-native-chart-kit":{category:"UI Components",stubType:"works",versions:[{range:">=6.0.0",coverage:.9,note:"pure JS chart components over react-native-svg",working:"LineChart, BarChart, PieChart, ProgressChart, ContributionGraph, StackedBarChart, path/point helpers",missing:"visual fidelity inherits react-native-svg text/path/gradient gaps"}]},"react-native-circular-progress":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.9,note:"pure JS circular progress components over react-native-svg",working:"AnimatedCircularProgress, CircularProgress, arc rendering, fill/tint/background props, children render prop",missing:"visual fidelity inherits react-native-svg arc/stroke animation gaps"}]},"react-native-parsed-text":{category:"UI Components",stubType:"works",versions:[{range:">=0.0.20",coverage:.95,note:"pure JS Text parser/renderer over React Native Text",working:"ParsedText component, pattern matching, URL/phone/email presets, custom renderText/onPress/style handlers",missing:"text layout and press fidelity follows the core RN Text implementation"}]},"react-native-otp-entry":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS OTP input built from TextInput, Pressable, View, and hooks",working:"OtpInput component, controlled/uncontrolled code value, focus/blur/clear/setValue refs, paste/backspace handling, secure text entry",missing:"keyboard and TextInput event fidelity follows the core RN implementation"}]},"react-native-skeleton-placeholder":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:.8,note:"pure JS skeleton layout; visual fidelity inherits masked-view and linear-gradient support",working:"SkeletonPlaceholder component, Item tree, border/radius/layout props, speed/direction/background/highlight props",missing:"masking and shimmer fidelity depends on @react-native-masked-view/masked-view, react-native-linear-gradient, and Animated timing"}]},"react-native-snap-carousel":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=3.0.0",coverage:.85,note:"pure JS carousel over ScrollView/FlatList, Animated, and PanResponder",working:"Carousel, Pagination, ParallaxImage, horizontal/vertical layouts, item renderer, snap callbacks",missing:"snap precision, momentum, parallax, and loop timing inherit ScrollView/FlatList/Animated fidelity"}]},"react-native-error-boundary":{category:"Essentials",stubType:"works",versions:[{range:">=3.0.0",coverage:.95,note:"pure JS React error boundary with RN fallback UI",working:"ErrorBoundary component, bundled fallback UI, custom FallbackComponent, onError callback, resetError recovery",missing:"fallback rendering fidelity follows core RN View/Text/Button primitives"}]},"react-native-popover-view":{category:"UI Components",stubType:"works",versions:[{range:">=6.0.0",coverage:.85,note:"pure JS popover over RN Modal, Animated, measure, and touch primitives",working:"Popover component, from/content placement props, arrow/background rendering, show/hide callbacks, adaptive positioning logic",missing:"anchor measurement, Modal layering, and animation fidelity inherit sootsim core RN behavior"}]},"react-native-hyperlink":{category:"UI Components",stubType:"works",versions:[{range:">=0.1.0",coverage:.95,note:"pure JS linkifying Text wrapper using linkify-it/mdurl",working:"Hyperlink component, URL/email/phone detection, linkStyle/linkText, onPress/onLongPress, nested Text traversal",missing:"press and nested text fidelity follows the core RN Text implementation"}]},"react-native-mask-text":{category:"UI Components",stubType:"works",versions:[{range:">=0.15.0",coverage:.95,note:"pure JS masked Text/TextInput helpers",working:"MaskedText, MaskedTextInput, mask/maskType/customMask handling, currency/date/phone/CPF/CNPJ/ZIP helpers",missing:"TextInput editing fidelity follows the core RN implementation"}]},"react-native-image-viewing":{category:"Image",stubType:"works",versions:[{range:">=0.2.0",coverage:.85,note:"pure JS image gallery modal over RN Modal, FlatList, Image, and gestures",working:"ImageViewing component, image paging, header/footer render props, swipe-to-close callbacks, double-tap/zoom plumbing",missing:"gesture, zoom, Modal layering, and image fidelity inherit core RN touch/Image behavior"}]},"react-native-popup-menu":{category:"UI Components",stubType:"works",versions:[{range:">=0.19.0",coverage:.9,note:"pure JS popup menu system over RN Views, touchables, layouts, and BackHandler",working:"MenuProvider, Menu, MenuTrigger, MenuOptions, MenuOption, renderers, context actions, open/close/select flow",missing:"precise option positioning and backdrop behavior depend on measure/layout and touch dispatch fidelity"}]},"react-native-material-textfield":{category:"UI Components",stubType:"works",versions:[{range:">=0.16.0",coverage:.9,note:"pure JS Material text field controls over RN TextInput and Animated",working:"TextField, FilledTextField, OutlinedTextField, labels, affixes, character counter, validation/error props",missing:"floating label animation and TextInput fidelity follow core RN Animated/TextInput"}]},"react-native-root-siblings":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:.8,note:"pure JS sibling overlay manager using React state and AppRegistry wrapping",working:"RootSiblingsManager, RootSiblingParent, RootSiblingPortal, update/destroy lifecycle, setSiblingWrapper",missing:"automatic AppRegistry root wrapping and overlay ordering depend on app entry shape and core AppRegistry capture behavior"}]},"react-native-root-toast":{category:"UI Components",stubType:"works",versions:[{range:">=4.0.0",coverage:.8,note:"pure JS toast manager built on react-native-root-siblings and RN Animated",working:"Toast.show/hide, ToastContainer, duration/position/shadow/animation props, keyboard offset handling",missing:"overlay behavior inherits react-native-root-siblings, Animated, Keyboard, and safe-area fidelity"}]},"react-native-flash-message":{category:"Notifications",stubType:"works",versions:[{range:">=0.4.0",coverage:.85,note:"pure JS flash message/banner component over RN Animated, Dimensions, and touchables",working:"FlashMessage component, showMessage/hideMessage helpers, message queue, icon/title/body rendering, position/duration props",missing:"safe-area/status-bar offsets, animation timing, and gesture dismissal inherit core RN behavior"}]},"react-native-status-bar-height":{category:"Device & Platform",stubType:"works",versions:[{range:">=2.0.0",coverage:.9,note:"pure JS status-bar height helper over Platform and Dimensions",working:"getStatusBarHeight, isIPhoneX, skipAndroid option",missing:"exact model-specific values depend on sootsim Platform/Dimensions device metadata"}]},"react-native-autolink":{category:"UI Components",stubType:"works",versions:[{range:">=4.0.0",coverage:.95,note:"pure JS autolinking Text component using autolinker",working:"Autolink component, URL/email/phone/hashtag/mention matching, custom renderers, linkProps/onPress callbacks",missing:"press and nested text fidelity follows core RN Text behavior"}]},"react-native-section-list-get-item-layout":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure JS getItemLayout calculator for SectionList \u2014 no native runtime surface",working:"section/item/header/footer separator length calculation and SectionList getItemLayout helper generation"}]},"react-native-responsive-screen":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS responsive dimension helpers over RN Dimensions",working:"widthPercentageToDP, heightPercentageToDP, listenOrientationChange, removeOrientationListener",missing:"orientation updates follow core RN Dimensions event fidelity"}]},"react-native-app-intro-slider":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=4.0.0",coverage:.9,note:"pure JS onboarding slider over RN FlatList, Animated, and touchables",working:"AppIntroSlider, renderItem/renderPagination/buttons/dots, next/done/skip callbacks, active index updates",missing:"paging and animation fidelity follows FlatList/Animated behavior"}]},"react-native-controlled-mentions":{category:"UI Components",stubType:"works",versions:[{range:">=3.0.0",coverage:.95,note:"pure JS controlled mentions parser/hooks for RN TextInput",working:"useMentions/useMentionsInput, trigger/part parsing, suggestions state, mention replacement helpers",missing:"selection and editing fidelity follows core RN TextInput behavior"}]},"react-native-responsive-fontsize":{category:"Device & Platform",stubType:"works",versions:[{range:">=0.5.0",coverage:.95,note:"pure JS responsive font-size helpers over RN Dimensions",working:"RFPercentage, RFValue, orientation-aware dimension calculations",missing:"exact values depend on sootsim Dimensions device metrics"}]},"react-native-walkthrough-tooltip":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.85,note:"pure JS walkthrough tooltip over RN Modal, measure, touchables, and View",working:"Tooltip component, child measurement, placement/topAdjustment/displayInsets, overlay rendering, onOpen/onClose callbacks",missing:"anchor measurement, Modal layering, and touch-through behavior inherit core RN fidelity"}]},"react-native-lightbox-v2":{category:"Image",stubType:"works",versions:[{range:">=0.9.0",coverage:.85,note:"pure JS lightbox overlay over RN Modal, Animated, Dimensions, and Image",working:"Lightbox component, overlay open/close, swipe-to-dismiss, renderHeader/renderContent/renderFooter, pinch/drag plumbing",missing:"gesture, image, Modal, and Animated fidelity inherit core RN behavior"}]},"react-native-lightbox":{category:"Image",stubType:"works",versions:[{range:">=0.8.0",coverage:.85,note:"pure JS legacy lightbox over RN Modal, Animated, Touchable, and Image",working:"Lightbox component, active/inactive child rendering, open/close callbacks, swipe-to-dismiss, custom header/content",missing:"layout measurement, Modal layering, Image, and Animated fidelity inherit core RN behavior"}]},"react-native-ui-datepicker":{category:"UI Components",stubType:"works",versions:[{range:">=3.0.0",coverage:.95,note:"pure JS date picker built from RN views and dayjs/lodash helpers",working:"DateTimePicker component, single/range/multiple modes, calendar navigation, locale/Jalali helpers, style/className props",missing:"touch and text rendering fidelity follows core RN primitives"}]},"react-native-shadow-2":{category:"UI Components",stubType:"works",versions:[{range:">=7.0.0",coverage:.75,note:"source-audited pure JS shadow component; visual proof still needed",working:"Shadow component, distance/startColor/endColor/offset/sides/corners props, SVG gradient shadow rendering",missing:"visual fidelity inherits react-native-svg gradient/path support"}]},"react-native-masked-text":{category:"UI Components",stubType:"works",versions:[{range:">=1.13.0",coverage:.85,note:"pure JS masked TextInput/Text helpers using date-and-time and tinymask",working:"TextInputMask, TextMask, mask types, custom text input, money/date/phone/credit-card/cpf/cnpj/zip helpers",missing:"TextInput selection/editing fidelity follows core RN; bundled vanilla-masker DOM helpers are not part of the RN path"}]},"react-native-shimmer-placeholder":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.8,note:"pure JS shimmer placeholder over Animated and react-native-linear-gradient",working:"ShimmerPlaceholder component/createShimmerPlaceholder, visible toggle, shimmer colors/duration/width/location props",missing:"gradient and shimmer animation fidelity inherits react-native-linear-gradient and Animated behavior"}]},"react-native-qrcode-styled":{category:"UI Components",stubType:"works",versions:[{range:">=0.4.0",coverage:.75,note:"source-audited pure JS QR renderer; visual proof still needed",working:"QRCodeStyled component, data/error correction, logo, piece/eye styling, gradient props",missing:"visual fidelity inherits react-native-svg path/gradient/image support"}]},"react-native-map-link":{category:"Device & Platform",stubType:"works",versions:[{range:">=3.0.0",coverage:.8,note:"pure JS map URL/action builder over RN Linking",working:"showLocation, getApps, openMap, app URL construction, installed-app filtering through canOpenURL",missing:"actual native map app launching is represented by browser/RN Linking behavior in sootsim"}]},"@shopify/restyle":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.95,note:"pure JS styling system over React Native components",working:"createTheme, createBox/createText/createRestyleComponent, composeRestyleFunctions, spacing/color/layout/variant helpers, ThemeProvider/useTheme",missing:"rendered output fidelity follows the underlying RN components"}]},"react-native-awesome-slider":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.8,note:"pure JS slider over react-native-reanimated and gesture-handler",working:"Slider component, min/max/progress shared values, pan/tap gestures, marks/bubble/thumb/render props",missing:"gesture and animation fidelity inherits gesture-handler and reanimated worklet support"}]},"react-native-swipe-list-view":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=3.0.0",coverage:.85,note:"pure JS swipeable list rows over RN FlatList/SectionList, Animated, and PanResponder",working:"SwipeListView, SwipeRow, hidden row rendering, left/right open values, row maps, close/open callbacks",missing:"swipe physics, virtualization, and hidden row layout inherit core Animated/List/PanResponder fidelity"}]},"react-native-modalize":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=2.0.0",coverage:.8,note:"pure JS modal sheet over gesture-handler, Animated, ScrollView/FlatList, and RN Modal",working:"Modalize component, open/close refs, snap points, scrollable content, header/footer, overlay callbacks",missing:"sheet physics, gesture conflict handling, and Modal layering inherit lower-level gesture/Animated/RN fidelity"}]},"react-native-toast-notifications":{category:"Notifications",stubType:"works",versions:[{range:">=3.0.0",coverage:.85,note:"pure JS toast provider/hook over RN Animated and view primitives",working:"ToastProvider, useToast, show/update/hide/hideAll, placement/duration/swipeEnabled/renderType/customToast props",missing:"overlay placement, swipe dismissal, and animation timing inherit core RN behavior"}]},"react-native-collapsible-tab-view":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=8.0.0",coverage:.75,note:"pure JS collapsible tabs over reanimated, pager-view, FlatList/ScrollView, and optional FlashList",working:"Tabs.Container, Tab, MaterialTabBar, FlatList/ScrollView/SectionList/MasonryFlashList wrappers, header/tab interpolation plumbing",missing:"collapsible scroll sync and pager physics inherit reanimated, pager-view, and list virtualization fidelity"}]},"react-native-reanimated-table":{category:"UI Components",stubType:"works",versions:[{range:">=0.0.2",coverage:.9,note:"pure JS table components built from RN views",working:"Table, Row, Rows, Cell, Col, Cols, TableWrapper, border/style/textStyle props",missing:"layout and text fidelity follows core RN View/Text behavior"}]},"react-native-marked":{category:"UI Components",stubType:"works",versions:[{range:">=8.0.0",coverage:.55,note:"source-audited pure JS Markdown renderer; complex output needs conformance proof",working:"Markdown renderer, marked parsing, text/list/link/code/table/image token renderers, custom renderer/theme hooks",missing:"SVG, table layout, links, image rendering, and text nesting fidelity inherit lower-level package support"}]},"react-native-country-flag":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.95,note:"pure JS country flag component rendered as Unicode regional indicators in RN Text",working:"CountryFlag component, isoCode lookup, size/style props",missing:"emoji glyph appearance follows the platform font support in Text"}]},"react-native-bouncy-checkbox":{category:"UI Components",stubType:"works",versions:[{range:">=4.0.0",coverage:.7,note:"source-audited pure JS checkbox component; visual/animation proof still needed",working:"BouncyCheckbox component, checked state, icon/text rendering, fill/unfill colors, bounce/press callbacks",missing:"bounce animation and press fidelity follows core RN Animated/Pressable behavior"}]},"react-native-asset":{category:"Image",stubType:"build-only",versions:[{range:">=2.0.0",coverage:1,note:"asset linking CLI only \u2014 mutates native project files at build time and has no tenant runtime surface"}]},"react-native-level-fs":{category:"Storage & Data",stubType:"works",versions:[{range:">=3.0.0",coverage:.65,note:"source-audited pure JS filesystem facade; storage backend behavior still needs runtime validation",working:"fs-style read/write/stat/readdir helpers backed by LevelUP-compatible storage",missing:"persistence and quota behavior inherit asyncstorage-down and the underlying AsyncStorage implementation"}]},"react-native-phone-number-input":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.65,note:"source-audited pure JS phone input; picker/input UI proof still needed",working:"PhoneInput component, libphonenumber validation/formatting, country picker flow, ref helpers",missing:"country picker modal and TextInput editing fidelity inherit lower-level RN component behavior"}]},"react-native-sortables":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=1.0.0",coverage:.6,note:"source-audited pure JS sortable components; drag/drop proof still needed",working:"Sortable, SortableGrid, SortableFlex, SortableLayer, drag/drop ordering, reanimated layout plumbing",missing:"drag physics inherit reanimated/gesture-handler; optional native haptic adapter only works where RNHapticFeedback is available"}]},"react-native-actions-sheet":{category:"Lists & Sheets",stubType:"works",versions:[{range:">=10.0.0",coverage:.6,note:"source-audited pure JS action sheet; sheet interaction proof still needed",working:"ActionSheet, SheetManager, SheetProvider, router/snap points, scrollable content, keyboard-aware movement",missing:"sheet physics, worklet timing, gesture conflicts, and Modal layering inherit lower-level support"}]},"react-native-network-logger":{category:"Analytics",stubType:"works",versions:[{range:">=2.0.0",coverage:.75,note:"source-audited pure JS development network inspector; runtime interception proof still needed",working:"startNetworkLogging, stopNetworkLogging, getRequests, clearRequests, NetworkLogger component, request detail UI",missing:"coverage depends on the tenant runtime fetch/XHR surfaces and does not observe native networking outside JS"}]},"react-native-geocoding":{category:"Device & Platform",stubType:"works",versions:[{range:">=0.5.0",coverage:.95,note:"pure JS Google Geocoding API client over fetch",working:"init, isInit, from address/latlng/object forms, query serialization, Google response/error handling",missing:"requires a real Google API key and browser fetch access"}]},"react-native-heroicons":{category:"UI Components",stubType:"works",versions:[{range:">=4.0.0",coverage:.75,note:"source-audited pure JS Heroicons components; visual proof still needed",working:"outline/solid/mini/micro icon component exports, size/color/stroke/fill props",missing:"visual fidelity inherits react-native-svg path rendering"}]},"react-native-indicators":{category:"UI Components",stubType:"works",versions:[{range:">=0.17.0",coverage:.65,note:"source-audited pure JS loading indicators; animation proof still needed",working:"BallIndicator, BarIndicator, DotIndicator, MaterialIndicator, PacmanIndicator, PulseIndicator, SkypeIndicator, UIActivityIndicator, WaveIndicator",missing:"animation timing fidelity follows core RN Animated behavior"}]},"react-native-timer-picker":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.7,note:"source-audited pure JS timer picker; picker UI proof still needed",working:"TimerPicker, TimerPickerModal, hour/minute/second controls, callbacks, modal props, theme/styles",missing:"scroll snapping and Modal fidelity follows core RN behavior"}]},"react-native-autocomplete-dropdown":{category:"UI Components",stubType:"works",versions:[{range:">=5.0.0",coverage:.65,note:"source-audited pure JS autocomplete dropdown; dropdown UI proof still needed",working:"AutocompleteDropdown, controller API, debounce, suggestions list, clear/chevron icons, loading state",missing:"dropdown placement, keyboard behavior, and SVG icon fidelity inherit lower-level RN support"}]},"react-native-phone-input":{category:"UI Components",stubType:"works",versions:[{range:">=1.3.0",coverage:.65,note:"source-audited pure JS phone input; picker/input UI proof still needed",working:"PhoneInput component, country selection, formatting/validation helpers, flag/text customization",missing:"picker modal and TextInput editing fidelity inherit lower-level RN support"}]},"expo-router":{category:"Navigation",stubType:"works",versions:[{range:">=4.0.0",coverage:.93,note:"pure JS file-based router on top of @react-navigation; all routing/loaders/deep linking runs unmodified, three iOS native components are not yet stubbed",working:"Stack, Tabs, Slot, Drawer, Modal, Link, Redirect, useRouter, useLocalSearchParams, useGlobalSearchParams, usePathname, useSegments, useFocusEffect, useNavigation, withLayoutContext, ErrorBoundary, RootHTMLForReactNative, file-based routing, dynamic segments, route groups, typed routes, loaders, deep linking, server-rendered routes (SSR via vxrn)",missing:"<Head> page-title module (iOS-only ExpoHeadModule not stubbed), Link.Preview iOS context-menu preview (LinkPreview native view not stubbed), iOS Toolbar component (RouterToolbarModule not stubbed), native-tabs (UITabBarController-backed Tabs)"}]},"expo-manifests":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=0.13.0",coverage:1,note:"build-only \u2014 the published 57.0.1 JavaScript entry build/Manifests.js contains only `export {}`; the package carries native manifest parser/types infrastructure and exposes no application runtime API"}]},"expo-json-utils":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=0.13.0",coverage:1,note:"build-only \u2014 the published 57.0.1 JavaScript entry index.js contains only `module.exports = null`; the package is native-side JSON utility code used internally by Expo and exposes no application runtime API"}]},"expo-structured-headers":{category:"Expo SDK",stubType:"build-only",versions:[{range:">=4.0.0",coverage:1,note:"build-only \u2014 the published 57.0.0 tarball declares index.js as main but omits that file entirely; it contains Java and Objective-C structured-header parsers and no application runtime JavaScript API"}]},"@bacons/apple-targets":{category:"Expo SDK",stubType:"native",versions:[{range:">=4.0.0 <6.0.0",coverage:.65,note:"native-seam only \u2014 the published ExtensionStorage wrapper runs unchanged against an app-group-keyed UserDefaults analogue; the package also keeps its Expo config-plugin and Apple-target generation paths at build time",working:"ExtensionStorage constructor, string/number/object/array set and get, remove, app-group suite isolation, reloadWidget, and reloadControls",missing:"persistence across simulator restarts, sharing with a real Apple extension process, and WidgetKit or Control Center timeline reloads"}]},"@react-native-assets/slider":{category:"UI Components",stubType:"works",versions:[{range:">=11.0.0",coverage:1,note:"pure-JS slider built on PanResponder + Animated \u2014 runs as-is from bundle, no native modules",working:"Slider, RangeSlider, value/minimumValue/maximumValue, step, onValueChange/onSlidingStart/onSlidingComplete, minimum/maximum/thumb tint colors, custom thumb/track components"}]},"react-native-remix-icon":{category:"UI Components",stubType:"works",versions:[{range:">=4.0.0",coverage:1,note:"pure-JS icon set built on react-native-svg \u2014 runs as-is when SVG is supported",working:"RemixIcon component, name/size/color props, full Remix icon catalog rendered through react-native-svg"}]},"react-native-styled-text":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:1,note:"pure-JS Text wrapper that parses inline tags \u2014 runs as-is on base RN Text",working:"StyledText component, inline tag parsing, textStyles prop with named style overrides, nested styled spans"}]},"react-native-datepicker":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:1,note:"pure-JS modal datepicker \u2014 runs as-is from bundle, no native modules",working:"DatePicker component with date/time/datetime modes, format prop, minDate/maxDate, custom styles, open/close imperative API, locale via moment"}]},"@intercom/intercom-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=8.0.0",coverage:.6,note:"telemetry calls may remain unavailable by scoring policy, but the reference iOS simulator presents the messenger and help-center UI that SootSim omits",working:"full upstream JS surface (Intercom object + correct enums + IntercomEvents); initialize, login/logout/updateUser/setUserHash/setUserJwt, logEvent, present* (accepted), help-center collection/article/search (empty), getUnreadConversationCount (0), visibility/padding/theme/loglevel setters, push token, event-listener wiring",missing:"no chat UI presentation, no help center fetches return real data, no push token delivery to Intercom servers"}]},"@braze/react-native-sdk":{category:"Analytics",stubType:"native",versions:[{range:">=10.0.0",coverage:0,note:"the reference iOS simulator presents Braze in-app messages and content cards. SootSim accepts the API calls but presents neither surface, so import safety receives no behavior credit",working:"full upstream JS surface (Braze singleton + all setters/loggers, models, in-app-message UI, ContentCardTypes); changeUser/identity, custom events/purchases/attributes (locally accepted), content cards / banners / feature flags resolve empty, in-app-message + push permission APIs, getInitialURL/PushPayload, location + ad-tracking setters, listener registration",missing:"no Braze backend \u2014 no event/session delivery, no remote content cards / banners / feature flags, no push token registration, no server-driven in-app messages; intentionally absent for the development simulator"}]},"@braze/expo-plugin":{category:"Analytics",stubType:"build-only",versions:[{range:">=2.0.0",coverage:1,note:"build-only \u2014 the published 5.2.0 JavaScript entry build/withBraze.js is an Expo createRunOncePlugin that mutates Android and iOS projects during prebuild; it exposes no application runtime API"}]},"@bugsnag/react-native":{category:"Analytics",stubType:"native",versions:[{range:">=8.0.0",coverage:.95,note:"crash-reporting SDK with full noop surface per the docs/compat-scoring.md rule \u2014 Bugsnag.start/notify/leaveBreadcrumb/setUser/addMetadata + onError handlers all accepted; delivery is intentionally absent in the browser preview.",working:"Bugsnag singleton, start/notify/leaveBreadcrumb/setUser/clearUser/addMetadata/clearMetadata/getMetadata, addFeatureFlag/clearFeatureFlag/clearFeatureFlags, startSession/pauseSession/resumeSession, getContext/setContext, onError/onSession/onBreadcrumb listeners",missing:"no error reports delivered, no breadcrumbs sent \u2014 same constraint as every crash-reporting SDK in browser preview (matches docs guidance)"}]},"@bugsnag/react-native-performance":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"performance-analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 start/startSpan/startNavigationSpan return noop spans; delivery intentionally absent in browser preview.",missing:"no spans delivered \u2014 same constraint as every performance-analytics SDK in browser preview"}]},"@posthog/react-native-plugin":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.1 <3.0.0",coverage:.95,note:"native-seam only \u2014 the published 2.0.1 and 2.3.1 JavaScript wrappers run unchanged against one PosthogReactNativePlugin seam; session-replay, native-error, and push bridges stay load-safe in their disabled state, and delivery is intentionally absent per the analytics/session-replay scoring rule",working:"2.0.1 named and default exports: setup/start/startSession/endSession/identify/startRecording/stopRecording/isEnabled=false; later 2.x exports reset, addExceptionStep, push-token register/unregister, setOptOut, capturePushNotificationOpened, and setPushIdentityProvider with NativeEventEmitter listener bookkeeping; the shared seam backs both surfaces",missing:"no session capture or replay upload, native exception capture, push subscription or notification-open delivery, or push-identity request events \u2014 intentionally absent for the development simulator"}]},"posthog-react-native-session-replay":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"native-seam only: the real posthog-react-native-session-replay runs from the bundle (start/startSession/endSession/identify/startRecording/stopRecording/isEnabled + default export \u2014 all upstream JS). its published surface is fully covered by the shared PosthogReactNativeSessionReplay module, which also carries the renamed plugin superset: recording actions resolve without capturing and isEnabled() reports false \u2014 the same clean state an app sees with replay unconfigured. per docs/compat-scoring.md session-replay rule, delivery is intentionally absent",working:"full upstream JS surface (named exports + default module), start/startSession/endSession/identify/startRecording/stopRecording resolve, isEnabled resolves false",missing:"no session capture, no canvas recording, no replay upload \u2014 intentionally absent for the development simulator (no PostHog replay backend)"}]},"customerio-reactnative":{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: native-seam only: the real customerio-reactnative runs from the bundle (CustomerIO object, CioRegion/CioLogLevel/CioPushPermissionStatus enums, in-app/push/notification-inbox wrappers : all upstream JS, no fabricated values). we stub only the five codegen modules (NativeCustomerIO/Logging/Location/MessagingPush/MessagingInApp), mirroring src/specs/modules/*@6.x exactly: calls accepted, getMessages/token empty, push permission reports NOTDETERMINED (fresh-sim), event-emitter properties return removable no-op subscriptions. per docs/compat-scoring.md analytics rule, delivery is intentionally absent. imports and API shape receive no behavior credit",working:"full upstream JS surface (CustomerIO object + correct enums + in-app/push/inbox wrappers); initialize/identify/track/screen, profile+device attributes, device-token register/delete, trackMetric, push receipt/permission APIs, in-app dismiss + inbox getMessages/mark/track, all three event-emitter subscriptions (no-op removable)",missing:"no events sent, no profile sync, no in-app messages displayed, push token not registered"}]},"newrelic-react-native-agent":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"load-safe noop \u2014 NewRelic.startAgent + record* methods + interaction tracking. no metrics, errors, or events are transmitted from the browser simulator and interaction ids are placeholders; delivery is intentionally absent, so an app behaves exactly as it would with a live agent."}]},appcenter:{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:.55,note:"load-safe noop \u2014 AppCenter retired 2025-03-31; setUserId/setEnabled/getInstallId/setLogLevel return placeholder values (matches appcenter-analytics / appcenter-crashes scoring)",missing:"service is end-of-life upstream; no telemetry would land regardless. install id is a fixed placeholder"}]},"appcenter-analytics":{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"load-safe noop \u2014 Analytics.trackEvent/trackPageView/setEnabled with no event delivery (AppCenter EOL)",missing:"no events delivered (service is end-of-life)"}]},"appcenter-crashes":{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"crash-reporting SDK with full noop surface per the docs/compat-scoring.md rule \u2014 Crashes.setEnabled/generateTestCrash/notifyUserConfirmation + UserConfirmation constants exposed; delivery intentionally absent in browser preview.",missing:"no crash reports delivered \u2014 same constraint as every crash-reporting SDK in browser preview (service is also end-of-life upstream)"}]},"@fullstory/react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"development noop \u2014 native-seam only: the real @fullstory/react-native runs from the bundle (FSPage, LogLevel, host component, applyFSPropertiesWithRef, FS_REF_SYMBOL all upstream); we stub only the FullStory + FullStoryPrivate TurboModules as structurally-correct noops mirroring NativeFullStory.ts/NativeFullStoryPrivate.ts. API surface is load-safe and no session data is sent from sootsim",working:"full upstream JS surface (FSPage class, LogLevel enum, host component, applyFSPropertiesWithRef, FS_REF_SYMBOL), anonymize/identify/setUserVars/event/log/consent/shutdown/restart/resetIdleTimer, startPage/endPage/updatePage, onReady/getCurrentSession/getCurrentSessionURL, onSessionStarted listener registration, FullStoryPrivate onFSPressForward",missing:"real session-replay video, rage-tap detection, DOM mutation feed, network capture \u2014 intentionally absent for the development simulator (no FullStory backend wired up)"}]},"@iterable/react-native-sdk":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: native-seam only: the real @iterable/react-native-sdk runs from the bundle (the Iterable class, inbox/embedded/in-app managers, and the authoritative enums : all upstream JS, no fabricated enum values). we stub only the RNIterableAPI TurboModule, mirroring src/api/NativeRNIterableAPI.ts@2.x (Spec) exactly: init resolves true (SDK initialized but offline), every getter returns the inert no-data value, handleAppLink resolves false so app routing takes over. per docs/compat-scoring.md analytics rule, delivery is intentionally absent. imports and API shape receive no behavior credit",working:"full upstream JS surface (Iterable class + inbox/embedded managers + correct enums); initialize, setEmail/UserId, in-app + inbox + embedded message getters (empty), track* events, commerce, updateUser/Email/subscriptions, attribution, session + embedded-impression tracking, auth token, listener registration",missing:"no push registration with Iterable backend, no in-app/embedded message fetch, no email/userId persisted server-side \u2014 intentionally absent for the development simulator (no Iterable backend)"}]},"react-native-google-mobile-ads":{category:"Analytics",stubType:"native",versions:[{range:">=14.0.0",coverage:0,note:"the reference iOS simulator renders Google test ads and presents consent flows. SootSim reports no-fill for every ad and presents no consent UI, so import safety receives no behavior credit",working:"initialize, setRequestConfiguration, setAppMuted, openAdInspector, openDebugMenu, AdsConsent: requestInfoUpdate / loadAndShowConsentFormIfRequired / getConsentInfo / reset / showPrivacyOptionsForm, InterstitialAd / RewardedAd / RewardedInterstitialAd / AppOpenAd / GAM* classes with load/show/destroy and addAdEventListener returning unsubscribe, BannerAd / GAMBannerAd / RewardedAdEventType / AdEventType / AdsConsentStatus / AdsConsentDebugGeography / BannerAdSize / MaxAdContentRating / TestIds constants",missing:"no real ad delivery \u2014 same constraint as every ad-network SDK in iOS-simulator / browser preview"}]},"react-native-callkeep":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:'full RNCallKeep surface as load-safe noop \u2014 CallKit / ConnectionService is unavailable in the iOS simulator too, so consumer code that branches on getCalls=[] takes the no-call path identically. matches docs/compat-scoring.md "score it high only when the full public API surface is present and returns the same unavailable/clean state an app should expect in development."',working:"RNCallKeep.setup, setAvailable, displayIncomingCall, startCall, endCall, endAllCalls, answerIncomingCall, rejectCall, setMutedCall, setOnHold, sendDTMF, updateDisplay, getCalls (empty), registerPhoneAccount, setReachable, hasPhoneAccount, checkIfBusy, checkSpeaker, isCallActive, END_CALL_REASONS / AUDIO_ROUTE / HANDLE_TYPE constants, all addEventListener handlers",missing:"no system call screen \u2014 same constraint as the iOS simulator. recommended on web: integrate WebRTC + a custom call UI surface"}]},"react-native-store-review":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.5.0",coverage:.85,note:"native-seam: the requestReview() wrapper + not-linked guard run from the bundle; the RNStoreReview TurboModule faithfully mirrors the iOS-simulator SKStoreReviewController contract \u2014 requestReview() is a silent void no-op (no prompt on a sim, no throw), exactly the package\u2019s entire one-method Spec. same faithful-unavailable tier as react-native-rate-app / react-native-mail / expo-mail-composer.",working:"requestReview(): void \u2014 matches upstream\u2019s exact single-method Spec; the JS not-linked guard sees a present native module and runs the real path instead of throwing",missing:"no visible in-app rating prompt (the iOS simulator shows none either \u2014 faithful iOS-sim behavior, not a sootsim-specific gap)"}]},"react-native-android-location-enabler":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.45,note:'mirrors upstream Android-only constraint \u2014 promptForEnableLocationIfNeeded rejects with a clear "Android-only" error so apps with platform branches take the right path on iOS / web',missing:"no system location-services dialog (Android-specific Settings.Secure flow has no browser equivalent)"}]},"react-native-purchases":{category:"Auth & Payments",stubType:"native",versions:[{range:">=9.0.0",coverage:.97,note:"native-seam only. real react-native-purchases JS (Purchases singleton, CustomerInfo/Offerings parsers, AppUserID generation, listener fan-out) runs from the bundle against RNPurchases. the default reproduces a RevenueCat project with no products: canMakePayments=false, empty offerings, and stable unsubscribed CustomerInfo. an opt-in catalog mirrors RevenueCat Test Store with exact offering/package/product shapes, standard package identifiers, sandbox transactions, entitlement grants, restore behavior, and customer-info events. all attribution setters accept noops so analytics call sites do not throw.",working:"configure/setup, configurable Test Store products/packages/offerings, $rc_monthly/$rc_annual package slots, getCustomerInfo, purchaseProduct/purchasePackage sandbox transactions, entitlement grants, customer-info listeners, cancel/product-not-found errors, canMakePayments, identity, restorePurchases, and attribution setters",missing:"no live StoreKit or Play Billing, receipt validation backend, promotional/win-back/subscription-option purchases, refund or subscription-management sheets, or native RevenueCat paywall UI"}]},"react-native-purchases-ui":{category:"Auth & Payments",stubType:"native",versions:[{range:">=8.0.0",coverage:0,note:"the reference iOS simulator renders configured RevenueCat paywalls. SootSim always returns NOT_PRESENTED and renders no paywall, so import safety receives no behavior credit",working:"RevenueCatUI singleton, presentPaywall (NOT_PRESENTED), presentPaywallIfNeeded (NOT_PRESENTED), presentCustomerCenter (rejects clearly), PAYWALL_RESULT enum (NOT_PRESENTED, ERROR, CANCELLED, PURCHASED, RESTORED)",missing:"no native paywall \u2014 same constraint as iOS simulator without StoreKit. pair with react-native-purchases for the full IAP flow"}]},"react-native-tcp-socket":{category:"Networking",stubType:"native",versions:[{range:">=6.0.0",coverage:.75,note:'load-safe error stub \u2014 Socket / Server / TLSSocket classes plus createServer/createConnection/connect throw a clear "unavailable in browser preview" error so apps with TCP-only paths fail visibly; isIP/isIPv4/isIPv6 helpers return false',missing:"no raw outbound TCP/TLS sockets (browsers only allow WebSocket / fetch); all socket APIs reject"}]},"expo-share-intent":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.3,note:"load-safe noop \u2014 useShareIntent hook reports hasShareIntent=false consistently; ShareIntentProvider passthrough; getShareIntent resolves null. apps with conditional UI on incoming shares take their no-share branch",missing:"no iOS Share Extension / Android ACTION_SEND intent target \u2014 browsers cannot register a system share target. ShareIntentTypes constants exposed for type-checked imports"}]},realm:{category:"Storage & Data",stubType:"native",versions:[{range:">=12.0.0",coverage:.6,note:"in-memory browser Realm with transactional local CRUD, migrations, listeners, sorting, and boolean/set queries",working:"path-scoped open/reuse/close, schemas and primary keys, write/create/update with rollback, objects, primary-key lookup, grouped AND/OR equality and IN filters, single-field sorting, delete/deleteAll/deleteFile, string/config exists, schemaVersion and onMigration, instance listeners, ObjectId, and UUID",missing:"persistence across preview-worker restarts, Results/Object change listeners, Realm Sync/subscriptions, backlinks, distinct and multi-field sorting, and the full Realm query language"}]},"react-native-html-to-pdf":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.12.0",coverage:.75,note:'load-safe error stub \u2014 convert() rejects with a clear "use server-side renderer" error',missing:"no native PDF generation (UIPrintInteractionController / Android PdfDocument have no browser equivalent that returns a base64 file). recommended swap: server-side puppeteer/wkhtmltopdf or jsPDF in-browser"}]},"@kingstinct/react-native-healthkit":{category:"Health",stubType:"native",versions:[{range:">=10.0.0",coverage:.85,note:"load-safe noop \u2014 isHealthDataAvailable=false, authorizationStatusFor=NotDetermined, all queries return empty, save/delete return false. apps with optional HealthKit gated on isHealthDataAvailable take their fallback path",missing:"no HealthKit data store in browser. queries return empty; identifier/unit constants are loose Proxy-based string returns to keep type-checked imports resolving"}]},"react-native-track-player":{category:"Media",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setupPlayer/queue ops/playback controls accepted; getPlaybackState returns State.None; full Event / Capability / RepeatMode / RatingType / IOSCategory enum surface; useTrackPlayerEvents/useProgress/useActiveTrack/usePlaybackState/usePlayWhenReady/useIsPlaying hooks return idle defaults. imports and API shape receive no behavior credit",missing:'no MPMediaPlayer / ExoPlayer integration; no MediaSession / lock-screen controls (browsers have MediaSession but the API surface diverges). State machine stays in None so apps branch on "not playing"'}]},"react-native-windows":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.70.0",coverage:.85,note:"load-safe noop \u2014 Windows-only runtime; exposes a default + Windows namespace so type-checked cross-platform code resolves on iOS/Android/web",missing:"no UWP / WinUI rendering \u2014 Windows-specific APIs throw"}]},"react-native-incall-manager":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"full InCallManager surface as a load-safe unavailable state. the iOS simulator has no proximity sensor or device audio route to change, so apps see the same unavailable behavior",working:"start, stop, turnScreenOn, turnScreenOff, setKeepScreenOn, setSpeakerphoneOn, setForceSpeakerphoneOn, setMicrophoneMute, startRingtone, stopRingtone, startProximitySensor, stopProximitySensor, startRingback, stopRingback, pokeScreen, getAudioUriJS, chooseAudioRoute (Speaker default), requestAudioFocus, abandonAudioFocus",missing:"no system AVAudioSession / AudioManager \u2014 same constraint as the iOS simulator"}]},"react-native-zeroconf":{category:"Networking",stubType:"native",versions:[{range:">=0.13.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Zeroconf class with on/off/scan/stop/publishService/getServices accepts every call; no events ever fire so apps with discovery-required UI take their no-services branch. imports and API shape receive no behavior credit",missing:"no mDNS / Bonjour discovery \u2014 browsers have no local network discovery API"}]},"react-native-background-geolocation":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: ready() resolves with enabled=false; configure/start/stop accepted; all on* listeners register but never fire; getProviderState reports gps:false; getCurrentPosition rejects so apps branch on geolocation-unavailable. imports and API shape receive no behavior credit",missing:"no background process \u2014 browsers have no equivalent to the iOS background-fetch / Android foreground service that this SDK schedules. AuthorizationStatus exposed for type-checked code"}]},"react-native-health-connect":{category:"Health",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"load-safe noop \u2014 getSdkStatus reports Unavailable; initialize=false; queries return empty {records, pageToken}; insertRecords returns []. apps with platform branches take their unavailable path",missing:"no Android Health Connect on iOS / web. SdkAvailabilityStatus / PermissionAccess constants exposed for type-checked code"}]},"react-native-capture-protection":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: prevent/allow/preventForCapture/preventForScreenshot/preventForScreenRecord accepted; getPreventStatus reports allow/allow; useCaptureProtection hook returns idle status. apps with screenshot-blocking UI run unaffected. imports and API shape receive no behavior credit",missing:"browsers have no screenshot / screen-recording prevention. CaptureProtectionStatus enum exposed"}]},"react-native-exit-app":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:'native-seam: the exitApp() wrapper runs from the bundle; the RNExitApp TurboModule is a faithful no-op \u2014 this IS the complete correct contract, not a gap: Apple\u2019s HIG forbids App Store apps from self-terminating and a browser cannot close its tab, so an app calling exitApp() on real iOS already gets nothing user-visible. same faithful "the platform cannot do this, so the no-op is correct" tier as react-native-orientation-locker.',working:"exitApp() \u2014 matches upstream\u2019s exact single-method Spec; faithful complete behavior (no-op, as on real iOS App Store apps)",missing:"none functionally \u2014 the package\u2019s sole purpose (terminate the app) is intentionally unavailable on both iOS App Store apps and browsers; the no-op is the faithful contract, not an unimplemented feature"}]},"react-native-notifications":{category:"Notifications",stubType:"native",versions:[{range:">=5.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Notifications.events() returns subscribers that never fire; registerRemoteNotifications accepts the call without registering; postLocalNotification returns 0; ios/android namespaces accept badge / channel / category ops; isRegisteredForRemoteNotifications=false. imports and API shape receive no behavior credit",missing:"no APNs / FCM token registration; no native notification UI delivered. recommended swap: expo-notifications which sootsim renders through the shell-native UI provider"}]},"@nozbe/watermelondb":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.27.0",coverage:.75,note:"upstream WatermelonDB runs over a real asynchronous WMDatabaseBridge backed by SootSim's persistent browser SQLite engine; apps requesting JSI use WatermelonDB's supported asynchronous fallback",working:"database initialization, schema setup and migrations, find/query/queryIds/raw queries/count, transactional batch and batchJSON writes, reset/vacuum/multi-statement execution, record caching, and local storage",missing:"synchronous nativeWatermelonCreateAdapter JSI dispatch, queryAsArray compression, unsafeLoadFromSync/provideSyncJson turbo sync, native exclusive locking, and unsafe native connection reuse"}]},"@rocket.chat/mobile-crypto":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.2.0",coverage:.9,note:"native-seam: the real package JavaScript runs over browser Web Crypto with the native MobileCrypto encodings and key formats",working:"SHA digests, PBKDF2, HMAC-SHA256, AES-CBC/GCM, secure random bytes/keys/UUIDs, RSA-OAEP encrypt/decrypt, RSA PKCS#1 signatures, and PEM/JWK import/export",missing:"native-path AES file transforms and file checksums; browser callers must supply bytes rather than native filesystem paths"}]},"@livekit/react-native":{category:"Networking",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: registerGlobals is a noop; AudioSession namespace accepts startAudioSession/stopAudioSession/configureAudio/selectAudioOutput; setupURLPolyfill noop. recommended swap on web: livekit-client directly. imports and API shape receive no behavior credit",missing:"no native LiveKit RTC bindings \u2014 browsers have WebRTC but lack LiveKit's background-audio + hardware-codec extensions. registerForPushNotifications rejects"}]},"@livekit/react-native-webrtc":{category:"Networking",stubType:"native",versions:[{range:">=125.0.0",coverage:.85,note:"load-safe noop \u2014 registerGlobals/setupReactNativeWebRTC accept calls; on web the global navigator.mediaDevices / RTCPeerConnection are already present so no patching is required",missing:"no native iOS/Android WebRTC bindings. apps that need raw camera capture should use the browser getUserMedia API directly"}]},"expo-iap":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.45,note:"load-safe noop \u2014 initConnection=false (apps branch on no-IAP), getProducts/getSubscriptions/getAvailablePurchases return empty arrays, requestPurchase rejects with E_IAP_NOT_AVAILABLE. PurchaseError class + ErrorCode/IAPErrorCode/IapEvent enums exposed for type-checked code",missing:"no StoreKit / Play Billing \u2014 same constraint as react-native-purchases. paywall flows take their offline branch"}]},"react-native-sqlite-storage":{category:"Storage & Data",stubType:"native",versions:[{range:">=6.0.0",coverage:.85,note:"real persistent SQLite via the same lazy-loaded bedrock-sqlite WASM backend as expo-sqlite/op-sqlite/nitro-sqlite \u2014 memfs persists to the tenant-scoped IDB so a reopened database keeps its rows. faithfully mirrors upstream sqlite.js: the default callback style (openDatabase/executeSql/transaction/readTransaction/sqlBatch/close/deleteDatabase) and the enablePromise(true) toggle that swaps every method to promise variants on the same prototypes via the same config table. verified end-to-end against the on-disk bedrock build in the compat suite (callback CRUD + transaction + sqlBatch + close/reopen persistence + promise-mode).",working:"SQLite.openDatabase (object + positional forms), deleteDatabase, enablePromise toggle, DEBUG/getAllDatabases; per-db executeSql (rows.length/item/raw, rowsAffected, insertId), transaction/readTransaction with queued tx.executeSql, sqlBatch, close (handle cached for fast reopen), default `new SQLiteFactory()` export \u2014 all backed by real bedrock SQL (joins, params, RETURNING)",missing:"ATTACH/DETACH across databases (a second memfs open \u2014 parked until a consumer needs it); the slightly broader async/prepared-statement surface that expo-sqlite exposes natively (use expo-sqlite for that)"}]},"@walletconnect/react-native-compat":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:1,note:"load-safe noop \u2014 this is itself a polyfill package that monkey-patches global objects (Buffer, crypto, async-storage). on sootsim those globals are already wired by our compat layer so importing this is a no-op import; default export is an empty object. its only job is done, though WalletConnect itself is not exercised end to end here."}]},"@aws-amplify/react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.6,note:"the random-value and storage helpers use SootSim primitives, but computeS3Etag and device identity return placeholders while the reference iOS simulator computes real results",missing:"no real AWS SDK calls (Amplify's data-layer talks over fetch/WebSocket which is what runs anyway). flagged 0.5 because no app-side end-to-end coverage yet"}]},"react-native-quick-crypto":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.7.0",coverage:.9,note:"native-seam only. Real react-native-quick-crypto JS runs from the bundle against either a SootSim-provided global.__QuickCryptoProxy or registered Nitro hybrid objects. The seam implements random, hash/HMAC, PBKDF2, AES-CBC/CTR/GCM, AES secret-key handles, and asynchronous RSA-OAEP WebCrypto key generation and encryption.",working:"upstream package JS and export surface, global __QuickCryptoProxy and Nitro hybrid-object install before module evaluation, random/randomFill/getRandomValues via upstream JS, createHash/createHmac host objects, pbkdf2 callback/promise form and pbkdf2Sync, AES-CBC/GCM/CTR host ciphers, AES WebCrypto secret-key import/export and encrypt/decrypt, RSA-OAEP subtle.generateKey plus JWK export/import and encrypt/decrypt",missing:"synchronous RSA key generation and publicEncrypt/publicDecrypt/privateDecrypt, createSign/createVerify, ECDH WebCrypto key paths, general asymmetric DER import, AES-KW, and legacy ciphers such as DES/RC4/ChaCha20."}]},"react-native-nitro-crypto":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.3.0",coverage:.55,note:"small compatibility surface backed by the react-native-quick-crypto native proxy for existing SootSim callers; this is not the quick-crypto package replacement and should be replaced by a native-seam-only Nitro Modules implementation when that package becomes a priority.",working:"createHash plus subtle/webcrypto references for load-safe consumers",missing:"full upstream react-native-nitro-crypto package JS/native contract is not modeled yet"}]},"react-native-nitro-totp":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"registers the NitroHotp/NitroTotp/NitroSecret hybrid objects used by upstream JS; HOTP/TOTP are HMAC-backed and secret generation uses secure random Base32.",working:"upstream NitroHotp, NitroTotp, and NitroSecret classes run unchanged through react-native-nitro-modules; SHA1/SHA256/SHA512 HOTP, TOTP currentTime/period/window validation, and compact/standard/extended secret generation",missing:"auth URL generation remains upstream JS; browser preview does not persist generated secrets unless the app stores them"}]},"react-native-rsa-signer":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.9,note:"native RNRsaSigner seam backed by WebCrypto RSASSA-PKCS1-v1_5 SHA-256 key generation and signing.",working:"getPublicKey lazily creates and returns a PEM public key per alias, regenerateKey replaces an alias keypair, sign returns a URL-safe base64 RSA/SHA-256 signature verifiable against the returned public key",missing:"keys are stored in-memory for the tenant runtime rather than OS Keychain/Android Keystore persistence"}]},"react-native-worklets-core":{category:"Animation",stubType:"native",versions:[{range:">=1.0.0",coverage:.5,note:"callbacks run, but every worklet stays on the main JavaScript thread while the reference iOS simulator executes worklets on their dedicated runtime",missing:"no off-thread JS execution (matches our react-native-worklets-pkg stub story). complex worklet pipelines that actually need parallelism will see degraded performance, not crashes"}]},"react-native-webrtc":{category:"Networking",stubType:"native",versions:[{range:">=125.0.0",coverage:.7,note:"load-safe pass-through \u2014 RTCPeerConnection / RTCIceCandidate / RTCSessionDescription / MediaStream / MediaStreamTrack / mediaDevices forwarded from globalThis (browsers have these natively); registerGlobals is a noop; RTCView component renders null since we have no host-side video bridge yet",missing:"RTCView visual rendering needs a host bridge that paints a video element into the device frame (deferred). raw audio/video peer connections work via the browser globals"}]},"react-native-unistyles":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: UnistylesRuntime exposes plausible iOS portrait defaults (insets matching iPhone safe-area, screen 393x852, fontScale 1, pixelRatio 3); StyleSheet/mq/withUnistyles passthrough; useUnistyles returns a {rt, theme} shape. imports and API shape receive no behavior credit",missing:"no breakpoint-driven rebuilds (browsers can do this via CSS but the unistyles state machine needs JSI hooks). theme switching via setTheme is a noop"}]},"rive-react-native":{category:"Animation",stubType:"native",versions:[{range:">=8.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Rive component renders null (no native renderer in browser); Fit/Alignment/Direction/LoopMode/RiveRenderer enums exposed for type-checked code. imports and API shape receive no behavior credit",missing:"no Rive .riv runtime \u2014 would need shipping the Rive WASM and wiring a canvas (deferred). apps that use Rive for branding/loading animations run cleanly without the visual"}]},"@rive-app/react-native":{category:"Animation",stubType:"native",versions:[{range:">=8.0.0",coverage:.6,note:"identical surface to rive-react-native \u2014 the new official package is just a rename. shares the same noop stub",missing:"same as rive-react-native \u2014 no .riv runtime"}]},"@nandorojo/galeria":{category:"UI Components",stubType:"native",versions:[{range:">=0.5.0",coverage:.92,note:"native-seam only - upstream Galeria root / Galeria.Image / context run from the bundle; the Expo Galeria view manager opens SootSim's shared image viewer with thumbnail transition, Galeria-specific chrome, swipe, pinch, rotation, double-tap zoom, and dismiss",working:"Galeria root, Galeria.Image, grouped urls, Image.resolveAssetSource mapping, tap-to-open from thumbnail, grouped thumbnail registry for close transitions, fullscreen viewer, adjacent-image swipe, pinch/rotate/double-tap zoom, vertical dismiss, close control, right nav action callback, page indicators, hidePageIndicators, hideBlurOverlay, light/dark theme, onIndexChange, onDismiss, onLongPress",missing:"SF Symbol names render as textual controls instead of exact symbol glyphs; no native blur effect when blur overlay is shown; natural image dimensions are async and fall back to screen aspect until measured"}]},"rn-fetch-blob":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.12.0",coverage:.9,note:"true alias for react-native-blob-util (0.93) \u2014 rnFetchBlobAlias re-exports the same module at runtime, so apps importing rn-fetch-blob get exactly the same surface. slight discount for callback-API differences in the older flavor",missing:"see react-native-blob-util"}]},"expo-gl":{category:"UI Components",stubType:"native",versions:[{range:">=15.0.0",coverage:.9,note:"native-seam only. upstream GLView and context APIs run from the guest bundle over the browser WebGL2 implementation in the tenant worker",working:"GLView context creation, WebGL2 commands, endFrameEXP presentation, view resizing, headless createContextAsync and destroyContextAsync, full-canvas snapshots, and @react-three/fiber native Canvas rendering",missing:"camera textures, native object destruction, experimental worklet contexts, asset-object texture uploads, and exact native MSAA sample counts"}]},three:{category:"UI Components",stubType:"works",versions:[{range:">=0.156.0",coverage:.96,note:"real pure-JavaScript package runs from the guest bundle; WebGLRenderer uses the browser WebGL2 context supplied by expo-gl",working:"scenes, cameras, geometry, lights, standard materials, shaders, animation, and WebGLRenderer",missing:"browser DOM integrations and loaders that require unsupported expo-gl asset-object texture uploads"}]},"@react-three/fiber":{category:"UI Components",stubType:"works",versions:[{range:">=9.0.0",coverage:.93,note:"real native entry and reconciler run from the guest bundle; Canvas mounts upstream expo-gl and presents each useFrame render through endFrameEXP",working:"native Canvas, declarative Three elements, useFrame, useThree, lights, materials, cameras, events, and continuous animation",missing:"asset-backed texture loading and browser-only DOM event integrations"}]},"expo-three":{category:"UI Components",stubType:"works",versions:[{range:">=8.0.0",coverage:.75,note:"real pure-JavaScript package runs from the guest bundle on the expo-gl WebGL2 context",working:"Three renderer construction and helpers that use plain WebGL resources",missing:"asset and texture helpers that depend on expo-gl asset-object uploads, camera textures, or browser DOM image elements"}]},"@lodev09/react-native-true-sheet":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: TrueSheet component passes children through; present/dismiss/resize/scrollToTop ref methods accepted as noops. imports and API shape receive no behavior credit",missing:"no native bottom-sheet UI. recommended swap on web: a regular sootsim modal \u2014 sootsim already simulates iOS sheet semantics natively"}]},"@stripe/stripe-terminal-react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.0.1",coverage:.85,note:'load-safe noop \u2014 StripeTerminalProvider passthrough; useStripeTerminal returns disconnected state; initialize / discoverReaders / connectReader reject with a clear "hardware unavailable" error. ConnectionStatus / DiscoveryMethod / PaymentStatus enums exposed',missing:"no in-person card reader (BBPOS / WisePOS / Tap to Pay) \u2014 browsers cannot communicate with reader hardware over Bluetooth Classic / Lightning"}]},"react-native-passkey":{category:"Auth & Payments",stubType:"native",versions:[{range:">=3.0.0",coverage:.25,note:'isSupported=false (sootsim tenant runs in a worker without DOM); create/get reject with a clear "needs top-level DOM" error so apps with passkey-optional flows take their password fallback. PasskeyError class exposed',missing:"no WebAuthn \u2014 needs DOM access. host iframe could provide this; deferred until host bridge for credential management"}]},"@expensify/react-native-wallet":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 canAddCardToWallet=false / isCardInWallet=false so apps gate Add to Wallet UI off; addCardToWallet rejects",missing:"no PassKit / Google Pay Wallet integration in browser. apps that present the wallet add-card sheet will see the false return and skip the UI"}]},"react-native-udp":{category:"Networking",stubType:"native",versions:[{range:">=4.0.0",coverage:.75,note:"load-safe error stub \u2014 Socket class throws on construction, createSocket throws \u2014 apps with UDP-only paths fail visibly",missing:"no raw UDP API in browser (only WebRTC data channels can do UDP-like, with very different semantics)"}]},"react-native-context-menu-view":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: ContextMenuView passes children through; long-press shows nothing instead of a native UIContextMenu. apps still render their primary content correctly. imports and API shape receive no behavior credit",missing:"no native context menu \u2014 recommended swap on web: a tap-on-icon menu via Pressable + Modal"}]},"expo-quick-actions":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setItems accepts; getItems returns []; isSupported=false; initial=null; addListener returns a removable subscription that never fires. imports and API shape receive no behavior credit",missing:"no 3D Touch / long-press app-icon shortcuts in browser. apps that gate quick-action UI on isSupported take their fallback path"}]},"react-native-camera-kit":{category:"Media",stubType:"native",versions:[{range:">=14.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Camera component renders null; CameraType / FlashMode / FocusMode / ZoomMode / ResizeMode / ScanBarcodeAlgorithm constants exposed; capture rejects; permission helpers return denied. imports and API shape receive no behavior credit",missing:"no native camera \u2014 recommended swap on web: expo-camera which uses getUserMedia. type-checked imports compile against this stub"}]},"react-native-agora":{category:"Networking",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator creates Agora RTC engines and joins calls. SootSim throws when either engine constructor is called, so error shape receives no behavior credit",missing:"no Agora SDK on web here \u2014 recommended swap: use the Agora Web SDK directly through a host iframe"}]},"expo-maps":{category:"Maps",stubType:"native",versions:[{range:">=0.10.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: AppleMaps / GoogleMaps namespaces with View / Marker / Polyline / Polygon / Circle components rendering null; PROVIDER_GOOGLE / PROVIDER_DEFAULT / MapType enums exposed. imports and API shape receive no behavior credit",missing:"no MKMapView / GoogleMap host views. recommended swap on web: a real react-leaflet or Mapbox GL JS surface in a host iframe"}]},"react-native-ble-manager":{category:"Device & Platform",stubType:"native",versions:[{range:">=11.0.0",coverage:.8,note:"load-safe noop \u2014 start/scan accept; connect rejects; getConnectedPeripherals returns []; full BleEventType / BleScanCallbackType / BleScanMode / BleAndroidPhyType / BleState enum surface",missing:"no Web Bluetooth bridging in this stub \u2014 apps that absolutely need BLE should branch on checkState=off"}]},"victory-native":{category:"UI Components",stubType:"works",versions:[{range:">=41.0.0 <42.0.0",coverage:.55,note:"the real package runs unmodified from the guest bundle over the CanvasKit-backed Skia, Reanimated, and gesture-handler compatibility layers",working:"explicit-size CartesianChart data transforms and chart bounds, static Area/Line/Scatter marks, PolarChart, and Pie.Chart/Pie.Slice donut rendering",missing:"bars, stacked marks, candlesticks, axes and custom labels, chart-press state, pan/pinch transforms, animated paths, chart hooks, headless rendering, and per-mark visual parity are not yet validated"}]},voltra:{category:"Device & Platform",stubType:"build-only",versions:[{range:">=0.0.1",coverage:1,note:"CLI only \u2014 mutates native project files at build time and is never imported by app code, so there is no runtime surface to support"}]},"react-native-enriched":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: EnrichedTextEditor / EnrichedTextInputView / EnrichedTextRenderer pass children through. imports and API shape receive no behavior credit",missing:"no native rich-text editing \u2014 use contenteditable or a lib like @10play/tentap-editor for web"}]},"react-native-enriched-markdown":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.65,note:"native seam for EnrichedMarkdownText/EnrichedMarkdown/EnrichedMarkdownTextInput generated host components; upstream JS wrapper and Streamdown integration run unchanged",missing:"native MD4C fidelity, selection menus, spoilers, math, images, and editable rich-markdown commands are simplified"}]},"react-native-emoji-popup":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: EmojiPopup component passes children through; OS emoji input is the right path on web. imports and API shape receive no behavior credit",missing:"no native emoji picker UI in browser preview"}]},"react-native-audio-api":{category:"Media",stubType:"native",versions:[{range:">=0.5.0",coverage:1,note:"load-safe pass-through \u2014 uses globalThis.AudioContext / OfflineAudioContext when present (Web Audio API). browsers have these natively"}]},"@lodev09/react-native-exify":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:'load-safe error stub \u2014 readAsync / writeAsync reject with clear "not yet bridged" message',missing:"EXIF parsing could be polyfilled with exifr or piexifjs (deferred)"}]},"clevertap-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: full singleton + push permission + inbox API accepted; no telemetry delivered. imports and API shape receive no behavior credit",missing:"no real analytics / in-app messaging / push delivery"}]},"@callstack/liquid-glass":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator renders the LiquidGlassView effect. SootSim passes children through without connecting the view to its blur primitives, so import safety receives no behavior credit",missing:"no native iOS visual effect; consumers can substitute expo-blur which we already polyfill"}]},"react-native-shake":{category:"Device & Platform",stubType:"native",versions:[{range:">=5.0.0",coverage:0,note:"the reference iOS simulator Shake Gesture triggers the package event. SootSim registers subscribers that never fire, so import safety receives no behavior credit",missing:"real device motion \u2014 same constraint as the iOS simulator. recommended on web: DeviceMotion API with user permission gesture"}]},"react-native-ssl-public-key-pinning":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: initialize=false / isInitialized=false. imports and API shape receive no behavior credit",missing:"browsers cannot intercept TLS; SSL pinning is a native-only concern"}]},"react-native-document-scanner-plugin":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 scanDocument rejects clearly",missing:"no VNDocumentCameraViewController in browser; recommended swap: getUserMedia + opencv.js or document-scanning JS lib"}]},"react-native-system-navigation-bar":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"load-safe noop \u2014 every set/show/hide method accepted; sootsim Android lane handles its own system bars",missing:"iOS / web have no equivalent system nav bar control"}]},"react-native-volume-manager":{category:"Media",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getVolume returns 0.5; setVolume / showNativeVolumeUI accepted; isInSilentMode=false; listeners never fire. imports and API shape receive no behavior credit",missing:"browsers cannot modify system volume; only the per-element <audio> volume is mutable from JS"}]},"react-native-navigation":{category:"Navigation",stubType:"native",versions:[{range:">=7.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Navigation singleton with setRoot / push / pop / showModal / dismissModal / events()/registerComponent accepted; nothing renders since this is a native router. recommended swap on web: react-navigation or @one/router which we already polyfill. imports and API shape receive no behavior credit",missing:"no native screen container; subscribers never fire"}]},"@dr.pogodin/react-native-fs":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"true alias for react-native-fs (0.95) \u2014 the maintained fork resolves to the same stub, so readFile / writeFile / appendFile / read / write / readDir / stat / exists / mkdir / unlink / copyFile / moveFile / hash / downloadFile / uploadFiles and every path constant run against the shared IndexedDB byte store that react-native-blob-util also writes to.",missing:"see react-native-fs \u2014 no Android background download manager; slight discount for fork-specific API drift we do not model separately"}]},"stream-chat-expo":{category:"Notifications",stubType:"native",versions:[{range:">=8.0.0",coverage:.75,note:"load-safe passthrough \u2014 Channel / ChannelList / Chat / MessageList / MessageInput / Thread / OverlayProvider pass children through; useChannelContext / useMessageContext / useChatContext return empty objects so consumers can render their UI without crashing",missing:"no real Stream client wired (depends on heavy native modules: audio, haptics, video). recommended on web: stream-chat-react"}]},"@giphy/react-native-sdk":{category:"UI Components",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: GiphySDK.configure noop; GiphyDialog.show/hide accept; GiphyContent.searchQuery / trending construct config objects; full Direction / MediaType / Rating / Theme / ContentType / ImageType enum surface. imports and API shape receive no behavior credit",missing:"no native picker UI; no real GIF delivery. recommended swap: @giphy/js-sdk + custom React UI on web"}]},"react-native-version-number":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.3.6 <1.0.0",coverage:.9,note:"native-seam only \u2014 published package JS runs unchanged and reads RNVersionNumber appVersion/buildVersion/bundleIdentifier from the live Expo config",working:"default export with appVersion, platform-typed buildVersion, and bundleIdentifier; iOS and Android config fields; stable bare-app fallback",missing:"bare/frozen apps without resolved Expo config use simulator metadata rather than Info.plist or PackageInfo"}]},"@rudderstack/rudder-sdk-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"load-safe noop \u2014 RudderClient with full setup/identify/track/screen/group/alias/reset/flush/optOut accepted",missing:"no real telemetry delivery \u2014 recommended swap: @rudderstack/analytics-js on web"}]},"sp-react-native-in-app-updates":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"load-safe noop \u2014 checkNeedsUpdate reports shouldUpdate=false; startUpdate/installUpdate accepted; IAUInstallStatus / IAUUpdateKind enums exposed",missing:"no Play / App Store update prompt \u2014 apps gate UI on shouldUpdate=false"}]},"@10play/tentap-editor":{category:"UI Components",stubType:"native",versions:[{range:">=0.7.0",coverage:.75,note:"load-safe passthrough \u2014 RichText / Toolbar pass children through; useEditorBridge returns idle bridge with injectJS / setContent / setSelection / setEditable / getEditorState / getHTML / getJSON / getText accepted; CoreBridge / TenTapStartKit exposed",missing:"no WebView-backed editor \u2014 consumers see editor layout but interactions are inert"}]},"@react-native-firebase/database":{category:"Storage & Data",stubType:"native",versions:[{range:">=21.0.0",coverage:.75,note:"load-safe error stub \u2014 RTDB requires native module. recommended swap: firebase-admin / firebase Web SDK + @firebase/database",missing:"no real-time database \u2014 consumers should use the regular Firebase Web SDK"}]},"@react-native-firebase/in-app-messaging":{category:"Notifications",stubType:"native",versions:[{range:">=21.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: isMessagesDisplaySuppressed=false / setMessagesDisplaySuppressed accepted; isAutomaticDataCollectionEnabled=true; triggerEvent accepted but no IAM displayed. imports and API shape receive no behavior credit",missing:"no native IAM UI in browser preview"}]},"@adobe/react-native-aepcore":{category:"Analytics",stubType:"native",versions:[{range:">=8.0.0",coverage:.95,note:"analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 MobileCore singleton + Identity / Lifecycle / Signal namespaces accepted; LogLevel / PrivacyStatus enums exposed; delivery intentionally absent in browser preview.",missing:"no Adobe Experience Platform delivery \u2014 same constraint as every analytics SDK in browser preview"}]},"@rnw-community/react-native-payments":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.6,note:"load-safe pass-through \u2014 forwards to globalThis.PaymentRequest where supported (browsers have W3C Payment Request API natively in some contexts)",missing:"no Apple Pay / Google Pay native fallback \u2014 apps fall back to PaymentRequest if available"}]},"react-native-sensitive-info":{category:"Auth & Payments",stubType:"native",versions:[{range:">=6.0.0",coverage:.85,note:"partial \u2014 getItem / setItem / deleteItem / hasItem / getAllItems backed by the shared tenant key/value store with __soot_sensitive_ prefix; biometric helpers (hasEnrolledFingerprints / isSensorAvailable) report false",missing:"no real biometric gating; recommended swap: react-native-keychain (already 0.85 in our registry)"}]},"react-native-turbo-image":{category:"Image",stubType:"native",versions:[{range:">=4.0.0",coverage:.75,note:"load-safe passthrough \u2014 TurboImage pass-through fires onSuccess once via queueMicrotask; prefetch / clearMemoryCache / clearDiskCache accepted",missing:"no Glide / SDWebImage backing \u2014 apps see image layout via underlying fetch / <img>; recommended swap: expo-image (already in our stubs)"}]},"@maplibre/maplibre-react-native":{category:"Maps",stubType:"native",versions:[{range:">=10.0.0",coverage:.75,note:"load-safe passthrough \u2014 MapView / Camera / ShapeSource / FillLayer / LineLayer / SymbolLayer / CircleLayer / RasterSource / RasterLayer pass children through; setAccessToken / setTelemetryEnabled accepted; StyleURL constants exposed",missing:"no maplibre-gl-js host iframe wired \u2014 recommended swap on web: maplibre-gl-js directly"}]},"react-native-avoid-softinput":{category:"Keyboard",stubType:"native",versions:[{range:">=4.0.0",coverage:.5,note:"SootSim has keyboard avoidance, but this package's view and configuration calls do not drive it while they alter layout in the reference iOS simulator",missing:"no programmatic keyboard offset \u2014 sootsim KeyboardAvoidingView is the right primary path"}]},"react-native-calendar-events":{category:"Calendar",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: requestPermissions / checkPermissions return denied; findCalendars / fetchAllEvents return []; saveEvent rejects. imports and API shape receive no behavior credit",missing:"no EventKit / CalendarContract in browser preview"}]},"react-native-add-calendar-event":{category:"Calendar",stubType:"native",versions:[{range:">=4.0.0",coverage:.75,note:"load-safe error stub \u2014 present*Dialog rejects",missing:"no system calendar dialog"}]},"@react-native-documents/viewer":{category:"Storage & Data",stubType:"native",versions:[{range:">=10.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: DocumentViewerView renders null; isDocumentViewerAvailable=false. imports and API shape receive no behavior credit",missing:"no QLPreviewController / ACTION_VIEW; recommended swap: an iframe with a PDF.js or similar JS viewer"}]},"rn-qr-generator":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 generate / detect reject",missing:"QR encode/decode could be polyfilled with qrcode.js + jsQR (deferred)"}]},"@clerk/expo":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator runs Clerk authentication and session flows. SootSim always reports an unauthenticated state and passes every gate component through, so import safety receives no behavior credit",missing:"no real Clerk auth \u2014 recommended swap: @clerk/clerk-react on web"}]},"react-native-ui-lib":{category:"UI Components",stubType:"native",versions:[{range:">=7.0.0",coverage:.5,note:"the token utilities run from the bundle, but Toast, Picker, Drawer, and ActionSheet pass children through while the reference iOS simulator renders their controls",missing:"native parts of ui-lib (Picker spinner, ActionSheet UI) are not delivered; UI looks plain"}]},"react-native-pdf-renderer":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator renders PDF pages. SootSim renders null, so import safety receives no behavior credit",missing:"no native PDF rendering; recommended swap: PDF.js iframe"}]},"react-native-a11y-order":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"upstream react-native-a11y-order JS runs unchanged; native codegen components resolve through sootsim requireNativeComponent/codegenNativeCommands",working:"A11y.Order, A11y.Index, A11y.Group, A11y.Container",missing:"native accessibility traversal order hints; sootsim a11y tree is still engine-derived"}]},"react-native-animateable-text":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"Text-backed native seam that renders text / animatedProps.initial.value.text and accepts setNativeProps({ text }) updates",working:"default export, AnimateableText named export, text prop, Reanimated animatedProps initial text, child fallback",missing:"native animated prop subscription after mount; no per-character animation surface"}]},"react-native-advanced-input-mask":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe passthrough \u2014 formatMask returns input unchanged",missing:"no input formatting; consumers should use a JS-only library on web"}]},"react-native-otp-verify":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 getOtp resolves empty; getHash resolves a placeholder hash; Android-only SMS Retriever has no browser equivalent",missing:"no SMS Retriever"}]},"@survicate/react-native-survicate":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator presents Survicate surveys when an event qualifies. SootSim accepts events but presents no survey and fires no listener, so import safety receives no behavior credit",missing:"no real survey delivery \u2014 same constraint as every analytics SDK in browser preview"}]},"react-native-navigation-bar-color":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"load-safe noop \u2014 Android system nav bar color setter accepted",missing:"iOS / web have nothing equivalent"}]},"@react-native-community/image-editor":{category:"Image",stubType:"native",versions:[{range:">=4.0.0",coverage:.92,note:"native-seam: the ImageEditor class + header normalization run from the bundle; the RNCImageEditor TurboModule mirrors upstream's own src/index.web.ts canvas crop (worker-safe OffscreenCanvas) and persists the result into the shared expo-file-system cache VFS so uri/path round-trip \u2014 matching the native 'stored in the Cache Path' contract",working:"cropImage with offset/size source rect, displaySize scaling, format (png/jpeg/webp), quality, includeBase64 (raw base64 without the data: prefix, iOS/Android parity), remote images with custom headers, file:// inputs read from the shared VFS; full CropResult (path/uri/name/width/height/size/type)",missing:"resizeMode is accepted but not honored (upstream src/index.web.ts also ignores it \u2014 drawImage scales to displaySize); same behavior as upstream web"}]},"react-native-localization-settings":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.5,note:"partial \u2014 getLanguage uses navigator.language; setLanguage / openSystemSettings noop",missing:"cannot set system language from browser"}]},"react-native-mmkv-storage":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.10.0",coverage:.9,note:"persistent package adapter for the legacy MMKVLoader/MMKVInstance API \u2014 instance-scoped string/number/boolean/object/array values and redux-persist setItem/getItem are backed by the shared tenant key/value store",missing:"no native MMKV encryption or mmap file semantics; listener/transaction/indexing helpers are not modeled"}]},"react-native-restart-newarch":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.5.0",coverage:.9,note:"partial \u2014 Restart() calls location.reload() on web",missing:"app-state reset semantics differ from a real RN reload"}]},"react-native-keyboard-manager":{category:"Keyboard",stubType:"native",versions:[{range:">=6.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: IQKeyboardManager-style helper. sootsim handles keyboard avoidance via its own pipeline. imports and API shape receive no behavior credit",missing:"iOS-only library; setEnable/setEnableAutoToolbar/etc accepted but inert"}]},"react-native-google-cast":{category:"Media",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getCastState reports NoDevicesAvailable; CastButton renders null; useCastSession=null; useDevices=[]; useCastState=NoDevicesAvailable. imports and API shape receive no behavior credit",missing:"no Chromecast device discovery / cast"}]},"@stream-io/flat-list-mvcp":{category:"UI Components",stubType:"works",versions:[{range:">=0.2.0",coverage:.95,note:'NOT stubbed \u2014 on iOS the package is literally `export default FlatList from "react-native"` (the MvcpScrollViewManager native module is android-only), so it runs from the bundle on sootsim\'s FlatList, which fully supports maintainVisibleContentPosition. drop-in FlatList/ScrollView replacements behave identically to the RN primitives sootsim already implements.',working:"FlatList / ScrollView default + named exports (resolve to sootsim FlatList/ScrollView via the package's iOS variant), maintainVisibleContentPosition prop honored by the engine scroll path, all FlatList/ScrollView props/imperative API (sootsim primitives)",missing:"android-only MvcpScrollViewManager fine-tuning (mvcpTuner) \u2014 not reached on the iOS code path"}]},"stream-chat-react-native":{category:"Notifications",stubType:"native",versions:[{range:">=8.0.0",coverage:.55,note:"identical surface to stream-chat-expo \u2014 passthrough children for Channel/Chat/MessageList components",missing:"same as stream-chat-expo \u2014 recommended swap: stream-chat-react"}]},"react-native-external-keyboard":{category:"Keyboard",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"upstream react-native-external-keyboard JS runs unchanged; native focus host components and commands resolve through sootsim codegen/requireNativeComponent seams",working:"withKeyboardFocus, KeyboardFocusView, BaseKeyboardView, ExternalKeyboardView, Pressable, KeyboardExtendedPressable, KeyboardExtendedInput/TextInput, KeyboardFocusGroup, KeyboardOrderFocusGroup, useIsViewFocused, Keyboard.dismiss",missing:"no hardware-keyboard focus tracking \u2014 sootsim runs on a virtual keyboard"}]},"react-native-wifi-reborn":{category:"Networking",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"load-safe noop \u2014 loadWifiList=[]; isEnabled=false; connectToProtectedSSID rejects",missing:"browsers cannot enumerate / configure WiFi networks"}]},"react-native-bluetooth-state-manager":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 getState reports PoweredOff; full BluetoothState enum exposed",missing:"browsers cannot read Bluetooth adapter state"}]},"react-native-drop-shadow":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.75,note:"load-safe passthrough",missing:"iOS-specific UIView shadow; CSS box-shadow on web is the right path"}]},"expo-health-connect":{category:"Health",stubType:"native",versions:[{range:">=4.0.0",coverage:.75,note:"alias for react-native-health-connect \u2014 same noop coverage",missing:"no Android Health Connect on iOS / web"}]},"react-native-print":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.10.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: print() accepted. imports and API shape receive no behavior credit",missing:"browsers have window.print() but the API surface differs"}]},"@hot-updater/react-native":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.10.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: runUpdateProcess accepted; useHotUpdater reports idle. imports and API shape receive no behavior credit",missing:"no OTA update mechanism in browser preview"}]},"@pusher/pusher-websocket-react-native":{category:"Networking",stubType:"native",versions:[{range:">=1.2.0",coverage:.75,note:"load-safe error stub \u2014 Pusher.getInstance returns a noop client; connect rejects with native bridge unavailable",missing:"recommended swap: @pusher/pusher-js on web"}]},"react-native-voip-push-notification":{category:"Notifications",stubType:"native",versions:[{range:">=10.0.0",coverage:.85,note:'load-safe noop \u2014 addEventListener returns removable subscription; requestPermissions reports denied; getVoipToken=""',missing:"no PushKit / VoIP push channel in browser"}]},"react-native-background-actions":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: start/stop accepted; isRunning=false. imports and API shape receive no behavior credit",missing:"no foreground service / background task"}]},"react-native-screenshot-aware":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.0.1",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: addListener returns removable subscription that never fires. imports and API shape receive no behavior credit",missing:"browsers cannot detect screenshots"}]},"@iterable/expo-plugin":{category:"Notifications",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"load-safe noop \u2014 expo plugin function returns empty config"}]},"react-native-navigation-mode":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 getNavigationMode reports three-button; NavigationMode enum exposed",missing:"no Android system gesture/3-button mode reading on iOS / web"}]},"@okta/okta-react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:'load-safe error stub \u2014 createConfig accepted; signIn rejects with "use @okta/okta-auth-js" suggestion; isAuthenticated=false',missing:"no native OIDC flow \u2014 recommended swap: @okta/okta-auth-js"}]},"react-native-snackbar":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: show/dismiss accepted; LENGTH_LONG/SHORT/INDEFINITE constants exposed. imports and API shape receive no behavior credit",missing:"no Material Snackbar UI on iOS / web; recommended swap: sootsim Toast (already polyfilled)"}]},"react-native-android-widget":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.13.0",coverage:.85,note:"load-safe noop \u2014 requestWidgetUpdate / requestWidgetUpdateById accepted",missing:"iOS / web have no Android home screen widgets"}]},"react-native-system-setting":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.7.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getVolume=0.5; getBrightness=0.5; isWifiEnabled=false; isLocationEnabled=false; isBluetoothEnabled=false; isAirplaneEnabled=false; all listeners never fire. imports and API shape receive no behavior credit",missing:"browsers cannot read / set system-level settings"}]},"react-native-network-info":{category:"Networking",stubType:"native",versions:[{range:">=5.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getSSID/getBSSID/getBroadcast/getIPAddress all return null. imports and API shape receive no behavior credit",missing:"browsers cannot read Wi-Fi info or LAN IP"}]},"react-native-razorpay":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:'load-safe error stub \u2014 open() rejects with "use razorpay web checkout"',missing:"no native checkout sheet; recommended swap: Razorpay Web Checkout"}]},"react-native-play-age-range-declaration":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 getCurrentAgeRange=0 (unspecified)",missing:"no Google Play age range API on iOS / web"}]},"react-native-spinkit":{category:"UI Components",stubType:"native",versions:[{range:">=1.5.0",coverage:.4,note:"load-safe passthrough \u2014 Spinner renders children; full Type enum exposed",missing:"no animation; recommended swap: pure-JS spinner like react-spinners"}]},"react-native-version-info":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.1.1 <2.0.0",coverage:.9,note:"native-seam only \u2014 published package JS runs unchanged and reads RNVersionInfo appVersion/buildVersion/bundleIdentifier from the live Expo config",working:"default export with appVersion, platform-typed buildVersion, and bundleIdentifier; iOS and Android config fields; stable bare-app fallback",missing:"bare/frozen apps without resolved Expo config use simulator metadata rather than Info.plist or PackageInfo"}]},"react-native-moengage":{category:"Analytics",stubType:"native",versions:[{range:">=10.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: full singleton accepted; no telemetry / nudge UI delivered. imports and API shape receive no behavior credit",missing:"no real MoEngage SDK; recommended swap: @moengage/web-sdk on web"}]},"react-native-nitro-sound":{category:"Media",stubType:"native",versions:[{range:">=0.5.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Nitro.startRecorder/startPlayer accepted; addRecordBack/PlayBackListener return removable subscriptions. imports and API shape receive no behavior credit",missing:"no native record/play audio engine; consumers can use Web Audio + getUserMedia directly"}]},"react-native-touch-id":{category:"Auth & Payments",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"native-seam: the pure-JS TouchID wrapper + errors.js + data/errors.js (TouchIDError classes + iOSErrors map) run from the real bundle; only NativeModules.TouchID is ours, mirroring TouchID.m on the reference iOS Simulator (Face ID device, no biometrics enrolled, no passcode): canEvaluatePolicy fails with LAErrorTouchIDNotEnrolled and passcodeFallback defaults false, so isSupported/authenticate call back with that error reason and the real wrapper rejects with the faithful NOT_ENROLLED TouchIDError \u2014 the exact value a guest gets on the reference device. same faithful tier as expo-local-authentication.",working:"isSupported(config) and authenticate(reason, config) \u2014 real upstream wrapper + TouchIDError/TouchIDUnifiedError + iOSErrors mapping run from the bundle off a faithful native callback; reference-simulator parity (rejects with LAErrorTouchIDNotEnrolled \u2192 NOT_ENROLLED)",missing:"no real biometric prompt can succeed \u2014 but neither can the reference iOS Simulator (no enrolled biometrics); package is deprecated upstream (expo-local-authentication is the maintained successor, also a faithful native-seam here)"}]},"react-native-app-clip":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.9.0",coverage:.85,note:"load-safe noop \u2014 isAppClip=false; getUserActivity=null",missing:"no Apple App Clip surface in browser"}]},"react-native-localization":{category:"Internationalization",stubType:"native",versions:[{range:">=2.0.0",coverage:.8,note:"load-safe class \u2014 setLanguage / getLanguage / getInterfaceLanguage / getAvailableLanguages backed by navigator.language",missing:"no Localizable.strings reading; consumers should use upstream Localizable strings via JSON imports"}]},"@react-native-firebase/app-distribution":{category:"Device & Platform",stubType:"native",versions:[{range:">=21.0.0",coverage:.85,note:"load-safe noop \u2014 isTesterSignedIn=false; signInTester rejects; checkForUpdate=null",missing:"no Firebase App Distribution in browser"}]},"react-native-wallet-manager":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 canAddPasses=false; addPass / addPassFromUrl reject",missing:"no native PassKit / Google Pay Wallet on web"}]},"react-native-blurhash":{category:"Image",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Blurhash component renders null. imports and API shape receive no behavior credit",missing:"no blurhash decoding; recommended swap: a JS implementation like blurhash npm package"}]},"expo-alternate-app-icons":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setAlternateAppIcon accepted; getAlternateAppIcon=null; isAlternateAppIconSupported=false. imports and API shape receive no behavior credit",missing:"no UIApplication.setAlternateIconName equivalent in browser"}]},"react-native-send-intent":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"load-safe error stub \u2014 Android-only ACTION_* helpers reject; isAppInstalled=false; openApp=false",missing:"iOS / web have no ACTION_SEND equivalent"}]},"react-native-select-contact":{category:"Calendar",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: selectContact / selectContactPhone / openContact resolve null. imports and API shape receive no behavior credit",missing:"no system contact picker on web"}]},"react-native-watch-connectivity":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.1.0",coverage:.85,note:"load-safe noop \u2014 getReachability/getInstalled/getIsPaired all false; sendMessage resolves empty; useReachability/useInstalled/usePaired hooks return false",missing:"browsers cannot pair with watchOS / Wear OS hardware"}]},"react-native-shared-group-preferences":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setItem accepted; getItem=null; isAppGroupShared=false. imports and API shape receive no behavior credit",missing:"no App Group container outside of iOS"}]},"react-native-mail":{category:"Storage & Data",stubType:"native",versions:[{range:">=6.0.0",coverage:.85,note:"native-seam: real one-line package (export default NativeModules.RNMail) runs from the bundle; the RNMail native module faithfully mirrors the iOS-simulator contract \u2014 upstream ios/RNMail.m guards mail() with [MFMailComposeViewController canSendMail], which is false on a sim with no Mail account, so it calls back 'not_available'. same faithful-unavailable stance and tier as the expo-mail-composer native seam.",working:"mail(options, callback) \u2192 callback('not_available') exactly as upstream RNMail.m does when canSendMail is false; apps that handle the documented error callback take the correct branch",missing:"no real mail composer UI (the iOS simulator has none either \u2014 this is faithful iOS-sim behavior, not a sootsim-specific gap)"}]},"expo-superwall":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Superwall.configure/identify/registerEvent/registerPlacement/preloadAllPaywalls accepted; getPresentationResult=paywallNotPresented; presentPaywallForEvent=noPaywallToPresent. imports and API shape receive no behavior credit",missing:"no real Superwall paywall delivery \u2014 Superwall has a Web SDK that consumers should use directly on web"}]},"@preeternal/react-native-cookie-manager":{category:"Networking",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: set/setFromResponse accepted; get/getFromResponse return empty; clearAll/clearByName/flush accepted. imports and API shape receive no behavior credit",missing:"no native cookie store; on web document.cookie is the right API but cross-origin reads are blocked"}]},"@stream-io/video-react-native-sdk":{category:"Networking",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough \u2014 StreamVideo / StreamCall / CallContent / RingingCallContent / IncomingCall / OutgoingCall pass children through; useCalls=[]; useStreamVideoClient=null",missing:"no real Stream Video client \u2014 recommended swap: @stream-io/video-react-sdk on web"}]},"react-native-shared-element":{category:"Animation",stubType:"native",versions:[{range:">=0.8.0",coverage:.75,note:"load-safe passthrough \u2014 SharedElement / SharedElementTransition pass children through; nodeFromRef=null",missing:"no native shared-element transitions; Framer Motion or react-native-reanimated layout is the right web/RN path"}]},"@react-native-ml-kit/text-recognition":{category:"ML",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 recognize rejects; TextRecognitionScript constants exposed",missing:"no ML Kit on web; recommended swap: tesseract.js or vision API endpoint"}]},"react-native-star-io10":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe stub \u2014 InterfaceType / StarConnectionSettings exposed; StarPrinter throws on construction",missing:"no Star receipt printer hardware in browser"}]},"llama.rn":{category:"ML",stubType:"native",versions:[{range:">=0.5.0",coverage:0,note:"the reference iOS simulator initializes local llama models and generates output. SootSim rejects initialization and returns an empty grammar, so error shape receives no behavior credit",missing:"no llama.cpp runtime in browser; recommended swap: web-llm or remote inference endpoint"}]},"@react-native-community/progress-bar-android":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 ProgressBarAndroid renders null",missing:"Android-only; iOS / web have ActivityIndicator equivalents"}]},"react-native-file-logger":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: debug/info/warn/error accepted; getLogFilePaths=[]; full LogLevel enum exposed. imports and API shape receive no behavior credit",missing:"no file system writes \u2014 browsers route logs to console.* instead"}]},"@renegades/react-native-tickle":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.0.1",coverage:.85,note:"load-safe noop \u2014 tickle accepted",missing:"no haptic API exposed by this stub; consumers should use expo-haptics"}]},"expo-in-app-updates":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 checkForUpdate=false; startUpdate accepted; addUpdateListener returns removable subscription",missing:"no Play / App Store update prompts in browser"}]},"react-native-pkce-challenge":{category:"Auth & Payments",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: returns empty codeVerifier/codeChallenge. imports and API shape receive no behavior credit",missing:"consumers should use a proper PKCE library like @noble/hashes on web"}]},"react-native-ux-cam":{category:"Analytics",stubType:"native",versions:[{range:">=5.0.0",coverage:.95,note:"native-seam only: the real react-native-ux-cam runs from the bundle (the UXCam JS class + types \u2014 all upstream). we stub only the RNUxcam TurboModule, mirroring src/NativeRNUxcam.ts@6.x exactly: recording actions are accepted but nothing is captured/uploaded and every opt-in/recording status reports false \u2014 the same clean state an app sees with UXCam unconfigured. per docs/compat-scoring.md session-replay rule, delivery is intentionally absent. (replaces a drifted JS stub that exposed non-existent methods like startWithKey/hideStatusGUI)",working:"full upstream JS surface (UXCam class + enums); startWithConfiguration, opt-in/out overall+schematic+video, session start/stop/cancel, tagScreenName, logEvent, setUser/Session properties, occlusion APIs, urlForCurrentSession/User (resolve null), listener registration",missing:"no real UXCam session recording, heatmaps, or upload \u2014 intentionally absent for the development simulator (no UXCam backend)"}]},"react-native-barcode-creator":{category:"Media",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: BarcodeCreatorView renders null; full Type enum exposed. imports and API shape receive no behavior credit",missing:"no native barcode generation; recommended swap: bwip-js"}]},"react-native-widgetkit":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getCurrentConfigurations={}; reload* accepted. imports and API shape receive no behavior credit",missing:"no WidgetKit on iOS / web"}]},"react-native-theoplayer":{category:"Media",stubType:"native",versions:[{range:">=8.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: THEOplayerView renders null; PlayerEventType enum exposed. imports and API shape receive no behavior credit",missing:"no THEOplayer player on web \u2014 consumers should use theoplayer Web SDK"}]},"@google/react-native-make-payment":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 isReadyToPay=false; requestPayment rejects",missing:"recommended swap: Google Pay JS API on web"}]},"react-native-change-icon":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:`the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: changeIcon rejects; getIcon="default"; resetIcon noop. imports and API shape receive no behavior credit`,missing:"duplicate of expo-alternate-app-icons capability"}]},"@react-native-community/progress-view":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: ProgressView renders null. imports and API shape receive no behavior credit",missing:"iOS UIProgressView; consumers can render their own bar in web"}]},"react-native-prompt-android":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.8,note:"partial \u2014 uses window.prompt() when available so callbacks fire with the entered value",missing:"no Material AlertDialog on iOS; window.prompt is the closest browser equivalent"}]},"react-native-text-size":{category:"UI Components",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:`the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: measure/flatHeights resolve zero-sized; fontFamilyNames=["system"]. imports and API shape receive no behavior credit`,missing:"no native text measurement; consumers should use canvas measureText on web"}]},"react-native-adapty":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: adapty.activate/identify/logout/getProfile accepted; getPaywall/makePurchase reject; restorePurchases resolves empty access levels. imports and API shape receive no behavior credit",missing:"recommended swap: @adapty/web-sdk on web"}]},"@twilio/voice-react-native-sdk":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator registers and connects Twilio Voice calls. SootSim rejects both operations, so error shape receives no behavior credit",missing:"recommended swap: @twilio/voice-sdk on web"}]},"react-native-fast-tflite":{category:"ML",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 loadTensorflowModel rejects; useTensorflowModel reports error state",missing:"no tflite runtime; recommended swap: tensorflow.js"}]},"react-native-screenguard":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: register/registerWith*/unregister accepted; screenshot/recording listeners never fire. imports and API shape receive no behavior credit",missing:"browsers cannot detect / prevent screenshots"}]},"react-native-signature-capture":{category:"UI Components",stubType:"native",versions:[{range:">=0.4.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: SignatureCapture renders null. imports and API shape receive no behavior credit",missing:"recommended swap: react-signature-canvas on web"}]},"react-native-month-year-picker":{category:"UI Components",stubType:"native",versions:[{range:">=1.9.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: picker renders null; ACTION_DATE_SET / ACTION_DISMISSED / ACTION_NEUTRAL constants exposed. imports and API shape receive no behavior credit",missing:"recommended swap: a JS-only date picker on web"}]},"react-native-nitro-image":{category:"Image",stubType:"native",versions:[{range:">=0.10.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: NitroImage renders null; loadImageFromUrl rejects. imports and API shape receive no behavior credit",missing:"use expo-image (already polyfilled) for browser-fast Image"}]},"react-native-wheel-picker-android":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"load-safe noop \u2014 WheelPicker renders null",missing:"Android-only; iOS / web should use sootsim Picker"}]},"scandit-react-native-datacapture-core":{category:"Media",stubType:"native",versions:[{range:">=6.0.0",coverage:0,note:"the reference iOS simulator creates a Scandit data-capture context and renders its view even without camera hardware. SootSim rejects the context and renders null, so error shape receives no behavior credit",missing:"no Scandit native runtime; recommended swap: scandit-web-datacapture-core"}]},"@sbaiahmed1/react-native-biometrics":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 isSensorAvailable reports unavailable; simplePrompt resolves success=false; createKeys/createSignature resolve empty",missing:"recommended swap: WebAuthn (browser) for biometric flows"}]},"react-native-splash-view":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: show/hide accepted. imports and API shape receive no behavior credit",missing:"sootsim handles splash via expo-splash-screen (already polyfilled)"}]},"react-native-legal":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: launchLicenseList accepted; addLicense / setLibraryName accepted. imports and API shape receive no behavior credit",missing:"no native UI; consumers should render licenses themselves on web"}]},"react-native-fast-shadow":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"no native shadow blur; CSS box-shadow on web is the right path"}]},"@react-native-community/toolbar-android":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"Android-only; iOS / web have nothing equivalent \u2014 header is the typical replacement"}]},"react-native-nitro-web-image":{category:"Image",stubType:"native",versions:[{range:">=0.5.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: NitroWebImage renders null. imports and API shape receive no behavior credit",missing:"use expo-image (already polyfilled)"}]},"react-native-bluetooth-classic":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 isBluetoothAvailable=false; getBondedDevices=[]; pairDevice/connectToDevice/accept reject; startDiscovery=[]",missing:"browsers have Web Bluetooth (BLE only); Bluetooth Classic / SPP unsupported"}]},"@logicwind/react-native-exit-app":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.1.0",coverage:.85,note:"native-seam: a maintained fork of react-native-exit-app with the identical single-method contract \u2014 the exitApp() wrapper runs from the bundle; the only native part is the `ExitApp` NativeModule (vs RNExitApp upstream), a faithful no-op. this IS the complete correct contract, not a gap: Apple\u2019s HIG forbids App Store apps from self-terminating and a browser cannot close its tab, so an app calling exitApp() on real iOS already gets nothing user-visible. same faithful tier as react-native-exit-app / react-native-orientation-locker.",working:"exitApp() \u2014 matches upstream\u2019s exact single-method surface; faithful complete behavior (no-op, as on real iOS App Store apps)",missing:"none functionally \u2014 the package\u2019s sole purpose (terminate the app) is intentionally unavailable on both iOS App Store apps and browsers; the no-op is the faithful contract, not an unimplemented feature"}]},"@xmartlabs/react-native-line":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 LineLogin.login rejects; setup / logout / getCurrentAccessToken accepted",missing:"recommended swap: @line/liff on web"}]},"react-native-get-location":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.92,note:"native-seam: package JS (LocationError, isLocationError, android permission, openSettings via Linking) runs from the bundle; the RNGetLocation TurboModule is backed by navigator.geolocation (the documented web equivalent), with the rejection shape upstream isLocationError() expects",working:"getCurrentPosition (enableHighAccuracy + timeout honored; full Location mapping incl. altitude/accuracy/speed/time and iOS verticalAccuracy/course from altitudeAccuracy/heading), error codes mapped to UNAUTHORIZED/TIMEOUT/UNAVAILABLE, openSettings via RN Linking, LocationError class + isLocationError guard",missing:"browser geolocation requires a user permission grant (denied \u2192 UNAUTHORIZED, same as a denied native prompt); altitude/speed are 0 and verticalAccuracy/course are -1 when the browser does not supply them"}]},"react-native-screenshot-prevent":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: enabled() accepted; iosProtectFromScreenRecording / iosProtectFromScreenshot accepted. imports and API shape receive no behavior credit",missing:"browsers cannot prevent screenshots"}]},"react-native-file-viewer-turbo":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 open() rejects",missing:"no native QLPreviewController; recommended swap: PDF.js iframe"}]},"react-native-secure-key-store":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"partial \u2014 set/get/remove backed by the shared tenant key/value store with __soot_secure_ prefix; ACCESSIBLE constants exposed",missing:"no real keychain encryption; recommended swap: react-native-keychain (already polyfilled)"}]},"react-native-radial-gradient":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"no native radial gradient; CSS radial-gradient on web is the right path"}]},"react-native-cloud-store":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: isICloudAvailable=false; documentsDirectory empty; upload/download reject; listSync=[]. imports and API shape receive no behavior credit",missing:"no iCloud Drive integration in browser"}]},"react-native-screen-corner-radius":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"native-seam: the two pure-JS constants (ScreenCornerRadius, IsScreenRounded) run from the real bundle; only the ScreenCornerRadius NativeModule is ours, and its `cornerRadius` constant returns the live simulated device's measured display corner radius from the same device spec the engine renders the chrome from. this is the package's entire purpose and SootSim answers it precisely. faithful complete contract, not a no-op.",working:"NativeModules.ScreenCornerRadius.cornerRadius (real per-device radius, synchronous constant read at import like upstream); ScreenCornerRadius + IsScreenRounded constants computed by the real package JS off that value, so IsScreenRounded is correct per device"}]},"freerasp-react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: startFreeRasp accepted; isAppInDebug/isAppTampered=false. imports and API shape receive no behavior credit",missing:"no RASP (runtime application self-protection) in browser"}]},"react-native-orientation-director":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getInitialOrientation/getDeviceOrientation/getInterfaceOrientation report Portrait; lockTo/unlock accepted; full Orientation enum exposed. imports and API shape receive no behavior credit",missing:"sootsim canvas is portrait-only; this matches"}]},"expo-squircle-view":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"no native squircle clip-path; CSS clip-path on web is the right path"}]},"scandit-react-native-datacapture-barcode":{category:"Media",stubType:"native",versions:[{range:">=6.0.0",coverage:0,note:"the reference iOS simulator creates a Scandit barcode capture session over supplied frames. SootSim rejects session creation, so constants and error shape receive no behavior credit",missing:"recommended swap: scandit-web-datacapture-barcode"}]},"react-native-a11y":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe passthrough",missing:"sootsim a11y tree is the right native path"}]},"expo-live-activity":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: startActivity rejects; updateActivity/endActivity accepted; listActivities=[]; requestPermissions=denied; isActivityEnabled=false. imports and API shape receive no behavior credit",missing:"no Dynamic Island / Live Activities outside iOS"}]},"@luciq/react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator presents the Luciq bug-reporting UI. SootSim accepts the singleton calls but presents no report surface, so import safety receives no behavior credit",missing:"no real bug-report delivery \u2014 same constraint as every analytics SDK in browser preview"}]},"react-native-safari-view":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: isAvailable=false; show rejects. imports and API shape receive no behavior credit",missing:"no SFSafariViewController in browser; consumers should use sootsim Browser or window.open"}]},"@zoontek/react-native-navigation-bar":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"load-safe noop \u2014 setStyle/setVisible/setBehavior accepted",missing:"iOS / web have no equivalent"}]},"react-native-webp-format":{category:"Image",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"load-safe partial \u2014 isWebPSupported=true (browsers support WebP); encodeWebP/decodeWebP reject"}]},"react-native-photo-manipulator":{category:"Image",stubType:"native",versions:[{range:">=1.0.0",coverage:.92,note:"native-seam: PhotoManipulator + ParamUtils (color/asset normalization, enums) run from the bundle; the RNPhotoManipulator module does the CoreGraphics/Bitmap work in worker-safe 2D canvas and persists the result into the shared expo-file-system cache VFS so the returned uri round-trips (native parity)",working:"crop (+ targetSize resize), flipImage (Horizontal/Vertical/Both), rotateImage (R90/R180/R270), overlayImage, printText (position/size/font/color/rotation/align/direction/shadow), optimize (jpeg quality), batch (crop+resize then chained flip/rotate/overlay/text), file:// inputs from the shared VFS, image/jpeg + image/png output",missing:"printText uses browser font metrics (sans-serif fallback when a native fontName is unavailable) so glyph positioning may differ by sub-pixel amounts from native CoreText/android Paint"}]},"@eabdullazyanov/react-native-sms-user-consent":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 startSmsHandling accepted; listeners never fire",missing:"Android-only SMS Retriever; iOS / web have nothing equivalent"}]},"react-native-keyevent":{category:"Keyboard",stubType:"native",versions:[{range:">=0.3.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: onKeyDown/UpListener register but never fire. imports and API shape receive no behavior credit",missing:"sootsim handles its own keyboard events; consumers can use window keydown/keyup directly"}]},"react-native-key-command":{category:"Keyboard",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"native-seam: the real package validation and NativeEventEmitter wrapper run from the bundle; KeyCommand mirrors iOS and Android constants, registration, unregistration, and hardware-key delivery",working:"platform-native modifier and input constants, registerKeyCommands, unregisterKeyCommands, onKeyCommand events for registered hardware shortcuts"}]},"@expensify/react-native-background-task":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.0.0",coverage:.85,note:"native-seam: the real task registry and NativeEventEmitter run from the bundle; Android job registration succeeds without inventing browser background execution",working:"defineTask registration, listener lifecycle, foreground JavaScript task registry",missing:"Android JobScheduler execution while the browser tab is suspended or closed"}]},"react-native-app-logs":{category:"Analytics",stubType:"native",versions:[{range:">=0.3.0",coverage:.7,note:"native-seam: the real handler and filter lifecycle runs from the bundle while SootSim captures browser logs through its inspector",working:"configure, registerHandler/remove, filter bookkeeping, TurboModule and NativeEventEmitter contracts",missing:"streaming Apple OSLogStore entries through newLogAvailable; browser process logs remain available in the SootSim inspector instead"}]},"group-ib-fp":{category:"Analytics",stubType:"native",versions:[{range:">=3.0.0",coverage:.95,note:"native-seam: the real FP class, enums, validation, and event subscription surface run from the bundle; native configuration calls complete without collecting or delivering fraud telemetry",working:"customer, URL, header, key, login, session, attribute, capability, run/stop, cookie, and listener APIs with Android callback shapes",missing:"device fingerprint collection, Group-IB network delivery, and native session events"}]},"@callstack/react-native-brownfield":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator mounts React Native inside the native host. SootSim passes children through and does not exercise that integration, so import safety receives no behavior credit"}]},"react-native-hole-view":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe passthrough \u2014 ECurve constants exposed",missing:"no native cutout; CSS clip-path on web is the right path"}]},"react-native-filament":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: FilamentView/Camera/Light/Model render null; useModel/useEngine/useCamera return null; loadAsset rejects. imports and API shape receive no behavior credit",missing:"no native Filament 3D renderer; recommended swap: three.js / WebGPU on web"}]},"react-native-executorch":{category:"ML",stubType:"native",versions:[{range:">=0.3.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: useLLM reports {generate: rejects, isReady: false}; useImageEmbeddings rejects. imports and API shape receive no behavior credit",missing:"no ExecuTorch runtime; recommended swap: web-llm or remote inference"}]},"react-native-image-marker":{category:"Image",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 markText/markImage reject",missing:"recommended swap: canvas + fillText on web"}]},"@callstack/react-native-visionos":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough \u2014 VolumeView / ImmersiveSpace pass children",missing:"no visionOS host; iOS / web have nothing equivalent"}]},"@didomi/react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: initialize/setUserAgreeToAll/setUserDisagreeToAll/showNotice/showPreferences/reset accepted; isReady=true; EventType enum exposed. imports and API shape receive no behavior credit",missing:"no real Didomi consent collection"}]},"react-native-youtube":{category:"Media",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: YouTube renders null. imports and API shape receive no behavior credit",missing:"no embedded YouTube player; consumers can use the iframe player API directly"}]},"react-native-fast-squircle":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"true alias for expo-squircle-view (0.75) \u2014 reactNativeFastSquircle re-exports the same module at runtime, so apps importing either get the same CSS clip-path surface",missing:"see expo-squircle-view"}]},"@simform_solutions/react-native-audio-waveform":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Waveform renders null; PermissionStatus enum exposed. imports and API shape receive no behavior credit",missing:"no native waveform rendering; recommended swap: WaveSurfer.js"}]},"rollbar-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:'native-seam only: the real rollbar-react-native runs from the bundle (Rollbar, Client, Configuration, telemetry, error transforms \u2014 all upstream JS). we stub only the RollbarReactNative native module, mirroring src/Client.js native usage exactly: init/setPerson/clearPerson accepted, deviceAttributes() returns "{}" (parsing to the same empty object upstream uses with no native side). per docs/compat-scoring.md crash-reporting rule, delivery is intentionally absent. (replaces a drifted JS stub that fabricated default/Client/Configuration classes)',working:"full upstream JS surface (Rollbar/Client/Configuration, telemetry, log/debug/info/warning/error/critical, captureUncaught/unhandledRejection wiring, setPerson/clearPerson, native init path)",missing:"no real Rollbar occurrence delivery \u2014 intentionally absent for the development simulator (no Rollbar backend)"}]},"@shopify/checkout-sheet-kit":{category:"Auth & Payments",stubType:"native",versions:[{range:">=3.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: present rejects; preload/invalidate/configure accepted; ColorScheme constants exposed. imports and API shape receive no behavior credit",missing:"no Shopify checkout sheet; recommended swap: shopify-checkout JS embed"}]},"expo-share-extension":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"no iOS share extension target; sootsim cannot run as a system share target"}]},"react-native-video-trim":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: showEditor rejects; cleanFiles/closeEditor accepted. imports and API shape receive no behavior credit",missing:"recommended swap: ffmpeg.wasm + video element"}]},"react-native-dialogs":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 showPicker/alert reject",missing:"sootsim Alert / ActionSheet are the right primitives"}]},"@kesha-antonov/react-native-background-downloader":{category:"Networking",stubType:"native",versions:[{range:">=3.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: download returns task object with pause/resume/cancel/done/error/begin/progress chains; checkForExistingDownloads=[]. imports and API shape receive no behavior credit",missing:"no background download \u2014 browsers have ServiceWorker fetch but the API differs"}]},"@clerk/expo-passkeys":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"no WebAuthn in tenant worker \u2014 needs DOM bridge"}]},"react-native-charts-wrapper":{category:"UI Components",stubType:"native",versions:[{range:">=0.6.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: LineChart/BarChart/PieChart/CandleStickChart/RadarChart/BubbleChart/HorizontalBarChart/ScatterChart/CombinedChart all render null. imports and API shape receive no behavior credit",missing:"no MPAndroidChart/Charts native; recommended swap: victory-native or recharts on web"}]},"react-native-video-cache":{category:"Media",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getCacheUri returns input url; cleanCache/cleanByUrl accepted; getCacheSize=0. imports and API shape receive no behavior credit",missing:"no video proxy/cache; browsers cache via standard HTTP cache"}]},"react-native-tiktok-business-sdk":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"attribution-analytics SDK with full noop surface per the docs/compat-scoring.md rule \u2014 initialize/identify/logout/trackEvent/trackContentEvent accepted; delivery intentionally absent in browser preview.",missing:"no real TikTok analytics \u2014 same constraint as every analytics SDK in browser preview"}]},"react-native-idle-timer":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:"native-seam: the 3-line wrapper runs from the bundle; the IdleTimerManager native module backs setIdleTimerDisabled with the real Screen Wake Lock API (navigator.wakeLock) \u2014 the documented web equivalent of UIApplication.isIdleTimerDisabled \u2014 best-effort acquiring/releasing a real screen lock per active tag, with state tracking so multi-tag refcounting stays correct even where Wake Lock is unavailable (insecure origin / hidden tab degrade silently, as an app expects when the OS declines)",working:"setIdleTimerDisabled(disabled, tag) \u2014 acquires a real screen wake lock while any tag is disabled, releases when all are cleared; correct tag refcounting; matches upstream\u2019s exact single-method void surface",missing:"a hidden/background tab cannot hold a Wake Lock (browser releases it on visibilitychange \u2014 same effective behavior as iOS releasing the idle-timer override when the app backgrounds)"}]},"react-native-rate-app":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam: upstream JS (RateAppError, openStoreForReview via real RN Linking, getAndroidMarketUrl, market-URL constants, AndroidMarket enum) runs from the bundle; the RateApp TurboModule faithfully mirrors the iOS-simulator SKStoreReviewController contract \u2014 requestReview resolves without throwing and the system prompt is a silent no-op (exactly as on a real sim; even on-device the prompt is OS-controlled and rate-limited). same faithful-unavailable tier as react-native-mail / expo-mail-composer.",working:"requestReview / requestReviewGalaxyStore / requestReviewAppGallery (resolve true \u2014 request issued, OS-suppressed display, no throw), openStoreForReview (real Linking.openURL to itms-apps/market URLs), getAndroidMarketUrl, RateAppError, AndroidMarket enum",missing:"no visible in-app rating prompt (the iOS simulator shows none either \u2014 faithful iOS-sim behavior, not a sootsim-specific gap)"}]},"react-native-compass-heading":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam: the start/stop NativeEventEmitter wrappers run from the bundle; the CompassHeading module backs them with the real DeviceOrientationEvent (webkitCompassHeading on iOS Safari, else the alpha angle converted to a clockwise compass heading \u2014 the same source expo-location.getHeadingAsync uses, kept consistent), emitting the HeadingUpdated { heading, accuracy } events upstream subscribes to, throttled by the caller\u2019s update_rate degree threshold",working:"start(update_rate) (acquires DeviceOrientation permission on iOS Safari, subscribes deviceorientation, emits HeadingUpdated with degree-threshold throttling, returns false when DeviceOrientationEvent is unavailable), stop() (removes the listener), NativeEventEmitter(CompassHeading) HeadingUpdated subscription",missing:"compass accuracy is -1 unless the browser exposes webkitCompassAccuracy (DeviceOrientationEvent.alpha carries no accuracy \u2014 coarser than CLLocationManager, same caveat as expo-location heading)"}]},"@cometchat/chat-uikit-react-native":{category:"Notifications",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator renders CometChat conversations, messages, the composer, and call UI. SootSim passes those components through, so import safety receives no behavior credit",missing:"no real CometChat client; recommended swap: @cometchat/chat-uikit-react"}]},"react-native-tcp":{category:"Networking",stubType:"native",versions:[{range:">=4.0.0",coverage:.7,note:"alias for react-native-tcp-socket",missing:"same as react-native-tcp-socket"}]},"react-native-sfsymbols":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: SFSymbol/SymbolView render null. imports and API shape receive no behavior credit",missing:"use expo-symbols (already polyfilled, blends with proof to higher score)"}]},"@googlemaps/react-native-navigation-sdk":{category:"Maps",stubType:"native",versions:[{range:">=0.6.0",coverage:.75,note:"load-safe passthrough \u2014 NavigationView/NavigationProvider pass children; useNavigation=null",missing:"no Google Maps Navigation SDK on web"}]},"@dr.pogodin/react-native-static-server":{category:"Networking",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe error stub \u2014 StaticServer.start rejects; addStateListener returns no-op unsubscribe",missing:"browsers cannot run a server"}]},"react-native-extra-dimensions-android":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 all dimension getters resolve 0",missing:"iOS / web have nothing equivalent"}]},"@rudderstack/rudder-integration-firebase-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop integration",missing:"no real Firebase integration"}]},"@bravemobile/react-native-code-push":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough \u2014 sync rejects; notifyAppReady accepted; allowRestart/disallowRestart/restartApp accepted",missing:"no OTA hot-update mechanism in browser preview"}]},"@batch.com/react-native-plugin":{category:"Notifications",stubType:"native",versions:[{range:">=8.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Batch singleton + Push/User/Inbox/Profile/Messaging namespaces accepted. imports and API shape receive no behavior credit",missing:"no real Batch.com push delivery"}]},"react-native-background-upload":{category:"Networking",stubType:"native",versions:[{range:">=6.0.0",coverage:.88,note:"native-seam: upstream src/index.js (getFileInfo wrapper, cancelUpload validation, DeviceEventEmitter listeners, default export) runs from the bundle; the VydiaRNFileUploader/RNFileUploader native module does a real XMLHttpRequest upload (the only browser API exposing upload progress), reading the source from the shared expo-file-system VFS and emitting the RNFileUploader-progress/completed/error/cancelled lifecycle on DeviceEventEmitter",working:"startUpload (raw + multipart with field/parameters/headers, PUT/POST), real upload progress events (0-100), completed (responseCode/responseBody), error, cancelUpload \u2192 cancelled event, getFileInfo (exists/size/name/extension/mimeType from the VFS, never rejects)",missing:"no true *background* continuation while the tab is closed (browsers have no equivalent \u2014 the upload runs foreground; same limitation as react-native-fs uploadFiles); tray notification options are accepted but inert (no OS notification surface)"}]},"@shakebugs/react-native-shake":{category:"Analytics",stubType:"native",versions:[{range:">=15.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: native-seam only: the real @shakebugs/react-native-shake runs from the bundle (the full ~670-line Shake JS object : all upstream). we stub only the Shake TurboModule, mirroring src/NativeShake.ts@17.x exactly: every config setter is accepted, every getter returns the inert unconfigured-SDK value, start/silentReport resolve without delivery. per docs/compat-scoring.md (crash/QA noop), delivery is intentionally absent. held one notch below the 0.95 analytics tier because the in-app report UI (show()) has no backend content. (replaces a drifted JS stub exposing non-Spec methods like setEnabled/setUserMetadata). imports and API shape receive no behavior credit",working:"full upstream JS surface (Shake object + enums); start, show, all config setters/getters (feedback/blackbox/activity-history/floating-button/screenshot/threshold/intro/video/console toggles), metadata, private views, network/notification capture APIs, user registration, tags, listener registration",missing:"no shake-to-report delivery, no rendered Shake report form content, no black-box/activity-history/video capture upload \u2014 intentionally absent for the development simulator (no Shake backend)"}]},"expo-dynamic-app-icon":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:`the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setAppIcon/getAppIcon resolve "default"; isSupported=false. imports and API shape receive no behavior credit`,missing:"no UIApplication.setAlternateIconName equivalent"}]},"expo-paste-input":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:0,note:"the reference iOS simulator handles pasted content through the native paste input. SootSim renders only the JavaScript wrapper around a pass-through container, so import safety receives no behavior credit",missing:"onPaste never fires \u2014 sootsim keyboard has no paste pipeline into guest inputs"}]},"react-native-view-pdf":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: PDFView renders null. imports and API shape receive no behavior credit",missing:"recommended swap: PDF.js iframe"}]},"react-native-nitro-haptics":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.5.0",coverage:.85,note:"load-safe noop \u2014 impact/notification/selection accepted",missing:"sootsim has expo-haptics; consumers should use that"}]},"react-native-google-places-sdk":{category:"Maps",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: initialize accepted; fetchPredictions=[]; fetchPlaceByID rejects. imports and API shape receive no behavior credit",missing:"recommended swap: Google Places API on web directly"}]},"react-native-dynamic-app-icon":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:`the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: alias for expo-dynamic-app-icon (0.85) : load-safe noop matching the upstream "no alternate-icon support in browser" expectation. imports and API shape receive no behavior credit`,missing:"see expo-dynamic-app-icon"}]},"react-native-device-country":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam: TYPE constants + getCountryCode wrappers run from the bundle; the NativeDeviceCountry TurboModule returns the real device region derived from the runtime locale (Intl.Locale(navigator.language).region, the documented web equivalent of iOS Locale.current.regionCode) instead of a hardcoded value, preserving upstream\u2019s exact { code, type } ResolveType shape",working:"getCountryCode (real ISO region from the runtime locale), getCountryCodeIOS / getCountryCodeAndroid / Platform branch (run from bundle JS), TYPE_ANY / TYPE_TELEPHONY / TYPE_CONFIGURATION constants",missing:"no SIM/telephony MCC lookup (browsers expose only the OS/locale region, not a carrier country \u2014 TYPE_TELEPHONY resolves the same locale region as TYPE_CONFIGURATION)"}]},"react-native-fingerprint-scanner":{category:"Auth & Payments",stubType:"native",versions:[{range:">=6.0.0",coverage:.85,note:'native-seam: the pure-JS src/* wrappers + createError + ERRORS map run from the real bundle (release.ios is pure JS and never touches native); only NativeModules.ReactNativeFingerprintScanner is ours, mirroring ReactNativeFingerprintScanner.m on the reference iOS Simulator (Face ID device, no biometrics enrolled): canEvaluatePolicy(biometrics) fails first in both isSensorAvailable and authenticate with LAErrorBiometryNotEnrolled, which the native maps to the code FingerprintScannerNotEnrolled and returns via RCTJSErrorFromCodeMessageAndNSError, so the real wrapper rejects with the faithful "no enrolled fingers" FingerprintScannerError \u2014 the exact value a guest gets on the reference device. same faithful tier as expo-local-authentication / react-native-touch-id.',working:"isSensorAvailable() and authenticate({ description, fallbackEnabled }) \u2014 real upstream wrappers + FingerprintScannerError + ERRORS mapping run from the bundle off a faithful native callback; release() is upstream pure JS; reference-simulator parity (rejects FingerprintScannerNotEnrolled)",missing:"no real biometric prompt can succeed \u2014 but neither can the reference iOS Simulator (no enrolled biometrics); expo-local-authentication is the maintained alternative, also a faithful native-seam here"}]},"expo-pip":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: startPictureInPicture/stopPictureInPicture accepted; isPipSupported=false. imports and API shape receive no behavior credit",missing:"browsers expose Document.exitPictureInPicture / requestPictureInPicture; sootsim does not bridge yet"}]},"react-native-detector":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: isAvailable=false; detect rejects. imports and API shape receive no behavior credit",missing:"package surface stubbed loosely"}]},"react-native-orientation-turbo":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.4,note:"orientation state and subscriptions have the right shape, but lock calls never rotate the viewport as they do in the reference iOS simulator",working:"startOrientationTracking/stopOrientationTracking, lockToPortrait/lockToLandscape/unlockAllOrientations (intent tracked \u2192 isLocked correct), getCurrentOrientation (PORTRAIT \u2014 real), isLocked, getDeviceAutoRotateStatus (null, faithful iOS), onOrientationChange/onLockOrientationChange (removable subscriptions), all enums",missing:"a browser cannot force device rotation, so lock* does not visually rotate and orientation-change callbacks never fire (faithful iOS-sim/browser limitation, identical to react-native-orientation-locker \u2014 not a sootsim-specific gap)"}]},"@journeyapps/react-native-quick-sqlite":{category:"Storage & Data",stubType:"native",versions:[{range:">=8.0.0",coverage:.85,note:"native-seam: the pure-JS concurrent-lock layer (setup-open.js, type-orm.js, DBListenerManager, lock-hooks, types) runs unchanged from the bundle; only the QuickSQLite NativeModule is ours \u2014 its synchronous install() populates global.__QuickSQLiteProxy with a real bedrock-sqlite-backed proxy sharing the same WASM engine as expo-sqlite/op-sqlite/nitro-sqlite/react-native-sqlite-storage, so persistence lands in the tenant-scoped memfs IDB and survives reload. faithfully implements the PowerSync concurrent-lock model: requestLock/onLockContextIsAvailable/executeInContext/releaseLock serialized per-db over the single-threaded WASM handle (read+write contexts one-at-a-time, FIFO \u2014 exactly how one SQLite connection behaves; the native lib\u2019s extra read connections are a throughput optimization, not an observable semantic). verified end-to-end against the on-disk bedrock build: CRUD, BEGIN/COMMIT, ROLLBACK, executeBatch, lock-context serialization ordering, and close/reopen persistence.",working:"install()/__QuickSQLiteProxy, open/close/delete, requestLock/releaseLock + onLockContextIsAvailable dispatch, executeInContext (real bedrock SQL incl. joins/params/RETURNING), executeBatch, refreshSchema, the upstream setup-open concurrent-connection object (execute, readLock/writeLock, readTransaction/writeTransaction, listener manager) running off the seam",missing:"ATTACH/DETACH across databases (a second memfs open \u2014 parked until a consumer needs it, matching react-native-sqlite-storage), loadFile, true multi-connection parallelism (single-threaded WASM serializes \u2014 semantically equivalent for SQLite)"}]},"@supersami/rn-foreground-service":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.85,note:"load-safe noop \u2014 start rejects; add_task/remove_task/get_task/get_all_tasks accepted; is_running=false",missing:"no Android foreground service in browser"}]},"react-native-azure-auth":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe error stub \u2014 authorize rejects",missing:"recommended swap: @azure/msal-browser"}]},"react-native-nitro-device-info":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.5.0",coverage:.7,note:'load-safe defaults \u2014 model/manufacturer/deviceId/bundleId/version/buildNumber/systemVersion/systemName all "sootsim"',missing:"consumers should use react-native-device-info (already polyfilled)"}]},"react-native-twilio-video-webrtc":{category:"Networking",stubType:"native",versions:[{range:">=3.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: TwilioVideoLocalView/TwilioVideoParticipantView render null; TwilioVideo.connect rejects. imports and API shape receive no behavior credit",missing:"recommended swap: twilio-video web SDK"}]},"@react-native-ml-kit/barcode-scanning":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam: the BarcodeFormat enum + LINKING_ERROR proxy run from the bundle; the BarcodeScanning native module backs scan() with the native BarcodeDetector API (shipped in the Chromium runtime SootSim runs on \u2014 no vendored library needed), loading the source image through the shared expo-file-system VFS / fetch loader and mapping results to upstream\u2019s exact { format, value } shape with the BarcodeFormat enum values",working:"scan(imageURL) for file:// (VFS) / http(s) / data: images, all BarcodeDetector-supported symbologies mapped to BarcodeFormat (QR/CODE_128/39/93/CODABAR/DATA_MATRIX/EAN/ITF/UPC/PDF417/AZTEC), BarcodeFormat enum",missing:"BarcodeDetector symbology support is browser-implementation-bounded; when unavailable or nothing is detected, resolves [] (a valid no-barcode result, matching the natives) rather than a richer ML Kit bounding-box/cornerPoints payload (upstream Barcode is only { format, value })"}]},"react-native-turbo-mock-location-detector":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: isLocationMocked/isInMockMode=false. imports and API shape receive no behavior credit",missing:"browsers cannot detect mock location"}]},"react-native-xaml":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"Windows-only WinUI/XAML; iOS / Android / web have nothing equivalent"}]},"expo-key-event":{category:"Keyboard",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: addListener/removeListener register but never fire. imports and API shape receive no behavior credit",missing:"consumers can use window keydown/keyup directly on web"}]},"react-native-google-fit":{category:"Health",stubType:"native",versions:[{range:">=0.20.0",coverage:.85,note:"load-safe noop \u2014 authorize reports unavailable; isAuthorized=false; all sample queries return empty",missing:"no Google Fit SDK on iOS / web"}]},"react-native-loader-kit":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.25,note:"load-safe noop \u2014 LoaderKit renders null",missing:"no native loader animations; recommended swap: pure-JS spinner"}]},"@mgcrea/vision-camera-barcode-scanner":{category:"Media",stubType:"native",versions:[{range:">=0.10.0",coverage:.85,note:"load-safe noop \u2014 useBarcodeScanner/useCodeScanner return idle scanner",missing:"paired with react-native-vision-camera (low-coverage upstream); consumers should use jsQR/zxing-js on web"}]},"@stripe/stripe-identity-react-native":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.0.1",coverage:.75,note:"load-safe error stub \u2014 presentVerificationSheet rejects",missing:"no Stripe Identity native flow; recommended swap: Stripe Identity web"}]},"@lottiefiles/dotlottie-react-native":{category:"Animation",stubType:"native",versions:[{range:">=0.5.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: DotLottieAnimation/DotLottiePlayer render null. imports and API shape receive no behavior credit",missing:"no .lottie playback; recommended swap: @lottiefiles/dotlottie-react on web"}]},"react-native-payments":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.10.0",coverage:.6,note:"load-safe pass-through \u2014 forwards to globalThis.PaymentRequest where supported",missing:"see @rnw-community/react-native-payments for the modern variant"}]},"@react-native-seoul/naver-login":{category:"Auth & Payments",stubType:"native",versions:[{range:">=3.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: initialize/logout/deleteToken accepted; login/getProfile reject. imports and API shape receive no behavior credit",missing:"recommended swap: Naver login JS SDK on web"}]},"@vonovak/react-native-theme-control":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setNativeAppearance accepted; getNativeAppearance reports system. imports and API shape receive no behavior credit",missing:"sootsim handles colorScheme natively"}]},"@azzapp/react-native-skia-video":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: SkiaVideo renders null; VideoComposition class exposed. imports and API shape receive no behavior credit",missing:"no native skia video; recommended swap: <video> + canvas on web"}]},"react-native-ease":{category:"Animation",stubType:"native",versions:[{range:">=0.0.1",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: Easing constants exposed; interpolate returns input. imports and API shape receive no behavior credit"}]},"react-native-performance-limiter":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setMode/getMode accepted. imports and API shape receive no behavior credit",missing:"browsers cannot adjust system performance modes"}]},"react-native-bare-kit":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.5.0",coverage:.75,note:"load-safe error stub \u2014 Worklet throws on construction",missing:"no Bare runtime in browser"}]},"react-native-siri-shortcut":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: donateShortcut/clearAllShortcuts/clearShortcutsWithIdentifiers/presentShortcut accepted; getShortcuts=[]; addEventListener returns removable subscription. imports and API shape receive no behavior credit",missing:"no Siri shortcuts on iOS / web"}]},"react-native-expo-braintree":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.5.0",coverage:.75,note:"load-safe error stub \u2014 runApplePay/runGooglePay/requestPaypalNonce reject",missing:"recommended swap: braintree-web SDK on web"}]},"react-native-pinchable":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe passthrough",missing:"no native pinch-to-zoom; consumers should use sootsim Reanimated GestureHandler"}]},"rn-secure-storage":{category:"Auth & Payments",stubType:"native",versions:[{range:">=3.0.0",coverage:.85,note:"partial \u2014 setItem/getItem/removeItem/exist/getAllKeys/multi* backed by the shared tenant key/value store with __soot_secure_ prefix; getSupportedBiometryType=null",missing:"no real keychain encryption; recommended swap: react-native-keychain (already 0.85)"}]},"@candlefinance/faster-image":{category:"Image",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: FasterImage renders null. imports and API shape receive no behavior credit",missing:"use expo-image (already polyfilled)"}]},"@azesmway/react-native-unity":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.5.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: UnityView renders null; sendUnityMessage/postMessageToUnity accepted; isReady=false. imports and API shape receive no behavior credit",missing:"no Unity engine in browser; recommended swap: Unity WebGL build embedded in iframe"}]},"@react-native-community/audio-toolkit":{category:"Media",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe error stub \u2014 Player/Recorder constructors accept; prepare rejects; MediaStates enum exposed",missing:"recommended swap: Web Audio API directly"}]},"@playerdata/react-native-mcu-manager":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 McuManager throws on construction",missing:"no MCU/SMP BLE OTA in browser"}]},"react-native-cloud-storage":{category:"Storage & Data",stubType:"native",versions:[{range:">=2.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: setValue/delete accepted; getValue=null; isCloudAvailable=false. imports and API shape receive no behavior credit",missing:"no iCloud Drive / Google Drive integration in browser"}]},"react-native-fast-opencv":{category:"ML",stubType:"native",versions:[{range:">=0.4.0",coverage:.75,note:"load-safe error stub \u2014 invoke rejects",missing:"recommended swap: opencv.js"}]},"react-native-ios-modal":{category:"UI Components",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"load-safe passthrough \u2014 iOS modal presentation; sootsim Modal already simulates iOS",missing:"consumers should use sootsim Modal directly"}]},"react-native-aes-gcm-crypto":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.2.0",coverage:.95,note:"native-seam: real package runs from the bundle (one line \u2014 export default NativeModules.AesGcmCrypto); the AesGcmCrypto native module is backed by Web Crypto SubtleCrypto AES-GCM with exact CryptoKit wire-format parity (base64 key, hex iv/tag, ciphertext/tag split as SealedBox does)",working:"encrypt (utf-8 or base64 plaintext \u2192 {iv, tag, content}), decrypt (\u2192 utf-8 or base64), encryptFile, decryptFile (read/write through the shared expo-file-system VFS so file:// paths round-trip)",missing:"AES-192 keys are browser-dependent under Web Crypto (AES-128/256 always work) \u2014 same caveat as expo-crypto"}]},"react-native-theme-switch-animation":{category:"Animation",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: applyTheme resolves immediately; ThemeSwitchAnimationStyle constants exposed. imports and API shape receive no behavior credit",missing:"no native theme transition animation"}]},"@react-native-ml-kit/face-detection":{category:"ML",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe error stub \u2014 detect rejects",missing:"recommended swap: face-api.js or MediaPipe"}]},"@mhpdev/react-native-haptics":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam: the impact/notification/selection/androidHaptics wrappers run from the bundle; the Haptics TurboModule delegates to SootSim\u2019s shared expo-haptics navigator.vibrate mapping (same enum string values), so behavior is identical to expo-haptics and there is one source of the vibration logic. calls resolve cleanly when no vibrator is present (and the iOS simulator has no haptics hardware either \u2014 the faithful contract)",working:"impact(style: light/medium/heavy/soft/rigid), notification(type: success/warning/error), selection(), androidHaptics() \u2014 all mapped to navigator.vibrate patterns via the shared expo-haptics implementation",missing:"browsers expose only on/off Vibration (no force/sharpness control) \u2014 exact UIFeedbackGenerator texture is approximated by duration, identical to expo-haptics; no perceptible vibration on a device without a vibrator (faithful to the iOS simulator, which has none)"}]},"expo-passkey":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: isPasskeyAuthAvailable=false; register/authenticate reject. imports and API shape receive no behavior credit",missing:"no WebAuthn in tenant worker"}]},"react-native-floating-label-input":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"load-safe passthrough",missing:"TextInput is the right primitive"}]},"react-native-share-menu":{category:"Device & Platform",stubType:"native",versions:[{range:">=6.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: getInitialShare=null; addNewShareListener returns subscription that never fires. imports and API shape receive no behavior credit",missing:"no iOS Share Extension in browser"}]},"@react-native-ai/apple":{category:"ML",stubType:"native",versions:[{range:">=0.0.1",coverage:.85,note:"load-safe noop \u2014 generateText/generateImage reject; isAvailable=false",missing:"no Apple Intelligence APIs in browser; consumers should use a remote LLM endpoint"}]},"react-native-ble-plx":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.85,note:'load-safe noop \u2014 BleManager class, full State/LogLevel/BleErrorCode/ScanMode enum surface; manager.state() resolves "PoweredOff", connectToDevice rejects with a clear "no native adapter" error so apps with state-gated paths take the no-BLE branch. Matches react-native-ble-manager precedent.',working:"BleManager construction, destroy(), state() (PoweredOff), onStateChange listener, startDeviceScan immediate error callback, stopDeviceScan, connectedDevices/devices/isDeviceConnected (empty/false), service+characteristic+descriptor list queries (empty), cancelTransaction, enable/disable, BleError class, every State / LogLevel / ConnectionPriority / ScanMode / ScanCallbackType / BleErrorCode constant",missing:"no Web Bluetooth bridging in this stub \u2014 apps that absolutely need BLE should branch on state=PoweredOff; characteristic read/write/notify all reject"}]},"react-native-nfc-manager":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:.85,note:'load-safe noop \u2014 NfcManager singleton, full NfcTech / NfcEvents / NfcAdapter / NfcError / Ndef constant surface; isSupported/isEnabled=false, requestTechnology rejects with a clear "no NFC hardware" error so apps with NFC-required paths take the unsupported branch.',working:"NfcManager.start/stop, isSupported/isEnabled (false), getLaunchTagEvent (null), setEventListener bookkeeping, registerTagEvent/unregisterTagEvent (noop), iOS invalidate*Session noops, ndefHandler/nfcAHandler/isoDepHandler structurally-correct empty responses, full NfcTech enum (Ndef, NfcA, NfcB, NfcF, NfcV, IsoDep, Mifare*, Iso15693IOS, FelicaIOS), Ndef.text/uri encode-passthrough helpers",missing:"no WebNFC integration (WebNFC is Chrome-Android-only and requires per-scan user gesture); requestTechnology and transceive operations reject"}]},"react-native-health":{category:"Health",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"load-safe noop \u2014 AppleHealthKit default with full callback-based API; isAvailable returns false so apps with HealthKit-gated paths display empty charts gracefully. Browsers have no HealthKit equivalent.",working:"initHealthKit (success), isAvailable (false), authorizationStatusForType / getAuthStatus (denied), every sample query (steps, distance, energy, heart rate, sleep, weight, height, body composition, blood pressure/glucose/temperature, respiratory/oxygen, mindful, workout) invokes its callback with an empty result, save* methods accept and return a synthesized stub id, deleteWorkout/deleteAllSamples accept, full HealthUnit + HealthStatusCode + HealthKitPermissions + Constants surface",missing:"no HealthKit data store on web \u2014 read queries always return empty results and writes are not persisted"}]},"@aptabase/react-native":{category:"Analytics",stubType:"native",versions:[{range:">=0.4.0",coverage:.95,note:"native-seam only - upstream analytics client, batching, AppState integration, and fetch delivery run from the bundle; RNAptabaseModule supplies live Expo-config appVersion/appBuildNumber constants",working:"init, trackEvent, flush, AppState-based batching, fetch delivery, appVersion/appBuildNumber constants",missing:"no extra native delivery path beyond the upstream JS fetch client"}]},"@mhpdev/react-native-speech":{category:"Media",stubType:"native",versions:[{range:">=1.4.0",coverage:.72,note:"native-seam only - upstream Speech and HighlightedText JS stay in the bundle; RNSpeech provides constants, configuration state, control methods, and codegen event emitters",working:"configure, reset, speak, stop, pause, resume, getSpeechStatus, speechStarted/speechRangeDetected/speechFinished/speechStopped/speechPaused/speechResumed/speechError emitters",missing:"real AVSpeechSynthesizer audio and platform voice availability when browser speechSynthesis is unavailable in the worker"}]},"expo-media-control":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.8,note:"native-seam only - upstream expo-module wrapper runs from the bundle; ExpoMediaControl tracks enabled state, metadata, playback state, and listener bookkeeping",working:"setEnabledAsync, setMetadataAsync, setPlaybackStateAsync, resetAsync, addListener/removeListeners, metadata/playback state storage",missing:"no OS Control Center, lock-screen now-playing UI, or remote transport command source"}]},"expo-video-metadata":{category:"Media",stubType:"native",versions:[{range:">=1.5.0",coverage:.65,note:"native-seam only - upstream Expo module wrapper runs from the bundle; ExpoVideoMetadata reads local VFS/Blob bytes and extracts conservative MP4 container duration, dimensions, audio-track presence, file size, orientation, and aspect ratio",working:"getVideoInfo, local file/blob bytes, MP4 mvhd/tkhd/hdlr parsing, duration, fileSize, width, height, hasAudio, aspectRatio, is16_9, naturalOrientation",missing:"AVFoundation codec/HDR/frame-rate/audio-format/GPS extraction, HTMLVideoElement probing for remote media, and exact track-transform orientation beyond natural dimensions"}]},"react-native-external-display":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.6.0",coverage:.68,note:"native-seam only - upstream component, hooks, SceneManager, and event wrapper run from the bundle; RNExternalDisplayEvent reports the faithful no-external-display state",working:"getConstants, screen lookup/query methods returning empty state, listener bookkeeping, native component load through the generic host-component path",missing:"no external display hardware, second-screen Scene rendering, or OS display attach/detach events"}]},"react-native-intercom":{category:"Analytics",stubType:"native",versions:[{range:">=21.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: native-seam only - upstream Intercom JS facade runs from the bundle; IntercomWrapper accepts registration, identity, messaging, help center, and event-listener calls without a backend session. imports and API shape receive no behavior credit",working:"login/logout/updateUser, unread count, messenger/help-center/article/carousel/survey presentation calls, event listener registration, token/logging/display-mode setters",missing:"no Intercom backend delivery, native messenger UI, push registration, or unread-count sync"}]},"react-native-job-queue":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.5.0",coverage:.75,note:"native-seam only - upstream JS job orchestration runs from the bundle; RNJobQueue stores queue definitions and jobs in memory with the native callback/event surface",working:"configure, addJob, removeJob, getJobs, start/stop queue controls, worker callback/event listener bookkeeping",missing:"no persisted job database, background execution, retry-after-process-death, or OS scheduler integration"}]},"react-native-location":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.5.0",coverage:.85,note:"native-seam only - upstream permission and location JS runs from the bundle; RNLocation bridges to browser geolocation and reports the iOS foreground permission shape",working:"configure, requestPermission/checkPermission for whenInUse-style foreground state, getLatestLocation, subscribeToLocationUpdates, unsubscribe, timeout handling",missing:"no always/background location mode, heading hardware stream, region monitoring, or OS permission prompt UI"}]},"react-native-pdf-from-image":{category:"Media",stubType:"native",versions:[{range:">=0.3.0",coverage:.72,note:"native-seam only - upstream TS wrapper keeps name, path, and paper-size normalization; PdfFromImage synchronously writes real PDF bytes into the shared cache VFS",working:"createPdf sync TurboModule call, file:// VFS reads, JPEG dimension parsing and DCTDecode embedding, PNG dimension parsing, paper-size metadata, cache-VFS output path",missing:"PNG image embedding/rasterization and full UIKit/CoreGraphics page rendering fidelity"}]},"react-native-pdf-light":{category:"Media",stubType:"native",versions:[{range:">=3.2.0",coverage:.55,note:"native-seam only - upstream Pdf/PdfView/ZoomPdfView JS runs from the bundle; NativePdfUtil parses local PDF page count and MediaBox sizes while PdfView is a view-backed host alias",working:"PdfUtil.getPageCount, PdfUtil.getPageSizes, local VFS PDF bytes, MediaBox page dimensions, PdfView host load, imperative annotation command no-op dispatch",missing:"actual PDF page rasterization, annotation drawing, native onPdfLoadComplete/onPdfMeasure events, encrypted PDFs, and full CGPDF parser fidelity"}]},"react-native-sqlite-2":{category:"Storage & Data",stubType:"native",versions:[{range:">=3.6.0",coverage:.88,note:"native-seam only - upstream WebSQL-compatible JS wrapper runs from the bundle; RNSqlite2.exec is backed by the shared bedrock-sqlite WASM engine",working:"openDatabase wrapper, transaction/readTransaction JS flow, exec query batches, rows/rowsAffected/insertId result shape, read-only transaction write rejection, multiply native smoke method",missing:"exact native file locations, multi-connection throughput behavior, and platform-specific SQLite extension loading"}]},"react-native-stallion":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.4.0",coverage:.68,note:"native-seam only - upstream package selects its own disabled/noop JS branch when getStallionConfig is absent; the seam only supplies getActiveReleaseHash for the unconditional native read",working:"package-provided noop init/restart/canUpdate flow, active release hash constant, disabled OTA branch selection",missing:"real OTA bundle download, bundle swap, rollback, and native app restart"}]},"react-native-a11y-container":{category:"UI Components",stubType:"native",versions:[{range:">=0.3.0",coverage:.85,note:"native-component seam only - upstream A11yContainerView JS and enum mapping run from the bundle; sootsim aliases the iOS codegen host view to RCTView so children/layout are preserved",working:"A11yContainerView component, type enum mapping, codegenNativeComponent load, child/layout preservation through the RCTView host alias",missing:"native accessibilityContainerType semantics in the iOS accessibility tree"}]},"react-native-auto-skeleton":{category:"UI Components",stubType:"native",versions:[{range:">=0.1.0",coverage:.7,note:"native-component seam only - upstream AutoSkeletonView and AutoSkeletonIgnoreView wrappers run from the bundle; sootsim aliases both codegen host views to RCTView so app content stays mounted",working:"AutoSkeletonView, AutoSkeletonIgnoreView, default prop processing, color processing, children/layout preservation through RCTView host aliases",missing:"native skeleton placeholder detection, shimmer/pulse mask drawing, and ignore-view masking semantics"}]},"react-native-linkedin-login":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.44.0",coverage:.65,note:"native-seam only - upstream LinkedinLogin JS singleton runs from the bundle; the LinkedinLogin native module emits the same DeviceEventEmitter error channels for unavailable native auth/API requests",working:"init, setSession/logout JS state, login error event, getProfile/getProfileImages request error event, DeviceEventEmitter listener flow",missing:"LinkedIn native SDK session creation, app/url callback handling, access token issuance, and authenticated profile API responses"}]},"react-native-vlc-media-player":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.45,note:"native-seam only - upstream VLCPlayer/VLCPlayerView JS stays in the bundle; sootsim aliases RCTVLCPlayer to RCTView and exposes the legacy UIManager command names the wrapper reads",working:"VLCPlayer import/render load safety, source normalization, event prop wiring, startRecording/stopRecording/stopPlayer/snapshot command dispatch without crashing",missing:"LibVLC playback, video rasterization, media buffering/progress events, recording, snapshots, audio/subtitle track selection, and native certificate handling"}]},"amazon-ivs-react-native-player":{category:"Media",stubType:"native",versions:[{range:">=1.6.0",coverage:.45,note:"native-seam only - upstream IVSPlayer wrapper, source objects, codegen command wrapper, and event prop mapping stay in the bundle; sootsim aliases AmazonIvs to RCTView",working:"AmazonIvs codegen host load, IVSPlayer wrapper mount, child overlay preservation, play/pause/preload/loadSource/releaseSource/seekTo/setOrigin/togglePip command dispatch without crashing",missing:"Amazon IVS SDK playback, stream buffering, quality selection, PiP, statistics/progress/player-state events, timed metadata, and native error reporting"}]},"gt-react-native":{category:"Internationalization",stubType:"native",versions:[{range:">=10.0.0",coverage:.9,note:"native-seam only - upstream @generaltranslation/react-core exports, provider, hooks, and fallback logic stay in the bundle; GtReactNative supplies locale discovery and the native key-value store",working:"getNativeLocales, nativeStoreGet/nativeStoreSet, multiply smoke method, package-owned React provider/hooks/components",missing:"native persistence is in-memory for the simulator session rather than platform storage"}]},"react-native-blasted-image":{category:"Image",stubType:"native",versions:[{range:">=1.1.0",coverage:.75,note:"native-seam only - upstream BlastedImage component, preload batching, fallback logic, and sizing run from the bundle; sootsim maps BlastedImageView to the engine Image host and accepts cache APIs",working:"BlastedImageView host rendering through sootsim Image, local/file/remote source paths, background children overlay, preload/loadImage promise flow, clearMemoryCache/clearDiskCache/clearAllCaches",missing:"native memory/disk cache implementation, retry-backed native prefetch, hybrid asset cache resolution, and platform image pipeline performance characteristics"}]},"react-native-receive-sharing-intent":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.65,note:"native-seam only - upstream Linking/AppState wrapper and data sorting stay in the bundle; ReceiveSharingIntent reports the clean no-initial-share state",working:"getReceivedFiles listener setup, getFileNames resolving an empty shared-file list, clearReceivedFiles local state",missing:"iOS share-extension handoff, Android ACTION_SEND intents, copied file persistence, and app activation from external share sheets"}]},"react-native-vosk":{category:"Media",stubType:"native",versions:[{range:">=2.1.0",coverage:.55,note:"native-seam only - upstream permission wrapper and event helper exports stay in the bundle; Vosk accepts model load/unload and exposes codegen event emitters before reporting recognition unavailable",working:"loadModel/unload, start unavailable rejection, stop noop, onResult/onPartialResult/onFinalResult/onError/onTimeout subscriptions",missing:"libvosk model loading, microphone capture, streaming recognition, timeout/result events, and offline speech decoding"}]},"react-native-cashfree-pg-sdk":{category:"Auth & Payments",stubType:"native",versions:[{range:">=2.4.0",coverage:.7,note:"native-seam only - upstream payment gateway class, Cashfree contract objects, card components, and callback subscription logic stay in the bundle; native calls are accepted and UPI discovery reports none installed",working:"doPayment/doUPIPayment/doWebPayment/doSubscriptionPayment, element/card/subscription payment method calls, set/remove callback/event subscriber, getInstalledUpiApps empty event/callback shape",missing:"Cashfree native checkout UI, payment execution, bank/UPI app discovery, verification callbacks from the SDK, and production transaction delivery"}]},"react-native-message-bar":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.9,note:"pure JS message bar \u2014 renders through base React Native primitives with no native module seam"}]},"react-native-ota-hot-update":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.7,note:"native-seam only \u2014 upstream OTA JS runs from the bundle; OtaHotUpdate stores version/metadata/bundle-list state and file writes through the shared VFS, while restart is a faithful browser no-op",working:"setupBundlePath, setExactBundlePath, deleteBundle, getCurrentVersion, getUpdateMetadata, setCurrentVersion, setUpdateMetadata, getBundleList, deleteBundleById, clearAllBundles, writeFile",missing:"no real JS bundle swapping or app restart inside the browser worker; rollback reports false unless a future shell-level bundle switcher is added"}]},"react-native-wifi-p2p":{category:"Networking",stubType:"native",versions:[{range:">=3.0.0",coverage:.75,note:"native-seam only \u2014 upstream JS runs from the bundle; WiFiP2PManagerModule reports the Android Wi-Fi Direct unsupported state with empty peer/connection data",working:"init, event subscription helpers, getAvailablePeersList (empty), getConnectionInfo (not formed), getGroupInfo (null), callback-style operations reject with upstream P2P_UNSUPPORTED reason code",missing:"no Wi-Fi Direct hardware, peer discovery, sockets, file transfer, or group ownership in the browser"}]},"expo-widgets":{category:"Expo SDK",stubType:"native",versions:[{range:">=57.0.10 <58.0.0",coverage:.7,note:"native-seam only \u2014 the published Widget, LiveActivity, and factory classes run from the bundle; widget timelines and live-activity instance lifecycles use deterministic in-memory state while unavailable host events and push tokens stay absent",working:"createWidget, Widget reload/updateTimeline/updateSnapshot/getTimeline, createLiveActivity, LiveActivityFactory start/getInstances, LiveActivity update/end/getPushToken, after dismissal policy, widgetsDirectory, reloadAllWidgets, and removable user-interaction/push-token subscriptions",missing:"no WidgetKit home-screen or Lock Screen rendering, Dynamic Island visuals, APNs push or push-to-start tokens, host widget interaction events, app-group files, or timeline persistence across simulator restarts"}]},"@bittingz/expo-widgets":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.1.0",coverage:.75,note:"native-seam only \u2014 upstream setWidgetData wrapper runs from the bundle; ExpoWidgets.setWidgetData is accepted with no Android widget host in SootSim",missing:"no Android AppWidget broadcast/rendering host in the iOS-shaped browser simulator"}]},"@ebrimasamba/react-native-sms-retriever":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:.75,note:"real package JS handles iOS as unsupported before loading its Android SMSRetriever TurboModule; SootSim follows that upstream branch without a stub",missing:"Android SMS Retriever hardware/service path is unavailable in the iOS simulator"}]},"react-native-actions-shortcuts":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream NativeModules.RNShortcuts export runs from the bundle; shortcut set/get/clear and initial-shortcut reads are backed by in-memory UIApplicationShortcutItem-shaped state",working:"setShortcuts, getShortcuts, clearShortcuts, getInitialShortcut",missing:"no home-screen quick-action launch event from the host OS"}]},"react-native-quick-actions":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.3.0",coverage:.9,note:"native-seam only. Upstream Android and iOS JavaScript runs from the bundle; ReactAppShortcuts and RNQuickActionManager share dynamic shortcut items in memory and start with no launcher action.",working:"setShortcutItems, clearShortcutItems, popInitialAction, isSupported",missing:"no home-screen launcher shortcut or host OS launch event"}]},"@joplin/react-native-alarm-notification":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.7.0",coverage:.8,note:"native-seam only. Upstream JavaScript runs from the bundle; RNAlarmNotification stores scheduled alarm records in memory and reports no notification-launch payload.",working:"scheduleAlarm, deleteAlarm, deleteRepeatingAlarm, getScheduledAlarms, getAlarmInfo, listener and permission methods",missing:"no host OS alarm scheduling, notification delivery, sound, or notification-launch events"}]},"@rn-org/react-native-shortcuts":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.2.0",coverage:.9,note:"native-seam only \u2014 upstream JS and NativeEventEmitter wrapper run from the bundle; RNShortcuts add/update/remove/query APIs are backed by in-memory UIApplicationShortcutItem-shaped state",working:"addShortcut, updateShortcut, removeShortcut, removeAllShortcuts, getShortcutById, isShortcutExists, isShortcutSupported, getInitialShortcutId, listener bookkeeping",missing:"no real iOS home-screen quick-action launch event"}]},"react-native-spotlight-search":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"native-seam only \u2014 upstream JS runs from the bundle; SpotlightSearch accepts index/delete calls and initial item reads without a CoreSpotlight index",working:"getInitialSearchItem, indexItem, indexItems, deleteItemsWithIdentifiers, deleteItemsInDomains, deleteAllItems, listener bookkeeping",missing:"no OS Spotlight index or tap-through launch events in the browser"}]},"react-native-testfairy":{category:"Analytics",stubType:"native",versions:[{range:">=2.0.0",coverage:.95,note:"native-seam only \u2014 real TestFairy JS class runs from the bundle; TestFairyBridge accepts every session/feedback/logging call without session recording or delivery",working:"begin, feedback handler toggles, identify/correlation/user attributes, checkpoints/events, screenshot/log/screen/session controls, feedback options, attachFile, network event logging",missing:"no TestFairy video/session upload backend in SootSim"}]},"react-native-notification-sounds":{category:"Notifications",stubType:"native",versions:[{range:">=0.5.0",coverage:.75,note:"native-seam only \u2014 upstream JS runs from the bundle; NotificationSounds exposes an empty system sound catalog and sample playback noops",working:"getNotifications resolves [], playSample and stopSample are accepted",missing:"no iOS system sound filesystem or AudioServices playback in the worker"}]},"expo-testflight":{category:"Expo SDK",stubType:"native",versions:[{range:">=0.3.0",coverage:1,note:"native-seam only \u2014 upstream expo module wrapper runs from the bundle; ExpoTestFlight.isTestFlight=false, matching a non-TestFlight simulator session"}]},"@bugfender/rn-bugfender":{category:"Analytics",stubType:"native",versions:[{range:">=4.0.0",coverage:.95,note:"native-seam only \u2014 real Bugfender JS/console facade runs from the bundle; RnBugfender accepts logging/crash/user-feedback calls with no delivery backend",working:"init/activateLogger, device/session URL getters, log levels, sendIssue/sendCrash/sendUserFeedback, device keys, forceSendOnce, feedback UI returns the clean unavailable path",missing:"no Bugfender dashboard delivery or native feedback UI in SootSim"}]},"react-native-simple-biometrics":{category:"Auth & Payments",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam only \u2014 upstream validation wrapper runs from the bundle; SimpleBiometrics reports canAuthenticate=false and rejects auth prompts as unavailable",missing:"no enrolled biometrics / LocalAuthentication prompt in the browser worker"}]},"react-native-credentials-manager":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.8.0",coverage:.6,note:"native-seam only \u2014 upstream credentials wrapper runs from the bundle; native sign-in methods reject with unsupported-operation errors and signOut resolves null",working:"module loads, signOut resolves, unsupported operations fail explicitly",missing:"no AuthenticationServices / Credential Manager / passkey / Google / Apple sign-in flow"}]},"@generac/react-native-local-network-permission":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: native-seam only : upstream expo-module wrapper runs from the bundle; check() resolves true, matching the package web/android no-op branches where there is no iOS local-network prompt. imports and API shape receive no behavior credit",missing:"no native iOS local-network permission dialog"}]},"react-native-system-bars":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream AndroidSystemBars class runs from the bundle; SystemBars.setSystemUIVisibility is accepted as an iOS/browser no-op",missing:"Android system UI flag rendering is not applicable to SootSim iOS"}]},"@pushpendersingh/react-native-otp-verify":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 upstream OTP helpers and extractOtp run from the bundle; ReactNativeOtpVerify returns an empty app signature, removes listeners, and rejects Android SMS consent/retriever starts as unavailable",working:"getAppSignature, removeSmsListener, onSmsReceived subscription shape, pure-JS extractOtp",missing:"Android SMS Retriever / phone-number consent service is unavailable in SootSim iOS"}]},"expo-screen-corner-radius":{category:"Expo SDK",stubType:"native",versions:[{range:">=1.0.0",coverage:1,note:"native-seam only \u2014 the upstream Expo module wrapper runs from the bundle; getCornerRadiusSync and getCornerRadius return the live simulated device's measured display corner radius from the same canonical surface metrics the engine uses to clip its screen. the value follows device switches and is zero for square-screen devices.",working:"getCornerRadiusSync and getCornerRadius with the real per-device radius in points"}]},"react-native-notification-badge":{category:"Notifications",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream iOS Platform branch runs from the bundle; NotificationBadge stores badge count in-memory and reports badge permission as notSupported",working:"setBadgeCount, getBadgeCount, getBadgeCountSync, getNotificationBadgeSetting, requestNotificationPermissions=false, removeNotificationsWithThreadId=0",missing:"no UserNotifications permission prompt or delivered-notification center"}]},"react-native-bluetooth-status":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.85,note:"native-seam only \u2014 upstream BluetoothManager/useBluetoothStatus JS runs from the bundle; RNBluetoothManager emits the iOS unsupported state and Android setBluetoothState is a no-op",working:"manualInitialization/initialize emit bluetoothStatus=unsupported, listener bookkeeping",missing:"no CoreBluetooth hardware state changes"}]},"react-native-headphone-detection":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream hook and event wrapper run from the bundle; RNHeadphoneDetection reports no audio jack or bluetooth route",working:"AUDIO_DEVICE_CHANGED_NOTIFICATION constant, isAudioDeviceConnected, NativeEventEmitter listener bookkeeping",missing:"no AVAudioSession route-change events from host hardware"}]},"react-native-fast-secure-storage":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream SecureStorage class and JSI install wrapper run from the bundle; FastSecureStorage.install mounts the __SecureStorage host object backed by the shared tenant key/value store",working:"setItem/getItem/clearStorage/setItems/getAllKeys/getAllItems/removeItem/hasItem plus sync get/set/remove/has operations",missing:"no real Keychain / EncryptedSharedPreferences encryption"}]},"@wwdrew/expo-android-shared-preferences":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.3.0",coverage:.9,note:"native-seam only \u2014 upstream Expo module wrapper, typed getters/setters, and hook run from the bundle; ExpoAndroidSharedPreferences is backed by filename-scoped entries in the shared tenant key/value store",working:"contains, remove, clear, string/int/long/float/boolean getters and setters, addChangeListener subscription shape",missing:"native Android SharedPreferences file semantics and cross-process broadcasts are unavailable in the iOS/browser simulator"}]},"react-native-get-device-locale":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream TurboModule/NativeModules selection and default-locale error handling run from the bundle; GetDeviceLocale returns the Intl locale in the package underscore format",working:"getDeviceLocale resolves values such as en_US",missing:"no per-app iOS language override beyond the browser Intl locale"}]},"@logicwind/react-native-status-bar-height":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.2.0",coverage:.85,note:"native-seam only \u2014 upstream Dimensions fallback logic and exported fetch helpers run from the bundle; ReactNativeStatusBarHeight exposes SootSim iPhone status and bottom-safe-area constants",working:"fetchStatusBarHeight and fetchBottomInset through upstream JS",missing:"constants are fixed to the current SootSim device rather than live device-picker updates"}]},"@computools/react-native-dynamic-app-icon":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.65,note:"native-seam only \u2014 upstream exported getIcon/changeIcon functions run from the bundle; getIcon reports DefaultIcon and changeIcon rejects with the iOS NOT_SUPPORTED path because SootSim has no declared alternate app icons",working:"getIcon returns DefaultIcon; unsupported changeIcon rejects with code IOS:NOT_SUPPORTED",missing:"no UIApplication alternateIconName / Info.plist icon set integration"}]},"@roman.sytnyk/blur-app-in-recents":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.2.0",coverage:.75,note:"native-seam only \u2014 upstream Expo module export runs from the bundle; BlurAppInRecents tracks enable/disable state for consumers that query it",working:"enable, disable, isBlurringEnabled",missing:"no real app-switcher snapshot blur overlay from the host OS"}]},"react-native-home-indicator":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.2.0",coverage:.85,note:"native-seam only \u2014 upstream HomeIndicator component and history stack run from the bundle; RNHomeIndicator accepts alwaysVisible/autoHidden calls",missing:"no host-level home indicator auto-hide effect yet"}]},"@attarchi/react-native-lottie-splash-screen":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator displays the package splash animation. SootSim only accepts hide(), so import safety receives no behavior credit",working:"SplashScreen.hide",missing:"no native launch-screen Lottie overlay to dismiss"}]},"@dariyd/react-native-document-scanner":{category:"Media",stubType:"native",versions:[{range:">=1.0.0",coverage:.65,note:"native-seam only \u2014 upstream TurboModule fallback wrapper and launchScanner Promise/callback normalization run from the bundle; DocumentScanner returns the native cancellation shape",working:"launchScanner resolves/calls back with {didCancel:true}",missing:"no VisionKit / ML Kit document camera UI or scanned image extraction"}]},"react-native-full-screen-notification-incoming-call":{category:"Notifications",stubType:"works",versions:[{range:">=1.0.0",coverage:.65,note:"real package JS is load-safe on iOS: Android-only display/hide/backToApp/listener methods return before touching the native module, while declineCall/answerCall emit through React Native DeviceEventEmitter",missing:"Android full-screen incoming-call notification Activity/service is unavailable in SootSim iOS"}]},"react-native-location-enabler":{category:"Device & Platform",stubType:"native",versions:[{range:">=4.0.0",coverage:.75,note:"native-seam only \u2014 upstream hook, PRIORITIES assignment, NativeEventEmitter wrapping, and config types run from the bundle; LocationEnabler reports location settings enabled and accepts resolution requests",working:"getConstants priorities, checkSettings/requestResolutionSettings, addListener/once path through NativeEventEmitter",missing:"Android Google Play Services resolution dialog and location-settings hardware checks"}]},"react-native-google-places":{category:"Device & Platform",stubType:"native",versions:[{range:">=3.0.0",coverage:.55,note:"native-seam only \u2014 upstream RNGooglePlaces class, default options merge, and place-field argument assembly run from the bundle; native seam returns empty prediction/current-place lists and rejects UI/detail flows as unavailable",working:"getAutocompletePredictions resolves [], getCurrentPlace resolves []",missing:"no Google Places SDK, API key validation, autocomplete modal UI, or place detail network lookup"}]},"react-native-http-bridge-refurbished":{category:"Networking",stubType:"native",versions:[{range:">=1.0.0",coverage:.6,note:"native-seam only \u2014 upstream BridgeServer, Request, Response, and route registration JS run from the bundle; HttpServer start/stop/respond are accepted without binding a local TCP port",working:"BridgeServer construction, route registration, listen/stop/respond call paths",missing:"browsers cannot open an inbound local HTTP server socket from the tenant worker"}]},"pushy-react-native":{category:"Notifications",stubType:"native",versions:[{range:">=1.0.0",coverage:.82,note:"native-seam only \u2014 upstream Pushy JS export, NativeEventEmitter listener helpers, and platform-specific placeholder methods run from the bundle; PushyModule accepts configuration calls and reports no registered push token",working:"listen, isRegistered=false, subscribe/unsubscribe noops, notification listener setup, badge/config/toggle helpers",missing:"no Pushy registration, APNs/FCM connectivity, notification delivery, or click events"}]},"expo-playcore-in-app-update":{category:"Expo SDK",stubType:"works",versions:[{range:">=0.0.0",coverage:.75,note:"real package JS uses requireOptionalNativeModule and returns early on non-Android platforms, so SootSim iOS follows the upstream unsupported branch without a native seam",missing:"Android Play Core immediate-update flow is unavailable in SootSim iOS"}]},"react-native-android-sms-listener":{category:"Device & Platform",stubType:"works",versions:[{range:">=0.8.0",coverage:.65,note:"real package JS is a DeviceEventEmitter subscription helper and runs unchanged on SootSim; no native module is required to mount optional SMS-listener code",missing:"Android broadcast receiver and incoming SMS events are unavailable in SootSim iOS"}]},"react-native-nitro-sse":{category:"Networking",stubType:"native",versions:[{range:">=2.0.0",coverage:.75,note:"native-seam only \u2014 upstream NitroSseClient class and listener dispatch run from the bundle; the NitroSse HybridObject supports setup/start/stop/restart/flush/status/header APIs with event callbacks",working:"createNitroSse, setup legacy callback, add/removeEventListener dispatch, start/open, stop/close, restart, isConnected, getStats, updateHeaders, setLastProcessedId",missing:"no native streaming socket implementation yet; browser EventSource/fetch streaming can be wired in a future seam"}]},"react-native-nitro-fetch":{category:"Networking",stubType:"native",versions:[{range:">=1.5.4 <2.0.0",coverage:.75,note:"native-seam only: upstream package JavaScript runs against browser-backed NitroFetch and in-memory NativeStorage hybrid objects",working:"fetch with RequestInfo/RequestInit, AbortSignal, headers, string/byte/form-data request bodies, redirects, credentials, request cancellation and timeouts; upstream Headers, Request, Response, generateCurl, NetworkInspector, prefetch queue, token mapping, and token-refresh utilities",missing:"Cronet/URLSession transport details, HTTP/3-specific behavior, native disk/prefetch cache, synchronous off-thread worklet requests, streaming requests, and encrypted native token-refresh persistence"}]},"react-native-nitro-text-decoder":{category:"Networking",stubType:"native",versions:[{range:">=0.2.0 <1.0.0",coverage:.98,note:"native-seam only: the upstream TextDecoder class runs unchanged against the worker TextDecoder through NitroTextEncoding",working:"UTF-8 and utf8 labels, fatal decoding, BOM handling, streaming decode, ArrayBuffer, typed-array and DataView byte ranges, and empty-input flush",missing:"native SIMD performance characteristics"}]},"react-native-nitro-websockets":{category:"Networking",stubType:"native",versions:[{range:">=1.0.0 <2.0.0",coverage:.75,note:"native-seam only: the upstream NitroWebSocket class runs unchanged against the worker browser WebSocket transport",working:"connect, string and binary send/receive, protocols, ready state, URL, buffered amount, extensions, and open/message/close/error callbacks",missing:"cold-start prewarming, durable prewarm queue storage including remove and clear behavior, custom native handshake headers, native TLS implementation details, and native socket performance characteristics"}]},"react-native-fast-trie":{category:"Storage & Data",stubType:"native",versions:[{range:">=0.2.0",coverage:.9,note:"native-seam only \u2014 upstream FastTrie class runs from the bundle; FastTrie.install mounts the __FastTrie host factory with deterministic prefix-search semantics",working:"insert, batchInsert, delete, contains, find(prefix, maxResults)",missing:"native burst-trie memory/performance characteristics; JS Set-backed trie is for simulator correctness, not benchmark parity"}]},"@iconscout/react-native-unicons":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.9,note:"pure JS icon components over react-native-svg; generated Unicon components render through the existing SVG engine without a native package seam",missing:"fidelity inherits react-native-svg path rendering"}]},"react-navigation-heavy-screen":{category:"Navigation",stubType:"works",versions:[{range:">=1.0.0",coverage:.85,note:"pure JS wrapper over React Navigation, InteractionManager, and reanimated Transitioning; no package-native module is used at runtime",missing:"animation fidelity inherits the reanimated Transitioning compatibility layer"}]},"@rudderstack/rudder-integration-appcenter-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 upstream integration setup wrapper runs from the bundle; RudderIntegrationAppcenterReactNative setup/enable/disable resolve without AppCenter delivery",missing:"no AppCenter analytics backend delivery"}]},"@baronha/ting":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"native-seam only \u2014 upstream image URI normalization and toast/alert/setup exports run from the bundle; Ting accepts toast/alert/dismiss/setup without presenting native SPIndicator UI",working:"toast, alert, dismissAlert, setup",missing:"no native toast/alert overlay visuals yet"}]},"react-native-record-screen":{category:"Media",stubType:"native",versions:[{range:">=0.6.0",coverage:.65,note:"native-seam only \u2014 upstream Dimensions/config wrapper runs from the bundle; RecordScreen accepts setup/start/clean and reports stop as unavailable",working:"startRecording resolves started, clean resolves, stopRecording returns an error-shaped unavailable result",missing:"no ReplayKit / MediaProjection capture of the simulated screen"}]},"react-native-dynamically-selected-picker":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.85,note:"real package JS renders a ScrollView/Text picker and does not touch its native module during normal rendering",missing:"native package is effectively unused; picker behavior inherits ScrollView snap/focus fidelity"}]},"expo-hardware-buttons":{category:"Expo SDK",stubType:"native",versions:[{range:">=1.0.0",coverage:.55,note:"native-seam only \u2014 upstream Expo module export and event types run from the bundle; HardwareButtons reports volume buttons present, no camera button, and accepts camera-button attach/detach",working:"getCapabilitiesAsync, attachCameraButton, detachCameraButton, listener subscription shape",missing:"no hardware button event stream from the host OS"}]},"@logicwind/react-native-fold-detection":{category:"Device & Platform",stubType:"works",versions:[{range:">=0.3.0",coverage:.75,note:"real package JS returns the iOS null FoldingFeature branch in SootSim and never calls the Android native module",missing:"Android foldable posture events are unavailable in the iOS simulator"}]},"react-native-measure-text":{category:"UI Components",stubType:"native",versions:[{range:">=1.0.0-alpha.0",coverage:.78,note:"native-seam only \u2014 upstream direct NativeModules.RNMeasureText export runs from the bundle; RNMeasureText.measure returns deterministic text-height estimates for arrays of strings",working:"measure({ width, texts, fontSize }) promise API",missing:"not backed by TextKit/CoreText font shaping yet; complex scripts and custom fonts are approximate"}]},"react-native-smart-splash-screen":{category:"Device & Platform",stubType:"native",versions:[{range:">=2.0.0",coverage:.9,note:"native-seam only \u2014 upstream NativeModules.SplashScreen export runs from the bundle; SplashScreen exposes animationType constants and accepts close()",working:"close, animationType constants",missing:"no native launch-screen overlay to animate away"}]},"react-native-social-share":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 upstream parameter validation runs from the bundle; KDSocialShare tweet/shareOnFacebook callbacks report the native not_available status without posting to native social SDKs",working:"shareOnTwitter/shareOnFacebook missing-input validation and native status callback shape",missing:"no Twitter/Facebook composer UI or posting"}]},"@ankipro/react-native-file-open":{category:"Storage & Data",stubType:"native",versions:[{range:">=1.0.0",coverage:.75,note:"native-seam only \u2014 upstream NativeEventEmitter wrapper runs from the bundle; FileOpeningModule returns no initial opened file and accepts FileOpened listeners",working:"getOpenedFileURL resolves empty string; addListener subscription shape",missing:"no host document-open handoff events"}]},"@splicer97/react-native-mytracker":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"native-seam only \u2014 upstream typed analytics facade runs from the bundle; Mytracker accepts every tracking/configuration call and returns a stable instance id without delivery",working:"initTracker, track events/login/invite/registration/level, launch/buffering/forcing/autotrack/location/debug settings, getInstanceId",missing:"no MyTracker network delivery"}]},"react-native-events":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 upstream EventEmitter orchestration runs from the bundle; RNEventEmitter accepts module registration and emit calls for JS-side event fanout",working:"register/conform/emitJSEvent paths for JS subscribers",missing:"no native module event source beyond JS-triggered fanout"}]},"react-native-orientation-manager":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.78,note:"native-seam only \u2014 upstream orientation value classes, lock helpers, listener maps, and NativeEventEmitter wrapper run from the bundle; OrientationManagerModule reports portrait initial constants and accepts orientation lock calls",working:"getConstants initialInterfaceOrientationValue/initialDeviceOrientationValue, lock/unlock/reset methods, addInterfaceOrientationChangeListener/addDeviceOrientationChangeListener subscription setup",missing:"no rotation/orientation-change events from the host device yet"}]},"@maniac-tech/react-native-expo-read-sms":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:.65,note:"real package JS returns its non-Android error branch in SootSim before touching the Android native SMS reader",missing:"Android SMS permissions, broadcast receiver, and SMS read events"}]},"expo-core-spotlight":{category:"Expo SDK",stubType:"native",versions:[{range:">=1.0.0",coverage:.4,note:"native-seam only \u2014 upstream Expo module wrapper and item types run from the bundle; ExpoCoreSpotlight reports unavailable and accepts index/remove calls so guarded app paths remain load-safe",working:"published package import, item validation and method shapes, indexItem(s), removeItem(s), removeAllItems, removeAllItemsFromDomain, isAvailable=false",missing:"no CoreSpotlight index or OS search tap-through"}]},"rn-apple-healthkit":{category:"Health",stubType:"native",versions:[{range:">=0.5.0",coverage:.72,note:"native-seam only \u2014 upstream constants merge and method export run from the bundle; AppleHealthKit reports HealthKit unavailable and exposes the callback methods with no-data results so gated optional HealthKit paths can degrade cleanly",working:"isAvailable=false, initHealthKit unavailable callback, authorizationStatusForType unavailable rejection, module info, characteristic fallbacks, empty sample arrays, zero quantity results, save callback arities without persistence",missing:"no HealthKit data store, permission prompt, authorization state, observer events, native input validation, or persisted writes in the browser simulator"}]},"rn-css":{category:"UI Components",stubType:"works",versions:[{range:">=2.0.0",coverage:.95,note:"pure JS \u2014 styled-components-style css template tag over RN primitives; no native modules, runs as-is from the bundle",working:"styled.View/Text/etc, css template literals, theme provider, media queries, units, inline style resolution",missing:"nothing native to provide \u2014 any gap is the pure-JS surface itself, not a missing native seam"}]},"react-native-gauge":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS \u2014 composes react-native-progress + masked-view + expo-linear-gradient + Animated; no native modules, runs as-is from the bundle",working:"Gauge component, animated needle, gradient fill, triangle tip/base, circle indicator \u2014 all JS-rendered",missing:"no native module \u2014 fidelity is bounded only by the underlying JS rendering libraries"}]},"react-native-material-you-colors":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS on iOS \u2014 the Monet palette generator runs in JS; the native module is android-only (isMaterialYouSupported=false, getPalletteFromAndroid=null on iOS)",working:"MaterialYou.generatePaletteFromColor, createThemeContext, useMaterialYouTheme, Palette/Monet algorithm, isSupported=false on iOS",missing:"dynamic system-wallpaper palette extraction (android-12+ only) \u2014 iOS has no system Material You source, matching upstream"}]},"react-native-shake-event":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: pure JS : addEventListener wires a DeviceEventEmitter listener for 'ShakeEvent'; no native module method is called, so it runs as-is and the shake event simply never fires in the simulator (correct: no shake gesture). imports and API shape receive no behavior credit",working:"RNShakeEvent.addEventListener/removeEventListener for the shake event",missing:"no device shake gesture in the simulator, so the listener never fires \u2014 matching the absence of a real accelerometer"}]},"@rudderstack/rudder-integration-facebook-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the setup() wrapper runs from the bundle; RudderIntegrationFacebookReactNative.setup() is a noop. delivery intentionally absent in browser preview.",working:"default setup() resolves; device-mode registration accepted without throwing",missing:"no Facebook SDK delivery \u2014 same constraint as every analytics integration in browser preview"}]},"@rudderstack/rudder-integration-clevertap-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the setup() wrapper runs from the bundle; RudderIntegrationCleverTapReactNative.setup() is a noop. delivery intentionally absent in browser preview.",working:"default setup() resolves; device-mode registration accepted without throwing",missing:"no CleverTap SDK delivery \u2014 same constraint as every analytics integration in browser preview"}]},"@rudderstack/rudder-integration-singular-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the setup() wrapper runs from the bundle; RudderIntegrationSingularReactNative.setup() is a noop. delivery intentionally absent in browser preview.",working:"default setup() resolves; device-mode registration accepted without throwing",missing:"no Singular SDK delivery \u2014 same constraint as every analytics integration in browser preview"}]},"@rudderstack/rudder-integration-braze-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the setup() wrapper runs from the bundle; RudderIntegrationBrazeReactNative.setup() is a noop. delivery intentionally absent in browser preview.",working:"default setup() resolves; device-mode registration accepted without throwing",missing:"no Braze SDK delivery \u2014 same constraint as every analytics integration in browser preview"}]},"@rudderstack/rudder-integration-amplitude-react-native":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the setup() wrapper runs from the bundle; RudderIntegrationAmplitudeReactNative.setup() is a noop. delivery intentionally absent in browser preview.",working:"default setup() resolves; device-mode registration accepted without throwing",missing:"no Amplitude SDK delivery \u2014 same constraint as every analytics integration in browser preview"}]},"react-native-apple-ads-attribution":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the AppleAdsAttribution JS class runs from the bundle; RNAppleAdsAttribution.getAttributionData() resolves {} (exactly what the real iOS module returns on the no-attribution/error path). attribution data intentionally absent.",working:"getAttributionData() resolves an empty object",missing:"no Apple Search Ads attribution payload in the simulator \u2014 matches the real iOS module resolving {} when attribution is unavailable"}]},"@logicwind/react-native-matomo-tracker":{category:"Analytics",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the tracker JS API runs from the bundle; ReactNativeMatomoTracker exposes all track*/createTracker/session/dimension methods as noops. delivery intentionally absent in browser preview.",working:"createTracker, trackScreen/Event/Goal/Search/Outlink/Download/Impression/Interaction/Media/Campaign/CustomDimension, trackDispatch, set/disable/enable tracking, setUserId/VisitorId, startSession, setLogger",missing:"no Matomo delivery \u2014 same constraint as every analytics SDK in browser preview"}]},"react-native-appearance-control":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the JS wrapper runs from the bundle; the AppearanceControl TurboModule accepts setAppearanceDark/Light/System as noops",working:"setAppearanceDark(), setAppearanceLight(), setAppearanceSystem() resolve",missing:"no runtime override of the host appearance in the simulator \u2014 calls resolve without changing the canvas color scheme"}]},"rn-date-format":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the JS wrapper runs from the bundle; the DeviceTimeFormat TurboModule's is24HourFormat() returns false (the iOS-default 12-hour reading)",working:"is24HourFormat() returns a boolean",missing:"no per-device locale time-format reading in the simulator \u2014 returns the 12-hour default"}]},"react-native-app-review":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the JS wrapper runs from the bundle; the AppReview native module exposes launch() as a noop (no StoreKit review prompt in the simulator)",working:"AppReview.launch() accepted",missing:"no SKStoreReviewController prompt in the simulator \u2014 launch() is a noop, matching the OS rate-limiting/no-op the real API has in most contexts"}]},"react-native-cardview":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS on iOS \u2014 CardView.ios.js renders a plain <View> with shadow/borderRadius styles; the native RNCardView is Android-only, never touched on the iOS-shaped simulator",working:"CardView with cardElevation/cornerRadius/shadowOpacity mapped to View shadow styles"}]},"@klarna/react-native-vector-drawable":{category:"Image",stubType:"works",versions:[{range:">=0.1.0",coverage:.95,note:"pure JS on iOS \u2014 index.ios.js is `export { View as default } from 'react-native'`; the native RNVectorDrawable component is Android-only and never resolved on the simulator",working:"VectorDrawable degrades to a plain RN View on iOS (matching upstream Android-only native)"}]},"react-native-image-mapper":{category:"UI Components",stubType:"works",versions:[{range:">=0.1.0",coverage:.95,note:"pure JS \u2014 image overlay built from ImageBackground + TouchableOpacity hotspots, no ios/ or android/ native code at all",working:"ImageMapper, clickable mapping areas over an image, onPress per area"}]},"react-native-basic-carousel":{category:"UI Components",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:"pure JS \u2014 the Carousel component is an Animated.FlatList with pagination; the package only references NativeModules.RNBasicCarouselModule for a vestigial default export (undefined on the simulator, load-safe)",working:"Carousel (data/renderItem/itemWidth/pagination/autoplay), snap-to-item, paging, pagination dots"}]},"react-native-insta-story":{category:"UI Components",stubType:"works",versions:[{range:">=0.1.0",coverage:.95,note:'pure JS \u2014 Story component built on modal + swipe gestures; the bundled InstaStory native module is an unimplemented placeholder (a red "*****" UILabel) that the JS never imports',working:"InstaStory list, per-story progress, swipe between users, tap to advance"}]},"react-native-in-app-updates":{category:"Device & Platform",stubType:"works",versions:[{range:">=1.0.0",coverage:.95,note:'load-safe on iOS \u2014 upstream guards the missing native module with a Proxy and every method short-circuits to `Promise.reject("only available on Android")`, exactly the clean unavailable state an app expects on iOS',working:"checkNeedsUpdate / startUpdate / addStatusUpdateListener importable; iOS calls reject with the Android-only error (matching real device behavior)"}]},"react-native-xxhash":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"native-seam only \u2014 the real JS runs from the bundle; the xxhash JSI install() mounts faithful XXH3-64/128 implementations (bit-exact vs upstream xxhash 0.8.3)",working:"hash64 / hash128 (globalThis.__xxhash64 / __xxhash128) \u2014 deterministic, matches the native C++ digest"}]},"react-native-ulid-jsi":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.95,note:"native-seam only \u2014 the real JS runs from the bundle; the RNUlid JSI install() mounts a faithful ULID spec implementation (Crockford base32, 48-bit time, monotonic)",working:"getUlid / checkIsValid / decodeTime (globalThis.__getUlid / __checkIsValid / __decodeTime)"}]},"react-native-nitro-buffer":{category:"Device & Platform",stubType:"native",versions:[{range:">=1.0.0",coverage:.9,note:"native-seam only \u2014 the Buffer JS class runs from the bundle; the NitroBuffer Nitro hybrid mirrors the upstream C++ byte ops faithfully (deterministic, no native dependency)",working:"alloc/allocUnsafe, byteLength, write/decode (utf8/utf16le/latin1/ascii/hex/base64/base64url), compare, fill, indexOf/lastIndexOf"}]},"react-native-nitro-geocoder":{category:"Maps",stubType:"native",versions:[{range:">=1.0.0",coverage:.7,note:"native-seam only \u2014 the JS runs from the bundle; the NitroGeocoder hybrid implements calculateDistance (faithful Haversine) and reports geocoding unavailable (no CLGeocoder in the simulator)",working:"calculateDistance (real great-circle distance), isGeocodingAvailable=false",missing:"geocode / reverseGeocode reject (CLGeocoder unavailable in the simulator \u2014 matches the no-results native path)"}]},"react-native-video-duration":{category:"Media",stubType:"native",versions:[{range:">=0.1.0",coverage:.7,note:"native-seam only \u2014 the JS runs from the bundle; VideoDuration.getVideoDuration() resolves 0 (no AVAsset in the simulator; upstream maps non-positive durations to 0)",working:"getVideoDuration importable + resolves cleanly",missing:"no real AVFoundation duration probe in the simulator"}]},"@meedwire/react-native-image-rotate":{category:"Image",stubType:"native",versions:[{range:">=0.1.0",coverage:.7,note:"native-seam only \u2014 the JS runs from the bundle; ImageRotate.rotate() returns the source content unchanged (no native pixel rotation in the simulator)",working:"rotate({content,type,angle}) resolves a string uri",missing:"pixels are not actually rotated in the simulator"}]},"react-native-tiktok":{category:"Auth & Payments",stubType:"native",versions:[{range:">=0.1.0",coverage:.7,note:"native-seam only \u2014 the JS runs from the bundle; Tiktok.authorize() invokes its callback with the no-auth shape (no TikTok OAuth handoff in the simulator)",working:"authorize importable + callback invoked, Scopes constants",missing:"no real TikTok login (the simulator has no native TikTok SDK app-switch)"}]},"react-native-store-age-signals-native-modules":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.1.0",coverage:.7,note:"native-seam only \u2014 the JS runs from the bundle; the native module resolves the all-null declared-age-range result (the Declared Age Range SDK is unavailable, matching upstream non-iOS fallback)",working:"requestIOSDeclaredAgeRange / getAndroidPlayAgeRangeStatus resolve the documented null result shape",missing:"no real StoreKit age-signal lookup in the simulator"}]},"react-native-widget-picker":{category:"Device & Platform",stubType:"native",versions:[{range:">=0.1.0",coverage:.85,note:"native-seam only \u2014 the JS runs from the bundle; WidgetPickerModule reports unsupported (home-screen widget pinning is Android-only, matching upstream index.ios.ts)",working:"isRequestPinAppWidgetSupported()=false, requestPinAppWidget() resolves the not-supported message"}]},"react-native-appstack-sdk":{category:"Analytics",stubType:"native",versions:[{range:">=0.1.0",coverage:.85,note:"native-seam only \u2014 the JS runs from the bundle; the AppstackReactNative attribution/event TurboModule is a load-safe noop. delivery intentionally absent in the simulator",working:"configure, sendEvent, enableAppleAdsAttribution, getAppstackId, isSdkDisabled, getAttributionParams (all resolve cleanly)",missing:"no network attribution delivery from the simulator"}]},"react-native-fcm":{category:"Notifications",stubType:"native",versions:[{range:">=0.1.0",coverage:0,note:"the reference iOS simulator performs this package's behavior. SootSim currently provides only this unsupported shape: native-seam only : the real JS runs from the bundle; the RNFIRMessaging native module is a load-safe noop (synthetic token, no events). delivery intentionally absent in the simulator. imports and API shape receive no behavior credit",working:"getFCMToken/getAPNSToken (synthetic token), local-notification + topic + badge plumbing importable and resolve cleanly",missing:"no real push delivery or token registration from the simulator"}]}};function v(e,t){let i=t.replace(/^[~^>=<\s]+/,"").split("-")[0],[s]=i.split(".").map(Number);for(let o of e.versions){let d=o.range.split(" "),l=!0;for(let g of d){let r=g.match(/^([><=]+)(\d+)/);if(!r)continue;let[,n,p]=r,c=parseInt(p);n===">="&&s<c&&(l=!1),n==="<"&&s>=c&&(l=!1),n===">"&&s<=c&&(l=!1),n==="<="&&s>c&&(l=!1)}if(l)return{coverage:o.coverage,note:o.note}}let a=e.versions.at(-1);return a?{coverage:a.coverage*.5,note:`${a.note} (version not explicitly supported)`}:null}var w=new Set(["react","react-dom","react-native","react-native-web","expo","one","vxrn","tamagui","@tamagui/core","@tamagui/config","typescript","vite","@types/react","@types/react-dom","@react-native-community/cli","@react-native-community/cli-platform-android","@react-native-community/cli-platform-ios","@react-native/babel-preset","@react-native/eslint-config","@react-native/metro-config","@react-native/typescript-config","react-native-typescript-transformer"]);function S(e){return e.one?"one":e.expo?"expo":e["react-native"]?"bare":"unknown"}function k(e,t){return w.has(e)?!1:e.startsWith("react-native")||e.startsWith("expo-")||e.startsWith("@react-native")||e.startsWith("@shopify/")||e.startsWith("@gorhom/")||e.startsWith("@callstack/")||t.registry[e]!==void 0||t.unsupported.includes(e)}function A(e){return h(e,{registry:m,unsupported:[...u]})}function h(e,t){let i={...e.dependencies,...e.devDependencies},s=S(i),a=i["react-native"]||null,o=[];for(let[r,n]of Object.entries(i)){if(!k(r,t))continue;if(t.unsupported.includes(r)){o.push({name:r,version:n,coverage:0,status:"unsupported",note:"requires native SDK"});continue}let p=t.registry[r];if(!p){o.push({name:r,version:n,coverage:.3,status:"auto-stub",note:"not yet verified; it may work through SootSim's generic native seam"});continue}if(p.stubType==="build-only"){o.push({name:r,version:n,coverage:1,status:"not-relevant",note:"build/config tool \u2014 not imported at runtime"});continue}let c=v(p,n);if(!c){o.push({name:r,version:n,coverage:.3,status:"auto-stub",note:"not yet verified for this version"});continue}o.push({name:r,version:n,coverage:c.coverage,status:c.coverage>=.9?"full":"partial",note:c.note})}let d=o.filter(r=>r.status!=="not-relevant"),l=d.length,g=l===0?1:d.reduce((r,n)=>r+n.coverage,0)/l;return{projectName:e.name||"unknown",rnVersion:a,framework:s,packages:o,overallScore:Math.round(g*100)/100}}function y(e){let t={supported:0,partial:0,unsupported:0,notYetVerified:0,notRelevant:0};for(let i of e.packages)switch(i.status){case"full":t.supported++;break;case"partial":t.partial++;break;case"unsupported":t.unsupported++;break;case"auto-stub":t.notYetVerified++;break;case"not-relevant":t.notRelevant++;break}return t}function T(e){let t=y(e);return[`${t.supported} supported`,`${t.partial} partial`,`${t.unsupported} unsupported`,`${t.notYetVerified} not yet verified`].join(", ")}function b(e){switch(e.status){case"full":return"supported";case"partial":return"partial";case"unsupported":return"unsupported";case"auto-stub":return"not yet verified";case"not-relevant":return"not relevant at runtime"}}function P(e){let t=[],i=e.packages.filter(a=>a.status==="partial"||a.status==="unsupported");for(let a of i)t.push(`${b(a)}: ${a.name}@${a.version} \u2014 ${a.note}`);let s=e.packages.filter(a=>a.status==="auto-stub");if(s.length>0){t.push("Not yet verified:");for(let a of s)t.push(` ${a.name}@${a.version} \u2014 ${a.note}`);t.push("SootSim may still work. The simulator will report a concrete runtime error if it finds a gap.")}return t}var I="This is a dependency-level estimate, not a guarantee that every app path works.";export{u as a,f as b,m as c,A as d,h as e,y as f,T as g,b as h,P as i,I as j};