@amabeth/repeating-wheel-picker 1.0.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 -44
  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 -177
  258. package/src/index.tsx +0 -507
@@ -0,0 +1,11 @@
1
+ import type { ErrorHandlerCallback } from 'react-native';
2
+
3
+ export function createErrorHandler(originalHandler: ErrorHandlerCallback): ErrorHandlerCallback {
4
+ return (error, isFatal) => originalHandler(error, isFatal);
5
+ }
6
+
7
+ /**
8
+ * @hidden
9
+ * @deprecated Will be removed in the future.
10
+ */
11
+ export function disableErrorHandling() {}
@@ -0,0 +1,112 @@
1
+ import type { EventEmitter } from 'expo-modules-core/types';
2
+ import { useEffect, useRef, useState } from 'react';
3
+
4
+ type AnyEventListener = (...args: any[]) => any;
5
+
6
+ /**
7
+ * Type helper that infers the event name from the emitter's events map.
8
+ */
9
+ type InferEventName<TEventsMap> =
10
+ TEventsMap extends Record<infer TEventName extends keyof TEventsMap, AnyEventListener>
11
+ ? TEventName
12
+ : never;
13
+
14
+ /**
15
+ * Type helper that infers the event listener from the emitter's events map.
16
+ */
17
+ type InferEventListener<TEventsMap, TEventName extends keyof TEventsMap> =
18
+ TEventsMap extends Record<TEventName, infer TEventListener extends AnyEventListener>
19
+ ? TEventListener
20
+ : never;
21
+
22
+ /**
23
+ * Type helper that infers the first parameter of the event listener.
24
+ */
25
+ type InferEventParameter<
26
+ TEventListener extends AnyEventListener,
27
+ TInitialValue,
28
+ > = TInitialValue extends Parameters<TEventListener>[0]
29
+ ? Parameters<TEventListener>[0]
30
+ : Parameters<TEventListener>[0] | TInitialValue | null;
31
+
32
+ /**
33
+ * React hook that listens to events emitted by the given object. The returned value is an event parameter
34
+ * that gets updated whenever a new event is dispatched.
35
+ * @param eventEmitter An object that emits events. For example, a native module or shared object or an instance of [`EventEmitter`](#eventemitter).
36
+ * @param eventName Name of the event to listen to.
37
+ * @param initialValue An event parameter to use until the event is called for the first time.
38
+ * @returns A parameter of the event listener.
39
+ * @example
40
+ * ```tsx
41
+ * import { useEvent } from 'expo';
42
+ * import { VideoPlayer } from 'expo-video';
43
+ *
44
+ * export function PlayerStatus({ videoPlayer }: { videoPlayer: VideoPlayer }) {
45
+ * const { status } = useEvent(videoPlayer, 'statusChange', { status: videoPlayer.status });
46
+ *
47
+ * return <Text>{`Player status: ${status}`}</Text>;
48
+ * }
49
+ * ```
50
+ */
51
+ export function useEvent<
52
+ TEventsMap extends Record<string, AnyEventListener>,
53
+ TEventName extends InferEventName<TEventsMap>,
54
+ TEventListener extends InferEventListener<TEventsMap, TEventName>,
55
+ TInitialValue extends Parameters<TEventListener>[0] | null,
56
+ >(
57
+ eventEmitter: EventEmitter<TEventsMap>,
58
+ eventName: TEventName,
59
+ initialValue: TInitialValue | null = null
60
+ ): InferEventParameter<TEventListener, TInitialValue> {
61
+ const [event, setEvent] = useState<Parameters<TEventListener>[0] | TInitialValue | null>(
62
+ initialValue
63
+ );
64
+ const listener = (event: Parameters<TEventListener>[0]) => setEvent(event);
65
+
66
+ useEventListener(eventEmitter, eventName, listener as InferEventListener<TEventsMap, TEventName>);
67
+
68
+ return event as InferEventParameter<TEventListener, TInitialValue>;
69
+ }
70
+
71
+ /**
72
+ * React hook that listens to events emitted by the given object and calls the listener function whenever a new event is dispatched.
73
+ * The event listener is automatically added during the first render and removed when the component unmounts.
74
+ * @param eventEmitter An object that emits events. For example, a native module or shared object or an instance of [`EventEmitter`](#eventemitter).
75
+ * @param eventName Name of the event to listen to.
76
+ * @param listener A function to call when the event is dispatched.
77
+ * @example
78
+ * ```tsx
79
+ * import { useEventListener } from 'expo';
80
+ * import { useVideoPlayer, VideoView } from 'expo-video';
81
+ *
82
+ * export function VideoPlayerView() {
83
+ * const player = useVideoPlayer(videoSource);
84
+ *
85
+ * useEventListener(player, 'playingChange', ({ isPlaying }) => {
86
+ * console.log('Player is playing:', isPlaying);
87
+ * });
88
+ *
89
+ * return <VideoView player={player} />;
90
+ * }
91
+ * ```
92
+ */
93
+ export function useEventListener<
94
+ TEventsMap extends Record<string, AnyEventListener>,
95
+ TEventName extends InferEventName<TEventsMap>,
96
+ TEventListener extends InferEventListener<TEventsMap, TEventName>,
97
+ >(eventEmitter: EventEmitter<TEventsMap>, eventName: TEventName, listener: TEventListener): void {
98
+ // Always use the most recent version of the listener inside the effect,
99
+ // without memoization so the listeners don't have to be swapped with every render.
100
+ const listenerRef = useRef<TEventListener>(listener);
101
+ listenerRef.current = listener;
102
+
103
+ useEffect(() => {
104
+ const callback = (...args: any[]) => listenerRef.current(...args);
105
+ const subscription = eventEmitter.addListener<TEventName>(
106
+ eventName,
107
+ callback as TEventsMap[TEventName]
108
+ );
109
+
110
+ return () => subscription.remove();
111
+ }, [eventEmitter, eventName, listenerRef]);
112
+ }
@@ -0,0 +1,64 @@
1
+ import '../Expo.fx';
2
+
3
+ import { type ComponentType } from 'react';
4
+ import { AppRegistry, Platform } from 'react-native';
5
+
6
+ declare namespace globalThis {
7
+ // TODO(@kitten): What's the proper type here? What would AppRegistry need to accept?
8
+ const __EXPO_ROUTER_HYDRATE__: unknown;
9
+ }
10
+
11
+ type InitialProps = {
12
+ exp?: {
13
+ notification?: any;
14
+ manifestString?: string;
15
+ [key: string]: any;
16
+ };
17
+ shell?: boolean;
18
+ shellManifestUrl?: string;
19
+ [key: string]: any;
20
+ };
21
+
22
+ // @needsAudit
23
+ /**
24
+ * Sets the initial React component to render natively in the app's root React Native view on Android, iOS, tvOS and the web.
25
+ *
26
+ * This method does the following:
27
+ * - Invokes React Native's `AppRegistry.registerComponent`.
28
+ * - Invokes React Native web's `AppRegistry.runApplication` on web to render to the root `index.html` file.
29
+ * - Polyfills the `process.nextTick` function globally.
30
+ *
31
+ * This method also adds the following dev-only features that are removed in production bundles.
32
+ * - Adds the Fast Refresh and bundle splitting indicator to the app.
33
+ * - Asserts if the `expo-updates` package is misconfigured.
34
+ * - Asserts if `react-native` is not aliased to `react-native-web` when running in the browser.
35
+ * @param component The React component class that renders the rest of your app.
36
+ * @see For information on how to setup `registerRootComponent` in an existing (bare) React Native app, see [Common questions](#rootregistercomponent-setup-for-existing-react-native-projects) below.
37
+ */
38
+ export default function registerRootComponent<P extends InitialProps>(
39
+ component: ComponentType<P>
40
+ ): void {
41
+ let qualifiedComponent = component;
42
+
43
+ if (process.env.NODE_ENV !== 'production') {
44
+ const { withDevTools } = require('./withDevTools') as typeof import('./withDevTools');
45
+ qualifiedComponent = withDevTools(component);
46
+ }
47
+
48
+ AppRegistry.registerComponent('main', () => qualifiedComponent);
49
+ // Skip querying the DOM if we're in a Node.js environment.
50
+ if (Platform.OS === 'web' && typeof window !== 'undefined') {
51
+ const rootTag = document.getElementById('root');
52
+ if (process.env.NODE_ENV !== 'production') {
53
+ if (!rootTag) {
54
+ throw new Error('Required HTML element with id "root" was not found in the document HTML.');
55
+ }
56
+ }
57
+
58
+ AppRegistry.runApplication('main', {
59
+ rootTag,
60
+ // Injected by SSR HTML tags.
61
+ hydrate: globalThis.__EXPO_ROUTER_HYDRATE__,
62
+ });
63
+ }
64
+ }
@@ -0,0 +1,47 @@
1
+ import * as React from 'react';
2
+
3
+ import DevLoadingView from '../environment/DevLoadingView';
4
+ import { isRunningInExpoGo } from '../environment/ExpoGo';
5
+
6
+ /**
7
+ * Append the Expo Fast Refresh view and optionally
8
+ * keep the screen awake if `expo-keep-awake` is installed.
9
+ */
10
+ export function withDevTools<TComponent extends React.ComponentType<any>>(
11
+ AppRootComponent: TComponent
12
+ ): React.ComponentType<React.ComponentProps<TComponent>> {
13
+ // This hook can be optionally imported because __DEV__ never changes during runtime.
14
+ // Using __DEV__ like this enables tree shaking to remove the hook in production.
15
+ const useOptionalKeepAwake: (tag?: string) => void = (() => {
16
+ try {
17
+ // Optionally import expo-keep-awake
18
+ const { useKeepAwake, ExpoKeepAwakeTag } = require('expo-keep-awake');
19
+ return () => useKeepAwake(ExpoKeepAwakeTag, { suppressDeactivateWarnings: true });
20
+ } catch {}
21
+ return () => {};
22
+ })();
23
+
24
+ const shouldUseExpoFastRefreshView = isRunningInExpoGo();
25
+
26
+ function WithDevTools(props: React.ComponentProps<TComponent>) {
27
+ useOptionalKeepAwake();
28
+
29
+ if (shouldUseExpoFastRefreshView) {
30
+ return (
31
+ <>
32
+ <AppRootComponent {...props} />
33
+ <DevLoadingView />
34
+ </>
35
+ );
36
+ }
37
+
38
+ return <AppRootComponent {...props} />;
39
+ }
40
+
41
+ if (process.env.NODE_ENV !== 'production') {
42
+ const name = AppRootComponent.displayName || AppRootComponent.name || 'Anonymous';
43
+ WithDevTools.displayName = `withDevTools(${name})`;
44
+ }
45
+
46
+ return WithDevTools;
47
+ }
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+
3
+ // Keep the screen awake on Android, we don't use the Fast Refresh overlay here.
4
+ // The default behavior here is to skip the custom Fast Refresh indicator.
5
+ export function withDevTools<TComponent extends React.ComponentType<any>>(
6
+ AppRootComponent: TComponent
7
+ ): React.ComponentType<React.ComponentProps<TComponent>> {
8
+ // This hook can be optionally imported because __DEV__ never changes during runtime.
9
+ // Using __DEV__ like this enables tree shaking to remove the hook in production.
10
+ const useOptionalKeepAwake: (tag?: string) => void = (() => {
11
+ try {
12
+ // Optionally import expo-keep-awake
13
+ const { useKeepAwake, ExpoKeepAwakeTag } = require('expo-keep-awake');
14
+ return () => useKeepAwake(ExpoKeepAwakeTag, { suppressDeactivateWarnings: true });
15
+ } catch {}
16
+ return () => {};
17
+ })();
18
+
19
+ function WithDevTools(props: React.ComponentProps<TComponent>) {
20
+ useOptionalKeepAwake();
21
+ return <AppRootComponent {...props} />;
22
+ }
23
+
24
+ if (process.env.NODE_ENV !== 'production') {
25
+ const name = AppRootComponent.displayName || AppRootComponent.name || 'Anonymous';
26
+ WithDevTools.displayName = `withDevTools(${name})`;
27
+ }
28
+
29
+ return WithDevTools;
30
+ }
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+
3
+ import DevLoadingView from '../environment/DevLoadingView';
4
+
5
+ export function withDevTools<TComponent extends React.ComponentType<any>>(
6
+ AppRootComponent: TComponent
7
+ ): React.ComponentType<React.ComponentProps<TComponent>> {
8
+ function WithDevTools(props: React.ComponentProps<TComponent>) {
9
+ return (
10
+ <>
11
+ <AppRootComponent {...props} />
12
+ <DevLoadingView />
13
+ </>
14
+ );
15
+ }
16
+
17
+ if (process.env.NODE_ENV !== 'production') {
18
+ const name = AppRootComponent.displayName || AppRootComponent.name || 'Anonymous';
19
+ WithDevTools.displayName = `withDevTools(${name})`;
20
+ }
21
+
22
+ return WithDevTools;
23
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Defines a small polyfill for process.nextTick. Eventually we'd like to replace this polyfill with
3
+ * a native implementation with the correct timing semantics.
4
+ */
5
+
6
+ if (!process.nextTick) {
7
+ process.nextTick = (callback: (...args: any[]) => any, ...args: any[]) => {
8
+ setTimeout(() => callback(...args), 0);
9
+ };
10
+ }
@@ -0,0 +1,47 @@
1
+ /*! *****************************************************************************
2
+ Copyright (c) Microsoft Corporation. All rights reserved.
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4
+ this file except in compliance with the License. You may obtain a copy of the
5
+ License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
9
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
10
+ MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ See the Apache Version 2.0 License for specific language governing permissions
13
+ and limitations under the License.
14
+ ***************************************************************************** */
15
+
16
+ /**
17
+ * This is a more comprehensive declaration of the Console API that JavaScript VMs include.
18
+ *
19
+ * This declaration is from https://github.com/Microsoft/TypeScript/blob/master/lib/lib.dom.d.ts
20
+ */
21
+ interface Console {
22
+ memory: any;
23
+ assert(condition?: boolean, message?: string, ...data: any[]): void;
24
+ clear(): void;
25
+ count(label?: string): void;
26
+ debug(message?: any, ...optionalParams: any[]): void;
27
+ dir(value?: any, ...optionalParams: any[]): void;
28
+ dirxml(value: any): void;
29
+ error(message?: any, ...optionalParams: any[]): void;
30
+ exception(message?: string, ...optionalParams: any[]): void;
31
+ group(groupTitle?: string, ...optionalParams: any[]): void;
32
+ groupCollapsed(groupTitle?: string, ...optionalParams: any[]): void;
33
+ groupEnd(): void;
34
+ info(message?: any, ...optionalParams: any[]): void;
35
+ log(message?: any, ...optionalParams: any[]): void;
36
+ markTimeline(label?: string): void;
37
+ profile(reportName?: string): void;
38
+ profileEnd(reportName?: string): void;
39
+ table(...tabularData: any[]): void;
40
+ time(label?: string): void;
41
+ timeEnd(label?: string): void;
42
+ timeStamp(label?: string): void;
43
+ timeline(label?: string): void;
44
+ timelineEnd(label?: string): void;
45
+ trace(message?: any, ...optionalParams: any[]): void;
46
+ warn(message?: any, ...optionalParams: any[]): void;
47
+ }
@@ -0,0 +1,12 @@
1
+ declare const global: any;
2
+
3
+ declare global {
4
+ // Augment global type for FormData prototype to include missing methods: keys, values, entries, and Symbol.iterator
5
+ // These methods are used in React for server actions.
6
+ interface FormData {
7
+ keys(): IterableIterator<string>;
8
+ values(): IterableIterator<string | Blob>;
9
+ entries(): IterableIterator<[string, string | Blob]>;
10
+ [Symbol.iterator](): IterableIterator<[string, string | Blob]>;
11
+ }
12
+ }
@@ -0,0 +1,34 @@
1
+ declare module 'react-native/Libraries/NativeModules/specs/NativeSourceCode' {
2
+ namespace SourceCode {
3
+ function getConstants(): { scriptURL: string };
4
+ }
5
+ export default SourceCode;
6
+ }
7
+
8
+ declare module 'react-native/Libraries/Network/FormData' {
9
+ type FormDataValue = string | { name?: string; type?: string; uri: string };
10
+
11
+ type Headers = {
12
+ [name: string]: string;
13
+ };
14
+
15
+ type FormDataPart =
16
+ | {
17
+ string: string;
18
+ headers: Headers;
19
+ }
20
+ | {
21
+ uri: string;
22
+ headers: Headers;
23
+ name?: string;
24
+ type?: string;
25
+ };
26
+
27
+ class FormData {
28
+ append(key: string, value: FormDataValue): void;
29
+ getAll(key: string): FormDataValue[];
30
+ getParts(): FormDataPart[];
31
+ }
32
+
33
+ export default FormData;
34
+ }
@@ -0,0 +1,186 @@
1
+ // NOTE(@kitten): This is based on @types/whatwg-url
2
+ declare module 'whatwg-url-without-unicode' {
3
+ /// <reference lib="es2020"/>
4
+ /** https://url.spec.whatwg.org/#url-representation */
5
+ export interface URLRecord {
6
+ scheme: string;
7
+ username: string;
8
+ password: string;
9
+ host: string | number | IPv6Address | null;
10
+ port: number | null;
11
+ path: string | string[];
12
+ query: string | null;
13
+ fragment: string | null;
14
+ }
15
+
16
+ /** https://url.spec.whatwg.org/#concept-ipv6 */
17
+ export type IPv6Address = [number, number, number, number, number, number, number, number];
18
+
19
+ // NOTE(@kitten): This is a custom modification to add static methods with an overlay
20
+ // We should make this available to users in expo/types, which should be linked to our own Winter implementation,
21
+ // and compatible with built-ins. Until then, we're adding this so we can polyfill properly in `src/winter/url.ts`
22
+ export const URL: URLConstructor;
23
+ export interface URLConstructor {
24
+ new (url: string, base?: string | URL): URL;
25
+ (url: string, base?: string | URL): URL;
26
+ canParse(url: string, base?: string): boolean;
27
+ }
28
+
29
+ /** https://url.spec.whatwg.org/#url-class */
30
+ interface URL {
31
+ constructor(url: string, base?: string | URL);
32
+
33
+ get href(): string;
34
+ set href(V: string);
35
+
36
+ get origin(): string;
37
+
38
+ get protocol(): string;
39
+ set protocol(V: string);
40
+
41
+ get username(): string;
42
+ set username(V: string);
43
+
44
+ get password(): string;
45
+ set password(V: string);
46
+
47
+ get host(): string;
48
+ set host(V: string);
49
+
50
+ get hostname(): string;
51
+ set hostname(V: string);
52
+
53
+ get port(): string;
54
+ set port(V: string);
55
+
56
+ get pathname(): string;
57
+ set pathname(V: string);
58
+
59
+ get search(): string;
60
+ set search(V: string);
61
+
62
+ get searchParams(): URLSearchParams;
63
+
64
+ get hash(): string;
65
+ set hash(V: string);
66
+
67
+ toJSON(): string;
68
+
69
+ readonly [Symbol.toStringTag]: 'URL';
70
+ }
71
+
72
+ /** https://url.spec.whatwg.org/#interface-urlsearchparams */
73
+ export class URLSearchParams {
74
+ constructor(
75
+ init?:
76
+ | readonly (readonly [name: string, value: string])[]
77
+ | Iterable<readonly [name: string, value: string]>
78
+ | { readonly [name: string]: string }
79
+ | string
80
+ );
81
+
82
+ get size(): number;
83
+ append(name: string, value: string): void;
84
+ delete(name: string, value?: string): void;
85
+ get(name: string): string | null;
86
+ getAll(name: string): string[];
87
+ has(name: string, value?: string): boolean;
88
+ set(name: string, value: string): void;
89
+ sort(): void;
90
+
91
+ keys(): IterableIterator<string>;
92
+ values(): IterableIterator<string>;
93
+ entries(): IterableIterator<[name: string, value: string]>;
94
+ forEach<THIS_ARG = void>(
95
+ callback: (this: THIS_ARG, value: string, name: string, searchParams: this) => void,
96
+ thisArg?: THIS_ARG
97
+ ): void;
98
+
99
+ readonly [Symbol.toStringTag]: 'URLSearchParams';
100
+ [Symbol.iterator](): IterableIterator<[name: string, value: string]>;
101
+ }
102
+
103
+ /** https://url.spec.whatwg.org/#concept-url-parser */
104
+ export function parseURL(
105
+ input: string,
106
+ options?: { readonly baseURL?: URLRecord | undefined }
107
+ ): URLRecord | null;
108
+
109
+ /** https://url.spec.whatwg.org/#concept-basic-url-parser */
110
+ export function basicURLParse(
111
+ input: string,
112
+ options?: {
113
+ baseURL?: URLRecord | undefined;
114
+ url?: URLRecord | undefined;
115
+ stateOverride?: StateOverride | undefined;
116
+ }
117
+ ): URLRecord | null;
118
+
119
+ /** https://url.spec.whatwg.org/#scheme-start-state */
120
+ export type StateOverride =
121
+ | 'scheme start'
122
+ | 'scheme'
123
+ | 'no scheme'
124
+ | 'special relative or authority'
125
+ | 'path or authority'
126
+ | 'relative'
127
+ | 'relative slash'
128
+ | 'special authority slashes'
129
+ | 'special authority ignore slashes'
130
+ | 'authority'
131
+ | 'host'
132
+ | 'hostname'
133
+ | 'port'
134
+ | 'file'
135
+ | 'file slash'
136
+ | 'file host'
137
+ | 'path start'
138
+ | 'path'
139
+ | 'opaque path'
140
+ | 'query'
141
+ | 'fragment';
142
+
143
+ /** https://url.spec.whatwg.org/#concept-url-serializer */
144
+ export function serializeURL(urlRecord: URLRecord, excludeFragment?: boolean): string;
145
+
146
+ /** https://url.spec.whatwg.org/#concept-host-serializer */
147
+ export function serializeHost(host: string | number | IPv6Address): string;
148
+
149
+ /** https://url.spec.whatwg.org/#url-path-serializer */
150
+ export function serializePath(urlRecord: URLRecord): string;
151
+
152
+ /** https://url.spec.whatwg.org/#serialize-an-integer */
153
+ export function serializeInteger(number: number): string;
154
+
155
+ /** https://html.spec.whatwg.org#ascii-serialisation-of-an-origin */
156
+ export function serializeURLOrigin(urlRecord: URLRecord): string;
157
+
158
+ /** https://url.spec.whatwg.org/#set-the-username */
159
+ export function setTheUsername(urlRecord: URLRecord, username: string): void;
160
+
161
+ /** https://url.spec.whatwg.org/#set-the-password */
162
+ export function setThePassword(urlRecord: URLRecord, password: string): void;
163
+
164
+ /** https://url.spec.whatwg.org/#url-opaque-path */
165
+ export function hasAnOpaquePath(urlRecord: URLRecord): boolean;
166
+
167
+ /** https://url.spec.whatwg.org/#cannot-have-a-username-password-port */
168
+ export function cannotHaveAUsernamePasswordPort(urlRecord: URLRecord): boolean;
169
+
170
+ /** https://url.spec.whatwg.org/#percent-decode */
171
+ export function percentDecodeBytes(buffer: TypedArray): Uint8Array;
172
+
173
+ /** https://url.spec.whatwg.org/#string-percent-decode */
174
+ export function percentDecodeString(string: string): Uint8Array;
175
+
176
+ export type TypedArray =
177
+ | Uint8Array
178
+ | Uint8ClampedArray
179
+ | Uint16Array
180
+ | Uint32Array
181
+ | Int8Array
182
+ | Int16Array
183
+ | Int32Array
184
+ | Float32Array
185
+ | Float64Array;
186
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Converts a Blob to an ArrayBuffer.
3
+ */
4
+ export function blobToArrayBufferAsync(blob: Blob): Promise<ArrayBuffer> {
5
+ if (typeof blob.arrayBuffer === 'function') {
6
+ return blob.arrayBuffer();
7
+ }
8
+ return legacyBlobToArrayBufferAsync(blob);
9
+ }
10
+
11
+ /**
12
+ * Converts a Blob to an ArrayBuffer using the FileReader API.
13
+ */
14
+ export async function legacyBlobToArrayBufferAsync(blob: Blob): Promise<ArrayBuffer> {
15
+ return new Promise((resolve, reject) => {
16
+ const reader = new FileReader();
17
+ reader.onload = () => {
18
+ resolve(reader.result as ArrayBuffer);
19
+ };
20
+ reader.onerror = reject;
21
+ reader.readAsArrayBuffer(blob);
22
+ });
23
+ }
@@ -0,0 +1,17 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+
3
+ /// <reference path="../ts-declarations/react-native.d.ts" />
4
+
5
+ import SourceCode from 'react-native/Libraries/NativeModules/specs/NativeSourceCode';
6
+
7
+ export function getBundleUrl(): string | null {
8
+ let scriptURL = SourceCode.getConstants().scriptURL;
9
+ if (scriptURL == null) {
10
+ return null;
11
+ }
12
+ if (scriptURL.startsWith('/')) {
13
+ scriptURL = `file://${scriptURL}`;
14
+ }
15
+ const url = new URL(scriptURL);
16
+ return url.toString();
17
+ }
@@ -0,0 +1,5 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+
3
+ export function getBundleUrl(): string | null {
4
+ return null;
5
+ }
@@ -0,0 +1,21 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+
3
+ export function getBundleUrl(): string | null {
4
+ let scriptURL: string | null | undefined = null;
5
+
6
+ if (typeof window === 'undefined') {
7
+ // For server runtime, we use the filename of the current script
8
+ // @ts-ignore The react-native tsconfig doesn't support CJS
9
+ scriptURL = 'file://' + __filename;
10
+ } else {
11
+ // TODO: Try to support `import.meta.url` when the ecosystem supports ESM,
12
+ // and jest doesn't throw SyntaxError when accessing `import.meta`.
13
+ scriptURL = (document.currentScript as HTMLScriptElement)?.src;
14
+ }
15
+
16
+ if (scriptURL == null) {
17
+ return null;
18
+ }
19
+ const url = new URL(scriptURL);
20
+ return `${url.protocol}//${url.host}${url.pathname}`;
21
+ }