18#include <QtCore/private/qohoslogger_p.h>
21#include <initializer_list>
36template<
typename... ExtraArgs>
40 template<
typename Func>
41 ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t<std::is_void<std::invoke_result_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::invoke_result_t<Func, ExtraArgs...>>::value,
int *> =
nullptr);
49 template<
typename Func>
55 std::function<Napi::Value(
const Napi::CallbackInfo &, ExtraArgs...)> m_callbackFunc;
96 template<
typename T, std::enable_if_t<!std::is_same<std::decay_t<T>, ValueWrapper>::value,
int> = 0>
102 std::function<Napi::Value(napi_env)> m_valueFactory;
110 static Array New(napi_env env,
std::size_t length = 0);
112 Array(
const Napi::Array &other);
125 Object(
const Napi::Object &other);
128 template<
typename T =
Value>
129 T
get(
const std::string &expr)
const;
131 template<
typename T =
Value>
132 T
get(
const Napi::Name &name)
const;
134 template<
typename T =
Value>
135 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
143 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
145 template<
typename Result =
Value>
147 Result call(
const std::string &
methodName,
const std::vector<ValueWrapper> &args = {})
const;
156template<
typename Context>
165 Promise(
const Napi::Promise &other);
176 template<
typename Context>
180template<
typename Context>
193 std::shared_ptr<Context> m_context;
196template<
typename T =
void>
228 Reference(Napi::Reference<Object> &&other);
232 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
238 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
242 Result call(
const std::string &
methodName,
const std::vector<ValueWrapper> &args = {})
const;
258 template<
typename T =
Value>
273 template<
typename... Args>
276 template<
typename Arg>
282 const Napi::CallbackInfo &m_cbInfo;
292template<
typename Element>
297template<
typename T,
typename ValueDescriptionSupplier>
298T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier);
303template<
typename OutputContainer,
typename Element,
typename TransFunc>
304OutputContainer
getArrayElements(
const Napi::Array &inputArray, TransFunc &&transFunc);
306template<
typename OutputContainer,
typename Element>
309template<
typename OutputContainer,
typename Element,
typename TransFilterFunc>
314Object makeNewInstance(
const Napi::Object &baseObj,
const std::string &typePath,
const std::vector<ValueWrapper> &args = {});
329Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues = {});
333template<
typename InputContainer,
typename TransFunc>
334Array makeArray(napi_env env, InputContainer &&inputContainer, TransFunc &&transFunc);
336template<
typename InputContainer>
339template<
typename Result =
Napi::
Value,
typename F>
409 static constexpr const char *
typeName =
"ArrayBuffer";
416 static constexpr const char *
typeName =
"TypedArray";
435 static constexpr const char *
typeName =
"Function";
454 static constexpr const char *
typeName =
"DataView";
468 static constexpr const char *
typeName =
"External";
475 static constexpr const char *
typeName =
"TypedArray";
487 return [callbackFunc = std::move(CallbackFuncWrapper(std::forward<T>(inputValue)).callbackFunc())](napi_env env) {
488 return Napi::Function::New(env, callbackFunc);
495 return [inputValue =
std::forward<T>(inputValue)](napi_env env) {
496 return Napi::Value::From(env, inputValue);
502 qOhosPrintfError(
"QNapi: exception: %s", msg.c_str());
503 return Napi::Error::New(env, msg);
522 using namespace std::string_literals;
524 if (value.IsArray()) {
525 auto arrayElemTypeString = getArrayElementValueTypeString(value.As<Napi::Array>());
526 return "Array<"s + arrayElemTypeString +
">"s;
530 const std::pair<
bool (Napi::Value::*)()
const,
const char *> typesChecksAndNames[] = {
531 {&Napi::Value::IsEmpty,
"<empty>"},
532 {&Napi::Value::IsNull,
"Null"},
533 {&Napi::Value::IsUndefined,
"Undefined"},
534 {&Napi::Value::IsArray,
"Array"},
535 {&Napi::Value::IsArrayBuffer,
"ArrayBuffer"},
536 {&Napi::Value::IsBuffer,
"Buffer"},
537 {&Napi::Value::IsTypedArray,
"TypedArray"},
538 {&Napi::Value::IsDataView,
"DataView"},
539 {&Napi::Value::IsFunction,
"Function"},
540 {&Napi::Value::IsPromise,
"Promise"},
541 {&Napi::Value::IsBigInt,
"BigInt"},
542 {&Napi::Value::IsBoolean,
"Boolean"},
543 {&Napi::Value::IsDate,
"Date"},
544 {&Napi::Value::IsExternal,
"External"},
545 {&Napi::Value::IsNumber,
"Number"},
546 {&Napi::Value::IsObject,
"Object"},
547 {&Napi::Value::IsString,
"String"},
548 {&Napi::Value::IsSymbol,
"Symbol"},
551 const char *foundTypeName =
nullptr;
552 for (
const auto &typeCheckEntry : typesChecksAndNames) {
553 if ((value.*(typeCheckEntry.first))()) {
554 foundTypeName = typeCheckEntry.second;
559 return foundTypeName !=
nullptr ? foundTypeName :
"?";
564 constexpr std::size_t maxArrayElementsForTypeCheck = 10;
566 std::size_t arrayLength = arrayValue.Length();
567 auto checkRangeSize =
std::min(arrayLength, maxArrayElementsForTypeCheck);
569 std::string commonElemTypeString;
570 for (
std::size_t i = 0; i < checkRangeSize; ++i) {
571 auto elemTypeString = getValueTypeStringImpl(arrayValue.Get(i));
572 if (commonElemTypeString.empty()) {
573 commonElemTypeString = elemTypeString;
574 }
else if (commonElemTypeString != elemTypeString) {
575 commonElemTypeString =
"";
580 return !commonElemTypeString.empty()
581 ? checkRangeSize == arrayLength
582 ? commonElemTypeString
583 : commonElemTypeString +
"?"
587template<
typename T,
typename ValueDescriptionSupplier>
589 const Napi::Value &value, ValueDescriptionSupplier &&)
594template<
typename T,
typename ValueDescriptionSupplier>
596 const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
598 using namespace std::string_literals;
600 if (!valueTypeMatchesImpl<T>(value)) {
602 auto valueTypeStr = getValueTypeStringImpl(value);
603 std::string valueDesc = valueDescSupplier();
605 "wrong type (expected '"s + expectedTypeName +
"', got '"s + valueTypeStr +
"') of Napi value"s;
606 throw makeLoggedExceptionImpl(
607 value.Env(), valueDesc.empty() ? baseErrorMsg : baseErrorMsg +
": "s + valueDesc);
610 return T(value.Env(), value);
613template<
typename Result,
typename F>
616 Napi::EscapableHandleScope scope(env);
617 Result result =
std::forward<F>(func)();
618 return checkedCastImpl<Result>(
619 scope.Escape(result),
621 return "value escaping from HandleScope";
626 napi_env env,
const std::string &callArgsSubExpr,
const std::vector<napi_value> &exprArgs)
628 using namespace std::string_literals;
630 if (callArgsSubExpr.empty()) {
632 }
else if (callArgsSubExpr ==
"*") {
635 throw makeLoggedException(
636 env,
"illegal call arguments in expression: '"s + callArgsSubExpr +
"'"s);
642 Napi::Object obj,
const std::string &expr,
const std::vector<napi_value> &exprArgs = {})
645 using namespace std::string_literals;
647 static const std::string newCallTag =
"<new>";
649 std::pair<Napi::Object, Napi::Value> result;
651 auto lastDotPos = expr.rfind(
'.');
653 if (!expr.empty() && expr.back() ==
')') {
654 auto openingBracketPos = expr.rfind(
'(');
655 if (openingBracketPos == std::string::npos)
656 throw makeLoggedExceptionImpl(obj.Env(),
"missing opening bracket in '"s + expr +
"'"s);
657 bool newInstanceCall =
658 openingBracketPos > newCallTag.size()
659 && expr.compare(openingBracketPos - newCallTag.size(), newCallTag.size(), newCallTag) == 0;
660 auto subFuncArgsExpr = expr.substr(
661 openingBracketPos + 1, expr.size() - 1 - (openingBracketPos + 1));
662 auto subFuncArgs = expandEvalCallArgs(obj.Env(), subFuncArgsExpr, exprArgs);
663 auto subFuncExpr = expr.substr(
664 0, newInstanceCall ? openingBracketPos - newCallTag.size() : openingBracketPos);
665 auto subFuncWithCtx = evalWithContextImpl<Napi::Function>(obj, subFuncExpr, exprArgs);
666 Napi::Value funcCallResult;
670 ? subFuncWithCtx.second.New(subFuncArgs)
671 : !subFuncWithCtx.first.IsEmpty()
672 ? subFuncWithCtx.second.Call(subFuncWithCtx.first, subFuncArgs)
673 : subFuncWithCtx.second.Call(subFuncArgs);
674 }
catch (
const Napi::Error &error) {
675 auto message =
"QNapi: got exception from call '"s + expr +
"': "s + error.what();
676 qOhosPrintfError(
"%s", message.c_str());
680 result = std::make_pair(Napi::Object(), funcCallResult);
681 }
else if (lastDotPos != std::string::npos) {
682 auto subObjExpr = expr.substr(0, lastDotPos);
683 auto propName = expr.substr(lastDotPos + 1);
685 auto subObj = evalWithContextImpl<Napi::Object>(obj, subObjExpr, exprArgs).second;
686 if (!subObj.Has(propName)) {
687 throw makeLoggedExceptionImpl(
688 obj.Env(),
"object '"s + subObjExpr +
"' has no property named '"s + propName +
"'"s);
691 result = std::make_pair(subObj, subObj.Get(propName));
693 if (!obj.Has(expr)) {
694 throw makeLoggedExceptionImpl(
695 obj.Env(),
"object has no property named '"s + expr +
"'"s);
698 result = std::make_pair(obj, obj.Get(expr));
701 return std::make_pair(result.first, checkedCastImpl<T>(result.second, [&]() {
return expr; }));
705 const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
707 using namespace std::string_literals;
708 return runEscapingHandleScopeImpl<Napi::Value>(
711 auto funcWithCtx = evalWithContextImpl<Napi::Function>(obj, methodName);
712 Napi::Value funcResult;
714 funcResult = funcWithCtx.second.Call(funcWithCtx.first, args);
715 }
catch (
const Napi::Error &error) {
716 auto message =
"QNapi: got exception from method call '"s + methodName +
"': "s + error.what();
717 qOhosPrintfError(
"%s", message.c_str());
725template<
typename Result>
726Result
callMethodImpl(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
728 using namespace std::string_literals;
730 return checkedCastImpl<Result>(
731 callMethodWithValueResultImpl(obj, methodName, args),
733 return "result of '"s + methodName +
"' method call"s;
737template<
typename Result =
Value>
738Result
callMethod(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<ValueWrapper> &args)
740 return runEscapingHandleScopeImpl<Result>(
743 return callMethodImpl<Result>(obj, methodName, unwrapValues(obj.Env(), args));
747template<
typename Arg>
748void getArgImpl(
const std::string &funcName,
const Napi::CallbackInfo &cbInfo, Arg &arg,
std::size_t argIndex)
750 using namespace std::string_literals;
752 arg = checkedCastImpl<Arg>(
755 return "arg #"s + std::to_string(argIndex) +
" of '"s + funcName +
"' func call"s;
759template<
typename... Args,
std::size_t... Is>
763 using namespace std::string_literals;
765 if (cbInfo.Length() <
sizeof...(Args)) {
766 throw makeLoggedExceptionImpl(
768 "getArgs: func '"s + funcName +
"' received less args than expected minimum: "s
769 + std::to_string(cbInfo.Length()) +
" vs "s + std::to_string(
sizeof...(Args)));
772 auto unused = {(getArgImpl(funcName, cbInfo,
std::get<Is>(args), Is), 0)..., 0};
780 using namespace std::string_literals;
782 if (optObj.IsEmpty() || !optObj.Has(propName))
785 auto propValue = optObj.Get(propName);
787 return !propValue.IsUndefined()
788 ?
QNapi::checkedCast<T>(
791 auto baseDesc =
"property '"s + propName.ToString().Utf8Value() +
"' of object"s;
792 return !objDesc.empty()
793 ? baseDesc +
": "s + objDesc
799template<
typename Container,
typename Element>
802 using Result = std::conditional_t<std::is_lvalue_reference<Container>::value, Element &, Element &&>;
803 return static_cast<Result>(element);
816 return m_valueFactory(env);
820template<
typename Func>
829 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
833template<
typename Func>
841 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
845template<
typename Func>
853 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
857template<
typename Func>
865 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
868template<
typename... ExtraArgs>
871 return m_callbackFunc;
876 return Napi::Object::New(env);
882 ? Napi::Array::New(env, length)
883 : Napi::Array::New(env);
893 Napi::Array::operator=(other);
909 Napi::Object::operator=(other);
926 using namespace std::string_literals;
929 throw makeLoggedException(
930 Env(),
"object has no property '"s + name.ToString().Utf8Value() +
"'"s);
933 return checkedCast<T>(
936 return "property '"s + name.ToString().Utf8Value() +
"'"s;
941T
Object::
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
945 return runEscapingHandleScope<T>(
948 return evalWithContextImpl<T>(*
this, expr, unwrapValues(Env(), exprArgs)).second;
953 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
959 return eval<QNapi::Promise>(expr, exprArgs);
960 }
catch (
const Napi::Error &error) {
961 auto deferred = Napi::Promise::Deferred::New(Env());
962 deferred.Reject(error.Value());
963 return QNapi::Promise(deferred.Promise());
970 Napi::HandleScope setPropScope(Env());
971 Set(name, value.mapToValue(Env()));
976 Napi::HandleScope setPropScope(Env());
977 Set(name, value.mapToValue(Env()));
980inline void Object::
set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
982 Napi::HandleScope setPropsScope(Env());
983 for (
const auto &namedValue : namedValues)
984 Set(namedValue.first, namedValue.second.mapToValue(Env()));
987template<
typename Result>
988Result
Object::call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
994 napi_key_collection_mode keyMode, napi_key_filter keyFilter)
const
996 napi_value keys =
nullptr;
997 const napi_status status = napi_get_all_property_names(
998 Env(), *
this, keyMode,
static_cast<napi_key_filter>(keyFilter | napi_key_skip_symbols),
999 napi_key_numbers_to_strings, &keys);
1000 if (status != napi_ok)
1001 throw Napi::Error::New(Env());
1003 return getArrayElements<std::vector<std::string>, String>(Array(Env(), keys));
1018 Napi::Promise::operator=(other);
1025 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc())});
1031 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc()),
std::move(onRejectedFunc.callbackFunc())});
1037 *
this,
"catch", {
std::move(onRejectedFunc.callbackFunc())});
1043 *
this,
"finally", {
std::move(onFinallyFunc.callbackFunc())});
1050 return onThen(
std::move(onFulfilledFunc),
std::move(onRejectedFunc)).onFinally(
std::move(onFinallyFunc));
1053template<
typename Context>
1056 static_assert(!
std::is_lvalue_reference<Context>::value,
"withContext() supports only rvalue contexts");
1060template<
typename Context>
1063 , m_context(context)
1067template<
typename Context>
1073 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1074 return onFulfilledFunc(cbInfo, *context);
1079template<
typename Context>
1085 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1086 return onFulfilledFunc(cbInfo, *context);
1088 [context = m_context, onRejectedFunc = std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1089 return onRejectedFunc(cbInfo, *context);
1094template<
typename Context>
1100 [context = m_context, onRejectedFunc =
std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1101 return onRejectedFunc(cbInfo, *context);
1106template<
typename Context>
1112 [context = m_context, onFinallyFunc =
std::move(onFinallyFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1113 return onFinallyFunc(cbInfo, *context);
1127 Napi::Reference<T>::operator=(std::move(other));
1140 Napi::Reference<T>::operator=(std::move(other));
1147 return Napi::Persistent(value);
1153 return Napi::Reference<T>();
1163 Napi::Reference<Object>::operator=(std::move(other));
1174 Napi::Reference<Object>::operator=(std::move(other));
1181 return runEscapingHandleScope<T>(
1184 return Value().eval<T>(expr, exprArgs);
1189 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
1194 return Value().evalToPromiseOrRejectOnThrow(expr, exprArgs);
1200 Napi::HandleScope scope(Env());
1201 Value().set(name, value);
1206 Napi::HandleScope scope(Env());
1207 Value().set(namedValues);
1210template<
typename Result>
1211Result
Reference<
Object>::call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
1213 return runEscapingHandleScope<Result>(
1216 return Value().call<Result>(methodName, args);
1222 return Napi::Persistent(value);
1227 return Napi::Reference<Object>();
1240 return Napi::Reference<T>();
1250 return m_cbInfo.Env();
1255 return m_cbInfo.Length();
1258template<
typename... Args>
1262 funcName, m_cbInfo,
std::tie(args...), std::make_index_sequence<
sizeof...(Args)>());
1265template<
typename Arg>
1269 getLeadingArgs(funcName, arg);
1280 std::vector<napi_value> unwrappedValues;
1282 wrappedValues.begin(), wrappedValues.end(),
1283 std::back_inserter(unwrappedValues),
1285 return arg.mapToValue(env);
1287 return unwrappedValues;
1292 return details_qnapi_p_h::makeLoggedExceptionImpl(env, msg);
1301template<
typename Element>
1304 if (!valueTypeMatches<Napi::Array>(value))
1307 auto arrayValue = checkedCast<Napi::Array>(value);
1308 auto arrayLength = arrayValue.Length();
1310 bool allElementsMatch =
true;
1311 for (
std::size_t i = 0; i < arrayLength; ++i) {
1312 if (!valueTypeMatches<Element>(arrayValue.Get(i))) {
1313 allElementsMatch =
false;
1318 return allElementsMatch;
1323 return details_qnapi_p_h::getValueTypeStringImpl(value);
1326template<
typename T,
typename ValueDescriptionSupplier>
1327T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
1330 value,
std::forward<ValueDescriptionSupplier>(valueDescSupplier));
1339 return std::string();
1343template<
typename OutputContainer,
typename Element,
typename TransFunc>
1346 return getFilteredArrayElements<OutputContainer, Element>(
1348 [&](Element &&elem) {
1349 return std::optional(transFunc(
std::forward<Element>(elem)));
1353template<
typename OutputContainer,
typename Element>
1356 return getArrayElements<OutputContainer, Element>(
1358 [](Element &&elem) {
1359 return std::forward<Element>(elem);
1363template<
typename OutputContainer,
typename Element,
typename TransFilterFunc>
1366 using namespace std::string_literals;
1368 OutputContainer result;
1369 auto arrayLength = inputArray.Length();
1370 for (
std::size_t i = 0; i < arrayLength; ++i) {
1371 auto arg = inputArray.Get(i);
1372 if (!valueTypeMatches<Element>(arg)) {
1374 auto argTypeStr = getValueTypeString(arg);
1375 throw makeLoggedException(
1377 "wrong type of Napi array element #"s + std::to_string(i)
1378 +
", expected '"s + expectedTypeName +
"', got '"s + argTypeStr +
"'"s);
1380 if (
auto optTransformed = transFilterFunc(checkedCast<Element>(arg)))
1381 result.insert(result.end(),
std::move(*optTransformed));
1389 return type.New(unwrapValues(type.Env(), args));
1394 return makeNewInstance(Object(baseObj).get<Napi::Function>(typePath), args);
1400 return Napi::Value();
1402 if (!obj.IsObject())
1403 return obj.Env().Undefined();
1405 auto typedObj = checkedCast<Napi::Object>(obj);
1407 return typedObj.Has(propName)
1408 ? typedObj.Get(propName)
1409 : typedObj.Env().Undefined();
1415 if (objRef.IsEmpty())
1416 return Napi::Value();
1418 return details_qnapi_p_h::runEscapingHandleScopeImpl<Napi::Value>(
1421 return getPropOrUndefined(objRef.Value(), propName);
1429 return !optObj.IsEmpty()
1431 optObj, Napi::String::New(optObj.Env(), propName), objDesc)
1439 return details_qnapi_p_h::getOptionalPropOrEmptyImpl<T>(optObj, propName, objDesc);
1442inline Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
1444 auto obj = QNapi::Object::New(env);
1445 obj.set(namedValues);
1451 return makeArray<std::initializer_list<ValueWrapper> &>(env, values);
1454template<
typename InputContainer,
typename TransFunc>
1459 return runEscapingHandleScopeImpl<Napi::Array>(
1462 auto containerSize =
static_cast<std::size_t>(
1463 std::distance(std::begin(inputContainer), std::end(inputContainer)));
1464 auto array = Napi::Array::New(env, containerSize);
1466 for (
auto &element : inputContainer) {
1467 array.Set(i, ValueWrapper(transFunc(forwardContainerElement<InputContainer>(element))).mapToValue(env));
1474template<
typename InputContainer>
1478 env,
std::forward<InputContainer>(inputContainer),
1479 [](
auto &&element) ->
decltype(
auto) {
1480 return std::forward<
decltype(element)>(element);
1484template<
typename Result,
typename F>
1492 std::string jsonString;
1494 Napi::HandleScope stringifyScope(value.Env());
1495 jsonString = details_qnapi_p_h::callMethod<String>(value.Env().Global(),
"JSON.stringify", {value});
1497 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_void< std::invoke_result_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::invoke_result_t< Func, const Napi::CallbackInfo &, ExtraArgs... > >::value, short * >=nullptr)
ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t< std::is_base_of< Napi::Value, std::invoke_result_t< Func, ExtraArgs... > >::value, long * >=nullptr)
QNapi::Promise evalToPromiseOrRejectOnThrow(const std::string &expr, const std::vector< ValueWrapper > &exprArgs={}) const
std::vector< std::string > getFilteredStringKeys(napi_key_collection_mode keyMode, napi_key_filter keyFilter) 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)
Q_DECL_DEPRECATED_X("Use eval() with a methodName() or methodName(*) expression instead.") Result call(const std
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)
QNapi::Promise evalToPromiseOrRejectOnThrow(const std::string &expr, const std::vector< ValueWrapper > &exprArgs={}) const
static Reference< Object > makePersistentFrom(const Object &value)
static Reference< Object > makeEmpty()
void set(const std::string &name, const ValueWrapper &value)
Q_DECL_DEPRECATED_X("Use eval() with a methodName() or methodName(*) expression instead.") Result call(const std
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)
constexpr decltype(auto) forwardContainerElement(Element &element) noexcept
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::enable_if_t< isCallbackFuncType< T >(), std::function< Napi::Value(napi_env)> > makeValueFactory(T &&inputValue)
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 &&)
Array makeArray(napi_env env, std::initializer_list< ValueWrapper > values={})
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)
OutputContainer getFilteredArrayElements(const Napi::Array &inputArray, TransFilterFunc &&transFilterFunc)
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)
Array makeArray(napi_env env, InputContainer &&inputContainer)
Array makeArray(napi_env env, InputContainer &&inputContainer, 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={})