1fa88aeb8STomasz Sapeta // Copyright 2022-present 650 Industries. All rights reserved.
2fa88aeb8STomasz Sapeta 
3fa88aeb8STomasz Sapeta #include "JSIUtils.h"
4fa88aeb8STomasz Sapeta 
5*e1f25825SŁukasz Kosmaty namespace expo::common {
6fa88aeb8STomasz Sapeta 
jsiArrayToPropNameIdsVector(jsi::Runtime & runtime,const jsi::Array & array)7fa88aeb8STomasz Sapeta std::vector<jsi::PropNameID> jsiArrayToPropNameIdsVector(jsi::Runtime &runtime, const jsi::Array &array) {
8fa88aeb8STomasz Sapeta   size_t size = array.size(runtime);
9fa88aeb8STomasz Sapeta   std::vector<jsi::PropNameID> vector;
10fa88aeb8STomasz Sapeta 
11fa88aeb8STomasz Sapeta   vector.reserve(size);
12fa88aeb8STomasz Sapeta 
13fa88aeb8STomasz Sapeta   for (size_t i = 0; i < size; i++) {
14fa88aeb8STomasz Sapeta     jsi::String name = array.getValueAtIndex(runtime, i).getString(runtime);
15fa88aeb8STomasz Sapeta     vector.push_back(jsi::PropNameID::forString(runtime, name));
16fa88aeb8STomasz Sapeta   }
17fa88aeb8STomasz Sapeta   return vector;
18fa88aeb8STomasz Sapeta }
19fa88aeb8STomasz Sapeta 
definePropertyOnJSIObject(jsi::Runtime & runtime,jsi::Object * jsthis,const char * name,jsi::Object descriptor)20*e1f25825SŁukasz Kosmaty void definePropertyOnJSIObject(
21*e1f25825SŁukasz Kosmaty   jsi::Runtime &runtime,
22*e1f25825SŁukasz Kosmaty   jsi::Object *jsthis,
23*e1f25825SŁukasz Kosmaty   const char *name,
24*e1f25825SŁukasz Kosmaty   jsi::Object descriptor
25*e1f25825SŁukasz Kosmaty ) {
26*e1f25825SŁukasz Kosmaty   jsi::Object global = runtime.global();
27*e1f25825SŁukasz Kosmaty   jsi::Object objectClass = global.getPropertyAsObject(runtime, "Object");
28*e1f25825SŁukasz Kosmaty   jsi::Function definePropertyFunction = objectClass.getPropertyAsFunction(
29*e1f25825SŁukasz Kosmaty     runtime,
30*e1f25825SŁukasz Kosmaty     "defineProperty"
31*e1f25825SŁukasz Kosmaty   );
32*e1f25825SŁukasz Kosmaty 
33*e1f25825SŁukasz Kosmaty   // This call is basically the same as `Object.defineProperty(object, name, descriptor)` in JS
34*e1f25825SŁukasz Kosmaty   definePropertyFunction.callWithThis(runtime, objectClass, {
35*e1f25825SŁukasz Kosmaty     jsi::Value(runtime, *jsthis),
36*e1f25825SŁukasz Kosmaty     jsi::String::createFromUtf8(runtime, name),
37*e1f25825SŁukasz Kosmaty     std::move(descriptor),
38*e1f25825SŁukasz Kosmaty   });
39*e1f25825SŁukasz Kosmaty }
40*e1f25825SŁukasz Kosmaty 
41*e1f25825SŁukasz Kosmaty } // namespace expo::common
42