@amabeth/repeating-wheel-picker 1.1.0 → 1.2.0

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 (258) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +57 -57
  3. package/example/index.ts +8 -0
  4. package/example/node_modules/@expo/cli/static/template/+html.tsx +28 -0
  5. package/example/node_modules/@expo/cli/static/template/+native-intent.ts +9 -0
  6. package/example/node_modules/@expo/cli/static/template/[...rsc]+api.ts +16 -0
  7. package/example/node_modules/ansi-styles/index.d.ts +345 -0
  8. package/example/node_modules/chalk/index.d.ts +415 -0
  9. package/example/node_modules/commander/typings/index.d.ts +627 -0
  10. package/example/node_modules/expo/Expo.podspec +108 -0
  11. package/example/node_modules/expo/build/Expo.d.ts +8 -0
  12. package/example/node_modules/expo/build/Expo.fx.d.ts +4 -0
  13. package/example/node_modules/expo/build/Expo.fx.web.d.ts +3 -0
  14. package/example/node_modules/expo/build/devtools/DevToolsPluginClient.d.ts +72 -0
  15. package/example/node_modules/expo/build/devtools/DevToolsPluginClientFactory.d.ts +16 -0
  16. package/example/node_modules/expo/build/devtools/DevToolsPluginClientImplApp.d.ts +15 -0
  17. package/example/node_modules/expo/build/devtools/DevToolsPluginClientImplBrowser.d.ts +14 -0
  18. package/example/node_modules/expo/build/devtools/MessageFramePacker.d.ts +50 -0
  19. package/example/node_modules/expo/build/devtools/ProtocolVersion.d.ts +7 -0
  20. package/example/node_modules/expo/build/devtools/WebSocketBackingStore.d.ts +10 -0
  21. package/example/node_modules/expo/build/devtools/WebSocketWithReconnect.d.ts +81 -0
  22. package/example/node_modules/expo/build/devtools/devtools.types.d.ts +42 -0
  23. package/example/node_modules/expo/build/devtools/getConnectionInfo.d.ts +6 -0
  24. package/example/node_modules/expo/build/devtools/getConnectionInfo.native.d.ts +6 -0
  25. package/example/node_modules/expo/build/devtools/index.d.ts +12 -0
  26. package/example/node_modules/expo/build/devtools/logger.d.ts +6 -0
  27. package/example/node_modules/expo/build/dom/base.d.ts +5 -0
  28. package/example/node_modules/expo/build/dom/dom-entry.d.ts +3 -0
  29. package/example/node_modules/expo/build/dom/dom-hooks.d.ts +8 -0
  30. package/example/node_modules/expo/build/dom/dom.d.ts +5 -0
  31. package/example/node_modules/expo/build/dom/dom.types.d.ts +34 -0
  32. package/example/node_modules/expo/build/dom/dom.web.d.ts +3 -0
  33. package/example/node_modules/expo/build/dom/global-events.d.ts +4 -0
  34. package/example/node_modules/expo/build/dom/injection.d.ts +9 -0
  35. package/example/node_modules/expo/build/dom/internal.d.ts +3 -0
  36. package/example/node_modules/expo/build/dom/internal.web.d.ts +2 -0
  37. package/example/node_modules/expo/build/dom/marshal.d.ts +4 -0
  38. package/example/node_modules/expo/build/dom/webview/ExpoDOMWebView.d.ts +6 -0
  39. package/example/node_modules/expo/build/dom/webview/RNWebView.d.ts +7 -0
  40. package/example/node_modules/expo/build/dom/webview/useDebugZeroHeight.d.ts +12 -0
  41. package/example/node_modules/expo/build/dom/webview-wrapper.d.ts +16 -0
  42. package/example/node_modules/expo/build/environment/DevLoadingView.d.ts +3 -0
  43. package/example/node_modules/expo/build/environment/DevLoadingView.web.d.ts +3 -0
  44. package/example/node_modules/expo/build/environment/DevLoadingViewNativeModule.d.ts +9 -0
  45. package/example/node_modules/expo/build/environment/DevLoadingViewNativeModule.native.d.ts +3 -0
  46. package/example/node_modules/expo/build/environment/ExpoGo.d.ts +31 -0
  47. package/example/node_modules/expo/build/environment/ExpoGo.web.d.ts +3 -0
  48. package/example/node_modules/expo/build/environment/getInitialSafeArea.d.ts +7 -0
  49. package/example/node_modules/expo/build/environment/getInitialSafeArea.native.d.ts +11 -0
  50. package/example/node_modules/expo/build/errors/AppEntryNotFound.d.ts +2 -0
  51. package/example/node_modules/expo/build/errors/ExpoErrorManager.d.ts +8 -0
  52. package/example/node_modules/expo/build/errors/ExpoErrorManager.native.d.ts +4 -0
  53. package/example/node_modules/expo/build/hooks/useEvent.d.ts +59 -0
  54. package/example/node_modules/expo/build/launch/registerRootComponent.d.ts +30 -0
  55. package/example/node_modules/expo/build/launch/withDevTools.d.ts +3 -0
  56. package/example/node_modules/expo/build/launch/withDevTools.ios.d.ts +7 -0
  57. package/example/node_modules/expo/build/launch/withDevTools.web.d.ts +3 -0
  58. package/example/node_modules/expo/build/timer/polyfillNextTick.d.ts +6 -0
  59. package/example/node_modules/expo/build/utils/blobUtils.d.ts +9 -0
  60. package/example/node_modules/expo/build/utils/getBundleUrl.d.ts +2 -0
  61. package/example/node_modules/expo/build/utils/getBundleUrl.native.d.ts +2 -0
  62. package/example/node_modules/expo/build/utils/getBundleUrl.web.d.ts +2 -0
  63. package/example/node_modules/expo/build/winter/FormData.d.ts +49 -0
  64. package/example/node_modules/expo/build/winter/ImportMetaRegistry.d.ts +9 -0
  65. package/example/node_modules/expo/build/winter/TextDecoder.d.ts +20 -0
  66. package/example/node_modules/expo/build/winter/fetch/ExpoFetchModule.d.ts +2 -0
  67. package/example/node_modules/expo/build/winter/fetch/ExpoFetchModule.web.d.ts +10 -0
  68. package/example/node_modules/expo/build/winter/fetch/FetchErrors.d.ts +8 -0
  69. package/example/node_modules/expo/build/winter/fetch/FetchResponse.d.ts +31 -0
  70. package/example/node_modules/expo/build/winter/fetch/NativeRequest.d.ts +30 -0
  71. package/example/node_modules/expo/build/winter/fetch/RequestUtils.d.ts +21 -0
  72. package/example/node_modules/expo/build/winter/fetch/convertFormData.d.ts +19 -0
  73. package/example/node_modules/expo/build/winter/fetch/fetch.d.ts +4 -0
  74. package/example/node_modules/expo/build/winter/fetch/fetch.types.d.ts +16 -0
  75. package/example/node_modules/expo/build/winter/fetch/fetch.web.d.ts +2 -0
  76. package/example/node_modules/expo/build/winter/fetch/index.d.ts +3 -0
  77. package/example/node_modules/expo/build/winter/index.d.ts +2 -0
  78. package/example/node_modules/expo/build/winter/runtime.d.ts +2 -0
  79. package/example/node_modules/expo/build/winter/runtime.native.d.ts +2 -0
  80. package/example/node_modules/expo/build/winter/url.d.ts +23 -0
  81. package/example/node_modules/expo/config-plugins.d.ts +1 -0
  82. package/example/node_modules/expo/config.d.ts +1 -0
  83. package/example/node_modules/expo/devtools.d.ts +1 -0
  84. package/example/node_modules/expo/dom/global.d.ts +1 -0
  85. package/example/node_modules/expo/dom/index.d.ts +1 -0
  86. package/example/node_modules/expo/dom/internal.d.ts +1 -0
  87. package/example/node_modules/expo/fetch.d.ts +1 -0
  88. package/example/node_modules/expo/fingerprint.d.ts +1 -0
  89. package/example/node_modules/expo/metro-config.d.ts +1 -0
  90. package/example/node_modules/expo/react-native.config.js +50 -0
  91. package/example/node_modules/expo/src/Expo.fx.tsx +53 -0
  92. package/example/node_modules/expo/src/Expo.fx.web.tsx +21 -0
  93. package/example/node_modules/expo/src/Expo.ts +30 -0
  94. package/example/node_modules/expo/src/devtools/DevToolsPluginClient.ts +240 -0
  95. package/example/node_modules/expo/src/devtools/DevToolsPluginClientFactory.ts +73 -0
  96. package/example/node_modules/expo/src/devtools/DevToolsPluginClientImplApp.ts +56 -0
  97. package/example/node_modules/expo/src/devtools/DevToolsPluginClientImplBrowser.ts +38 -0
  98. package/example/node_modules/expo/src/devtools/MessageFramePacker.ts +235 -0
  99. package/example/node_modules/expo/src/devtools/ProtocolVersion.ts +6 -0
  100. package/example/node_modules/expo/src/devtools/WebSocketBackingStore.ts +10 -0
  101. package/example/node_modules/expo/src/devtools/WebSocketWithReconnect.ts +318 -0
  102. package/example/node_modules/expo/src/devtools/devtools.types.ts +50 -0
  103. package/example/node_modules/expo/src/devtools/getConnectionInfo.native.ts +18 -0
  104. package/example/node_modules/expo/src/devtools/getConnectionInfo.ts +16 -0
  105. package/example/node_modules/expo/src/devtools/index.ts +53 -0
  106. package/example/node_modules/expo/src/devtools/logger.ts +29 -0
  107. package/example/node_modules/expo/src/dom/base.ts +62 -0
  108. package/example/node_modules/expo/src/dom/dom-entry.tsx +128 -0
  109. package/example/node_modules/expo/src/dom/dom-hooks.ts +46 -0
  110. package/example/node_modules/expo/src/dom/dom.ts +8 -0
  111. package/example/node_modules/expo/src/dom/dom.types.ts +39 -0
  112. package/example/node_modules/expo/src/dom/dom.web.ts +6 -0
  113. package/example/node_modules/expo/src/dom/global-events.ts +16 -0
  114. package/example/node_modules/expo/src/dom/injection.ts +42 -0
  115. package/example/node_modules/expo/src/dom/internal.ts +5 -0
  116. package/example/node_modules/expo/src/dom/internal.web.ts +1 -0
  117. package/example/node_modules/expo/src/dom/marshal.tsx +116 -0
  118. package/example/node_modules/expo/src/dom/webview/ExpoDOMWebView.ts +10 -0
  119. package/example/node_modules/expo/src/dom/webview/RNWebView.ts +12 -0
  120. package/example/node_modules/expo/src/dom/webview/useDebugZeroHeight.ts +62 -0
  121. package/example/node_modules/expo/src/dom/webview-wrapper.tsx +253 -0
  122. package/example/node_modules/expo/src/environment/DevLoadingView.tsx +123 -0
  123. package/example/node_modules/expo/src/environment/DevLoadingView.web.tsx +135 -0
  124. package/example/node_modules/expo/src/environment/DevLoadingViewNativeModule.native.ts +3 -0
  125. package/example/node_modules/expo/src/environment/DevLoadingViewNativeModule.ts +7 -0
  126. package/example/node_modules/expo/src/environment/ExpoGo.ts +53 -0
  127. package/example/node_modules/expo/src/environment/ExpoGo.web.ts +7 -0
  128. package/example/node_modules/expo/src/environment/getInitialSafeArea.native.ts +16 -0
  129. package/example/node_modules/expo/src/environment/getInitialSafeArea.ts +8 -0
  130. package/example/node_modules/expo/src/errors/AppEntryNotFound.tsx +35 -0
  131. package/example/node_modules/expo/src/errors/ExpoErrorManager.native.ts +51 -0
  132. package/example/node_modules/expo/src/errors/ExpoErrorManager.ts +11 -0
  133. package/example/node_modules/expo/src/hooks/useEvent.ts +112 -0
  134. package/example/node_modules/expo/src/launch/registerRootComponent.tsx +64 -0
  135. package/example/node_modules/expo/src/launch/withDevTools.ios.tsx +47 -0
  136. package/example/node_modules/expo/src/launch/withDevTools.tsx +30 -0
  137. package/example/node_modules/expo/src/launch/withDevTools.web.tsx +23 -0
  138. package/example/node_modules/expo/src/timer/polyfillNextTick.ts +10 -0
  139. package/example/node_modules/expo/src/ts-declarations/console.d.ts +47 -0
  140. package/example/node_modules/expo/src/ts-declarations/global.d.ts +12 -0
  141. package/example/node_modules/expo/src/ts-declarations/react-native.d.ts +34 -0
  142. package/example/node_modules/expo/src/ts-declarations/whatwg-url-without-unicode.d.ts +186 -0
  143. package/example/node_modules/expo/src/utils/blobUtils.ts +23 -0
  144. package/example/node_modules/expo/src/utils/getBundleUrl.native.ts +17 -0
  145. package/example/node_modules/expo/src/utils/getBundleUrl.ts +5 -0
  146. package/example/node_modules/expo/src/utils/getBundleUrl.web.ts +21 -0
  147. package/example/node_modules/expo/src/winter/FormData.ts +222 -0
  148. package/example/node_modules/expo/src/winter/ImportMetaRegistry.ts +14 -0
  149. package/example/node_modules/expo/src/winter/TextDecoder.ts +429 -0
  150. package/example/node_modules/expo/src/winter/fetch/ExpoFetchModule.ts +3 -0
  151. package/example/node_modules/expo/src/winter/fetch/ExpoFetchModule.web.ts +7 -0
  152. package/example/node_modules/expo/src/winter/fetch/FetchErrors.ts +11 -0
  153. package/example/node_modules/expo/src/winter/fetch/FetchResponse.ts +146 -0
  154. package/example/node_modules/expo/src/winter/fetch/NativeRequest.ts +38 -0
  155. package/example/node_modules/expo/src/winter/fetch/RequestUtils.ts +124 -0
  156. package/example/node_modules/expo/src/winter/fetch/convertFormData.ts +92 -0
  157. package/example/node_modules/expo/src/winter/fetch/fetch.ts +59 -0
  158. package/example/node_modules/expo/src/winter/fetch/fetch.types.ts +17 -0
  159. package/example/node_modules/expo/src/winter/fetch/fetch.web.ts +1 -0
  160. package/example/node_modules/expo/src/winter/fetch/index.ts +2 -0
  161. package/example/node_modules/expo/src/winter/index.ts +1 -0
  162. package/example/node_modules/expo/src/winter/runtime.native.ts +41 -0
  163. package/example/node_modules/expo/src/winter/runtime.ts +5 -0
  164. package/example/node_modules/expo/src/winter/url.ts +116 -0
  165. package/example/node_modules/expo/types/global.d.ts +38 -0
  166. package/example/node_modules/expo/types/index.d.ts +3 -0
  167. package/example/node_modules/expo/types/metro-require.d.ts +52 -0
  168. package/example/node_modules/expo/types/react-native-web.d.ts +291 -0
  169. package/example/node_modules/expo-modules-autolinking/build/ExpoModuleConfig.d.ts +85 -0
  170. package/example/node_modules/expo-modules-autolinking/build/autolinking/findModules.d.ts +5 -0
  171. package/example/node_modules/expo-modules-autolinking/build/autolinking/generatePackageList.d.ts +11 -0
  172. package/example/node_modules/expo-modules-autolinking/build/autolinking/getConfiguration.d.ts +2 -0
  173. package/example/node_modules/expo-modules-autolinking/build/autolinking/index.d.ts +17 -0
  174. package/example/node_modules/expo-modules-autolinking/build/autolinking/mergeLinkingOptions.d.ts +21 -0
  175. package/example/node_modules/expo-modules-autolinking/build/autolinking/resolveModules.d.ts +9 -0
  176. package/example/node_modules/expo-modules-autolinking/build/autolinking/utils.d.ts +6 -0
  177. package/example/node_modules/expo-modules-autolinking/build/autolinking/verifySearchResults.d.ts +5 -0
  178. package/example/node_modules/expo-modules-autolinking/build/fileUtils.d.ts +18 -0
  179. package/example/node_modules/expo-modules-autolinking/build/index.d.ts +1 -0
  180. package/example/node_modules/expo-modules-autolinking/build/platforms/android.d.ts +38 -0
  181. package/example/node_modules/expo-modules-autolinking/build/platforms/apple.d.ts +15 -0
  182. package/example/node_modules/expo-modules-autolinking/build/platforms/devtools.d.ts +3 -0
  183. package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/androidResolver.d.ts +20 -0
  184. package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/config.d.ts +5 -0
  185. package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/index.d.ts +2 -0
  186. package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/iosResolver.d.ts +2 -0
  187. package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/reactNativeConfig.d.ts +13 -0
  188. package/example/node_modules/expo-modules-autolinking/build/reactNativeConfig/reactNativeConfig.types.d.ts +95 -0
  189. package/example/node_modules/expo-modules-autolinking/build/types.d.ts +319 -0
  190. package/example/node_modules/expo-modules-autolinking/e2e/TestUtils.ts +53 -0
  191. package/example/node_modules/expo-modules-autolinking/exports.d.ts +1 -0
  192. package/example/node_modules/expo-modules-autolinking/src/ExpoModuleConfig.ts +181 -0
  193. package/example/node_modules/expo-modules-autolinking/src/autolinking/findModules.ts +259 -0
  194. package/example/node_modules/expo-modules-autolinking/src/autolinking/generatePackageList.ts +46 -0
  195. package/example/node_modules/expo-modules-autolinking/src/autolinking/getConfiguration.ts +7 -0
  196. package/example/node_modules/expo-modules-autolinking/src/autolinking/index.ts +45 -0
  197. package/example/node_modules/expo-modules-autolinking/src/autolinking/mergeLinkingOptions.ts +127 -0
  198. package/example/node_modules/expo-modules-autolinking/src/autolinking/resolveModules.ts +46 -0
  199. package/example/node_modules/expo-modules-autolinking/src/autolinking/utils.ts +37 -0
  200. package/example/node_modules/expo-modules-autolinking/src/autolinking/verifySearchResults.ts +33 -0
  201. package/example/node_modules/expo-modules-autolinking/src/fileUtils.ts +64 -0
  202. package/example/node_modules/expo-modules-autolinking/src/index.ts +262 -0
  203. package/example/node_modules/expo-modules-autolinking/src/platforms/android.ts +303 -0
  204. package/example/node_modules/expo-modules-autolinking/src/platforms/apple.ts +292 -0
  205. package/example/node_modules/expo-modules-autolinking/src/platforms/devtools.ts +25 -0
  206. package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/androidResolver.ts +264 -0
  207. package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/config.ts +67 -0
  208. package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/index.ts +2 -0
  209. package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/iosResolver.ts +37 -0
  210. package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/reactNativeConfig.ts +245 -0
  211. package/example/node_modules/expo-modules-autolinking/src/reactNativeConfig/reactNativeConfig.types.ts +107 -0
  212. package/example/node_modules/expo-modules-autolinking/src/types.ts +384 -0
  213. package/example/node_modules/find-up/index.d.ts +138 -0
  214. package/example/node_modules/glob/dist/commonjs/glob.d.ts +388 -0
  215. package/example/node_modules/glob/dist/commonjs/has-magic.d.ts +14 -0
  216. package/example/node_modules/glob/dist/commonjs/ignore.d.ts +24 -0
  217. package/example/node_modules/glob/dist/commonjs/index.d.ts +97 -0
  218. package/example/node_modules/glob/dist/commonjs/pattern.d.ts +76 -0
  219. package/example/node_modules/glob/dist/commonjs/processor.d.ts +59 -0
  220. package/example/node_modules/glob/dist/commonjs/walker.d.ts +97 -0
  221. package/example/node_modules/glob/dist/esm/glob.d.ts +388 -0
  222. package/example/node_modules/glob/dist/esm/has-magic.d.ts +14 -0
  223. package/example/node_modules/glob/dist/esm/ignore.d.ts +24 -0
  224. package/example/node_modules/glob/dist/esm/index.d.ts +97 -0
  225. package/example/node_modules/glob/dist/esm/pattern.d.ts +76 -0
  226. package/example/node_modules/glob/dist/esm/processor.d.ts +59 -0
  227. package/example/node_modules/glob/dist/esm/walker.d.ts +97 -0
  228. package/example/node_modules/locate-path/index.d.ts +83 -0
  229. package/example/node_modules/log-symbols/node_modules/chalk/types/index.d.ts +97 -0
  230. package/example/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
  231. package/example/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
  232. package/example/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
  233. package/example/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
  234. package/example/node_modules/minimatch/dist/commonjs/index.d.ts +94 -0
  235. package/example/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
  236. package/example/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
  237. package/example/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
  238. package/example/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
  239. package/example/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
  240. package/example/node_modules/minimatch/dist/esm/index.d.ts +94 -0
  241. package/example/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
  242. package/example/node_modules/ora/index.d.ts +257 -0
  243. package/example/node_modules/ora/node_modules/chalk/types/index.d.ts +97 -0
  244. package/example/node_modules/ora/node_modules/strip-ansi/index.d.ts +15 -0
  245. package/example/node_modules/p-locate/index.d.ts +53 -0
  246. package/example/node_modules/path-exists/index.d.ts +28 -0
  247. package/example/package.json +29 -0
  248. package/example/src/constants/styles.ts +43 -0
  249. package/example/src/hooks/useComponentHeight.ts +13 -0
  250. package/example/src/scenes/app.tsx +33 -0
  251. package/example/src/scenes/booleanPicker.tsx +60 -0
  252. package/example/src/scenes/customTypePicker.tsx +83 -0
  253. package/example/src/scenes/numberPicker.tsx +75 -0
  254. package/example/src/scenes/stringPicker.tsx +64 -0
  255. package/lib/module/index.js +6 -6
  256. package/lib/module/index.js.map +1 -1
  257. package/package.json +168 -183
  258. package/src/index.tsx +0 -507
@@ -0,0 +1,53 @@
1
+ // load expo-asset immediately to set a custom `source` transformer in React Native
2
+ import './winter';
3
+ import 'expo-asset';
4
+ import 'expo/virtual/rsc';
5
+
6
+ import Constants from 'expo-constants';
7
+ import { AppRegistry, NativeModules, LogBox, Platform } from 'react-native';
8
+
9
+ import { isRunningInExpoGo } from './environment/ExpoGo';
10
+ import { AppEntryNotFound } from './errors/AppEntryNotFound';
11
+ import { createErrorHandler } from './errors/ExpoErrorManager';
12
+
13
+ if (isRunningInExpoGo()) {
14
+ // set up some improvements to commonly logged error messages stemming from react-native
15
+ const globalHandler = ErrorUtils.getGlobalHandler();
16
+ ErrorUtils.setGlobalHandler(createErrorHandler(globalHandler));
17
+ }
18
+
19
+ // Warn if the New Architecture is not explicitly enabled in the app config and we are running in Expo Go.
20
+ // This could be problematic because you will be developing your app with the New Architecture enabled and
21
+ // but your builds will have the New Architecture disabled.
22
+ if (__DEV__ && isRunningInExpoGo() && process.env.NODE_ENV === 'development') {
23
+ (['android', 'ios'] as const).forEach((platform) => {
24
+ const newArchPlatformConfig = Constants.expoConfig?.[platform]?.newArchEnabled;
25
+ const newArchRootConfig = Constants.expoConfig?.newArchEnabled;
26
+
27
+ const isNewArchExplicitlyDisabled =
28
+ newArchPlatformConfig === false ||
29
+ (newArchPlatformConfig === undefined && newArchRootConfig === false);
30
+
31
+ if (Platform.OS === platform && isNewArchExplicitlyDisabled) {
32
+ // Wrap it in rAF to show the warning after the React Native DevTools message
33
+ requestAnimationFrame(() => {
34
+ console.warn(
35
+ `🚨 React Native's New Architecture is always enabled in Expo Go, but it is explicitly disabled in your project's app config. This may lead to unexpected behavior when creating a production or development build. Remove "newArchEnabled": false from your app.json.\nLearn more: https://docs.expo.dev/guides/new-architecture/`
36
+ );
37
+ });
38
+ }
39
+ });
40
+ }
41
+
42
+ // Disable the "Open debugger to view warnings" React Native DevTools warning in
43
+ // Expo Go and expo-dev-client, because launching the debugger from there will not
44
+ // get the correct JS target.
45
+ const IS_RUNNING_IN_DEV_CLIENT = !!NativeModules.EXDevLauncher;
46
+ if (__DEV__ && LogBox?.ignoreLogs && (isRunningInExpoGo() || IS_RUNNING_IN_DEV_CLIENT)) {
47
+ LogBox.ignoreLogs([/Open debugger to view warnings/]);
48
+ }
49
+
50
+ if (process.env.NODE_ENV !== 'production') {
51
+ // Register a default component and expect `registerRootComponent` to be called later and update it.
52
+ AppRegistry.registerComponent('main', () => AppEntryNotFound);
53
+ }
@@ -0,0 +1,21 @@
1
+ import './winter';
2
+ import 'expo/virtual/rsc';
3
+
4
+ // When users dangerously import a file inside of react-native, it breaks the web alias.
5
+ // This is one of the most common, and cryptic web errors that users encounter.
6
+ // This conditional side-effect provides a more helpful error message for debugging.
7
+ // Use a wrapper `__DEV__` to remove this entire block in production.
8
+ if (__DEV__) {
9
+ if (
10
+ // Skip mocking if someone is shimming this value out.
11
+ !('__fbBatchedBridgeConfig' in global)
12
+ ) {
13
+ Object.defineProperty(global, '__fbBatchedBridgeConfig', {
14
+ get() {
15
+ throw new Error(
16
+ "Your web project is importing a module from 'react-native' instead of 'react-native-web'. Learn more: https://expo.fyi/fb-batched-bridge-config-web"
17
+ );
18
+ },
19
+ });
20
+ }
21
+ }
@@ -0,0 +1,30 @@
1
+ import './Expo.fx';
2
+
3
+ export { disableErrorHandling } from './errors/ExpoErrorManager';
4
+ export { default as registerRootComponent } from './launch/registerRootComponent';
5
+
6
+ export { isRunningInExpoGo, getExpoGoProjectConfig } from './environment/ExpoGo';
7
+
8
+ export {
9
+ // Core classes
10
+ EventEmitter,
11
+ SharedObject,
12
+ SharedRef,
13
+ NativeModule,
14
+
15
+ // Methods
16
+ requireNativeModule,
17
+ requireOptionalNativeModule,
18
+ requireNativeViewManager as requireNativeView,
19
+ registerWebModule,
20
+ reloadAppAsync,
21
+ } from 'expo-modules-core';
22
+
23
+ export type {
24
+ SharedRef as SharedRefType,
25
+ EventEmitter as EventEmitterType,
26
+ NativeModule as NativeModuleType,
27
+ SharedObject as SharedObjectType,
28
+ } from 'expo-modules-core/types';
29
+
30
+ export { useEvent, useEventListener } from './hooks/useEvent';
@@ -0,0 +1,240 @@
1
+ import { MessageFramePacker } from './MessageFramePacker';
2
+ import { WebSocketBackingStore } from './WebSocketBackingStore';
3
+ import { WebSocketWithReconnect } from './WebSocketWithReconnect';
4
+ import type {
5
+ ConnectionInfo,
6
+ DevToolsPluginClientOptions,
7
+ HandshakeMessageParams,
8
+ } from './devtools.types';
9
+ import * as logger from './logger';
10
+ import { blobToArrayBufferAsync } from '../utils/blobUtils';
11
+
12
+ interface MessageFramePackerMessageKey {
13
+ pluginName: string;
14
+ method: string;
15
+ }
16
+
17
+ export interface EventSubscription {
18
+ remove(): void;
19
+ }
20
+
21
+ /**
22
+ * This client is for the Expo DevTools Plugins to communicate between the app and the DevTools webpage hosted in a browser.
23
+ * All the code should be both compatible with browsers and React Native.
24
+ */
25
+ export abstract class DevToolsPluginClient {
26
+ private listeners: Record<string, undefined | Set<(params: any) => void>>;
27
+
28
+ private static defaultWSStore: WebSocketBackingStore = new WebSocketBackingStore();
29
+ private readonly wsStore: WebSocketBackingStore = DevToolsPluginClient.defaultWSStore;
30
+
31
+ protected isClosed = false;
32
+ protected retries = 0;
33
+ private readonly messageFramePacker: MessageFramePacker<MessageFramePackerMessageKey> =
34
+ new MessageFramePacker();
35
+
36
+ public constructor(
37
+ public readonly connectionInfo: ConnectionInfo,
38
+ private readonly options?: DevToolsPluginClientOptions
39
+ ) {
40
+ this.wsStore = connectionInfo.wsStore || DevToolsPluginClient.defaultWSStore;
41
+ this.listeners = Object.create(null);
42
+ }
43
+
44
+ /**
45
+ * Initialize the connection.
46
+ * @hidden
47
+ */
48
+ public async initAsync(): Promise<void> {
49
+ if (this.wsStore.ws == null) {
50
+ this.wsStore.ws = await this.connectAsync();
51
+ }
52
+ this.wsStore.refCount += 1;
53
+ this.wsStore.ws.addEventListener('message', this.handleMessage);
54
+ }
55
+
56
+ /**
57
+ * Close the connection.
58
+ */
59
+ public async closeAsync(): Promise<void> {
60
+ this.isClosed = true;
61
+ this.wsStore.ws?.removeEventListener('message', this.handleMessage);
62
+ this.wsStore.refCount -= 1;
63
+ if (this.wsStore.refCount < 1) {
64
+ this.wsStore.ws?.close();
65
+ this.wsStore.ws = null;
66
+ }
67
+ this.listeners = Object.create(null);
68
+ }
69
+
70
+ /**
71
+ * Send a message to the other end of DevTools.
72
+ * @param method A method name.
73
+ * @param params any extra payload.
74
+ */
75
+ public sendMessage(method: string, params: any) {
76
+ if (this.wsStore.ws?.readyState === WebSocket.CLOSED) {
77
+ logger.warn('Unable to send message in a disconnected state.');
78
+ return;
79
+ }
80
+ const messageKey: MessageFramePackerMessageKey = {
81
+ pluginName: this.connectionInfo.pluginName,
82
+ method,
83
+ };
84
+ const packedData = this.messageFramePacker.pack({ messageKey, payload: params });
85
+ if (!(packedData instanceof Promise)) {
86
+ this.wsStore.ws?.send(packedData);
87
+ return;
88
+ }
89
+ packedData.then((data) => {
90
+ this.wsStore.ws?.send(data);
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Subscribe to a message from the other end of DevTools.
96
+ * @param method Subscribe to a message with a method name.
97
+ * @param listener Listener to be called when a message is received.
98
+ */
99
+ public addMessageListener(method: string, listener: (params: any) => void): EventSubscription {
100
+ const listenersForMethod = this.listeners[method] || (this.listeners[method] = new Set());
101
+ listenersForMethod.add(listener);
102
+ return {
103
+ remove: () => {
104
+ this.listeners[method]?.delete(listener);
105
+ },
106
+ };
107
+ }
108
+
109
+ /**
110
+ * Subscribe to a message from the other end of DevTools just once.
111
+ * @param method Subscribe to a message with a method name.
112
+ * @param listener Listener to be called when a message is received.
113
+ */
114
+ public addMessageListenerOnce(method: string, listener: (params: any) => void): void {
115
+ const wrappedListenerOnce = (params: any): void => {
116
+ listener(params);
117
+ this.listeners[method]?.delete(wrappedListenerOnce);
118
+ };
119
+ this.addMessageListener(method, wrappedListenerOnce);
120
+ }
121
+
122
+ /**
123
+ * Internal handshake message sender.
124
+ * @hidden
125
+ */
126
+ protected sendHandshakeMessage(params: HandshakeMessageParams) {
127
+ if (this.wsStore.ws?.readyState === WebSocket.CLOSED) {
128
+ logger.warn('Unable to send message in a disconnected state.');
129
+ return;
130
+ }
131
+ this.wsStore.ws?.send(JSON.stringify({ ...params, __isHandshakeMessages: true }));
132
+ }
133
+
134
+ /**
135
+ * Internal handshake message listener.
136
+ * @hidden
137
+ */
138
+ protected addHandskakeMessageListener(
139
+ listener: (params: HandshakeMessageParams) => void
140
+ ): EventSubscription {
141
+ const messageListener = (event: MessageEvent) => {
142
+ if (typeof event.data !== 'string') {
143
+ // binary data is not coming from the handshake messages.
144
+ return;
145
+ }
146
+
147
+ const data = JSON.parse(event.data);
148
+ if (!data.__isHandshakeMessages) {
149
+ return;
150
+ }
151
+ delete data.__isHandshakeMessages;
152
+ const params = data as HandshakeMessageParams;
153
+ if (params.pluginName && params.pluginName !== this.connectionInfo.pluginName) {
154
+ return;
155
+ }
156
+ listener(params);
157
+ };
158
+
159
+ this.wsStore.ws?.addEventListener('message', messageListener);
160
+ return {
161
+ remove: () => {
162
+ this.wsStore.ws?.removeEventListener('message', messageListener);
163
+ },
164
+ };
165
+ }
166
+
167
+ /**
168
+ * Returns whether the client is connected to the server.
169
+ */
170
+ public isConnected(): boolean {
171
+ return this.wsStore.ws?.readyState === WebSocket.OPEN;
172
+ }
173
+
174
+ /**
175
+ * The method to create the WebSocket connection.
176
+ */
177
+ protected connectAsync(): Promise<WebSocket> {
178
+ return new Promise((resolve, reject) => {
179
+ const endpoint = 'expo-dev-plugins/broadcast';
180
+ const ws = new WebSocketWithReconnect(`ws://${this.connectionInfo.devServer}/${endpoint}`, {
181
+ binaryType: this.options?.websocketBinaryType,
182
+ onError: (e: unknown) => {
183
+ if (e instanceof Error) {
184
+ console.warn(`Error happened from the WebSocket connection: ${e.message}\n${e.stack}`);
185
+ } else {
186
+ console.warn(`Error happened from the WebSocket connection: ${JSON.stringify(e)}`);
187
+ }
188
+ },
189
+ });
190
+ ws.addEventListener('open', () => {
191
+ resolve(ws);
192
+ });
193
+ ws.addEventListener('error', (e) => {
194
+ reject(e);
195
+ });
196
+ ws.addEventListener('close', (e: WebSocketCloseEvent) => {
197
+ logger.info('WebSocket closed', e.code, e.reason);
198
+ });
199
+ });
200
+ }
201
+
202
+ protected handleMessage = async (event: WebSocketMessageEvent) => {
203
+ let data: ArrayBuffer | string;
204
+ if (typeof event.data === 'string') {
205
+ data = event.data;
206
+ } else if (event.data instanceof ArrayBuffer) {
207
+ data = event.data;
208
+ } else if (ArrayBuffer.isView(event.data)) {
209
+ data = event.data.buffer as ArrayBuffer;
210
+ } else if (event.data instanceof Blob) {
211
+ data = await blobToArrayBufferAsync(event.data);
212
+ } else {
213
+ logger.warn('Unsupported received data type in handleMessageImpl');
214
+ return;
215
+ }
216
+ const { messageKey, payload, ...rest } = this.messageFramePacker.unpack(data);
217
+ // @ts-expect-error: `__isHandshakeMessages` is a private field that is not part of the MessageFramePacker type.
218
+ if (rest?.__isHandshakeMessages === true) {
219
+ return;
220
+ }
221
+ if (messageKey.pluginName && messageKey.pluginName !== this.connectionInfo.pluginName) {
222
+ return;
223
+ }
224
+
225
+ const listenersForMethod = this.listeners[messageKey.method];
226
+ if (listenersForMethod) {
227
+ for (const listener of listenersForMethod) {
228
+ listener(payload);
229
+ }
230
+ }
231
+ };
232
+
233
+ /**
234
+ * Get the WebSocket backing store. Exposed for testing.
235
+ * @hidden
236
+ */
237
+ public getWebSocketBackingStore(): WebSocketBackingStore {
238
+ return this.wsStore;
239
+ }
240
+ }
@@ -0,0 +1,73 @@
1
+ import type { DevToolsPluginClient } from './DevToolsPluginClient';
2
+ import { DevToolsPluginClientImplApp } from './DevToolsPluginClientImplApp';
3
+ import { DevToolsPluginClientImplBrowser } from './DevToolsPluginClientImplBrowser';
4
+ import type { ConnectionInfo, DevToolsPluginClientOptions } from './devtools.types';
5
+ import { getConnectionInfo } from './getConnectionInfo';
6
+
7
+ const instanceMap: Record<string, DevToolsPluginClient | Promise<DevToolsPluginClient>> = {};
8
+
9
+ /**
10
+ * Factory of DevToolsPluginClient based on sender types.
11
+ * @hidden
12
+ */
13
+ export async function createDevToolsPluginClient(
14
+ connectionInfo: ConnectionInfo,
15
+ options?: DevToolsPluginClientOptions
16
+ ): Promise<DevToolsPluginClient> {
17
+ let client: DevToolsPluginClient;
18
+ if (connectionInfo.sender === 'app') {
19
+ client = new DevToolsPluginClientImplApp(connectionInfo, options);
20
+ } else {
21
+ client = new DevToolsPluginClientImplBrowser(connectionInfo, options);
22
+ }
23
+ await client.initAsync();
24
+ return client;
25
+ }
26
+
27
+ /**
28
+ * Public API to get the DevToolsPluginClient instance.
29
+ */
30
+ export async function getDevToolsPluginClientAsync(
31
+ pluginName: string,
32
+ options?: DevToolsPluginClientOptions
33
+ ): Promise<DevToolsPluginClient> {
34
+ const connectionInfo = getConnectionInfo();
35
+
36
+ let instance: DevToolsPluginClient | Promise<DevToolsPluginClient> | null =
37
+ instanceMap[pluginName];
38
+ if (instance != null) {
39
+ if (instance instanceof Promise) {
40
+ return instance;
41
+ }
42
+ if (
43
+ instance.isConnected() === false ||
44
+ instance.connectionInfo.devServer !== connectionInfo.devServer
45
+ ) {
46
+ await instance.closeAsync();
47
+ delete instanceMap[pluginName];
48
+ instance = null;
49
+ }
50
+ }
51
+ if (instance == null) {
52
+ const instancePromise = createDevToolsPluginClient({ ...connectionInfo, pluginName }, options);
53
+ instanceMap[pluginName] = instancePromise;
54
+ instance = await instancePromise;
55
+ instanceMap[pluginName] = instance;
56
+ }
57
+ return instance;
58
+ }
59
+
60
+ /**
61
+ * Internal testing API to cleanup all DevToolsPluginClient instances.
62
+ */
63
+ export function cleanupDevToolsPluginInstances() {
64
+ for (const pluginName of Object.keys(instanceMap)) {
65
+ const instance = instanceMap[pluginName];
66
+ delete instanceMap[pluginName];
67
+ if (instance instanceof Promise) {
68
+ instance.then((instance) => instance.closeAsync());
69
+ } else {
70
+ instance.closeAsync();
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,56 @@
1
+ import { DevToolsPluginClient } from './DevToolsPluginClient';
2
+ import * as logger from './logger';
3
+
4
+ /**
5
+ * The DevToolsPluginClient for the app -> browser communication.
6
+ */
7
+ export class DevToolsPluginClientImplApp extends DevToolsPluginClient {
8
+ // Map of pluginName -> browserClientId
9
+ private browserClientMap: Record<string, string> = {};
10
+
11
+ /**
12
+ * Initialize the connection.
13
+ * @hidden
14
+ */
15
+ override async initAsync(): Promise<void> {
16
+ await super.initAsync();
17
+ this.addHandshakeHandler();
18
+ }
19
+
20
+ private addHandshakeHandler() {
21
+ this.addHandskakeMessageListener((params) => {
22
+ if (params.method === 'handshake') {
23
+ const { pluginName, protocolVersion } = params;
24
+
25
+ // [0] Check protocol version
26
+ if (protocolVersion !== this.connectionInfo.protocolVersion) {
27
+ // Use console.warn than logger because we want to show the warning even logging is disabled.
28
+ console.warn(
29
+ `Received an incompatible devtools plugin handshake message - pluginName[${pluginName}]`
30
+ );
31
+ this.terminateBrowserClient(pluginName, params.browserClientId);
32
+ return;
33
+ }
34
+
35
+ // [1] Terminate duplicated browser clients for the same plugin
36
+ const previousBrowserClientId = this.browserClientMap[pluginName];
37
+ if (previousBrowserClientId != null && previousBrowserClientId !== params.browserClientId) {
38
+ logger.info(
39
+ `Terminate the previous browser client connection - previousBrowserClientId[${previousBrowserClientId}]`
40
+ );
41
+ this.terminateBrowserClient(pluginName, previousBrowserClientId);
42
+ }
43
+ this.browserClientMap[pluginName] = params.browserClientId;
44
+ }
45
+ });
46
+ }
47
+
48
+ private terminateBrowserClient(pluginName: string, browserClientId: string) {
49
+ this.sendHandshakeMessage({
50
+ protocolVersion: this.connectionInfo.protocolVersion,
51
+ method: 'terminateBrowserClient',
52
+ browserClientId,
53
+ pluginName,
54
+ });
55
+ }
56
+ }
@@ -0,0 +1,38 @@
1
+ import { DevToolsPluginClient } from './DevToolsPluginClient';
2
+ import * as logger from './logger';
3
+
4
+ /**
5
+ * The DevToolsPluginClient for the browser -> app communication.
6
+ */
7
+ export class DevToolsPluginClientImplBrowser extends DevToolsPluginClient {
8
+ private browserClientId: string = Date.now().toString();
9
+
10
+ /**
11
+ * Initialize the connection.
12
+ * @hidden
13
+ */
14
+ override async initAsync(): Promise<void> {
15
+ await super.initAsync();
16
+ this.startHandshake();
17
+ }
18
+
19
+ private startHandshake() {
20
+ this.addHandskakeMessageListener((params) => {
21
+ if (
22
+ params.method === 'terminateBrowserClient' &&
23
+ this.browserClientId === params.browserClientId
24
+ ) {
25
+ logger.info(
26
+ 'Received terminateBrowserClient messages and terminate the current connection'
27
+ );
28
+ this.closeAsync();
29
+ }
30
+ });
31
+ this.sendHandshakeMessage({
32
+ protocolVersion: this.connectionInfo.protocolVersion,
33
+ pluginName: this.connectionInfo.pluginName,
34
+ method: 'handshake',
35
+ browserClientId: this.browserClientId,
36
+ });
37
+ }
38
+ }