expo-modules-core 1.0.0 → 1.0.2
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 +17 -0
- package/android/build.gradle +7 -3
- package/android/src/main/java/expo/modules/kotlin/exception/CodedException.kt +20 -2
- package/android/src/main/java/expo/modules/kotlin/objects/ObjectDefinitionBuilder.kt +18 -0
- package/android/src/main/java/expo/modules/kotlin/types/EnumTypeConverter.kt +3 -3
- package/build/EventEmitter.d.ts.map +1 -1
- package/build/EventEmitter.js +0 -17
- package/build/EventEmitter.js.map +1 -1
- package/ios/Swift/JavaScriptUtils.swift +8 -1
- package/package.json +2 -2
- package/src/EventEmitter.ts +0 -18
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,23 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 1.0.2 — 2022-11-08
|
|
14
|
+
|
|
15
|
+
### 💡 Others
|
|
16
|
+
|
|
17
|
+
- Rephrased the message of `ArgumentCastException` to use ordinal numbers. ([#19912](https://github.com/expo/expo/pull/19912) by [@tsapeta](https://github.com/tsapeta))
|
|
18
|
+
|
|
19
|
+
## 1.0.1 - 2022-11-07
|
|
20
|
+
|
|
21
|
+
### 🐛 Bug fixes
|
|
22
|
+
|
|
23
|
+
- Added a list of the acceptable enum values to the conversion error on Android. ([#19895](https://github.com/expo/expo/pull/19895) by [@lukmccall](https://github.com/lukmccall))
|
|
24
|
+
- Fixed `new NativeEventEmitter() was called with a non-null argument without the required addListener method.` warnings on Android with JSC. ([#19920](https://github.com/expo/expo/pull/19920) by [@kudo](https://github.com/kudo))
|
|
25
|
+
|
|
26
|
+
### 💡 Others
|
|
27
|
+
|
|
28
|
+
- Exposed coroutines related packages on Android. ([#19896](https://github.com/expo/expo/pull/19896) by [@lukmccall](https://github.com/lukmccall))
|
|
29
|
+
|
|
13
30
|
## 1.0.0 — 2022-11-03
|
|
14
31
|
|
|
15
32
|
_This version does not introduce any user-facing changes._
|
package/android/build.gradle
CHANGED
|
@@ -6,7 +6,7 @@ apply plugin: 'maven-publish'
|
|
|
6
6
|
apply plugin: "de.undercouch.download"
|
|
7
7
|
|
|
8
8
|
group = 'host.exp.exponent'
|
|
9
|
-
version = '1.0.
|
|
9
|
+
version = '1.0.2'
|
|
10
10
|
|
|
11
11
|
buildscript {
|
|
12
12
|
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
|
@@ -191,7 +191,7 @@ android {
|
|
|
191
191
|
targetSdkVersion safeExtGet("targetSdkVersion", 31)
|
|
192
192
|
consumerProguardFiles 'proguard-rules.pro'
|
|
193
193
|
versionCode 1
|
|
194
|
-
versionName "1.0.
|
|
194
|
+
versionName "1.0.2"
|
|
195
195
|
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled.toString()
|
|
196
196
|
|
|
197
197
|
testInstrumentationRunner "expo.modules.TestRunner"
|
|
@@ -289,7 +289,11 @@ dependencies {
|
|
|
289
289
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}"
|
|
290
290
|
implementation "org.jetbrains.kotlin:kotlin-reflect:${getKotlinVersion()}"
|
|
291
291
|
implementation 'androidx.annotation:annotation:1.3.0'
|
|
292
|
-
|
|
292
|
+
|
|
293
|
+
api "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0"
|
|
294
|
+
api "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0"
|
|
295
|
+
api "androidx.core:core-ktx:1.6.0"
|
|
296
|
+
|
|
293
297
|
/**
|
|
294
298
|
* ReactActivity (the base activity for every React Native application) is subclassing AndroidX classes.
|
|
295
299
|
* Unfortunately until https://github.com/facebook/react-native/pull/33072 is released React Native uses "androidx.appcompat:appcompat:1.0.2".
|
|
@@ -71,6 +71,14 @@ internal class IncompatibleArgTypeException(
|
|
|
71
71
|
cause = cause
|
|
72
72
|
)
|
|
73
73
|
|
|
74
|
+
internal class EnumNoSuchValueException(
|
|
75
|
+
enumType: KClass<Enum<*>>,
|
|
76
|
+
enumConstants: Array<out Enum<*>>,
|
|
77
|
+
value: Any?
|
|
78
|
+
) : CodedException(
|
|
79
|
+
message = "'$value' is not present in ${enumType.simpleName} enum, it must be one of: ${enumConstants.joinToString(separator = ", ") { "'${it.name}'" }}"
|
|
80
|
+
)
|
|
81
|
+
|
|
74
82
|
internal class MissingTypeConverter(
|
|
75
83
|
forType: KType
|
|
76
84
|
) : CodedException(
|
|
@@ -137,9 +145,19 @@ internal class ArgumentCastException(
|
|
|
137
145
|
providedType: ReadableType,
|
|
138
146
|
cause: CodedException,
|
|
139
147
|
) : DecoratedException(
|
|
140
|
-
message = "
|
|
148
|
+
message = "The ${formatOrdinalNumber(argIndex + 1)} argument cannot be cast to type $argDesiredType (received $providedType)",
|
|
141
149
|
cause,
|
|
142
|
-
)
|
|
150
|
+
) {
|
|
151
|
+
companion object {
|
|
152
|
+
fun formatOrdinalNumber(number: Int) = "$number" + when {
|
|
153
|
+
(number % 100 in 11..13) -> "th"
|
|
154
|
+
(number % 10) == 1 -> "st"
|
|
155
|
+
(number % 10) == 2 -> "nd"
|
|
156
|
+
(number % 10) == 3 -> "rd"
|
|
157
|
+
else -> "th"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
143
161
|
|
|
144
162
|
internal class FieldCastException(
|
|
145
163
|
fieldName: String,
|
|
@@ -43,6 +43,18 @@ open class ObjectDefinitionBuilder {
|
|
|
43
43
|
internal var properties = mutableMapOf<String, PropertyComponentBuilder>()
|
|
44
44
|
|
|
45
45
|
fun buildObject(): ObjectDefinitionData {
|
|
46
|
+
// Register stub functions to bypass react-native `NativeEventEmitter` warnings
|
|
47
|
+
// WARN `new NativeEventEmitter()` was called with a non-null argument without the required `addListener` method.
|
|
48
|
+
// WARN `new NativeEventEmitter()` was called with a non-null argument without the required `removeListeners` method.
|
|
49
|
+
eventsDefinition?.run {
|
|
50
|
+
if (!containsFunction("addListener")) {
|
|
51
|
+
Function("addListener") { _: String -> { } }
|
|
52
|
+
}
|
|
53
|
+
if (!containsFunction("removeListeners")) {
|
|
54
|
+
Function("removeListeners") { _: Int -> { } }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
46
58
|
return ObjectDefinitionData(
|
|
47
59
|
constantsProvider,
|
|
48
60
|
syncFunctions,
|
|
@@ -52,6 +64,12 @@ open class ObjectDefinitionBuilder {
|
|
|
52
64
|
)
|
|
53
65
|
}
|
|
54
66
|
|
|
67
|
+
private fun containsFunction(functionName: String): Boolean {
|
|
68
|
+
return syncFunctions.containsKey(functionName) ||
|
|
69
|
+
asyncFunctions.containsKey(functionName) ||
|
|
70
|
+
functionBuilders.containsKey(functionName)
|
|
71
|
+
}
|
|
72
|
+
|
|
55
73
|
/**
|
|
56
74
|
* Definition function setting the module's constants to export.
|
|
57
75
|
*/
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package expo.modules.kotlin.types
|
|
2
2
|
|
|
3
3
|
import com.facebook.react.bridge.Dynamic
|
|
4
|
+
import expo.modules.kotlin.exception.EnumNoSuchValueException
|
|
4
5
|
import expo.modules.kotlin.exception.IncompatibleArgTypeException
|
|
5
6
|
import expo.modules.kotlin.jni.ExpectedType
|
|
6
7
|
import expo.modules.kotlin.logger
|
|
@@ -73,9 +74,8 @@ class EnumTypeConverter(
|
|
|
73
74
|
stringRepresentation: String,
|
|
74
75
|
enumConstants: Array<out Enum<*>>
|
|
75
76
|
): Enum<*> {
|
|
76
|
-
return
|
|
77
|
-
|
|
78
|
-
) { "Couldn't convert '$stringRepresentation' to ${enumClass.simpleName}" }
|
|
77
|
+
return enumConstants.find { it.name == stringRepresentation }
|
|
78
|
+
?: throw EnumNoSuchValueException(enumClass, enumConstants, stringRepresentation)
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAA2B,MAAM,cAAc,CAAC;AAI3E,aAAK,YAAY,GAAG;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAGF,oBAAY,YAAY,GAAG;IACzB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,qBAAa,YAAY;IACvB,cAAc,SAAK;IACnB,aAAa,EAAE,YAAY,CAAC;IAC5B,aAAa,EAAE,kBAAkB,CAAC;gBAEtB,YAAY,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAA2B,MAAM,cAAc,CAAC;AAI3E,aAAK,YAAY,GAAG;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAGF,oBAAY,YAAY,GAAG;IACzB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,qBAAa,YAAY;IACvB,cAAc,SAAK;IACnB,aAAa,EAAE,YAAY,CAAC;IAC5B,aAAa,EAAE,kBAAkB,CAAC;gBAEtB,YAAY,EAAE,YAAY;IAqBtC,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,YAAY;IAgB7E,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAmB3C,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IA0BpD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI;CAGhD"}
|
package/build/EventEmitter.js
CHANGED
|
@@ -14,23 +14,6 @@ export class EventEmitter {
|
|
|
14
14
|
nativeModule.addListener = (...args) => NativeModules.EXReactNativeEventEmitter.addProxiedListener(nativeModule.__expo_module_name__, ...args);
|
|
15
15
|
nativeModule.removeListeners = (...args) => NativeModules.EXReactNativeEventEmitter.removeProxiedListeners(nativeModule.__expo_module_name__, ...args);
|
|
16
16
|
}
|
|
17
|
-
// Fix the `NativeEventEmitter` warnings on Android.
|
|
18
|
-
// WARN `new NativeEventEmitter()` was called with a non-null argument without the required `addListener` method.
|
|
19
|
-
// WARN `new NativeEventEmitter()` was called with a non-null argument without the required `removeListeners` method.
|
|
20
|
-
if (Platform.OS === 'android') {
|
|
21
|
-
Object.defineProperties(nativeModule, {
|
|
22
|
-
addListener: {
|
|
23
|
-
value: () => { },
|
|
24
|
-
writable: true,
|
|
25
|
-
enumerable: true,
|
|
26
|
-
},
|
|
27
|
-
removeListeners: {
|
|
28
|
-
value: () => { },
|
|
29
|
-
writable: true,
|
|
30
|
-
enumerable: true,
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
17
|
this._nativeModule = nativeModule;
|
|
35
18
|
this._eventEmitter = new NativeEventEmitter(nativeModule);
|
|
36
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE3E,MAAM,4BAA4B,GAAG,+BAA+B,CAAC;AAkBrE,MAAM,OAAO,YAAY;IACvB,cAAc,GAAG,CAAC,CAAC;IACnB,aAAa,CAAe;IAC5B,aAAa,CAAqB;IAElC,YAAY,YAA0B;QACpC,6FAA6F;QAC7F,4FAA4F;QAC5F,uFAAuF;QACvF,gDAAgD;QAChD,IAAI,YAAY,CAAC,oBAAoB,IAAI,aAAa,CAAC,yBAAyB,EAAE;YAChF,YAAY,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CACrC,aAAa,CAAC,yBAAyB,CAAC,kBAAkB,CACxD,YAAY,CAAC,oBAAoB,EACjC,GAAG,IAAI,CACR,CAAC;YACJ,YAAY,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CACzC,aAAa,CAAC,yBAAyB,CAAC,sBAAsB,CAC5D,YAAY,CAAC,oBAAoB,EACjC,GAAG,IAAI,CACR,CAAC;SACL;QACD,
|
|
1
|
+
{"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":"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","sourcesContent":["import invariant from 'invariant';\nimport { NativeEventEmitter, NativeModules, Platform } from 'react-native';\n\nconst nativeEmitterSubscriptionKey = '@@nativeEmitterSubscription@@';\n\ntype NativeModule = {\n __expo_module_name__?: string;\n startObserving?: () => void;\n stopObserving?: () => void;\n addListener: (eventName: string) => void;\n removeListeners: (count: number) => void;\n};\n\n// @needsAudit\nexport type Subscription = {\n /**\n * A method to unsubscribe the listener.\n */\n remove: () => void;\n};\n\nexport class EventEmitter {\n _listenerCount = 0;\n _nativeModule: NativeModule;\n _eventEmitter: NativeEventEmitter;\n\n constructor(nativeModule: NativeModule) {\n // Expo modules installed through the JSI don't have `addListener` and `removeListeners` set,\n // so if someone wants to use them with `EventEmitter`, make sure to provide these functions\n // as they are required by `NativeEventEmitter`. This is only temporary — in the future\n // JSI modules will have event emitter built in.\n if (nativeModule.__expo_module_name__ && NativeModules.EXReactNativeEventEmitter) {\n nativeModule.addListener = (...args) =>\n NativeModules.EXReactNativeEventEmitter.addProxiedListener(\n nativeModule.__expo_module_name__,\n ...args\n );\n nativeModule.removeListeners = (...args) =>\n NativeModules.EXReactNativeEventEmitter.removeProxiedListeners(\n nativeModule.__expo_module_name__,\n ...args\n );\n }\n this._nativeModule = nativeModule;\n this._eventEmitter = new NativeEventEmitter(nativeModule as any);\n }\n\n addListener<T>(eventName: string, listener: (event: T) => void): Subscription {\n if (!this._listenerCount && Platform.OS !== 'ios' && this._nativeModule.startObserving) {\n this._nativeModule.startObserving();\n }\n\n this._listenerCount++;\n const nativeEmitterSubscription = this._eventEmitter.addListener(eventName, listener);\n const subscription = {\n [nativeEmitterSubscriptionKey]: nativeEmitterSubscription,\n remove: () => {\n this.removeSubscription(subscription);\n },\n };\n return subscription;\n }\n\n removeAllListeners(eventName: string): void {\n // @ts-ignore: the EventEmitter interface has been changed in react-native@0.64.0\n const removedListenerCount = this._eventEmitter.listenerCount\n ? // @ts-ignore: this is available since 0.64\n this._eventEmitter.listenerCount(eventName)\n : // @ts-ignore: this is available in older versions\n this._eventEmitter.listeners(eventName).length;\n this._eventEmitter.removeAllListeners(eventName);\n this._listenerCount -= removedListenerCount;\n invariant(\n this._listenerCount >= 0,\n `EventEmitter must have a non-negative number of listeners`\n );\n\n if (!this._listenerCount && Platform.OS !== 'ios' && this._nativeModule.stopObserving) {\n this._nativeModule.stopObserving();\n }\n }\n\n removeSubscription(subscription: Subscription): void {\n const nativeEmitterSubscription = subscription[nativeEmitterSubscriptionKey];\n if (!nativeEmitterSubscription) {\n return;\n }\n\n if ('remove' in nativeEmitterSubscription) {\n // `react-native-web@0.17.1` doesn't support `removeSubscription`\n nativeEmitterSubscription.remove();\n } else if ('removeSubscription' in this._eventEmitter) {\n this._eventEmitter.removeSubscription(nativeEmitterSubscription!);\n }\n this._listenerCount--;\n\n // Ensure that the emitter's internal state remains correct even if `removeSubscription` is\n // called again with the same subscription\n delete subscription[nativeEmitterSubscriptionKey];\n\n // Release closed-over references to the emitter\n subscription.remove = () => {};\n\n if (!this._listenerCount && Platform.OS !== 'ios' && this._nativeModule.stopObserving) {\n this._nativeModule.stopObserving();\n }\n }\n\n emit(eventName: string, ...params: any[]): void {\n this._eventEmitter.emit(eventName, ...params);\n }\n}\n"]}
|
|
@@ -63,7 +63,14 @@ internal class InvalidArgsNumberException: GenericException<(received: Int, expe
|
|
|
63
63
|
|
|
64
64
|
internal class ArgumentCastException: GenericException<(index: Int, type: AnyDynamicType)> {
|
|
65
65
|
override var reason: String {
|
|
66
|
-
"
|
|
66
|
+
"The \(formatOrdinalNumber(param.index + 1)) argument cannot be cast to type \(param.type.description)"
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
func formatOrdinalNumber(_ number: Int) -> String {
|
|
70
|
+
let formatter = NumberFormatter()
|
|
71
|
+
formatter.numberStyle = .ordinal
|
|
72
|
+
formatter.locale = Locale(identifier: "en_US")
|
|
73
|
+
return formatter.string(from: NSNumber(value: number)) ?? ""
|
|
67
74
|
}
|
|
68
75
|
}
|
|
69
76
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-modules-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "The core of Expo Modules architecture",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"@testing-library/react-hooks": "^7.0.1",
|
|
43
43
|
"expo-module-scripts": "^3.0.0"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "4cfefb886fd394c376290f24dabf987cdd6e6ca0"
|
|
46
46
|
}
|
package/src/EventEmitter.ts
CHANGED
|
@@ -41,24 +41,6 @@ export class EventEmitter {
|
|
|
41
41
|
...args
|
|
42
42
|
);
|
|
43
43
|
}
|
|
44
|
-
// Fix the `NativeEventEmitter` warnings on Android.
|
|
45
|
-
// WARN `new NativeEventEmitter()` was called with a non-null argument without the required `addListener` method.
|
|
46
|
-
// WARN `new NativeEventEmitter()` was called with a non-null argument without the required `removeListeners` method.
|
|
47
|
-
if (Platform.OS === 'android') {
|
|
48
|
-
Object.defineProperties(nativeModule, {
|
|
49
|
-
addListener: {
|
|
50
|
-
value: () => {},
|
|
51
|
-
writable: true,
|
|
52
|
-
enumerable: true,
|
|
53
|
-
},
|
|
54
|
-
removeListeners: {
|
|
55
|
-
value: () => {},
|
|
56
|
-
writable: true,
|
|
57
|
-
enumerable: true,
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
44
|
this._nativeModule = nativeModule;
|
|
63
45
|
this._eventEmitter = new NativeEventEmitter(nativeModule as any);
|
|
64
46
|
}
|