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>
150template<
typename Context>
159 Promise(
const Napi::Promise &other);
170 template<
typename Context>
174template<
typename Context>
187 std::shared_ptr<Context> m_context;
190template<
typename T =
void>
222 Reference(Napi::Reference<Object> &&other);
226 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
232 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
252 template<
typename T =
Value>
267 template<
typename... Args>
270 template<
typename Arg>
276 const Napi::CallbackInfo &m_cbInfo;
286template<
typename Element>
291template<
typename T,
typename ValueDescriptionSupplier>
292T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier);
297template<
typename OutputContainer,
typename Element,
typename TransFunc>
298OutputContainer
getArrayElements(
const Napi::Array &inputArray, TransFunc &&transFunc);
300template<
typename OutputContainer,
typename Element>
303template<
typename OutputContainer,
typename Element,
typename TransFilterFunc>
308Object makeNewInstance(
const Napi::Object &baseObj,
const std::string &typePath,
const std::vector<ValueWrapper> &args = {});
323Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues = {});
327template<
typename InputContainer,
typename TransFunc>
328Array makeArray(napi_env env, InputContainer &&inputContainer, TransFunc &&transFunc);
330template<
typename InputContainer>
333template<
typename Result =
Napi::
Value,
typename F>
403 static constexpr const char *
typeName =
"ArrayBuffer";
410 static constexpr const char *
typeName =
"TypedArray";
429 static constexpr const char *
typeName =
"Function";
448 static constexpr const char *
typeName =
"DataView";
462 static constexpr const char *
typeName =
"External";
469 static constexpr const char *
typeName =
"TypedArray";
481 return [callbackFunc = std::move(CallbackFuncWrapper(std::forward<T>(inputValue)).callbackFunc())](napi_env env) {
482 return Napi::Function::New(env, callbackFunc);
489 return [inputValue =
std::forward<T>(inputValue)](napi_env env) {
490 return Napi::Value::From(env, inputValue);
496 qOhosPrintfError(
"QNapi: exception: %s", msg.c_str());
497 return Napi::Error::New(env, msg);
516 using namespace std::string_literals;
518 if (value.IsArray()) {
519 auto arrayElemTypeString = getArrayElementValueTypeString(value.As<Napi::Array>());
520 return "Array<"s + arrayElemTypeString +
">"s;
524 const std::pair<
bool (Napi::Value::*)()
const,
const char *> typesChecksAndNames[] = {
525 {&Napi::Value::IsEmpty,
"<empty>"},
526 {&Napi::Value::IsNull,
"Null"},
527 {&Napi::Value::IsUndefined,
"Undefined"},
528 {&Napi::Value::IsArray,
"Array"},
529 {&Napi::Value::IsArrayBuffer,
"ArrayBuffer"},
530 {&Napi::Value::IsBuffer,
"Buffer"},
531 {&Napi::Value::IsTypedArray,
"TypedArray"},
532 {&Napi::Value::IsDataView,
"DataView"},
533 {&Napi::Value::IsFunction,
"Function"},
534 {&Napi::Value::IsPromise,
"Promise"},
535 {&Napi::Value::IsBigInt,
"BigInt"},
536 {&Napi::Value::IsBoolean,
"Boolean"},
537 {&Napi::Value::IsDate,
"Date"},
538 {&Napi::Value::IsExternal,
"External"},
539 {&Napi::Value::IsNumber,
"Number"},
540 {&Napi::Value::IsObject,
"Object"},
541 {&Napi::Value::IsString,
"String"},
542 {&Napi::Value::IsSymbol,
"Symbol"},
545 const char *foundTypeName =
nullptr;
546 for (
const auto &typeCheckEntry : typesChecksAndNames) {
547 if ((value.*(typeCheckEntry.first))()) {
548 foundTypeName = typeCheckEntry.second;
553 return foundTypeName !=
nullptr ? foundTypeName :
"?";
558 constexpr std::size_t maxArrayElementsForTypeCheck = 10;
560 std::size_t arrayLength = arrayValue.Length();
561 auto checkRangeSize =
std::min(arrayLength, maxArrayElementsForTypeCheck);
563 std::string commonElemTypeString;
564 for (
std::size_t i = 0; i < checkRangeSize; ++i) {
565 auto elemTypeString = getValueTypeStringImpl(arrayValue.Get(i));
566 if (commonElemTypeString.empty()) {
567 commonElemTypeString = elemTypeString;
568 }
else if (commonElemTypeString != elemTypeString) {
569 commonElemTypeString =
"";
574 return !commonElemTypeString.empty()
575 ? checkRangeSize == arrayLength
576 ? commonElemTypeString
577 : commonElemTypeString +
"?"
581template<
typename T,
typename ValueDescriptionSupplier>
583 const Napi::Value &value, ValueDescriptionSupplier &&)
588template<
typename T,
typename ValueDescriptionSupplier>
590 const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
592 using namespace std::string_literals;
594 if (!valueTypeMatchesImpl<T>(value)) {
596 auto valueTypeStr = getValueTypeStringImpl(value);
597 std::string valueDesc = valueDescSupplier();
599 "wrong type (expected '"s + expectedTypeName +
"', got '"s + valueTypeStr +
"') of Napi value"s;
600 throw makeLoggedExceptionImpl(
601 value.Env(), valueDesc.empty() ? baseErrorMsg : baseErrorMsg +
": "s + valueDesc);
604 return T(value.Env(), value);
607template<
typename Result,
typename F>
610 Napi::EscapableHandleScope scope(env);
611 Result result =
std::forward<F>(func)();
612 return checkedCastImpl<Result>(
613 scope.Escape(result),
615 return "value escaping from HandleScope";
620 napi_env env,
const std::string &callArgsSubExpr,
const std::vector<napi_value> &exprArgs)
622 using namespace std::string_literals;
624 if (callArgsSubExpr.empty()) {
626 }
else if (callArgsSubExpr ==
"*") {
629 throw makeLoggedException(
630 env,
"illegal call arguments in expression: '"s + callArgsSubExpr +
"'"s);
636 Napi::Object obj,
const std::string &expr,
const std::vector<napi_value> &exprArgs = {})
639 using namespace std::string_literals;
641 static const std::string newCallTag =
"<new>";
643 std::pair<Napi::Object, Napi::Value> result;
645 auto lastDotPos = expr.rfind(
'.');
647 if (!expr.empty() && expr.back() ==
')') {
648 auto openingBracketPos = expr.rfind(
'(');
649 if (openingBracketPos == std::string::npos)
650 throw makeLoggedExceptionImpl(obj.Env(),
"missing opening bracket in '"s + expr +
"'"s);
651 bool newInstanceCall =
652 openingBracketPos > newCallTag.size()
653 && expr.compare(openingBracketPos - newCallTag.size(), newCallTag.size(), newCallTag) == 0;
654 auto subFuncArgsExpr = expr.substr(
655 openingBracketPos + 1, expr.size() - 1 - (openingBracketPos + 1));
656 auto subFuncArgs = expandEvalCallArgs(obj.Env(), subFuncArgsExpr, exprArgs);
657 auto subFuncExpr = expr.substr(
658 0, newInstanceCall ? openingBracketPos - newCallTag.size() : openingBracketPos);
659 auto subFuncWithCtx = evalWithContextImpl<Napi::Function>(obj, subFuncExpr, exprArgs);
660 Napi::Value funcCallResult;
664 ? subFuncWithCtx.second.New(subFuncArgs)
665 : !subFuncWithCtx.first.IsEmpty()
666 ? subFuncWithCtx.second.Call(subFuncWithCtx.first, subFuncArgs)
667 : subFuncWithCtx.second.Call(subFuncArgs);
668 }
catch (
const Napi::Error &error) {
669 auto message =
"QNapi: got exception from call '"s + expr +
"': "s + error.what();
670 qOhosPrintfError(
"%s", message.c_str());
674 result = std::make_pair(Napi::Object(), funcCallResult);
675 }
else if (lastDotPos != std::string::npos) {
676 auto subObjExpr = expr.substr(0, lastDotPos);
677 auto propName = expr.substr(lastDotPos + 1);
679 auto subObj = evalWithContextImpl<Napi::Object>(obj, subObjExpr, exprArgs).second;
680 if (!subObj.Has(propName)) {
681 throw makeLoggedExceptionImpl(
682 obj.Env(),
"object '"s + subObjExpr +
"' has no property named '"s + propName +
"'"s);
685 result = std::make_pair(subObj, subObj.Get(propName));
687 if (!obj.Has(expr)) {
688 throw makeLoggedExceptionImpl(
689 obj.Env(),
"object has no property named '"s + expr +
"'"s);
692 result = std::make_pair(obj, obj.Get(expr));
695 return std::make_pair(result.first, checkedCastImpl<T>(result.second, [&]() {
return expr; }));
699 const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
701 using namespace std::string_literals;
702 return runEscapingHandleScopeImpl<Napi::Value>(
705 auto funcWithCtx = evalWithContextImpl<Napi::Function>(obj, methodName);
706 Napi::Value funcResult;
708 funcResult = funcWithCtx.second.Call(funcWithCtx.first, args);
709 }
catch (
const Napi::Error &error) {
710 auto message =
"QNapi: got exception from method call '"s + methodName +
"': "s + error.what();
711 qOhosPrintfError(
"%s", message.c_str());
719template<
typename Result>
720Result
callMethodImpl(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
722 using namespace std::string_literals;
724 return checkedCastImpl<Result>(
725 callMethodWithValueResultImpl(obj, methodName, args),
727 return "result of '"s + methodName +
"' method call"s;
731template<
typename Result =
Value>
732Result
callMethod(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<ValueWrapper> &args)
734 return runEscapingHandleScopeImpl<Result>(
737 return callMethodImpl<Result>(obj, methodName, unwrapValues(obj.Env(), args));
741template<
typename Arg>
742void getArgImpl(
const std::string &funcName,
const Napi::CallbackInfo &cbInfo, Arg &arg,
std::size_t argIndex)
744 using namespace std::string_literals;
746 arg = checkedCastImpl<Arg>(
749 return "arg #"s + std::to_string(argIndex) +
" of '"s + funcName +
"' func call"s;
753template<
typename... Args,
std::size_t... Is>
757 using namespace std::string_literals;
759 if (cbInfo.Length() <
sizeof...(Args)) {
760 throw makeLoggedExceptionImpl(
762 "getArgs: func '"s + funcName +
"' received less args than expected minimum: "s
763 + std::to_string(cbInfo.Length()) +
" vs "s + std::to_string(
sizeof...(Args)));
766 auto unused = {(getArgImpl(funcName, cbInfo,
std::get<Is>(args), Is), 0)..., 0};
774 using namespace std::string_literals;
776 if (optObj.IsEmpty() || !optObj.Has(propName))
779 auto propValue = optObj.Get(propName);
781 return !propValue.IsUndefined()
782 ?
QNapi::checkedCast<T>(
785 auto baseDesc =
"property '"s + propName.ToString().Utf8Value() +
"' of object"s;
786 return !objDesc.empty()
787 ? baseDesc +
": "s + objDesc
793template<
typename Container,
typename Element>
796 using Result = std::conditional_t<std::is_lvalue_reference<Container>::value, Element &, Element &&>;
797 return static_cast<Result>(element);
810 return m_valueFactory(env);
814template<
typename Func>
823 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
827template<
typename Func>
835 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
839template<
typename Func>
847 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
851template<
typename Func>
859 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
862template<
typename... ExtraArgs>
865 return m_callbackFunc;
870 return Napi::Object::New(env);
876 ? Napi::Array::New(env, length)
877 : Napi::Array::New(env);
887 Napi::Array::operator=(other);
903 Napi::Object::operator=(other);
920 using namespace std::string_literals;
923 throw makeLoggedException(
924 Env(),
"object has no property '"s + name.ToString().Utf8Value() +
"'"s);
927 return checkedCast<T>(
930 return "property '"s + name.ToString().Utf8Value() +
"'"s;
935T
Object::
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
939 return runEscapingHandleScope<T>(
942 return evalWithContextImpl<T>(*
this, expr, unwrapValues(Env(), exprArgs)).second;
947 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
953 return eval<QNapi::Promise>(expr, exprArgs);
954 }
catch (
const Napi::Error &error) {
955 auto deferred = Napi::Promise::Deferred::New(Env());
956 deferred.Reject(error.Value());
957 return QNapi::Promise(deferred.Promise());
964 Napi::HandleScope setPropScope(Env());
965 Set(name, value.mapToValue(Env()));
970 Napi::HandleScope setPropScope(Env());
971 Set(name, value.mapToValue(Env()));
974inline void Object::
set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
976 Napi::HandleScope setPropsScope(Env());
977 for (
const auto &namedValue : namedValues)
978 Set(namedValue.first, namedValue.second.mapToValue(Env()));
981template<
typename Result>
982Result
Object::call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
999 Napi::Promise::operator=(other);
1006 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc())});
1012 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc()),
std::move(onRejectedFunc.callbackFunc())});
1018 *
this,
"catch", {
std::move(onRejectedFunc.callbackFunc())});
1024 *
this,
"finally", {
std::move(onFinallyFunc.callbackFunc())});
1031 return onThen(
std::move(onFulfilledFunc),
std::move(onRejectedFunc)).onFinally(
std::move(onFinallyFunc));
1034template<
typename Context>
1037 static_assert(!
std::is_lvalue_reference<Context>::value,
"withContext() supports only rvalue contexts");
1041template<
typename Context>
1044 , m_context(context)
1048template<
typename Context>
1054 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1055 return onFulfilledFunc(cbInfo, *context);
1060template<
typename Context>
1066 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1067 return onFulfilledFunc(cbInfo, *context);
1069 [context = m_context, onRejectedFunc = std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1070 return onRejectedFunc(cbInfo, *context);
1075template<
typename Context>
1081 [context = m_context, onRejectedFunc =
std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1082 return onRejectedFunc(cbInfo, *context);
1087template<
typename Context>
1093 [context = m_context, onFinallyFunc =
std::move(onFinallyFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1094 return onFinallyFunc(cbInfo, *context);
1108 Napi::Reference<T>::operator=(std::move(other));
1121 Napi::Reference<T>::operator=(std::move(other));
1128 return Napi::Persistent(value);
1134 return Napi::Reference<T>();
1144 Napi::Reference<Object>::operator=(std::move(other));
1155 Napi::Reference<Object>::operator=(std::move(other));
1162 return runEscapingHandleScope<T>(
1165 return Value().eval<T>(expr, exprArgs);
1170 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
1175 return Value().evalToPromiseOrRejectOnThrow(expr, exprArgs);
1181 Napi::HandleScope scope(Env());
1182 Value().set(name, value);
1187 Napi::HandleScope scope(Env());
1188 Value().set(namedValues);
1191template<
typename Result>
1192Result
Reference<
Object>::call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
1194 return runEscapingHandleScope<Result>(
1197 return Value().call<Result>(methodName, args);
1203 return Napi::Persistent(value);
1208 return Napi::Reference<Object>();
1221 return Napi::Reference<T>();
1231 return m_cbInfo.Env();
1236 return m_cbInfo.Length();
1239template<
typename... Args>
1243 funcName, m_cbInfo,
std::tie(args...), std::make_index_sequence<
sizeof...(Args)>());
1246template<
typename Arg>
1250 getLeadingArgs(funcName, arg);
1261 std::vector<napi_value> unwrappedValues;
1263 wrappedValues.begin(), wrappedValues.end(),
1264 std::back_inserter(unwrappedValues),
1266 return arg.mapToValue(env);
1268 return unwrappedValues;
1273 return details_qnapi_p_h::makeLoggedExceptionImpl(env, msg);
1282template<
typename Element>
1285 if (!valueTypeMatches<Napi::Array>(value))
1288 auto arrayValue = checkedCast<Napi::Array>(value);
1289 auto arrayLength = arrayValue.Length();
1291 bool allElementsMatch =
true;
1292 for (
std::size_t i = 0; i < arrayLength; ++i) {
1293 if (!valueTypeMatches<Element>(arrayValue.Get(i))) {
1294 allElementsMatch =
false;
1299 return allElementsMatch;
1304 return details_qnapi_p_h::getValueTypeStringImpl(value);
1307template<
typename T,
typename ValueDescriptionSupplier>
1308T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
1311 value,
std::forward<ValueDescriptionSupplier>(valueDescSupplier));
1320 return std::string();
1324template<
typename OutputContainer,
typename Element,
typename TransFunc>
1327 return getFilteredArrayElements<OutputContainer, Element>(
1329 [&](Element &&elem) {
1330 return std::optional(transFunc(
std::forward<Element>(elem)));
1334template<
typename OutputContainer,
typename Element>
1337 return getArrayElements<OutputContainer, Element>(
1339 [](Element &&elem) {
1340 return std::forward<Element>(elem);
1344template<
typename OutputContainer,
typename Element,
typename TransFilterFunc>
1347 using namespace std::string_literals;
1349 OutputContainer result;
1350 auto arrayLength = inputArray.Length();
1351 for (
std::size_t i = 0; i < arrayLength; ++i) {
1352 auto arg = inputArray.Get(i);
1353 if (!valueTypeMatches<Element>(arg)) {
1355 auto argTypeStr = getValueTypeString(arg);
1356 throw makeLoggedException(
1358 "wrong type of Napi array element #"s + std::to_string(i)
1359 +
", expected '"s + expectedTypeName +
"', got '"s + argTypeStr +
"'"s);
1361 if (
auto optTransformed = transFilterFunc(checkedCast<Element>(arg)))
1362 result.insert(result.end(),
std::move(*optTransformed));
1370 return type.New(unwrapValues(type.Env(), args));
1375 return makeNewInstance(Object(baseObj).get<Napi::Function>(typePath), args);
1381 return Napi::Value();
1383 if (!obj.IsObject())
1384 return obj.Env().Undefined();
1386 auto typedObj = checkedCast<Napi::Object>(obj);
1388 return typedObj.Has(propName)
1389 ? typedObj.Get(propName)
1390 : typedObj.Env().Undefined();
1396 if (objRef.IsEmpty())
1397 return Napi::Value();
1399 return details_qnapi_p_h::runEscapingHandleScopeImpl<Napi::Value>(
1402 return getPropOrUndefined(objRef.Value(), propName);
1410 return !optObj.IsEmpty()
1412 optObj, Napi::String::New(optObj.Env(), propName), objDesc)
1420 return details_qnapi_p_h::getOptionalPropOrEmptyImpl<T>(optObj, propName, objDesc);
1423inline Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
1425 auto obj = QNapi::Object::New(env);
1426 obj.set(namedValues);
1432 return makeArray<std::initializer_list<ValueWrapper> &>(env, values);
1435template<
typename InputContainer,
typename TransFunc>
1440 return runEscapingHandleScopeImpl<Napi::Array>(
1443 auto containerSize =
static_cast<std::size_t>(
1444 std::distance(std::begin(inputContainer), std::end(inputContainer)));
1445 auto array = Napi::Array::New(env, containerSize);
1447 for (
auto &element : inputContainer) {
1448 array.Set(i, ValueWrapper(transFunc(forwardContainerElement<InputContainer>(element))).mapToValue(env));
1455template<
typename InputContainer>
1459 env,
std::forward<InputContainer>(inputContainer),
1460 [](
auto &&element) ->
decltype(
auto) {
1461 return std::forward<
decltype(element)>(element);
1465template<
typename Result,
typename F>
1473 std::string jsonString;
1475 Napi::HandleScope stringifyScope(value.Env());
1476 jsonString = details_qnapi_p_h::callMethod<String>(value.Env().Global(),
"JSON.stringify", {value});
1478 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
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={})