18#include <QtCore/private/qohoslogger_p.h>
19#include <QtCore/qstring.h>
36template<
typename... ExtraArgs>
40 template<
typename Func>
41 ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t<std::is_void<std::result_of_t<Func(
const Napi::CallbackInfo &, ExtraArgs...)>>::value,
char *> =
nullptr);
43 template<
typename Func>
46 template<
typename Func>
47 ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t<std::is_void<std::result_of_t<Func(ExtraArgs...)>>::value,
int *> =
nullptr);
49 template<
typename Func>
55 std::function<Napi::Value(
const Napi::CallbackInfo &, ExtraArgs...)> m_callbackFunc;
100 std::function<Napi::Value(napi_env)> m_valueFactory;
108 static Array New(napi_env env,
std::size_t length = 0);
110 Array(
const Napi::Array &other);
123 Object(
const Napi::Object &other);
126 template<
typename T =
Value>
127 T
get(
const std::string &expr)
const;
129 template<
typename T =
Value>
130 T
get(
const Napi::Name &name)
const;
133 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
139 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
141 template<
typename Result =
Value>
142 Result
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args = {})
const;
145template<
typename Context>
154 Promise(
const Napi::Promise &other);
165 template<
typename Context>
169template<
typename Context>
182 std::shared_ptr<Context> m_context;
185template<
typename T =
void>
217 Reference(Napi::Reference<Object> &&other);
221 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
225 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
228 Result
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args = {})
const;
244 template<
typename T =
Value>
259 template<
typename... Args>
262 template<
typename Arg>
268 const Napi::CallbackInfo &m_cbInfo;
278template<
typename Element>
283template<
typename T,
typename ValueDescriptionSupplier>
284T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier);
289template<
typename OutputContainer,
typename Element,
typename TransFunc>
290OutputContainer
getArrayElements(
const Napi::Array &inputArray, TransFunc &&transFunc);
292template<
typename OutputContainer,
typename Element>
297Object makeNewInstance(
const Napi::Object &baseObj,
const std::string &typePath,
const std::vector<ValueWrapper> &args = {});
312Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues = {});
314Array makeArray(napi_env env,
const std::vector<ValueWrapper> &values = {});
316template<
typename Result =
Napi::
Value,
typename F>
386 static constexpr const char *
typeName =
"ArrayBuffer";
393 static constexpr const char *
typeName =
"TypedArray";
412 static constexpr const char *
typeName =
"Function";
431 static constexpr const char *
typeName =
"DataView";
445 static constexpr const char *
typeName =
"External";
452 static constexpr const char *
typeName =
"TypedArray";
464 return Napi::Function::New(env, std::move(CallbackFuncWrapper(std::forward<T>(inputValue)).callbackFunc()));
470 return Napi::Value::From(env, std::forward<T>(inputValue));
475 qOhosPrintfError(
"QNapi: exception: %s", msg.c_str());
476 return Napi::Error::New(env, msg);
495 using namespace std::string_literals;
497 if (value.IsArray()) {
498 auto arrayElemTypeString = getArrayElementValueTypeString(value.As<Napi::Array>());
499 return "Array<"s + arrayElemTypeString +
">"s;
503 const std::pair<
bool (Napi::Value::*)()
const,
const char *> typesChecksAndNames[] = {
504 {&Napi::Value::IsEmpty,
"<empty>"},
505 {&Napi::Value::IsNull,
"Null"},
506 {&Napi::Value::IsUndefined,
"Undefined"},
507 {&Napi::Value::IsArray,
"Array"},
508 {&Napi::Value::IsArrayBuffer,
"ArrayBuffer"},
509 {&Napi::Value::IsTypedArray,
"TypedArray"},
510 {&Napi::Value::IsDataView,
"DataView"},
511 {&Napi::Value::IsFunction,
"Function"},
512 {&Napi::Value::IsPromise,
"Promise"},
513 {&Napi::Value::IsBigInt,
"BigInt"},
514 {&Napi::Value::IsBuffer,
"Buffer"},
515 {&Napi::Value::IsBoolean,
"Boolean"},
516 {&Napi::Value::IsDate,
"Date"},
517 {&Napi::Value::IsExternal,
"External"},
518 {&Napi::Value::IsNumber,
"Number"},
519 {&Napi::Value::IsObject,
"Object"},
520 {&Napi::Value::IsString,
"String"},
521 {&Napi::Value::IsSymbol,
"Symbol"},
524 const char *foundTypeName =
nullptr;
525 for (
const auto &typeCheckEntry : typesChecksAndNames) {
526 if ((value.*(typeCheckEntry.first))()) {
527 foundTypeName = typeCheckEntry.second;
532 return foundTypeName !=
nullptr ? foundTypeName :
"?";
537 constexpr std::size_t maxArrayElementsForTypeCheck = 10;
539 std::size_t arrayLength = arrayValue.Length();
540 auto checkRangeSize =
std::min(arrayLength, maxArrayElementsForTypeCheck);
542 std::string commonElemTypeString;
543 for (
std::size_t i = 0; i < checkRangeSize; ++i) {
544 auto elemTypeString = getValueTypeStringImpl(arrayValue.Get(i));
545 if (commonElemTypeString.empty()) {
546 commonElemTypeString = elemTypeString;
547 }
else if (commonElemTypeString != elemTypeString) {
548 commonElemTypeString =
"";
553 return !commonElemTypeString.empty()
554 ? checkRangeSize == arrayLength
555 ? commonElemTypeString
556 : commonElemTypeString +
"?"
560template<
typename T,
typename ValueDescriptionSupplier>
562 const Napi::Value &value, ValueDescriptionSupplier &&)
567template<
typename T,
typename ValueDescriptionSupplier>
569 const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
571 using namespace std::string_literals;
573 if (!valueTypeMatchesImpl<T>(value)) {
575 auto valueTypeStr = getValueTypeStringImpl(value);
576 std::string valueDesc = valueDescSupplier();
578 "wrong type (expected '"s + expectedTypeName +
"', got '"s + valueTypeStr +
"') of Napi value"s;
579 throw makeLoggedExceptionImpl(
580 value.Env(), valueDesc.empty() ? baseEerrorMsg : baseEerrorMsg +
": "s + valueDesc);
583 return T(value.Env(), value);
586template<
typename Result,
typename F>
589 Napi::EscapableHandleScope scope(env);
590 Result result =
std::forward<F>(func)();
591 return checkedCastImpl<Result>(
592 scope.Escape(result),
594 return "value escaping from HandleScope";
599 napi_env env,
const std::string &callArgsSubExpr,
const std::vector<napi_value> &exprArgs)
601 using namespace std::string_literals;
603 if (callArgsSubExpr.empty()) {
605 }
else if (callArgsSubExpr ==
"*") {
608 throw makeLoggedException(
609 env,
"illegal call arguments in expression: '"s + callArgsSubExpr +
"'"s);
615 Napi::Object obj,
const std::string &expr,
const std::vector<napi_value> &exprArgs = {})
618 using namespace std::string_literals;
620 static const std::string newCallTag =
"<new>";
622 std::pair<Napi::Object, Napi::Value> result;
624 auto lastDotPos = expr.rfind(
'.');
626 if (!expr.empty() && expr.back() ==
')') {
627 auto openingBracketPos = expr.rfind(
'(');
628 if (openingBracketPos == std::string::npos)
629 throw makeLoggedExceptionImpl(obj.Env(),
"missing opening bracket in '"s + expr +
"'"s);
630 bool newInstanceCall =
631 openingBracketPos > newCallTag.size()
632 && expr.compare(openingBracketPos - newCallTag.size(), newCallTag.size(), newCallTag) == 0;
633 auto subFuncArgsExpr = expr.substr(
634 openingBracketPos + 1, expr.size() - 1 - (openingBracketPos + 1));
635 auto subFuncArgs = expandEvalCallArgs(obj.Env(), subFuncArgsExpr, exprArgs);
636 auto subFuncExpr = expr.substr(
637 0, newInstanceCall ? openingBracketPos - newCallTag.size() : openingBracketPos);
638 auto subFuncWithCtx = evalWithContextImpl<Napi::Function>(obj, subFuncExpr, exprArgs);
639 Napi::Value funcCallResult;
643 ? subFuncWithCtx.second.New(subFuncArgs)
644 : !subFuncWithCtx.first.IsEmpty()
645 ? subFuncWithCtx.second.Call(subFuncWithCtx.first, subFuncArgs)
646 : subFuncWithCtx.second.Call(subFuncArgs);
647 }
catch (
const Napi::Error &error) {
648 auto message =
"QNapi: got exception from call '"s + expr +
"': "s + error.what();
649 qOhosPrintfError(
"%s", message.c_str());
653 result = std::make_pair(Napi::Object(), funcCallResult);
654 }
else if (lastDotPos != std::string::npos) {
655 auto subObjExpr = expr.substr(0, lastDotPos);
656 auto propName = expr.substr(lastDotPos + 1);
658 auto subObj = evalWithContextImpl<Napi::Object>(obj, subObjExpr, exprArgs).second;
659 if (!subObj.Has(propName)) {
660 throw makeLoggedExceptionImpl(
661 obj.Env(),
"object '"s + subObjExpr +
"' has no property named '"s + propName +
"'"s);
664 result = std::make_pair(subObj, subObj.Get(propName));
666 if (!obj.Has(expr)) {
667 throw makeLoggedExceptionImpl(
668 obj.Env(),
"object has no property named '"s + expr +
"'"s);
671 result = std::make_pair(obj, obj.Get(expr));
674 return std::make_pair(result.first, checkedCastImpl<T>(result.second, [&]() {
return expr; }));
678 const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
680 using namespace std::string_literals;
681 return runEscapingHandleScopeImpl<Napi::Value>(
684 auto funcWithCtx = evalWithContextImpl<Napi::Function>(obj, methodName);
685 auto funcResult = funcWithCtx.second.Call(funcWithCtx.first, args);
690template<
typename Result>
691Result
callMethodImpl(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
693 using namespace std::string_literals;
695 return checkedCastImpl<Result>(
696 callMethodWithValueResultImpl(obj, methodName, args),
698 return "result of '"s + methodName +
"' method call"s;
702template<
typename Result =
Value>
703Result
callMethod(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<ValueWrapper> &args)
705 return runEscapingHandleScopeImpl<Result>(
708 return callMethodImpl<Result>(obj, methodName, unwrapValues(obj.Env(), args));
712template<
typename Arg>
713void getArgImpl(
const std::string &funcName,
const Napi::CallbackInfo &cbInfo, Arg &arg,
std::size_t argIndex)
715 using namespace std::string_literals;
717 arg = checkedCastImpl<Arg>(
720 return "arg #"s + std::to_string(argIndex) +
" of '"s + funcName +
"' func call"s;
724template<
typename... Args,
std::size_t... Is>
728 using namespace std::string_literals;
730 if (cbInfo.Length() <
sizeof...(Args)) {
731 throw makeLoggedExceptionImpl(
733 "getArgs: func '"s + funcName +
"' received less args than expected minimum: "s
734 + std::to_string(cbInfo.Length()) +
" vs "s + std::to_string(
sizeof...(Args)));
737 auto unused = {(getArgImpl(funcName, cbInfo,
std::get<Is>(args), Is), 0)..., 0};
745 using namespace std::string_literals;
747 if (optObj.IsEmpty() || !optObj.Has(propName))
750 auto propValue = optObj.Get(propName);
752 return !propValue.IsUndefined()
753 ?
QNapi::checkedCast<T>(
756 auto baseDesc =
"property '"s + propName.ToString().Utf8Value() +
"' of object"s;
757 return !objDesc.empty()
758 ? baseDesc +
": "s + objDesc
777 return m_valueFactory(env);
781template<
typename Func>
793template<
typename Func>
801template<
typename Func>
812template<
typename Func>
822template<
typename... ExtraArgs>
825 return m_callbackFunc;
830 return Napi::Object::New(env);
836 ? Napi::Array::New(env, length)
837 : Napi::Array::New(env);
847 Napi::Array::operator=(other);
863 Napi::Object::operator=(other);
880 using namespace std::string_literals;
883 throw makeLoggedException(
884 Env(),
"object has no property '"s + name.ToString().Utf8Value() +
"'"s);
887 return checkedCast<T>(
890 return "property '"s + name.ToString().Utf8Value() +
"'"s;
895T
Object::
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
899 return runEscapingHandleScope<T>(
902 return evalWithContextImpl<T>(*
this, expr, unwrapValues(Env(), exprArgs)).second;
908 Napi::HandleScope setPropScope(Env());
909 Set(name, value.mapToValue(Env()));
914 Napi::HandleScope setPropScope(Env());
915 Set(name, value.mapToValue(Env()));
918inline void Object::
set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
920 Napi::HandleScope setPropsScope(Env());
921 for (
const auto &namedValue : namedValues)
922 Set(namedValue.first, namedValue.second.mapToValue(Env()));
925template<
typename Result>
926Result
Object::
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
943 Napi::Promise::operator=(other);
950 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc())});
956 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc()),
std::move(onRejectedFunc.callbackFunc())});
962 *
this,
"catch", {
std::move(onRejectedFunc.callbackFunc())});
968 *
this,
"finally", {
std::move(onFinallyFunc.callbackFunc())});
975 return onThen(
std::move(onFulfilledFunc),
std::move(onRejectedFunc)).onFinally(
std::move(onFinallyFunc));
978template<
typename Context>
984template<
typename Context>
991template<
typename Context>
997 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
998 return onFulfilledFunc(cbInfo, *context);
1003template<
typename Context>
1009 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1010 return onFulfilledFunc(cbInfo, *context);
1012 [context = m_context, onRejectedFunc = std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1013 return onRejectedFunc(cbInfo, *context);
1018template<
typename Context>
1024 [context = m_context, onRejectedFunc =
std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1025 return onRejectedFunc(cbInfo, *context);
1030template<
typename Context>
1036 [context = m_context, onFinallyFunc =
std::move(onFinallyFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1037 return onFinallyFunc(cbInfo, *context);
1051 Napi::Reference<T>::operator=(std::move(other));
1064 Napi::Reference<T>::operator=(std::move(other));
1071 return Napi::Persistent(value);
1077 return Napi::Reference<T>();
1087 Napi::Reference<Object>::operator=(std::move(other));
1098 Napi::Reference<Object>::operator=(std::move(other));
1105 return runEscapingHandleScope<T>(
1108 return Value().eval<T>(expr, exprArgs);
1114 Napi::HandleScope scope(Env());
1115 Value().set(name, value);
1120 Napi::HandleScope scope(Env());
1121 Value().set(namedValues);
1124template<
typename Result>
1127 return runEscapingHandleScope<Result>(
1130 return Value().call<Result>(methodName, args);
1136 return Napi::Persistent(value);
1141 return Napi::Reference<Object>();
1154 return Napi::Reference<T>();
1164 return m_cbInfo.Env();
1169 return m_cbInfo.Length();
1172template<
typename... Args>
1176 funcName, m_cbInfo,
std::tie(args...), std::make_index_sequence<
sizeof...(Args)>());
1179template<
typename Arg>
1183 getLeadingArgs(funcName, arg);
1194 std::vector<napi_value> unwrappedValues;
1196 wrappedValues.begin(), wrappedValues.end(),
1197 std::back_inserter(unwrappedValues),
1199 return arg.mapToValue(env);
1201 return unwrappedValues;
1206 return details_qnapi_p_h::makeLoggedExceptionImpl(env, msg);
1215template<
typename Element>
1218 if (!valueTypeMatches<Napi::Array>(value))
1221 auto arrayValue = checkedCast<Napi::Array>(value);
1222 auto arrayLength = arrayValue.Length();
1224 bool allElementsMatch =
true;
1225 for (
std::size_t i = 0; i < arrayLength; ++i) {
1226 if (!valueTypeMatches<Element>(arrayValue.Get(i))) {
1227 allElementsMatch =
false;
1232 return allElementsMatch;
1237 return details_qnapi_p_h::getValueTypeStringImpl(value);
1240template<
typename T,
typename ValueDescriptionSupplier>
1241T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
1244 value,
std::forward<ValueDescriptionSupplier>(valueDescSupplier));
1253 return std::string();
1257template<
typename OutputContainer,
typename Element,
typename TransFunc>
1260 using namespace std::string_literals;
1262 OutputContainer result;
1263 auto arrayLength = inputArray.Length();
1264 for (
std::size_t i = 0; i < arrayLength; ++i) {
1265 auto arg = inputArray.Get(i);
1266 if (!valueTypeMatches<Element>(arg)) {
1268 auto argTypeStr = getValueTypeString(arg);
1269 throw makeLoggedException(
1271 "wrong type of Napi array element #"s + std::to_string(i)
1272 +
", expected '"s + expectedTypeName +
"', got '"s + argTypeStr +
"'"s);
1274 result.insert(result.end(), transFunc(checkedCast<Element>(arg)));
1280template<
typename OutputContainer,
typename Element>
1283 return getArrayElements<OutputContainer, Element>(
1285 [](Element &&elem) {
1286 return std::forward<Element>(elem);
1292 return type.New(unwrapValues(type.Env(), args));
1297 return makeNewInstance(Object(baseObj).get<Napi::Function>(typePath), args);
1302 if (!obj.IsObject())
1303 return obj.Env().Undefined();
1305 auto typedObj = checkedCast<Napi::Object>(obj);
1307 return typedObj.Has(propName)
1308 ? typedObj.Get(propName)
1309 : typedObj.Env().Undefined();
1315 return details_qnapi_p_h::runEscapingHandleScopeImpl<Napi::Value>(
1318 return getPropOrUndefined(objRef.Value(), propName);
1326 return !optObj.IsEmpty()
1328 optObj, Napi::String::New(optObj.Env(), propName), objDesc)
1336 return details_qnapi_p_h::getOptionalPropOrEmptyImpl<T>(optObj, propName, objDesc);
1339inline Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
1341 auto obj = QNapi::Object::New(env);
1342 obj.set(namedValues);
1348 return details_qnapi_p_h::runEscapingHandleScopeImpl<Napi::Array>(
1351 auto array = Napi::Array::New(env, values.size());
1352 for (std::size_t i = 0; i < values.size(); ++i)
1353 array.Set(i, values[i].mapToValue(env));
1358template<
typename Result,
typename F>
1366 std::string jsonString;
1368 Napi::HandleScope stringifyScope(value.Env());
1369 jsonString = details_qnapi_p_h::callMethod<String>(value.Env().Global(),
"JSON.stringify", {value});
1371 jsonString =
"<stringify-error>";
void fill(const ValueWrapper &value)
Array & operator=(const Napi::Array &other)
static Array New(napi_env env, std::size_t length=0)
Array(const Napi::Array &other)
Arg getFirstArg(const std::string &funcName) const
CallbackInfo(const Napi::CallbackInfo &cbInfo)
void getLeadingArgs(const std::string &funcName, Args &...args) const
CallbackInfo(const CallbackInfo &other)=delete
CallbackInfo & operator=(const CallbackInfo &other)=delete
std::size_t Length() const
ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t< std::is_base_of< Napi::Value, std::result_of_t< Func(const Napi::CallbackInfo &, ExtraArgs...)> >::value, short * >=nullptr)
ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t< std::is_void< std::result_of_t< Func(const Napi::CallbackInfo &, ExtraArgs...)> >::value, char * >=nullptr)
std::function< Napi::Value(const Napi::CallbackInfo &, ExtraArgs...)> & callbackFunc()
ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t< std::is_base_of< Napi::Value, std::result_of_t< Func(ExtraArgs...)> >::value, long * >=nullptr)
Result call(const std::string &methodName, const std::vector< ValueWrapper > &args={}) const
Object(const Napi::Object &other)
T eval(const std::string &expr, const std::vector< ValueWrapper > &exprArgs={}) const
void set(const std::vector< std::pair< std::string, ValueWrapper > > &namedValues)
void set(const std::string &name, const ValueWrapper &value)
T get(const std::string &expr) const
static Object New(napi_env env)
Object & operator=(const Napi::Object &other)
PromiseWithContext onFinallyWithContext(ExtendedCallbackFuncWrapper< Context & > &&onFinallyFunc)
PromiseWithContext onCatchWithContext(ExtendedCallbackFuncWrapper< Context & > &&onRejectedFunc)
PromiseWithContext(const Promise &promise, std::shared_ptr< Context > context)
PromiseWithContext onThenWithContext(ExtendedCallbackFuncWrapper< Context & > &&onFulfilledFunc, CallbackFuncWrapper &&onRejectedFunc)
PromiseWithContext onThenWithContext(ExtendedCallbackFuncWrapper< Context & > &&onFulfilledFunc)
Promise onThen(CallbackFuncWrapper &&onFulfilledFunc)
Promise onFinally(CallbackFuncWrapper &&onFinallyFunc)
Promise(const Napi::Promise &other)
Promise & operator=(const Napi::Promise &other)
Promise onThen(CallbackFuncWrapper &&onFulfilledFunc, CallbackFuncWrapper &&onRejectedFunc)
Promise onCatch(CallbackFuncWrapper &&onRejectedFunc)
PromiseWithContext< Context > withContext(Context &&context)
Promise onThenAndFinally(CallbackFuncWrapper &&onFulfilledFunc, CallbackFuncWrapper &&onRejectedFunc, CallbackFuncWrapper &&onFinallyFunc)
static Reference< Object > makePersistentFrom(const Object &value)
static Reference< Object > makeEmpty()
void set(const std::string &name, const ValueWrapper &value)
Result call(const std::string &methodName, const std::vector< ValueWrapper > &args={}) const
Reference< Object > & operator=(Reference< Object > &&other)
void set(const std::vector< std::pair< std::string, ValueWrapper > > &namedValues)
T eval(const std::string &expr, const std::vector< ValueWrapper > &exprArgs={}) const
Reference< Object > & operator=(Napi::Reference< Object > &&other)
Reference< Object > & operator=(const Reference< Object > &other)=delete
Reference(Napi::Reference< Object > &&other)
Reference(const Reference< Object > &other)=delete
Reference(Reference< Object > &&other)
static Reference< T > makeEmpty()
static Reference< T > makePersistentFrom(const T &value)
Reference< T > & operator=(Reference< T > &&other)
Reference(Reference< T > &&other)
static Reference< T > makeEmpty()
Reference(Napi::Reference< T > &&other)
Reference(const Reference< T > &other)=delete
Reference< T > & operator=(const Reference< T > &other)=delete
Reference< T > & operator=(Napi::Reference< T > &&other)
Napi::Value mapToValue(napi_env env) const
ValueWrapper(T &&inputValue)
Result callMethod(const Napi::Object &obj, const std::string &methodName, const std::vector< ValueWrapper > &args)
std::enable_if_t< std::is_same< T, Napi::Value >::value, bool > valueTypeMatchesImpl(const Napi::Value &)
constexpr bool isCallbackFuncType()
std::enable_if_t< std::is_base_of< Napi::Value, T >::value, T > getOptionalPropOrEmptyImpl(const Napi::Object &optObj, const Napi::Name &propName, const std::string &objDesc)
std::enable_if_t< isCallbackFuncType< T >(), Napi::Value > makeValue(napi_env env, T &&inputValue)
void getLeadingArgsImpl(const std::string &funcName, const Napi::CallbackInfo &cbInfo, std::tuple< Args... > args, std::index_sequence< Is... >)
std::string getArrayElementValueTypeString(const Napi::Array &arrayValue)
std::string getValueTypeStringImpl(const Napi::Value &value)
Result runEscapingHandleScopeImpl(napi_env env, F &&func)
std::pair< Napi::Object, T > evalWithContextImpl(Napi::Object obj, const std::string &expr, const std::vector< napi_value > &exprArgs={})
void getArgImpl(const std::string &funcName, const Napi::CallbackInfo &cbInfo, Arg &arg, std::size_t argIndex)
Napi::Error makeLoggedExceptionImpl(napi_env env, const std::string &msg)
Napi::Value callMethodWithValueResultImpl(const Napi::Object &obj, const std::string &methodName, const std::vector< napi_value > &args)
Result callMethodImpl(const Napi::Object &obj, const std::string &methodName, const std::vector< napi_value > &args)
std::vector< napi_value > expandEvalCallArgs(napi_env env, const std::string &callArgsSubExpr, const std::vector< napi_value > &exprArgs)
std::enable_if_t< std::is_same< T, Napi::Value >::value, T > checkedCastImpl(const Napi::Value &value, ValueDescriptionSupplier &&)
Napi::Error makeLoggedException(napi_env env, const std::string &msg)
std::string getValueTypeString(const Napi::Value &value)
Napi::Value getPropOrUndefined(const Napi::Reference< T > &objRef, const std::string &propName)
Array makeArray(napi_env env, const std::vector< ValueWrapper > &values={})
Object makeObject(napi_env env, const std::vector< std::pair< std::string, ValueWrapper > > &namedValues={})
std::enable_if_t< std::is_base_of< Napi::Value, T >::value, T > getOptionalPropOrEmpty(const Napi::Object &optObj, const std::string &propName, const std::string &objDesc={})
T checkedCast(const Napi::Value &value)
OutputContainer getArrayElements(const Napi::Array &inputArray, TransFunc &&transFunc)
std::vector< napi_value > unwrapValues(napi_env env, const std::vector< ValueWrapper > &wrappedValues)
bool valueTypeMatches(const Napi::Value &value)
bool arrayElementTypesMatch(const Napi::Value &value)
OutputContainer getArrayElements(const Napi::Array &inputArray)
Object makeNewInstance(const Napi::Object &baseObj, const std::string &typePath, const std::vector< ValueWrapper > &args={})
T checkedCast(const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
Result runEscapingHandleScope(napi_env env, F &&func)
ExtendedCallbackFuncWrapper<> CallbackFuncWrapper
std::string toJsonString(const Napi::Value &value)
Napi::Value getPropOrUndefined(const Napi::Value &obj, const std::string &propName)
Object makeNewInstance(const Napi::Function &type, const std::vector< ValueWrapper > &args={})