expo-modules-core 1.11.13 → 1.12.1
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.
- package/CHANGELOG.md +77 -13
- package/ExpoModulesCore.podspec +7 -4
- package/android/ExpoModulesCorePlugin.gradle +40 -28
- package/android/build.gradle +12 -93
- package/android/proguard-rules.pro +0 -8
- package/android/src/main/cpp/Exceptions.cpp +1 -1
- package/android/src/main/cpp/Exceptions.h +1 -1
- package/android/src/main/cpp/ExpoModulesHostObject.cpp +7 -6
- package/android/src/main/cpp/ExpoModulesHostObject.h +3 -3
- package/android/src/main/cpp/JNIInjector.cpp +4 -2
- package/android/src/main/cpp/JSIContext.cpp +354 -0
- package/android/src/main/cpp/{JSIInteropModuleRegistry.h → JSIContext.h} +90 -9
- package/android/src/main/cpp/JavaCallback.cpp +210 -24
- package/android/src/main/cpp/JavaCallback.h +42 -7
- package/android/src/main/cpp/JavaScriptFunction.cpp +20 -6
- package/android/src/main/cpp/JavaScriptFunction.h +4 -1
- package/android/src/main/cpp/JavaScriptModuleObject.cpp +118 -82
- package/android/src/main/cpp/JavaScriptModuleObject.h +21 -18
- package/android/src/main/cpp/JavaScriptObject.cpp +7 -8
- package/android/src/main/cpp/JavaScriptObject.h +4 -2
- package/android/src/main/cpp/JavaScriptRuntime.cpp +18 -41
- package/android/src/main/cpp/JavaScriptRuntime.h +2 -8
- package/android/src/main/cpp/JavaScriptTypedArray.cpp +3 -3
- package/android/src/main/cpp/JavaScriptTypedArray.h +1 -1
- package/android/src/main/cpp/JavaScriptValue.cpp +7 -7
- package/android/src/main/cpp/JavaScriptValue.h +1 -1
- package/android/src/main/cpp/JavaScriptWeakObject.cpp +4 -4
- package/android/src/main/cpp/JavaScriptWeakObject.h +1 -1
- package/android/src/main/cpp/MethodMetadata.cpp +44 -120
- package/android/src/main/cpp/MethodMetadata.h +5 -11
- package/android/src/main/cpp/WeakRuntimeHolder.cpp +3 -3
- package/android/src/main/cpp/WeakRuntimeHolder.h +2 -2
- package/android/src/main/cpp/types/AnyType.cpp +1 -1
- package/android/src/main/cpp/types/AnyType.h +1 -1
- package/android/src/main/cpp/types/FrontendConverter.cpp +32 -43
- package/android/src/main/cpp/types/FrontendConverter.h +1 -23
- package/android/src/main/cpp/types/JNIToJSIConverter.cpp +5 -10
- package/android/src/main/cpp/types/JNIToJSIConverter.h +6 -2
- package/android/src/main/java/expo/modules/adapters/react/ModuleRegistryAdapter.java +3 -0
- package/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +14 -100
- package/android/src/main/java/expo/modules/adapters/react/ReactAdapterPackage.java +3 -5
- package/android/src/main/java/expo/modules/adapters/react/ReactModuleRegistryProvider.java +6 -22
- package/android/src/main/java/expo/modules/adapters/react/apploader/RNHeadlessAppLoader.kt +8 -4
- package/android/src/main/java/expo/modules/adapters/react/services/EventEmitterModule.java +0 -1
- package/android/src/main/java/expo/modules/adapters/react/services/UIManagerModuleWrapper.java +23 -8
- package/android/src/main/java/expo/modules/core/BasePackage.java +0 -10
- package/android/src/main/java/expo/modules/core/ModulePriorities.kt +1 -0
- package/android/src/main/java/expo/modules/core/ModuleRegistry.java +2 -32
- package/android/src/main/java/expo/modules/core/ModuleRegistryProvider.java +0 -18
- package/android/src/main/java/expo/modules/core/Promise.java +2 -0
- package/android/src/main/java/expo/modules/core/interfaces/Package.java +0 -17
- package/android/src/main/java/expo/modules/core/interfaces/ReactActivityHandler.java +0 -9
- package/android/src/main/java/expo/modules/core/interfaces/ReactNativeHostHandler.java +24 -31
- package/android/src/main/java/expo/modules/core/logging/LogHandler.kt +1 -7
- package/android/src/main/java/expo/modules/core/logging/LogHandlers.kt +11 -0
- package/android/src/main/java/expo/modules/core/logging/Logger.kt +18 -29
- package/android/src/main/java/expo/modules/core/logging/LoggerTimer.kt +11 -0
- package/android/src/main/java/expo/modules/core/logging/OSLogHandler.kt +2 -4
- package/android/src/main/java/expo/modules/core/logging/PersistentFileLogHandler.kt +1 -3
- package/android/src/main/java/expo/modules/interfaces/constants/ConstantsInterface.java +0 -2
- package/android/src/main/java/expo/modules/interfaces/permissions/PermissionsStatus.java +1 -1
- package/android/src/main/java/expo/modules/kotlin/AppContext.kt +44 -24
- package/android/src/main/java/expo/modules/kotlin/ArrayExtenstions.kt +15 -0
- package/android/src/main/java/expo/modules/kotlin/CoreLogger.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/DynamicExtenstions.kt +0 -3
- package/android/src/main/java/expo/modules/kotlin/ExpoBridgeModule.kt +41 -0
- package/android/src/main/java/expo/modules/kotlin/ExpoModulesHelper.kt +1 -2
- package/android/src/main/java/expo/modules/kotlin/KPromiseWrapper.kt +1 -2
- package/android/src/main/java/expo/modules/kotlin/KotlinInteropModuleRegistry.kt +1 -33
- package/android/src/main/java/expo/modules/kotlin/ModuleHolder.kt +7 -6
- package/android/src/main/java/expo/modules/kotlin/ModuleRegistry.kt +12 -12
- package/android/src/main/java/expo/modules/kotlin/Promise.kt +10 -0
- package/android/src/main/java/expo/modules/kotlin/ReactExtensions.kt +14 -0
- package/android/src/main/java/expo/modules/kotlin/Utils.kt +4 -1
- package/android/src/main/java/expo/modules/kotlin/activityaware/AppCompatActivityAwareHelper.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultCaller.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/activityresult/AppContextActivityResultRegistry.kt +6 -6
- package/android/src/main/java/expo/modules/kotlin/classcomponent/ClassComponentBuilder.kt +44 -15
- package/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt +31 -1
- package/android/src/main/java/expo/modules/kotlin/defaultmodules/ErrorManagerModule.kt +2 -4
- package/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt +11 -4
- package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +2 -3
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionBuilder.kt +136 -43
- package/android/src/main/java/expo/modules/kotlin/functions/AsyncFunctionComponent.kt +71 -2
- package/android/src/main/java/expo/modules/kotlin/functions/FunctionBuilder.kt +39 -12
- package/android/src/main/java/expo/modules/kotlin/jni/ExpectedType.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/jni/JNIDeallocator.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/jni/{JSIInteropModuleRegistry.kt → JSIContext.kt} +90 -14
- package/android/src/main/java/expo/modules/kotlin/jni/JavaCallback.kt +51 -24
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptFunction.kt +3 -3
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptModuleObject.kt +4 -1
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptObject.kt +1 -0
- package/android/src/main/java/expo/modules/kotlin/jni/JavaScriptValue.kt +1 -0
- package/android/src/main/java/expo/modules/kotlin/jni/PromiseImpl.kt +20 -0
- package/android/src/main/java/expo/modules/kotlin/modules/Module.kt +0 -1
- package/android/src/main/java/expo/modules/kotlin/modules/ModuleDefinitionBuilder.kt +1 -1
- package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +164 -65
- package/android/src/main/java/expo/modules/kotlin/objects/PropertyComponentBuilder.kt +3 -4
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/ClassRegistry.kt +21 -0
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObject.kt +34 -1
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedObjectRegistry.kt +23 -8
- package/android/src/main/java/expo/modules/kotlin/sharedobjects/SharedRef.kt +7 -1
- package/android/src/main/java/expo/modules/kotlin/tracing/ExpoTrace.kt +4 -0
- package/android/src/main/java/expo/modules/kotlin/types/AnyType.kt +134 -2
- package/android/src/main/java/expo/modules/kotlin/types/EnforceType.kt +60 -0
- package/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt +2 -2
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverter.kt +0 -2
- package/android/src/main/java/expo/modules/kotlin/types/TypeConverterProvider.kt +3 -27
- package/android/src/main/java/expo/modules/kotlin/types/UnitTypeConverter.kt +3 -7
- package/android/src/main/java/expo/modules/kotlin/types/io/PathTypeConverter.kt +3 -0
- package/android/src/main/java/expo/modules/kotlin/viewevent/ViewEvent.kt +2 -5
- package/android/src/main/java/expo/modules/kotlin/views/ViewDefinitionBuilder.kt +137 -48
- package/android/src/main/java/expo/modules/kotlin/views/ViewManagerDefinition.kt +2 -5
- package/build/EventEmitter.d.ts +2 -2
- package/build/EventEmitter.d.ts.map +1 -1
- package/build/EventEmitter.js +8 -8
- package/build/EventEmitter.js.map +1 -1
- package/build/NativeModule.d.ts +4 -0
- package/build/NativeModule.d.ts.map +1 -0
- package/build/NativeModule.js +4 -0
- package/build/NativeModule.js.map +1 -0
- package/build/NativeModulesProxy.native.d.ts.map +1 -1
- package/build/NativeModulesProxy.native.js +4 -0
- package/build/NativeModulesProxy.native.js.map +1 -1
- package/build/NativeModulesProxy.types.d.ts +2 -2
- package/build/NativeModulesProxy.types.d.ts.map +1 -1
- package/build/NativeModulesProxy.types.js.map +1 -1
- package/build/NativeViewManagerAdapter.native.d.ts.map +1 -1
- package/build/NativeViewManagerAdapter.native.js +20 -1
- package/build/NativeViewManagerAdapter.native.js.map +1 -1
- package/build/PermissionsHook.d.ts.map +1 -1
- package/build/PermissionsHook.js +2 -0
- package/build/PermissionsHook.js.map +1 -1
- package/build/Refs.d.ts +8 -0
- package/build/Refs.d.ts.map +1 -0
- package/build/Refs.js +10 -0
- package/build/Refs.js.map +1 -0
- package/build/SharedObject.d.ts +4 -0
- package/build/SharedObject.d.ts.map +1 -0
- package/build/SharedObject.js +4 -0
- package/build/SharedObject.js.map +1 -0
- package/build/createWebModule.d.ts +2 -0
- package/build/createWebModule.d.ts.map +1 -0
- package/build/createWebModule.js +6 -0
- package/build/createWebModule.js.map +1 -0
- package/build/createWebModule.web.d.ts +2 -0
- package/build/createWebModule.web.d.ts.map +1 -0
- package/build/createWebModule.web.js +6 -0
- package/build/createWebModule.web.js.map +1 -0
- package/build/ensureNativeModulesAreInstalled.d.ts +6 -0
- package/build/ensureNativeModulesAreInstalled.d.ts.map +1 -0
- package/build/ensureNativeModulesAreInstalled.js +26 -0
- package/build/ensureNativeModulesAreInstalled.js.map +1 -0
- package/build/hooks/useReleasingSharedObject.d.ts +7 -0
- package/build/hooks/useReleasingSharedObject.d.ts.map +1 -0
- package/build/hooks/useReleasingSharedObject.js +40 -0
- package/build/hooks/useReleasingSharedObject.js.map +1 -0
- package/build/index.d.ts +8 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +8 -0
- package/build/index.js.map +1 -1
- package/build/requireNativeModule.d.ts +0 -17
- package/build/requireNativeModule.d.ts.map +1 -1
- package/build/requireNativeModule.js +2 -23
- package/build/requireNativeModule.js.map +1 -1
- package/build/ts-declarations/EventEmitter.d.ts +50 -0
- package/build/ts-declarations/EventEmitter.d.ts.map +1 -0
- package/build/ts-declarations/EventEmitter.js +2 -0
- package/build/ts-declarations/EventEmitter.js.map +1 -0
- package/build/ts-declarations/NativeModule.d.ts +14 -0
- package/build/ts-declarations/NativeModule.d.ts.map +1 -0
- package/build/ts-declarations/NativeModule.js +2 -0
- package/build/ts-declarations/NativeModule.js.map +1 -0
- package/build/ts-declarations/SharedObject.d.ts +14 -0
- package/build/ts-declarations/SharedObject.d.ts.map +1 -0
- package/build/ts-declarations/SharedObject.js +2 -0
- package/build/ts-declarations/SharedObject.js.map +1 -0
- package/build/ts-declarations/global.d.ts +49 -0
- package/build/ts-declarations/global.d.ts.map +1 -0
- package/build/ts-declarations/global.js +2 -0
- package/build/ts-declarations/global.js.map +1 -0
- package/build/web/CoreModule.d.ts +17 -0
- package/build/web/CoreModule.d.ts.map +1 -0
- package/build/web/CoreModule.js +51 -0
- package/build/web/CoreModule.js.map +1 -0
- package/build/web/index.d.ts +1 -0
- package/build/web/index.d.ts.map +1 -0
- package/build/web/index.js +1 -0
- package/build/web/index.js.map +1 -0
- package/build/web/index.web.d.ts +2 -0
- package/build/web/index.web.d.ts.map +1 -0
- package/build/web/index.web.js +2 -0
- package/build/web/index.web.js.map +1 -0
- package/common/cpp/BridgelessJSCallInvoker.h +41 -0
- package/common/cpp/EventEmitter.cpp +299 -0
- package/common/cpp/EventEmitter.h +111 -0
- package/common/cpp/JSIUtils.cpp +116 -11
- package/common/cpp/JSIUtils.h +54 -7
- package/common/cpp/LazyObject.cpp +15 -3
- package/common/cpp/LazyObject.h +13 -0
- package/common/cpp/NativeModule.cpp +16 -0
- package/common/cpp/NativeModule.h +34 -0
- package/common/cpp/ObjectDeallocator.cpp +3 -5
- package/common/cpp/ObjectDeallocator.h +2 -3
- package/common/cpp/SharedObject.cpp +69 -0
- package/common/cpp/SharedObject.h +59 -0
- package/common/cpp/TestingSyncJSCallInvoker.h +44 -0
- package/ios/Api/Builders/ClassComponentBuilder.swift +34 -0
- package/ios/{Objects → Api/Builders}/ObjectDefinitionBuilder.swift +3 -3
- package/ios/Api/Builders/ViewDefinitionBuilder.swift +53 -0
- package/ios/Api/Factories/AsyncFunctionFactories.swift +173 -0
- package/ios/{Classes/ClassComponentFactories.swift → Api/Factories/ClassFactories.swift} +19 -19
- package/ios/{Functions/ConcurrentFunctionDefinition.swift → Api/Factories/ConcurrentFunctionFactories.swift} +0 -113
- package/ios/{Modules/ModuleDefinitionComponents.swift → Api/Factories/EventListenersFactories.swift} +0 -20
- package/ios/Api/Factories/ModuleFactories.swift +6 -0
- package/ios/{Objects/ObjectDefinitionComponents.swift → Api/Factories/ObjectFactories.swift} +5 -5
- package/ios/Api/Factories/PropertyFactories.swift +50 -0
- package/ios/Api/Factories/SyncFunctionFactories.swift +173 -0
- package/ios/{Views/ViewManagerDefinitionComponents.swift → Api/Factories/ViewFactories.swift} +7 -6
- package/ios/AppDelegates/EXAppDelegateWrapper.h +0 -21
- package/ios/AppDelegates/EXAppDelegateWrapper.mm +37 -29
- package/ios/{AppContext.swift → Core/AppContext.swift} +34 -11
- package/ios/Core/Classes/AnyClassDefinitionElement.swift +37 -0
- package/ios/{Classes/ClassComponent.swift → Core/Classes/ClassDefinition.swift} +10 -10
- package/ios/{Conversions.swift → Core/Conversions.swift} +1 -1
- package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicSharedObjectType.swift +3 -3
- package/ios/Core/Events/EventObservingDefinition.swift +79 -0
- package/ios/Core/Events/LegacyEventEmitterCompat.swift +32 -0
- package/ios/Core/ExpoBridgeModule.h +18 -0
- package/ios/Core/ExpoBridgeModule.mm +88 -0
- package/ios/Core/ExpoRuntime.swift +6 -0
- package/ios/{Functions/AnyFunction.swift → Core/Functions/AnyFunctionDefinition.swift} +9 -2
- package/ios/Core/Functions/AsyncFunctionDefinition.swift +150 -0
- package/ios/Core/Functions/ConcurrentFunctionDefinition.swift +112 -0
- package/ios/Core/Functions/SyncFunctionDefinition.swift +108 -0
- package/ios/{JavaScriptUtils.swift → Core/JavaScriptUtils.swift} +4 -4
- package/ios/{Logging → Core/Logging}/LogHandlers.swift +12 -5
- package/ios/{Logging → Core/Logging}/Logger.swift +14 -92
- package/ios/Core/Logging/LoggerTimer.swift +22 -0
- package/ios/{ModuleHolder.swift → Core/ModuleHolder.swift} +2 -10
- package/ios/Core/Modules/CoreModule.swift +43 -0
- package/ios/{Modules → Core/Modules}/ModuleDefinition.swift +20 -12
- package/ios/{Modules → Core/Modules}/ModuleDefinitionBuilder.swift +1 -3
- package/ios/{Objects → Core/Objects}/ObjectDefinition.swift +9 -9
- package/ios/{Objects/PropertyComponent.swift → Core/Objects/PropertyDefinition.swift} +11 -64
- package/ios/Core/Protocols/AnyDefinition.swift +4 -0
- package/ios/Core/Protocols/AnyExpoView.swift +7 -0
- package/ios/Core/Protocols/AnyModule.swift +17 -0
- package/ios/Core/Protocols/AnyViewDefinition.swift +34 -0
- package/ios/Core/SharedObjects/SharedObject.swift +80 -0
- package/ios/{SharedObjects → Core/SharedObjects}/SharedObjectRegistry.swift +45 -19
- package/ios/{Views → Core/Views}/AnyViewProp.swift +1 -1
- package/ios/{Views → Core/Views}/ComponentData.swift +7 -7
- package/ios/{Views → Core/Views}/ExpoView.swift +1 -1
- package/ios/Core/Views/ViewDefinition.swift +97 -0
- package/ios/{Views → Core/Views}/ViewLifecycleMethod.swift +1 -1
- package/ios/{Views → Core/Views}/ViewModuleWrapper.swift +1 -1
- package/ios/Fabric/ExpoFabricView.swift +5 -6
- package/ios/FileSystemUtilities/FileSystemLegacyUtilities.swift +111 -0
- package/ios/JSI/EXJSIInstaller.h +28 -0
- package/ios/JSI/EXJSIInstaller.mm +54 -10
- package/ios/JSI/EXJSIUtils.h +15 -11
- package/ios/JSI/EXJSIUtils.mm +21 -49
- package/ios/JSI/EXJavaScriptObject.mm +2 -2
- package/ios/JSI/EXJavaScriptRuntime.h +15 -0
- package/ios/JSI/EXJavaScriptRuntime.mm +53 -26
- package/ios/JSI/EXSharedObjectUtils.h +15 -0
- package/ios/JSI/EXSharedObjectUtils.mm +18 -0
- package/ios/JSI/JavaScriptRuntime.swift +16 -0
- package/ios/Legacy/ModuleRegistry/EXModuleRegistry.m +1 -0
- package/ios/Legacy/ModuleRegistryProvider/EXModuleRegistryProvider.m +5 -0
- package/ios/Legacy/NativeModulesProxy/EXNativeModulesProxy.mm +5 -4
- package/ios/Legacy/Services/EXReactNativeAdapter.mm +34 -28
- package/ios/ReactDelegates/EXReactDelegateWrapper.h +4 -12
- package/ios/ReactDelegates/EXReactDelegateWrapper.mm +41 -0
- package/ios/ReactDelegates/EXReactRootViewFactory.h +38 -0
- package/ios/ReactDelegates/EXReactRootViewFactory.mm +54 -0
- package/ios/ReactDelegates/ExpoReactDelegate.swift +22 -15
- package/ios/ReactDelegates/ExpoReactDelegateHandler.swift +10 -21
- package/ios/ReactDelegates/RCTAppDelegate+Recreate.h +28 -0
- package/ios/ReactDelegates/RCTAppDelegate+Recreate.mm +47 -0
- package/ios/Tests/{ClassComponentSpec.swift → ClassDefinitionSpec.swift} +6 -6
- package/ios/Tests/ConvertiblesSpec.swift +6 -1
- package/ios/Tests/CoreModuleSpec.swift +0 -4
- package/ios/Tests/DynamicTypeSpec.swift +1 -1
- package/ios/Tests/EventEmitterSpec.swift +274 -0
- package/ios/Tests/ExceptionsSpec.swift +114 -54
- package/ios/Tests/ExpoModulesSpec.swift +4 -3
- package/ios/Tests/LoggerSpec.swift +80 -0
- package/ios/Tests/{PropertyComponentSpec.swift → PropertyDefinitionSpec.swift} +1 -1
- package/ios/Tests/SharedObjectRegistrySpec.swift +34 -28
- package/ios/Tests/SharedObjectSpec.swift +141 -0
- package/ios/Tests/ViewDefinitionSpec.swift +1 -1
- package/package.json +2 -2
- package/src/EventEmitter.ts +15 -18
- package/src/NativeModule.ts +6 -0
- package/src/NativeModulesProxy.native.ts +5 -0
- package/src/NativeModulesProxy.types.ts +2 -2
- package/src/NativeViewManagerAdapter.native.tsx +25 -1
- package/src/PermissionsHook.ts +4 -0
- package/src/Refs.ts +10 -0
- package/src/SharedObject.ts +6 -0
- package/src/createWebModule.ts +5 -0
- package/src/createWebModule.web.ts +6 -0
- package/src/ensureNativeModulesAreInstalled.ts +24 -0
- package/src/hooks/useReleasingSharedObject.ts +51 -0
- package/src/index.ts +13 -0
- package/src/requireNativeModule.ts +2 -51
- package/src/ts-declarations/EventEmitter.ts +65 -0
- package/src/ts-declarations/ExpoModules.d.ts +0 -5
- package/src/ts-declarations/NativeModule.ts +18 -0
- package/src/ts-declarations/SharedObject.ts +16 -0
- package/src/ts-declarations/global.ts +60 -0
- package/src/web/CoreModule.ts +83 -0
- package/src/web/index.ts +0 -0
- package/src/web/index.web.ts +1 -0
- package/android/src/main/cpp/JSIInteropModuleRegistry.cpp +0 -196
- package/android/src/main/java/expo/modules/adapters/react/ArgumentsHelper.java +0 -48
- package/android/src/main/java/expo/modules/adapters/react/PromiseWrapper.java +0 -38
- package/android/src/main/java/expo/modules/adapters/react/services/CookieManagerModule.java +0 -53
- package/android/src/main/java/expo/modules/core/ArgumentsHelper.java +0 -44
- package/android/src/main/java/expo/modules/core/ExportedModule.java +0 -173
- package/android/src/main/java/expo/modules/core/ModuleRegistryDelegate.kt +0 -12
- package/android/src/main/java/expo/modules/core/ViewManager.java +0 -9
- package/android/src/main/java/expo/modules/core/interfaces/ExpoMethod.java +0 -12
- package/android/src/main/java/expo/modules/core/interfaces/ExpoProp.java +0 -10
- package/android/src/main/java/expo/modules/core/logging/LoggerOptions.kt +0 -29
- package/android-annotation/build.gradle +0 -48
- package/android-annotation/src/main/java/expo/modules/annotation/Config.kt +0 -7
- package/android-annotation/src/main/java/expo/modules/annotation/ConverterBinder.kt +0 -7
- package/android-annotation-processor/build.gradle +0 -54
- package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessor.kt +0 -175
- package/android-annotation-processor/src/main/java/expo/modules/annotationprocessor/ExpoSymbolProcessorProvider.kt +0 -10
- package/android-annotation-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider +0 -1
- package/ios/Classes/ClassComponentElement.swift +0 -37
- package/ios/Classes/ClassComponentElementsBuilder.swift +0 -34
- package/ios/ExpoBridgeModule.m +0 -7
- package/ios/ExpoBridgeModule.swift +0 -108
- package/ios/ExpoRuntime.swift +0 -28
- package/ios/Functions/AsyncFunctionComponent.swift +0 -327
- package/ios/Functions/SyncFunctionComponent.swift +0 -282
- package/ios/Interfaces/Font/EXFontManagerInterface.h +0 -9
- package/ios/Interfaces/Font/EXFontProcessorInterface.h +0 -15
- package/ios/Interfaces/Font/EXFontScalerInterface.h +0 -9
- package/ios/Interfaces/Font/EXFontScalersManagerInterface.h +0 -9
- package/ios/Legacy/Services/EXReactFontManager.h +0 -6
- package/ios/Legacy/Services/EXReactFontManager.m +0 -130
- package/ios/Modules/AnyModule.swift +0 -53
- package/ios/Modules/CoreModule.swift +0 -17
- package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.h +0 -16
- package/ios/ReactDelegates/EXRCTBridgeDelegateInterceptor.m +0 -49
- package/ios/ReactDelegates/EXReactCompatibleHelpers.h +0 -15
- package/ios/ReactDelegates/EXReactCompatibleHelpers.m +0 -25
- package/ios/ReactDelegates/EXReactDelegateWrapper.m +0 -53
- package/ios/SharedObjects/SharedObject.swift +0 -31
- package/ios/Views/ViewDefinition.swift +0 -114
- package/ios/Views/ViewFactory.swift +0 -16
- package/ios/Views/ViewManagerDefinition.swift +0 -77
- package/ios/Views/ViewManagerDefinitionBuilder.swift +0 -11
- /package/ios/{AppContextConfig.swift → Core/AppContextConfig.swift} +0 -0
- /package/ios/{Arguments → Core/Arguments}/AnyArgument.swift +0 -0
- /package/ios/{Arguments → Core/Arguments}/Convertible.swift +0 -0
- /package/ios/{Arguments → Core/Arguments}/Convertibles.swift +0 -0
- /package/ios/{Arguments → Core/Arguments}/Enumerable.swift +0 -0
- /package/ios/{Classes → Core/Classes}/ClassRegistry.swift +0 -0
- /package/ios/{Convertibles → Core/Convertibles}/Convertibles+Color.swift +0 -0
- /package/ios/{Convertibles → Core/Convertibles}/Either.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/AnyDynamicType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicArrayType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicConvertibleType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDataType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicDictionaryType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicEnumType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicJavaScriptType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicOptionalType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicRawType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicTypedArrayType.swift +0 -0
- /package/ios/{DynamicTypes → Core/DynamicTypes}/DynamicViewType.swift +0 -0
- /package/ios/{EventListener.swift → Core/EventListener.swift} +0 -0
- /package/ios/{Events → Core/Events}/Callback.swift +0 -0
- /package/ios/{Events → Core/Events}/EventDispatcher.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/ChainableException.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/CodedError.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/CommonExceptions.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/Exception.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/ExceptionOrigin.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/GenericException.swift +0 -0
- /package/ios/{Exceptions → Core/Exceptions}/UnexpectedException.swift +0 -0
- /package/ios/{JavaScriptFunction.swift → Core/JavaScriptFunction.swift} +0 -0
- /package/ios/{Logging → Core/Logging}/LogType.swift +0 -0
- /package/ios/{Logging → Core/Logging}/PersistentFileLog.swift +0 -0
- /package/ios/{ModuleRegistry.swift → Core/ModuleRegistry.swift} +0 -0
- /package/ios/{Modules → Core/Modules}/Module.swift +0 -0
- /package/ios/{ModulesProvider.swift → Core/ModulesProvider.swift} +0 -0
- /package/ios/{Objects → Core/Objects}/JavaScriptObjectBuilder.swift +0 -0
- /package/ios/{Promise.swift → Core/Promise.swift} +0 -0
- /package/ios/{Records → Core/Records}/AnyField.swift +0 -0
- /package/ios/{Records → Core/Records}/Field.swift +0 -0
- /package/ios/{Records → Core/Records}/FieldExtensions.swift +0 -0
- /package/ios/{Records → Core/Records}/FieldOption.swift +0 -0
- /package/ios/{Records → Core/Records}/Record.swift +0 -0
- /package/ios/{SharedObjects → Core/SharedObjects}/SharedRef.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/AnyTypedArray.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/ConcreteTypedArrays.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/GenericTypedArray.swift +0 -0
- /package/ios/{TypedArrays → Core/TypedArrays}/TypedArray.swift +0 -0
- /package/ios/{Views → Core/Views}/ConcreteViewProp.swift +0 -0
|
@@ -8,51 +8,57 @@ final class SharedObjectRegistrySpec: ExpoSpec {
|
|
|
8
8
|
override class func spec() {
|
|
9
9
|
let appContext = AppContext.create()
|
|
10
10
|
let runtime = try! appContext.runtime
|
|
11
|
+
let sharedObjectRegistry = appContext.sharedObjectRegistry
|
|
11
12
|
|
|
12
13
|
describe("pullNextId") {
|
|
13
14
|
it("returns nextId") {
|
|
14
|
-
let id =
|
|
15
|
-
expect(
|
|
15
|
+
let id = sharedObjectRegistry.nextId
|
|
16
|
+
expect(sharedObjectRegistry.pullNextId()) == id
|
|
16
17
|
}
|
|
17
18
|
it("increments nextId") {
|
|
18
|
-
let id =
|
|
19
|
-
|
|
20
|
-
expect(
|
|
19
|
+
let id = sharedObjectRegistry.nextId
|
|
20
|
+
sharedObjectRegistry.pullNextId()
|
|
21
|
+
expect(sharedObjectRegistry.nextId) == id + 1
|
|
21
22
|
}
|
|
22
23
|
it("is not increasing size") {
|
|
23
|
-
let size =
|
|
24
|
-
|
|
25
|
-
expect(
|
|
24
|
+
let size = sharedObjectRegistry.size
|
|
25
|
+
sharedObjectRegistry.pullNextId()
|
|
26
|
+
expect(sharedObjectRegistry.size) == size
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
describe("add") {
|
|
30
31
|
it("adds using nextId") {
|
|
31
|
-
let nextId =
|
|
32
|
-
let id =
|
|
32
|
+
let nextId = sharedObjectRegistry.nextId
|
|
33
|
+
let id = sharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
|
|
33
34
|
expect(nextId) == id
|
|
34
35
|
}
|
|
35
36
|
it("is increasing size") {
|
|
36
|
-
let size =
|
|
37
|
-
|
|
38
|
-
expect(
|
|
37
|
+
let size = sharedObjectRegistry.size
|
|
38
|
+
sharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
|
|
39
|
+
expect(sharedObjectRegistry.size) == size + 1
|
|
39
40
|
}
|
|
40
41
|
it("assigns id on native object") {
|
|
41
42
|
let nativeObject = TestSharedObject()
|
|
42
|
-
let id =
|
|
43
|
+
let id = sharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
|
|
43
44
|
expect(nativeObject.sharedObjectId) == id
|
|
44
45
|
}
|
|
46
|
+
it("assigns the app context on native object") {
|
|
47
|
+
let nativeObject = TestSharedObject()
|
|
48
|
+
sharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
|
|
49
|
+
expect(nativeObject.appContext) == appContext
|
|
50
|
+
}
|
|
45
51
|
it("assigns id on JS object") {
|
|
46
52
|
let jsObject = runtime.createObject()
|
|
47
|
-
let id =
|
|
53
|
+
let id = sharedObjectRegistry.add(native: TestSharedObject(), javaScript: jsObject)
|
|
48
54
|
expect(jsObject.hasProperty(sharedObjectIdPropertyName)) == true
|
|
49
55
|
expect(try! jsObject.getProperty(sharedObjectIdPropertyName).asInt()) == id
|
|
50
56
|
}
|
|
51
57
|
it("saves objects pair") {
|
|
52
58
|
let nativeObject = TestSharedObject()
|
|
53
59
|
let jsObject = runtime.createObject()
|
|
54
|
-
let id =
|
|
55
|
-
let pair =
|
|
60
|
+
let id = sharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
|
|
61
|
+
let pair = sharedObjectRegistry.get(id)
|
|
56
62
|
expect(pair?.native) === nativeObject
|
|
57
63
|
expect(pair?.javaScript.lock()) == jsObject
|
|
58
64
|
}
|
|
@@ -60,14 +66,14 @@ final class SharedObjectRegistrySpec: ExpoSpec {
|
|
|
60
66
|
|
|
61
67
|
describe("delete") {
|
|
62
68
|
it("deletes objects pair") {
|
|
63
|
-
let id =
|
|
64
|
-
|
|
65
|
-
expect(
|
|
69
|
+
let id = sharedObjectRegistry.add(native: TestSharedObject(), javaScript: runtime.createObject())
|
|
70
|
+
sharedObjectRegistry.delete(id)
|
|
71
|
+
expect(sharedObjectRegistry.get(id)).to(beNil())
|
|
66
72
|
}
|
|
67
73
|
it("resets id on native object") {
|
|
68
74
|
let nativeObject = TestSharedObject()
|
|
69
|
-
let id =
|
|
70
|
-
|
|
75
|
+
let id = sharedObjectRegistry.add(native: nativeObject, javaScript: runtime.createObject())
|
|
76
|
+
sharedObjectRegistry.delete(id)
|
|
71
77
|
expect(nativeObject.sharedObjectId).toEventually(equal(0))
|
|
72
78
|
}
|
|
73
79
|
}
|
|
@@ -76,12 +82,12 @@ final class SharedObjectRegistrySpec: ExpoSpec {
|
|
|
76
82
|
it("returns native object") {
|
|
77
83
|
let nativeObject = TestSharedObject()
|
|
78
84
|
let jsObject = runtime.createObject()
|
|
79
|
-
|
|
80
|
-
expect(
|
|
85
|
+
sharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
|
|
86
|
+
expect(sharedObjectRegistry.toNativeObject(jsObject)) === nativeObject
|
|
81
87
|
}
|
|
82
88
|
it("returns nil") {
|
|
83
89
|
let jsObject = runtime.createObject()
|
|
84
|
-
expect(
|
|
90
|
+
expect(sharedObjectRegistry.toNativeObject(jsObject)).to(beNil())
|
|
85
91
|
}
|
|
86
92
|
}
|
|
87
93
|
|
|
@@ -89,12 +95,12 @@ final class SharedObjectRegistrySpec: ExpoSpec {
|
|
|
89
95
|
it("returns JS object") {
|
|
90
96
|
let nativeObject = TestSharedObject()
|
|
91
97
|
let jsObject = runtime.createObject()
|
|
92
|
-
|
|
93
|
-
expect(
|
|
98
|
+
sharedObjectRegistry.add(native: nativeObject, javaScript: jsObject)
|
|
99
|
+
expect(sharedObjectRegistry.toJavaScriptObject(nativeObject)) == jsObject
|
|
94
100
|
}
|
|
95
101
|
it("returns nil") {
|
|
96
102
|
let nativeObject = TestSharedObject()
|
|
97
|
-
expect(
|
|
103
|
+
expect(sharedObjectRegistry.toJavaScriptObject(nativeObject)).to(beNil())
|
|
98
104
|
}
|
|
99
105
|
}
|
|
100
106
|
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import ExpoModulesTestCore
|
|
2
|
+
|
|
3
|
+
@testable import ExpoModulesCore
|
|
4
|
+
|
|
5
|
+
final class SharedObjectSpec: ExpoSpec {
|
|
6
|
+
override class func spec() {
|
|
7
|
+
let appContext = AppContext.create()
|
|
8
|
+
let runtime = try! appContext.runtime
|
|
9
|
+
|
|
10
|
+
beforeSuite {
|
|
11
|
+
appContext.moduleRegistry.register(moduleType: SharedObjectModule.self)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("Base JS class") {
|
|
15
|
+
it("exists") {
|
|
16
|
+
let baseSharedObjectClass = try runtime.eval("expo.SharedObject")
|
|
17
|
+
expect(baseSharedObjectClass.kind) == .function
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
it("has release function in prototype") {
|
|
21
|
+
let releaseFunction = try runtime.eval("expo.SharedObject.prototype.release")
|
|
22
|
+
expect(releaseFunction.kind) == .function
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
it("initializes") {
|
|
26
|
+
let sharedObject = try runtime.eval("new expo.SharedObject()")
|
|
27
|
+
expect(sharedObject.kind) == .object
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
it("does not register") {
|
|
31
|
+
let registrySizeBefore = appContext.sharedObjectRegistry.size
|
|
32
|
+
try runtime.eval("new expo.SharedObject()")
|
|
33
|
+
expect(appContext.sharedObjectRegistry.size) == registrySizeBefore
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
it("inherits from EventEmitter") {
|
|
37
|
+
let isEventEmitter = try runtime.eval("new expo.SharedObject() instanceof expo.EventEmitter")
|
|
38
|
+
expect(isEventEmitter.kind) == .bool
|
|
39
|
+
expect(try isEventEmitter.asBool()) == true
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
describe("Concrete JS class") {
|
|
44
|
+
it("exists") {
|
|
45
|
+
let sharedObjectClass = try runtime.eval("expo.modules.SharedObjectModule.SharedObjectExample")
|
|
46
|
+
expect(sharedObjectClass.kind) == .function
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
it("has base class prototype") {
|
|
50
|
+
let hasBaseClassPrototype = try runtime.eval("expo.modules.SharedObjectModule.SharedObjectExample.prototype instanceof expo.SharedObject")
|
|
51
|
+
expect(hasBaseClassPrototype.kind) == .bool
|
|
52
|
+
expect(try hasBaseClassPrototype.asBool()) == true
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
it("creates new instance") {
|
|
56
|
+
let sharedObject = try runtime.eval("new expo.modules.SharedObjectModule.SharedObjectExample()")
|
|
57
|
+
expect(sharedObject.kind) == .object
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
it("registers") {
|
|
61
|
+
let registrySizeBefore = appContext.sharedObjectRegistry.size
|
|
62
|
+
try runtime.eval("new expo.modules.SharedObjectModule.SharedObjectExample()")
|
|
63
|
+
expect(appContext.sharedObjectRegistry.size) == registrySizeBefore + 1
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
it("is instance of") {
|
|
67
|
+
let isInstanceOf = try runtime.eval([
|
|
68
|
+
"sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()",
|
|
69
|
+
"sharedObject instanceof expo.modules.SharedObjectModule.SharedObjectExample"
|
|
70
|
+
])
|
|
71
|
+
expect(isInstanceOf.kind) == .bool
|
|
72
|
+
expect(try isInstanceOf.asBool()) == true
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
it("is instance of base class") {
|
|
76
|
+
let isInstanceOfBaseClass = try runtime.eval([
|
|
77
|
+
"sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()",
|
|
78
|
+
"sharedObject instanceof expo.SharedObject"
|
|
79
|
+
])
|
|
80
|
+
expect(isInstanceOfBaseClass.kind) == .bool
|
|
81
|
+
expect(try isInstanceOfBaseClass.asBool()) == true
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
it("has function from base class") {
|
|
85
|
+
let releaseFunction = try runtime.eval([
|
|
86
|
+
"sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()",
|
|
87
|
+
"sharedObject.release"
|
|
88
|
+
])
|
|
89
|
+
expect(releaseFunction.kind) == .function
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
describe("Native object") {
|
|
94
|
+
// Event emitting requires Xcode 15.0, but we're still using Xcode 14
|
|
95
|
+
// to run these tests on GitHub Actions due to some performance issues.
|
|
96
|
+
#if swift(>=5.9)
|
|
97
|
+
it("emits events") {
|
|
98
|
+
// Create the shared object
|
|
99
|
+
let jsObject = try runtime
|
|
100
|
+
.eval("sharedObject = new expo.modules.SharedObjectModule.SharedObjectExample()")
|
|
101
|
+
.asObject()
|
|
102
|
+
|
|
103
|
+
// Add a listener that adds three arguments
|
|
104
|
+
try runtime.eval([
|
|
105
|
+
"result = null",
|
|
106
|
+
"sharedObject.addListener('test event', (number, string, record) => { result = { number, string, record } })"
|
|
107
|
+
])
|
|
108
|
+
|
|
109
|
+
// Get the native instance
|
|
110
|
+
let nativeObject = appContext.sharedObjectRegistry.toNativeObject(jsObject)
|
|
111
|
+
|
|
112
|
+
struct EventRecord: Record {
|
|
113
|
+
@Field var boolean: Bool = true
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Emit an event from the native object to JS
|
|
117
|
+
nativeObject?.emit(event: "test event", arguments: 123, "test", EventRecord())
|
|
118
|
+
|
|
119
|
+
// Check the value that is set by the listener
|
|
120
|
+
let result = try runtime.eval("result").asObject()
|
|
121
|
+
|
|
122
|
+
expect(try result.getProperty("number").asInt()) == 123
|
|
123
|
+
expect(try result.getProperty("string").asString()) == "test"
|
|
124
|
+
expect(try result.getProperty("record").asObject().getProperty("boolean").asBool()) == true
|
|
125
|
+
}
|
|
126
|
+
#endif // swift(>=5.9)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private class SharedObjectModule: Module {
|
|
132
|
+
public func definition() -> ModuleDefinition {
|
|
133
|
+
Class(SharedObjectExample.self) {
|
|
134
|
+
Constructor {
|
|
135
|
+
return SharedObjectExample()
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private final class SharedObjectExample: SharedObject {}
|
|
@@ -33,7 +33,7 @@ final class ViewDefinitionSpec: ExpoSpec {
|
|
|
33
33
|
let textView = UITextView()
|
|
34
34
|
let content = "hello"
|
|
35
35
|
let definition = View(UITextView.self) {
|
|
36
|
-
// The type of `view` is inferred and equals to the type passed to `View
|
|
36
|
+
// The type of `view` is inferred and equals to the type passed to `View`.
|
|
37
37
|
Prop("content") { (view, _: String) in
|
|
38
38
|
expect(view).to(beAKindOf(UITextView.self))
|
|
39
39
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-modules-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.1",
|
|
4
4
|
"description": "The core of Expo Modules architecture",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"@testing-library/react-hooks": "^7.0.1",
|
|
45
45
|
"expo-module-scripts": "^3.0.0"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "0897aeadb926491a457bcd67d83360956994ee82"
|
|
48
48
|
}
|
package/src/EventEmitter.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import invariant from 'invariant';
|
|
2
|
-
import { NativeEventEmitter,
|
|
2
|
+
import { NativeEventEmitter, Platform } from 'react-native';
|
|
3
3
|
|
|
4
4
|
const nativeEmitterSubscriptionKey = '@@nativeEmitterSubscription@@';
|
|
5
5
|
|
|
@@ -7,8 +7,11 @@ type NativeModule = {
|
|
|
7
7
|
__expo_module_name__?: string;
|
|
8
8
|
startObserving?: () => void;
|
|
9
9
|
stopObserving?: () => void;
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
|
|
11
|
+
// Erase these types as they would conflict with the new NativeModule type.
|
|
12
|
+
// This EventEmitter is deprecated anyway.
|
|
13
|
+
addListener?: any;
|
|
14
|
+
removeListeners?: any;
|
|
12
15
|
};
|
|
13
16
|
|
|
14
17
|
// @needsAudit
|
|
@@ -21,25 +24,19 @@ export type Subscription = {
|
|
|
21
24
|
|
|
22
25
|
export class EventEmitter {
|
|
23
26
|
_listenerCount = 0;
|
|
27
|
+
|
|
28
|
+
// @ts-expect-error
|
|
24
29
|
_nativeModule: NativeModule;
|
|
30
|
+
|
|
31
|
+
// @ts-expect-error
|
|
25
32
|
_eventEmitter: NativeEventEmitter;
|
|
26
33
|
|
|
27
34
|
constructor(nativeModule: NativeModule) {
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
nativeModule.addListener = (...args) =>
|
|
34
|
-
NativeModules.EXReactNativeEventEmitter.addProxiedListener(
|
|
35
|
-
nativeModule.__expo_module_name__,
|
|
36
|
-
...args
|
|
37
|
-
);
|
|
38
|
-
nativeModule.removeListeners = (...args) =>
|
|
39
|
-
NativeModules.EXReactNativeEventEmitter.removeProxiedListeners(
|
|
40
|
-
nativeModule.__expo_module_name__,
|
|
41
|
-
...args
|
|
42
|
-
);
|
|
35
|
+
// If the native module is a new module, just return it back as it's already an event emitter.
|
|
36
|
+
// This is for backwards compatibility until we stop using this legacy class in other packages.
|
|
37
|
+
if (nativeModule.__expo_module_name__) {
|
|
38
|
+
// @ts-expect-error
|
|
39
|
+
return nativeModule;
|
|
43
40
|
}
|
|
44
41
|
this._nativeModule = nativeModule;
|
|
45
42
|
this._eventEmitter = new NativeEventEmitter(nativeModule as any);
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// Copyright © 2024 650 Industries.
|
|
2
|
+
// NOTE: Forcing this to be a client boundary so the errors are a bit clearer. In the future we can
|
|
3
|
+
// make this a shim on the server by ignoring the globals that are missing in React Server contexts (Node.js).
|
|
4
|
+
'use client';
|
|
5
|
+
|
|
1
6
|
import { NativeModules } from 'react-native';
|
|
2
7
|
|
|
3
8
|
import { ProxyNativeModule } from './NativeModulesProxy.types';
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
// Copyright © 2024 650 Industries.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
1
5
|
import React from 'react';
|
|
2
|
-
import { findNodeHandle, NativeModules,
|
|
6
|
+
import { findNodeHandle, NativeModules, HostComponent } from 'react-native';
|
|
7
|
+
import * as NativeComponentRegistry from 'react-native/Libraries/NativeComponent/NativeComponentRegistry';
|
|
3
8
|
|
|
4
9
|
import { requireNativeModule } from './requireNativeModule';
|
|
5
10
|
|
|
@@ -17,6 +22,25 @@ import { requireNativeModule } from './requireNativeModule';
|
|
|
17
22
|
*/
|
|
18
23
|
const nativeComponentsCache = new Map<string, HostComponent<any>>();
|
|
19
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Requires a React Native component using the static view config from an Expo module.
|
|
27
|
+
*/
|
|
28
|
+
function requireNativeComponent<Props>(viewName: string): HostComponent<Props> {
|
|
29
|
+
return NativeComponentRegistry.get<Props>(viewName, () => {
|
|
30
|
+
const viewModuleName = viewName.replace('ViewManagerAdapter_', '');
|
|
31
|
+
const expoViewConfig = globalThis.expo?.getViewConfig(viewModuleName);
|
|
32
|
+
|
|
33
|
+
if (!expoViewConfig) {
|
|
34
|
+
console.warn('Unable to get the view config for %s', viewModuleName);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
uiViewClassName: viewName,
|
|
39
|
+
...expoViewConfig,
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
20
44
|
/**
|
|
21
45
|
* Requires a React Native component from cache if possible. This prevents
|
|
22
46
|
* "Tried to register two views with the same name" errors on fast refresh, but
|
package/src/PermissionsHook.ts
CHANGED
package/src/Refs.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Create a React ref object that is friendly for snapshots.
|
|
5
|
+
* It will be represented as `[React.ref]` in snapshots.
|
|
6
|
+
* @returns a React ref object.
|
|
7
|
+
*/
|
|
8
|
+
export function createSnapshotFriendlyRef<T>(): React.RefObject<T> {
|
|
9
|
+
return React.createRef<T>();
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// It is a no-op function that returns the module implementation without importing CoreModule.
|
|
2
|
+
// Actual implementation is located in `createWebModule.web.ts`.
|
|
3
|
+
export function createWebModule<ModuleType = any>(moduleImplementation: ModuleType): ModuleType {
|
|
4
|
+
return moduleImplementation;
|
|
5
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { NativeModules, Platform } from 'react-native';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Ensures that the native modules are installed in the current runtime.
|
|
5
|
+
* Otherwise, it synchronously calls a native function that installs them.
|
|
6
|
+
*/
|
|
7
|
+
export function ensureNativeModulesAreInstalled(): void {
|
|
8
|
+
if (globalThis.expo) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
if (Platform.OS === 'web') {
|
|
13
|
+
// Requiring web folder sets up the `globalThis.expo` object.
|
|
14
|
+
require('./web');
|
|
15
|
+
} else {
|
|
16
|
+
// TODO: ExpoModulesCore shouldn't be optional here,
|
|
17
|
+
// but to keep backwards compatibility let's just ignore it in SDK 50.
|
|
18
|
+
// In most cases the modules were already installed from the native side.
|
|
19
|
+
NativeModules.ExpoModulesCore?.installModules();
|
|
20
|
+
}
|
|
21
|
+
} catch (error) {
|
|
22
|
+
console.error(`Unable to install Expo modules: ${error}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { DependencyList, useRef, useMemo, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { SharedObject } from '../ts-declarations/SharedObject';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns a shared object, which is automatically cleaned up when the component is unmounted.
|
|
7
|
+
*/
|
|
8
|
+
export function useReleasingSharedObject<TSharedObject extends SharedObject>(
|
|
9
|
+
factory: () => TSharedObject,
|
|
10
|
+
dependencies: DependencyList
|
|
11
|
+
): TSharedObject {
|
|
12
|
+
const objectRef = useRef<TSharedObject | null>(null);
|
|
13
|
+
const isFastRefresh = useRef(false);
|
|
14
|
+
const previousDependencies = useRef<DependencyList>(dependencies);
|
|
15
|
+
|
|
16
|
+
if (objectRef.current == null) {
|
|
17
|
+
objectRef.current = factory();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const object = useMemo(() => {
|
|
21
|
+
let newObject = objectRef.current;
|
|
22
|
+
const dependenciesAreEqual =
|
|
23
|
+
previousDependencies.current?.length === dependencies.length &&
|
|
24
|
+
dependencies.every((value, index) => value === previousDependencies.current[index]);
|
|
25
|
+
|
|
26
|
+
// If the dependencies have changed, release the previous object and create a new one, otherwise this has been called
|
|
27
|
+
// because of a fast refresh, and we don't want to release the object.
|
|
28
|
+
if (!newObject || !dependenciesAreEqual) {
|
|
29
|
+
objectRef.current?.release();
|
|
30
|
+
newObject = factory();
|
|
31
|
+
objectRef.current = newObject;
|
|
32
|
+
previousDependencies.current = dependencies;
|
|
33
|
+
} else {
|
|
34
|
+
isFastRefresh.current = true;
|
|
35
|
+
}
|
|
36
|
+
return newObject;
|
|
37
|
+
}, dependencies);
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
isFastRefresh.current = false;
|
|
41
|
+
|
|
42
|
+
return () => {
|
|
43
|
+
// This will be called on every fast refresh and on unmount, but we only want to release the object on unmount.
|
|
44
|
+
if (!isFastRefresh.current && objectRef.current) {
|
|
45
|
+
objectRef.current.release();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
return object;
|
|
51
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { DeviceEventEmitter } from 'react-native';
|
|
2
2
|
|
|
3
3
|
import { EventEmitter, Subscription } from './EventEmitter';
|
|
4
|
+
import NativeModule from './NativeModule';
|
|
4
5
|
import NativeModulesProxy from './NativeModulesProxy';
|
|
5
6
|
import { ProxyNativeModule } from './NativeModulesProxy.types';
|
|
6
7
|
import { requireNativeViewManager } from './NativeViewManagerAdapter';
|
|
7
8
|
import Platform from './Platform';
|
|
9
|
+
import SharedObject from './SharedObject';
|
|
8
10
|
import { CodedError } from './errors/CodedError';
|
|
9
11
|
import { UnavailabilityError } from './errors/UnavailabilityError';
|
|
10
12
|
|
|
11
13
|
import './sweet/setUpErrorManager.fx';
|
|
14
|
+
import './web/index';
|
|
15
|
+
|
|
16
|
+
export type * from './ts-declarations/global';
|
|
12
17
|
|
|
13
18
|
export { default as uuid } from './uuid';
|
|
14
19
|
|
|
@@ -20,12 +25,16 @@ export {
|
|
|
20
25
|
Platform,
|
|
21
26
|
Subscription,
|
|
22
27
|
requireNativeViewManager,
|
|
28
|
+
// Globals
|
|
29
|
+
SharedObject,
|
|
30
|
+
NativeModule,
|
|
23
31
|
// Errors
|
|
24
32
|
CodedError,
|
|
25
33
|
UnavailabilityError,
|
|
26
34
|
};
|
|
27
35
|
|
|
28
36
|
export * from './requireNativeModule';
|
|
37
|
+
export * from './createWebModule';
|
|
29
38
|
export * from './TypedArrays.types';
|
|
30
39
|
|
|
31
40
|
/**
|
|
@@ -35,3 +44,7 @@ export const SyntheticPlatformEmitter = DeviceEventEmitter;
|
|
|
35
44
|
|
|
36
45
|
export * from './PermissionsInterface';
|
|
37
46
|
export * from './PermissionsHook';
|
|
47
|
+
|
|
48
|
+
export * from './Refs';
|
|
49
|
+
|
|
50
|
+
export * from './hooks/useReleasingSharedObject';
|
|
@@ -1,31 +1,5 @@
|
|
|
1
|
-
import { NativeModules } from 'react-native';
|
|
2
|
-
|
|
3
1
|
import NativeModulesProxy from './NativeModulesProxy';
|
|
4
|
-
|
|
5
|
-
type ExpoObject = {
|
|
6
|
-
modules:
|
|
7
|
-
| undefined
|
|
8
|
-
| {
|
|
9
|
-
[key: string]: any;
|
|
10
|
-
};
|
|
11
|
-
uuidv4: () => string;
|
|
12
|
-
uuidv5: (name: string, namespace: string) => string;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
declare global {
|
|
16
|
-
// eslint-disable-next-line no-var
|
|
17
|
-
var expo: ExpoObject | undefined;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @deprecated `global.ExpoModules` is deprecated, use `global.expo.modules` instead.
|
|
21
|
-
*/
|
|
22
|
-
// eslint-disable-next-line no-var
|
|
23
|
-
var ExpoModules:
|
|
24
|
-
| undefined
|
|
25
|
-
| {
|
|
26
|
-
[key: string]: any;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
2
|
+
import { ensureNativeModulesAreInstalled } from './ensureNativeModulesAreInstalled';
|
|
29
3
|
|
|
30
4
|
/**
|
|
31
5
|
* Imports the native module registered with given name. In the first place it tries to load
|
|
@@ -57,28 +31,5 @@ export function requireOptionalNativeModule<ModuleType = any>(
|
|
|
57
31
|
): ModuleType | null {
|
|
58
32
|
ensureNativeModulesAreInstalled();
|
|
59
33
|
|
|
60
|
-
return
|
|
61
|
-
globalThis.expo?.modules?.[moduleName] ??
|
|
62
|
-
globalThis.ExpoModules?.[moduleName] ??
|
|
63
|
-
NativeModulesProxy[moduleName] ??
|
|
64
|
-
null
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Ensures that the native modules are installed in the current runtime.
|
|
70
|
-
* Otherwise, it synchronously calls a native function that installs them.
|
|
71
|
-
*/
|
|
72
|
-
function ensureNativeModulesAreInstalled(): void {
|
|
73
|
-
if (globalThis.expo) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
// TODO: ExpoModulesCore shouldn't be optional here,
|
|
78
|
-
// but to keep backwards compatibility let's just ignore it in SDK 50.
|
|
79
|
-
// In most cases the modules were already installed from the native side.
|
|
80
|
-
NativeModules.ExpoModulesCore?.installModules();
|
|
81
|
-
} catch (error) {
|
|
82
|
-
console.error(`Unable to install Expo modules: ${error}`);
|
|
83
|
-
}
|
|
34
|
+
return globalThis.expo?.modules?.[moduleName] ?? NativeModulesProxy[moduleName] ?? null;
|
|
84
35
|
}
|