18#include <QtCore/private/qohoslogger_p.h>
21#include <initializer_list>
35template<
typename... ExtraArgs>
39 template<
typename Func>
40 ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t<std::is_void<std::result_of_t<Func(
const Napi::CallbackInfo &, ExtraArgs...)>>::value,
char *> =
nullptr);
42 template<
typename Func>
45 template<
typename Func>
46 ExtendedCallbackFuncWrapper(Func &&callbackFunc, std::enable_if_t<std::is_void<std::result_of_t<Func(ExtraArgs...)>>::value,
int *> =
nullptr);
48 template<
typename Func>
54 std::function<Napi::Value(
const Napi::CallbackInfo &, ExtraArgs...)> m_callbackFunc;
95 template<
typename T, std::enable_if_t<!std::is_same<std::decay_t<T>, ValueWrapper>::value,
int> = 0>
101 std::function<Napi::Value(napi_env)> m_valueFactory;
109 static Array New(napi_env env,
std::size_t length = 0);
111 Array(
const Napi::Array &other);
124 Object(
const Napi::Object &other);
127 template<
typename T =
Value>
128 T
get(
const std::string &expr)
const;
130 template<
typename T =
Value>
131 T
get(
const Napi::Name &name)
const;
133 template<
typename T =
Value>
134 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
142 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
144 template<
typename Result =
Value>
145 Result
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args = {})
const;
148template<
typename Context>
157 Promise(
const Napi::Promise &other);
168 template<
typename Context>
172template<
typename Context>
185 std::shared_ptr<Context> m_context;
188template<
typename T =
void>
220 Reference(Napi::Reference<Object> &&other);
224 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
230 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
233 Result
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args = {})
const;
249 template<
typename T =
Value>
264 template<
typename... Args>
267 template<
typename Arg>
273 const Napi::CallbackInfo &m_cbInfo;
283template<
typename Element>
288template<
typename T,
typename ValueDescriptionSupplier>
289T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier);
294template<
typename OutputContainer,
typename Element,
typename TransFunc>
295OutputContainer
getArrayElements(
const Napi::Array &inputArray, TransFunc &&transFunc);
297template<
typename OutputContainer,
typename Element>
302Object makeNewInstance(
const Napi::Object &baseObj,
const std::string &typePath,
const std::vector<ValueWrapper> &args = {});
317Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues = {});
321template<
typename InputContainer,
typename TransFunc>
322Array makeArray(napi_env env, InputContainer &&inputContainer, TransFunc &&transFunc);
324template<
typename InputContainer>
327template<
typename Result =
Napi::
Value,
typename F>
397 static constexpr const char *
typeName =
"ArrayBuffer";
404 static constexpr const char *
typeName =
"TypedArray";
423 static constexpr const char *
typeName =
"Function";
442 static constexpr const char *
typeName =
"DataView";
456 static constexpr const char *
typeName =
"External";
463 static constexpr const char *
typeName =
"TypedArray";
475 return Napi::Function::New(env, std::move(CallbackFuncWrapper(std::forward<T>(inputValue)).callbackFunc()));
481 return Napi::Value::From(env, std::forward<T>(inputValue));
486 qOhosPrintfError(
"QNapi: exception: %s", msg.c_str());
487 return Napi::Error::New(env, msg);
506 using namespace std::string_literals;
508 if (value.IsArray()) {
509 auto arrayElemTypeString = getArrayElementValueTypeString(value.As<Napi::Array>());
510 return "Array<"s + arrayElemTypeString +
">"s;
514 const std::pair<
bool (Napi::Value::*)()
const,
const char *> typesChecksAndNames[] = {
515 {&Napi::Value::IsEmpty,
"<empty>"},
516 {&Napi::Value::IsNull,
"Null"},
517 {&Napi::Value::IsUndefined,
"Undefined"},
518 {&Napi::Value::IsArray,
"Array"},
519 {&Napi::Value::IsArrayBuffer,
"ArrayBuffer"},
520 {&Napi::Value::IsTypedArray,
"TypedArray"},
521 {&Napi::Value::IsDataView,
"DataView"},
522 {&Napi::Value::IsFunction,
"Function"},
523 {&Napi::Value::IsPromise,
"Promise"},
524 {&Napi::Value::IsBigInt,
"BigInt"},
525 {&Napi::Value::IsBuffer,
"Buffer"},
526 {&Napi::Value::IsBoolean,
"Boolean"},
527 {&Napi::Value::IsDate,
"Date"},
528 {&Napi::Value::IsExternal,
"External"},
529 {&Napi::Value::IsNumber,
"Number"},
530 {&Napi::Value::IsObject,
"Object"},
531 {&Napi::Value::IsString,
"String"},
532 {&Napi::Value::IsSymbol,
"Symbol"},
535 const char *foundTypeName =
nullptr;
536 for (
const auto &typeCheckEntry : typesChecksAndNames) {
537 if ((value.*(typeCheckEntry.first))()) {
538 foundTypeName = typeCheckEntry.second;
543 return foundTypeName !=
nullptr ? foundTypeName :
"?";
548 constexpr std::size_t maxArrayElementsForTypeCheck = 10;
550 std::size_t arrayLength = arrayValue.Length();
551 auto checkRangeSize =
std::min(arrayLength, maxArrayElementsForTypeCheck);
553 std::string commonElemTypeString;
554 for (
std::size_t i = 0; i < checkRangeSize; ++i) {
555 auto elemTypeString = getValueTypeStringImpl(arrayValue.Get(i));
556 if (commonElemTypeString.empty()) {
557 commonElemTypeString = elemTypeString;
558 }
else if (commonElemTypeString != elemTypeString) {
559 commonElemTypeString =
"";
564 return !commonElemTypeString.empty()
565 ? checkRangeSize == arrayLength
566 ? commonElemTypeString
567 : commonElemTypeString +
"?"
571template<
typename T,
typename ValueDescriptionSupplier>
573 const Napi::Value &value, ValueDescriptionSupplier &&)
578template<
typename T,
typename ValueDescriptionSupplier>
580 const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
582 using namespace std::string_literals;
584 if (!valueTypeMatchesImpl<T>(value)) {
586 auto valueTypeStr = getValueTypeStringImpl(value);
587 std::string valueDesc = valueDescSupplier();
589 "wrong type (expected '"s + expectedTypeName +
"', got '"s + valueTypeStr +
"') of Napi value"s;
590 throw makeLoggedExceptionImpl(
591 value.Env(), valueDesc.empty() ? baseEerrorMsg : baseEerrorMsg +
": "s + valueDesc);
594 return T(value.Env(), value);
597template<
typename Result,
typename F>
600 Napi::EscapableHandleScope scope(env);
601 Result result =
std::forward<F>(func)();
602 return checkedCastImpl<Result>(
603 scope.Escape(result),
605 return "value escaping from HandleScope";
610 napi_env env,
const std::string &callArgsSubExpr,
const std::vector<napi_value> &exprArgs)
612 using namespace std::string_literals;
614 if (callArgsSubExpr.empty()) {
616 }
else if (callArgsSubExpr ==
"*") {
619 throw makeLoggedException(
620 env,
"illegal call arguments in expression: '"s + callArgsSubExpr +
"'"s);
626 Napi::Object obj,
const std::string &expr,
const std::vector<napi_value> &exprArgs = {})
629 using namespace std::string_literals;
631 static const std::string newCallTag =
"<new>";
633 std::pair<Napi::Object, Napi::Value> result;
635 auto lastDotPos = expr.rfind(
'.');
637 if (!expr.empty() && expr.back() ==
')') {
638 auto openingBracketPos = expr.rfind(
'(');
639 if (openingBracketPos == std::string::npos)
640 throw makeLoggedExceptionImpl(obj.Env(),
"missing opening bracket in '"s + expr +
"'"s);
641 bool newInstanceCall =
642 openingBracketPos > newCallTag.size()
643 && expr.compare(openingBracketPos - newCallTag.size(), newCallTag.size(), newCallTag) == 0;
644 auto subFuncArgsExpr = expr.substr(
645 openingBracketPos + 1, expr.size() - 1 - (openingBracketPos + 1));
646 auto subFuncArgs = expandEvalCallArgs(obj.Env(), subFuncArgsExpr, exprArgs);
647 auto subFuncExpr = expr.substr(
648 0, newInstanceCall ? openingBracketPos - newCallTag.size() : openingBracketPos);
649 auto subFuncWithCtx = evalWithContextImpl<Napi::Function>(obj, subFuncExpr, exprArgs);
650 Napi::Value funcCallResult;
654 ? subFuncWithCtx.second.New(subFuncArgs)
655 : !subFuncWithCtx.first.IsEmpty()
656 ? subFuncWithCtx.second.Call(subFuncWithCtx.first, subFuncArgs)
657 : subFuncWithCtx.second.Call(subFuncArgs);
658 }
catch (
const Napi::Error &error) {
659 auto message =
"QNapi: got exception from call '"s + expr +
"': "s + error.what();
660 qOhosPrintfError(
"%s", message.c_str());
664 result = std::make_pair(Napi::Object(), funcCallResult);
665 }
else if (lastDotPos != std::string::npos) {
666 auto subObjExpr = expr.substr(0, lastDotPos);
667 auto propName = expr.substr(lastDotPos + 1);
669 auto subObj = evalWithContextImpl<Napi::Object>(obj, subObjExpr, exprArgs).second;
670 if (!subObj.Has(propName)) {
671 throw makeLoggedExceptionImpl(
672 obj.Env(),
"object '"s + subObjExpr +
"' has no property named '"s + propName +
"'"s);
675 result = std::make_pair(subObj, subObj.Get(propName));
677 if (!obj.Has(expr)) {
678 throw makeLoggedExceptionImpl(
679 obj.Env(),
"object has no property named '"s + expr +
"'"s);
682 result = std::make_pair(obj, obj.Get(expr));
685 return std::make_pair(result.first, checkedCastImpl<T>(result.second, [&]() {
return expr; }));
689 const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
691 using namespace std::string_literals;
692 return runEscapingHandleScopeImpl<Napi::Value>(
695 auto funcWithCtx = evalWithContextImpl<Napi::Function>(obj, methodName);
696 Napi::Value funcResult;
698 funcResult = funcWithCtx.second.Call(funcWithCtx.first, args);
699 }
catch (
const Napi::Error &error) {
700 auto message =
"QNapi: got exception from method call '"s + methodName +
"': "s + error.what();
701 qOhosPrintfError(
"%s", message.c_str());
709template<
typename Result>
710Result
callMethodImpl(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
712 using namespace std::string_literals;
714 return checkedCastImpl<Result>(
715 callMethodWithValueResultImpl(obj, methodName, args),
717 return "result of '"s + methodName +
"' method call"s;
721template<
typename Result =
Value>
722Result
callMethod(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<ValueWrapper> &args)
724 return runEscapingHandleScopeImpl<Result>(
727 return callMethodImpl<Result>(obj, methodName, unwrapValues(obj.Env(), args));
731template<
typename Arg>
732void getArgImpl(
const std::string &funcName,
const Napi::CallbackInfo &cbInfo, Arg &arg,
std::size_t argIndex)
734 using namespace std::string_literals;
736 arg = checkedCastImpl<Arg>(
739 return "arg #"s + std::to_string(argIndex) +
" of '"s + funcName +
"' func call"s;
743template<
typename... Args,
std::size_t... Is>
747 using namespace std::string_literals;
749 if (cbInfo.Length() <
sizeof...(Args)) {
750 throw makeLoggedExceptionImpl(
752 "getArgs: func '"s + funcName +
"' received less args than expected minimum: "s
753 + std::to_string(cbInfo.Length()) +
" vs "s + std::to_string(
sizeof...(Args)));
756 auto unused = {(getArgImpl(funcName, cbInfo,
std::get<Is>(args), Is), 0)..., 0};
764 using namespace std::string_literals;
766 if (optObj.IsEmpty() || !optObj.Has(propName))
769 auto propValue = optObj.Get(propName);
771 return !propValue.IsUndefined()
772 ?
QNapi::checkedCast<T>(
775 auto baseDesc =
"property '"s + propName.ToString().Utf8Value() +
"' of object"s;
776 return !objDesc.empty()
777 ? baseDesc +
": "s + objDesc
783template<
typename Container,
typename Element>
786 using Result = std::conditional_t<std::is_lvalue_reference<Container>::value, Element &, Element &&>;
787 return static_cast<Result>(element);
803 return m_valueFactory(env);
807template<
typename Func>
819template<
typename Func>
830template<
typename Func>
841template<
typename Func>
851template<
typename... ExtraArgs>
854 return m_callbackFunc;
859 return Napi::Object::New(env);
865 ? Napi::Array::New(env, length)
866 : Napi::Array::New(env);
876 Napi::Array::operator=(other);
892 Napi::Object::operator=(other);
909 using namespace std::string_literals;
912 throw makeLoggedException(
913 Env(),
"object has no property '"s + name.ToString().Utf8Value() +
"'"s);
916 return checkedCast<T>(
919 return "property '"s + name.ToString().Utf8Value() +
"'"s;
924T
Object::
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
928 return runEscapingHandleScope<T>(
931 return evalWithContextImpl<T>(*
this, expr, unwrapValues(Env(), exprArgs)).second;
936 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
942 return eval<QNapi::Promise>(expr, exprArgs);
943 }
catch (
const Napi::Error &error) {
944 auto deferred = Napi::Promise::Deferred::New(Env());
945 deferred.Reject(error.Value());
946 return QNapi::Promise(deferred.Promise());
953 Napi::HandleScope setPropScope(Env());
954 Set(name, value.mapToValue(Env()));
959 Napi::HandleScope setPropScope(Env());
960 Set(name, value.mapToValue(Env()));
963inline void Object::
set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
965 Napi::HandleScope setPropsScope(Env());
966 for (
const auto &namedValue : namedValues)
967 Set(namedValue.first, namedValue.second.mapToValue(Env()));
970template<
typename Result>
971Result
Object::
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
988 Napi::Promise::operator=(other);
995 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc())});
1001 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc()),
std::move(onRejectedFunc.callbackFunc())});
1007 *
this,
"catch", {
std::move(onRejectedFunc.callbackFunc())});
1013 *
this,
"finally", {
std::move(onFinallyFunc.callbackFunc())});
1020 return onThen(
std::move(onFulfilledFunc),
std::move(onRejectedFunc)).onFinally(
std::move(onFinallyFunc));
1023template<
typename Context>
1029template<
typename Context>
1032 , m_context(context)
1036template<
typename Context>
1042 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1043 return onFulfilledFunc(cbInfo, *context);
1048template<
typename Context>
1054 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1055 return onFulfilledFunc(cbInfo, *context);
1057 [context = m_context, onRejectedFunc = std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1058 return onRejectedFunc(cbInfo, *context);
1063template<
typename 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, onFinallyFunc =
std::move(onFinallyFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1082 return onFinallyFunc(cbInfo, *context);
1096 Napi::Reference<T>::operator=(std::move(other));
1109 Napi::Reference<T>::operator=(std::move(other));
1116 return Napi::Persistent(value);
1122 return Napi::Reference<T>();
1132 Napi::Reference<Object>::operator=(std::move(other));
1143 Napi::Reference<Object>::operator=(std::move(other));
1150 return runEscapingHandleScope<T>(
1153 return Value().eval<T>(expr, exprArgs);
1158 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
1163 return Value().evalToPromiseOrRejectOnThrow(expr, exprArgs);
1169 Napi::HandleScope scope(Env());
1170 Value().set(name, value);
1175 Napi::HandleScope scope(Env());
1176 Value().set(namedValues);
1179template<
typename Result>
1182 return runEscapingHandleScope<Result>(
1185 return Value().call<Result>(methodName, args);
1191 return Napi::Persistent(value);
1196 return Napi::Reference<Object>();
1209 return Napi::Reference<T>();
1219 return m_cbInfo.Env();
1224 return m_cbInfo.Length();
1227template<
typename... Args>
1231 funcName, m_cbInfo,
std::tie(args...), std::make_index_sequence<
sizeof...(Args)>());
1234template<
typename Arg>
1238 getLeadingArgs(funcName, arg);
1249 std::vector<napi_value> unwrappedValues;
1251 wrappedValues.begin(), wrappedValues.end(),
1252 std::back_inserter(unwrappedValues),
1254 return arg.mapToValue(env);
1256 return unwrappedValues;
1261 return details_qnapi_p_h::makeLoggedExceptionImpl(env, msg);
1270template<
typename Element>
1273 if (!valueTypeMatches<Napi::Array>(value))
1276 auto arrayValue = checkedCast<Napi::Array>(value);
1277 auto arrayLength = arrayValue.Length();
1279 bool allElementsMatch =
true;
1280 for (
std::size_t i = 0; i < arrayLength; ++i) {
1281 if (!valueTypeMatches<Element>(arrayValue.Get(i))) {
1282 allElementsMatch =
false;
1287 return allElementsMatch;
1292 return details_qnapi_p_h::getValueTypeStringImpl(value);
1295template<
typename T,
typename ValueDescriptionSupplier>
1296T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
1299 value,
std::forward<ValueDescriptionSupplier>(valueDescSupplier));
1308 return std::string();
1312template<
typename OutputContainer,
typename Element,
typename TransFunc>
1315 using namespace std::string_literals;
1317 OutputContainer result;
1318 auto arrayLength = inputArray.Length();
1319 for (
std::size_t i = 0; i < arrayLength; ++i) {
1320 auto arg = inputArray.Get(i);
1321 if (!valueTypeMatches<Element>(arg)) {
1323 auto argTypeStr = getValueTypeString(arg);
1324 throw makeLoggedException(
1326 "wrong type of Napi array element #"s + std::to_string(i)
1327 +
", expected '"s + expectedTypeName +
"', got '"s + argTypeStr +
"'"s);
1329 result.insert(result.end(), transFunc(checkedCast<Element>(arg)));
1335template<
typename OutputContainer,
typename Element>
1338 return getArrayElements<OutputContainer, Element>(
1340 [](Element &&elem) {
1341 return std::forward<Element>(elem);
1347 return type.New(unwrapValues(type.Env(), args));
1352 return makeNewInstance(Object(baseObj).get<Napi::Function>(typePath), args);
1357 if (!obj.IsObject())
1358 return obj.Env().Undefined();
1360 auto typedObj = checkedCast<Napi::Object>(obj);
1362 return typedObj.Has(propName)
1363 ? typedObj.Get(propName)
1364 : typedObj.Env().Undefined();
1370 return details_qnapi_p_h::runEscapingHandleScopeImpl<Napi::Value>(
1373 return getPropOrUndefined(objRef.Value(), propName);
1381 return !optObj.IsEmpty()
1383 optObj, Napi::String::New(optObj.Env(), propName), objDesc)
1391 return details_qnapi_p_h::getOptionalPropOrEmptyImpl<T>(optObj, propName, objDesc);
1394inline Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
1396 auto obj = QNapi::Object::New(env);
1397 obj.set(namedValues);
1403 return makeArray<std::initializer_list<ValueWrapper> &>(env, values);
1406template<
typename InputContainer,
typename TransFunc>
1411 return runEscapingHandleScopeImpl<Napi::Array>(
1414 auto containerSize =
static_cast<std::size_t>(
1415 std::distance(std::begin(inputContainer), std::end(inputContainer)));
1416 auto array = Napi::Array::New(env, containerSize);
1418 for (
auto &element : inputContainer) {
1419 array.Set(i, ValueWrapper(transFunc(forwardContainerElement<InputContainer>(element))).mapToValue(env));
1426template<
typename InputContainer>
1430 env,
std::forward<InputContainer>(inputContainer),
1431 [](
auto &&element) ->
decltype(
auto) {
1432 return std::forward<
decltype(element)>(element);
1436template<
typename Result,
typename F>
1444 std::string jsonString;
1446 Napi::HandleScope stringifyScope(value.Env());
1447 jsonString = details_qnapi_p_h::callMethod<String>(value.Env().Global(),
"JSON.stringify", {value});
1449 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
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)
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)
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)
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::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)
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={})