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::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;
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>
146 Result
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args = {})
const;
149template<
typename Context>
158 Promise(
const Napi::Promise &other);
169 template<
typename Context>
173template<
typename Context>
186 std::shared_ptr<Context> m_context;
189template<
typename T =
void>
221 Reference(Napi::Reference<Object> &&other);
225 T
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs = {})
const;
231 void set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues);
234 Result
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args = {})
const;
250 template<
typename T =
Value>
265 template<
typename... Args>
268 template<
typename Arg>
274 const Napi::CallbackInfo &m_cbInfo;
284template<
typename Element>
289template<
typename T,
typename ValueDescriptionSupplier>
290T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier);
295template<
typename OutputContainer,
typename Element,
typename TransFunc>
296OutputContainer
getArrayElements(
const Napi::Array &inputArray, TransFunc &&transFunc);
298template<
typename OutputContainer,
typename Element>
301template<
typename OutputContainer,
typename Element,
typename TransFilterFunc>
306Object makeNewInstance(
const Napi::Object &baseObj,
const std::string &typePath,
const std::vector<ValueWrapper> &args = {});
321Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues = {});
325template<
typename InputContainer,
typename TransFunc>
326Array makeArray(napi_env env, InputContainer &&inputContainer, TransFunc &&transFunc);
328template<
typename InputContainer>
331template<
typename Result =
Napi::
Value,
typename F>
401 static constexpr const char *
typeName =
"ArrayBuffer";
408 static constexpr const char *
typeName =
"TypedArray";
427 static constexpr const char *
typeName =
"Function";
446 static constexpr const char *
typeName =
"DataView";
460 static constexpr const char *
typeName =
"External";
467 static constexpr const char *
typeName =
"TypedArray";
479 return [callbackFunc = std::move(CallbackFuncWrapper(std::forward<T>(inputValue)).callbackFunc())](napi_env env) {
480 return Napi::Function::New(env, callbackFunc);
487 return [inputValue =
std::forward<T>(inputValue)](napi_env env) {
488 return Napi::Value::From(env, inputValue);
494 qOhosPrintfError(
"QNapi: exception: %s", msg.c_str());
495 return Napi::Error::New(env, msg);
514 using namespace std::string_literals;
516 if (value.IsArray()) {
517 auto arrayElemTypeString = getArrayElementValueTypeString(value.As<Napi::Array>());
518 return "Array<"s + arrayElemTypeString +
">"s;
522 const std::pair<
bool (Napi::Value::*)()
const,
const char *> typesChecksAndNames[] = {
523 {&Napi::Value::IsEmpty,
"<empty>"},
524 {&Napi::Value::IsNull,
"Null"},
525 {&Napi::Value::IsUndefined,
"Undefined"},
526 {&Napi::Value::IsArray,
"Array"},
527 {&Napi::Value::IsArrayBuffer,
"ArrayBuffer"},
528 {&Napi::Value::IsBuffer,
"Buffer"},
529 {&Napi::Value::IsTypedArray,
"TypedArray"},
530 {&Napi::Value::IsDataView,
"DataView"},
531 {&Napi::Value::IsFunction,
"Function"},
532 {&Napi::Value::IsPromise,
"Promise"},
533 {&Napi::Value::IsBigInt,
"BigInt"},
534 {&Napi::Value::IsBoolean,
"Boolean"},
535 {&Napi::Value::IsDate,
"Date"},
536 {&Napi::Value::IsExternal,
"External"},
537 {&Napi::Value::IsNumber,
"Number"},
538 {&Napi::Value::IsObject,
"Object"},
539 {&Napi::Value::IsString,
"String"},
540 {&Napi::Value::IsSymbol,
"Symbol"},
543 const char *foundTypeName =
nullptr;
544 for (
const auto &typeCheckEntry : typesChecksAndNames) {
545 if ((value.*(typeCheckEntry.first))()) {
546 foundTypeName = typeCheckEntry.second;
551 return foundTypeName !=
nullptr ? foundTypeName :
"?";
556 constexpr std::size_t maxArrayElementsForTypeCheck = 10;
558 std::size_t arrayLength = arrayValue.Length();
559 auto checkRangeSize =
std::min(arrayLength, maxArrayElementsForTypeCheck);
561 std::string commonElemTypeString;
562 for (
std::size_t i = 0; i < checkRangeSize; ++i) {
563 auto elemTypeString = getValueTypeStringImpl(arrayValue.Get(i));
564 if (commonElemTypeString.empty()) {
565 commonElemTypeString = elemTypeString;
566 }
else if (commonElemTypeString != elemTypeString) {
567 commonElemTypeString =
"";
572 return !commonElemTypeString.empty()
573 ? checkRangeSize == arrayLength
574 ? commonElemTypeString
575 : commonElemTypeString +
"?"
579template<
typename T,
typename ValueDescriptionSupplier>
581 const Napi::Value &value, ValueDescriptionSupplier &&)
586template<
typename T,
typename ValueDescriptionSupplier>
588 const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
590 using namespace std::string_literals;
592 if (!valueTypeMatchesImpl<T>(value)) {
594 auto valueTypeStr = getValueTypeStringImpl(value);
595 std::string valueDesc = valueDescSupplier();
597 "wrong type (expected '"s + expectedTypeName +
"', got '"s + valueTypeStr +
"') of Napi value"s;
598 throw makeLoggedExceptionImpl(
599 value.Env(), valueDesc.empty() ? baseErrorMsg : baseErrorMsg +
": "s + valueDesc);
602 return T(value.Env(), value);
605template<
typename Result,
typename F>
608 Napi::EscapableHandleScope scope(env);
609 Result result =
std::forward<F>(func)();
610 return checkedCastImpl<Result>(
611 scope.Escape(result),
613 return "value escaping from HandleScope";
618 napi_env env,
const std::string &callArgsSubExpr,
const std::vector<napi_value> &exprArgs)
620 using namespace std::string_literals;
622 if (callArgsSubExpr.empty()) {
624 }
else if (callArgsSubExpr ==
"*") {
627 throw makeLoggedException(
628 env,
"illegal call arguments in expression: '"s + callArgsSubExpr +
"'"s);
634 Napi::Object obj,
const std::string &expr,
const std::vector<napi_value> &exprArgs = {})
637 using namespace std::string_literals;
639 static const std::string newCallTag =
"<new>";
641 std::pair<Napi::Object, Napi::Value> result;
643 auto lastDotPos = expr.rfind(
'.');
645 if (!expr.empty() && expr.back() ==
')') {
646 auto openingBracketPos = expr.rfind(
'(');
647 if (openingBracketPos == std::string::npos)
648 throw makeLoggedExceptionImpl(obj.Env(),
"missing opening bracket in '"s + expr +
"'"s);
649 bool newInstanceCall =
650 openingBracketPos > newCallTag.size()
651 && expr.compare(openingBracketPos - newCallTag.size(), newCallTag.size(), newCallTag) == 0;
652 auto subFuncArgsExpr = expr.substr(
653 openingBracketPos + 1, expr.size() - 1 - (openingBracketPos + 1));
654 auto subFuncArgs = expandEvalCallArgs(obj.Env(), subFuncArgsExpr, exprArgs);
655 auto subFuncExpr = expr.substr(
656 0, newInstanceCall ? openingBracketPos - newCallTag.size() : openingBracketPos);
657 auto subFuncWithCtx = evalWithContextImpl<Napi::Function>(obj, subFuncExpr, exprArgs);
658 Napi::Value funcCallResult;
662 ? subFuncWithCtx.second.New(subFuncArgs)
663 : !subFuncWithCtx.first.IsEmpty()
664 ? subFuncWithCtx.second.Call(subFuncWithCtx.first, subFuncArgs)
665 : subFuncWithCtx.second.Call(subFuncArgs);
666 }
catch (
const Napi::Error &error) {
667 auto message =
"QNapi: got exception from call '"s + expr +
"': "s + error.what();
668 qOhosPrintfError(
"%s", message.c_str());
672 result = std::make_pair(Napi::Object(), funcCallResult);
673 }
else if (lastDotPos != std::string::npos) {
674 auto subObjExpr = expr.substr(0, lastDotPos);
675 auto propName = expr.substr(lastDotPos + 1);
677 auto subObj = evalWithContextImpl<Napi::Object>(obj, subObjExpr, exprArgs).second;
678 if (!subObj.Has(propName)) {
679 throw makeLoggedExceptionImpl(
680 obj.Env(),
"object '"s + subObjExpr +
"' has no property named '"s + propName +
"'"s);
683 result = std::make_pair(subObj, subObj.Get(propName));
685 if (!obj.Has(expr)) {
686 throw makeLoggedExceptionImpl(
687 obj.Env(),
"object has no property named '"s + expr +
"'"s);
690 result = std::make_pair(obj, obj.Get(expr));
693 return std::make_pair(result.first, checkedCastImpl<T>(result.second, [&]() {
return expr; }));
697 const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
699 using namespace std::string_literals;
700 return runEscapingHandleScopeImpl<Napi::Value>(
703 auto funcWithCtx = evalWithContextImpl<Napi::Function>(obj, methodName);
704 Napi::Value funcResult;
706 funcResult = funcWithCtx.second.Call(funcWithCtx.first, args);
707 }
catch (
const Napi::Error &error) {
708 auto message =
"QNapi: got exception from method call '"s + methodName +
"': "s + error.what();
709 qOhosPrintfError(
"%s", message.c_str());
717template<
typename Result>
718Result
callMethodImpl(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<napi_value> &args)
720 using namespace std::string_literals;
722 return checkedCastImpl<Result>(
723 callMethodWithValueResultImpl(obj, methodName, args),
725 return "result of '"s + methodName +
"' method call"s;
729template<
typename Result =
Value>
730Result
callMethod(
const Napi::Object &obj,
const std::string &methodName,
const std::vector<ValueWrapper> &args)
732 return runEscapingHandleScopeImpl<Result>(
735 return callMethodImpl<Result>(obj, methodName, unwrapValues(obj.Env(), args));
739template<
typename Arg>
740void getArgImpl(
const std::string &funcName,
const Napi::CallbackInfo &cbInfo, Arg &arg,
std::size_t argIndex)
742 using namespace std::string_literals;
744 arg = checkedCastImpl<Arg>(
747 return "arg #"s + std::to_string(argIndex) +
" of '"s + funcName +
"' func call"s;
751template<
typename... Args,
std::size_t... Is>
755 using namespace std::string_literals;
757 if (cbInfo.Length() <
sizeof...(Args)) {
758 throw makeLoggedExceptionImpl(
760 "getArgs: func '"s + funcName +
"' received less args than expected minimum: "s
761 + std::to_string(cbInfo.Length()) +
" vs "s + std::to_string(
sizeof...(Args)));
764 auto unused = {(getArgImpl(funcName, cbInfo,
std::get<Is>(args), Is), 0)..., 0};
772 using namespace std::string_literals;
774 if (optObj.IsEmpty() || !optObj.Has(propName))
777 auto propValue = optObj.Get(propName);
779 return !propValue.IsUndefined()
780 ?
QNapi::checkedCast<T>(
783 auto baseDesc =
"property '"s + propName.ToString().Utf8Value() +
"' of object"s;
784 return !objDesc.empty()
785 ? baseDesc +
": "s + objDesc
791template<
typename Container,
typename Element>
794 using Result = std::conditional_t<std::is_lvalue_reference<Container>::value, Element &, Element &&>;
795 return static_cast<Result>(element);
808 return m_valueFactory(env);
812template<
typename Func>
821 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
825template<
typename Func>
833 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
837template<
typename Func>
845 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
849template<
typename Func>
857 static_assert(!
std::is_lvalue_reference<Func>::value,
"callback functor must be passed as an rvalue");
860template<
typename... ExtraArgs>
863 return m_callbackFunc;
868 return Napi::Object::New(env);
874 ? Napi::Array::New(env, length)
875 : Napi::Array::New(env);
885 Napi::Array::operator=(other);
901 Napi::Object::operator=(other);
918 using namespace std::string_literals;
921 throw makeLoggedException(
922 Env(),
"object has no property '"s + name.ToString().Utf8Value() +
"'"s);
925 return checkedCast<T>(
928 return "property '"s + name.ToString().Utf8Value() +
"'"s;
933T
Object::
eval(
const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
937 return runEscapingHandleScope<T>(
940 return evalWithContextImpl<T>(*
this, expr, unwrapValues(Env(), exprArgs)).second;
945 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
951 return eval<QNapi::Promise>(expr, exprArgs);
952 }
catch (
const Napi::Error &error) {
953 auto deferred = Napi::Promise::Deferred::New(Env());
954 deferred.Reject(error.Value());
955 return QNapi::Promise(deferred.Promise());
962 Napi::HandleScope setPropScope(Env());
963 Set(name, value.mapToValue(Env()));
968 Napi::HandleScope setPropScope(Env());
969 Set(name, value.mapToValue(Env()));
972inline void Object::
set(
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
974 Napi::HandleScope setPropsScope(Env());
975 for (
const auto &namedValue : namedValues)
976 Set(namedValue.first, namedValue.second.mapToValue(Env()));
979template<
typename Result>
980Result
Object::
call(
const std::string &methodName,
const std::vector<ValueWrapper> &args)
const
997 Napi::Promise::operator=(other);
1004 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc())});
1010 *
this,
"then", {
std::move(onFulfilledFunc.callbackFunc()),
std::move(onRejectedFunc.callbackFunc())});
1016 *
this,
"catch", {
std::move(onRejectedFunc.callbackFunc())});
1022 *
this,
"finally", {
std::move(onFinallyFunc.callbackFunc())});
1029 return onThen(
std::move(onFulfilledFunc),
std::move(onRejectedFunc)).onFinally(
std::move(onFinallyFunc));
1032template<
typename Context>
1035 static_assert(!
std::is_lvalue_reference<Context>::value,
"withContext() supports only rvalue contexts");
1039template<
typename Context>
1042 , m_context(context)
1046template<
typename Context>
1052 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1053 return onFulfilledFunc(cbInfo, *context);
1058template<
typename Context>
1064 [context = m_context, onFulfilledFunc =
std::move(onFulfilledFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1065 return onFulfilledFunc(cbInfo, *context);
1067 [context = m_context, onRejectedFunc = std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1068 return onRejectedFunc(cbInfo, *context);
1073template<
typename Context>
1079 [context = m_context, onRejectedFunc =
std::move(onRejectedFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1080 return onRejectedFunc(cbInfo, *context);
1085template<
typename Context>
1091 [context = m_context, onFinallyFunc =
std::move(onFinallyFunc.callbackFunc())](
const Napi::CallbackInfo &cbInfo) {
1092 return onFinallyFunc(cbInfo, *context);
1106 Napi::Reference<T>::operator=(std::move(other));
1119 Napi::Reference<T>::operator=(std::move(other));
1126 return Napi::Persistent(value);
1132 return Napi::Reference<T>();
1142 Napi::Reference<Object>::operator=(std::move(other));
1153 Napi::Reference<Object>::operator=(std::move(other));
1160 return runEscapingHandleScope<T>(
1163 return Value().eval<T>(expr, exprArgs);
1168 const std::string &expr,
const std::vector<ValueWrapper> &exprArgs)
const
1173 return Value().evalToPromiseOrRejectOnThrow(expr, exprArgs);
1179 Napi::HandleScope scope(Env());
1180 Value().set(name, value);
1185 Napi::HandleScope scope(Env());
1186 Value().set(namedValues);
1189template<
typename Result>
1192 return runEscapingHandleScope<Result>(
1195 return Value().call<Result>(methodName, args);
1201 return Napi::Persistent(value);
1206 return Napi::Reference<Object>();
1219 return Napi::Reference<T>();
1229 return m_cbInfo.Env();
1234 return m_cbInfo.Length();
1237template<
typename... Args>
1241 funcName, m_cbInfo,
std::tie(args...), std::make_index_sequence<
sizeof...(Args)>());
1244template<
typename Arg>
1248 getLeadingArgs(funcName, arg);
1259 std::vector<napi_value> unwrappedValues;
1261 wrappedValues.begin(), wrappedValues.end(),
1262 std::back_inserter(unwrappedValues),
1264 return arg.mapToValue(env);
1266 return unwrappedValues;
1271 return details_qnapi_p_h::makeLoggedExceptionImpl(env, msg);
1280template<
typename Element>
1283 if (!valueTypeMatches<Napi::Array>(value))
1286 auto arrayValue = checkedCast<Napi::Array>(value);
1287 auto arrayLength = arrayValue.Length();
1289 bool allElementsMatch =
true;
1290 for (
std::size_t i = 0; i < arrayLength; ++i) {
1291 if (!valueTypeMatches<Element>(arrayValue.Get(i))) {
1292 allElementsMatch =
false;
1297 return allElementsMatch;
1302 return details_qnapi_p_h::getValueTypeStringImpl(value);
1305template<
typename T,
typename ValueDescriptionSupplier>
1306T
checkedCast(
const Napi::Value &value, ValueDescriptionSupplier &&valueDescSupplier)
1309 value,
std::forward<ValueDescriptionSupplier>(valueDescSupplier));
1318 return std::string();
1322template<
typename OutputContainer,
typename Element,
typename TransFunc>
1325 return getFilteredArrayElements<OutputContainer, Element>(
1327 [&](Element &&elem) {
1328 return std::optional(transFunc(
std::forward<Element>(elem)));
1332template<
typename OutputContainer,
typename Element>
1335 return getArrayElements<OutputContainer, Element>(
1337 [](Element &&elem) {
1338 return std::forward<Element>(elem);
1342template<
typename OutputContainer,
typename Element,
typename TransFilterFunc>
1345 using namespace std::string_literals;
1347 OutputContainer result;
1348 auto arrayLength = inputArray.Length();
1349 for (
std::size_t i = 0; i < arrayLength; ++i) {
1350 auto arg = inputArray.Get(i);
1351 if (!valueTypeMatches<Element>(arg)) {
1353 auto argTypeStr = getValueTypeString(arg);
1354 throw makeLoggedException(
1356 "wrong type of Napi array element #"s + std::to_string(i)
1357 +
", expected '"s + expectedTypeName +
"', got '"s + argTypeStr +
"'"s);
1359 if (
auto optTransformed = transFilterFunc(checkedCast<Element>(arg)))
1360 result.insert(result.end(),
std::move(*optTransformed));
1368 return type.New(unwrapValues(type.Env(), args));
1373 return makeNewInstance(Object(baseObj).get<Napi::Function>(typePath), args);
1379 return Napi::Value();
1381 if (!obj.IsObject())
1382 return obj.Env().Undefined();
1384 auto typedObj = checkedCast<Napi::Object>(obj);
1386 return typedObj.Has(propName)
1387 ? typedObj.Get(propName)
1388 : typedObj.Env().Undefined();
1394 if (objRef.IsEmpty())
1395 return Napi::Value();
1397 return details_qnapi_p_h::runEscapingHandleScopeImpl<Napi::Value>(
1400 return getPropOrUndefined(objRef.Value(), propName);
1408 return !optObj.IsEmpty()
1410 optObj, Napi::String::New(optObj.Env(), propName), objDesc)
1418 return details_qnapi_p_h::getOptionalPropOrEmptyImpl<T>(optObj, propName, objDesc);
1421inline Object makeObject(napi_env env,
const std::vector<std::pair<std::string, ValueWrapper>> &namedValues)
1423 auto obj = QNapi::Object::New(env);
1424 obj.set(namedValues);
1430 return makeArray<std::initializer_list<ValueWrapper> &>(env, values);
1433template<
typename InputContainer,
typename TransFunc>
1438 return runEscapingHandleScopeImpl<Napi::Array>(
1441 auto containerSize =
static_cast<std::size_t>(
1442 std::distance(std::begin(inputContainer), std::end(inputContainer)));
1443 auto array = Napi::Array::New(env, containerSize);
1445 for (
auto &element : inputContainer) {
1446 array.Set(i, ValueWrapper(transFunc(forwardContainerElement<InputContainer>(element))).mapToValue(env));
1453template<
typename InputContainer>
1457 env,
std::forward<InputContainer>(inputContainer),
1458 [](
auto &&element) ->
decltype(
auto) {
1459 return std::forward<
decltype(element)>(element);
1463template<
typename Result,
typename F>
1471 std::string jsonString;
1473 Napi::HandleScope stringifyScope(value.Env());
1474 jsonString = details_qnapi_p_h::callMethod<String>(value.Env().Global(),
"JSON.stringify", {value});
1476 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)
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={})