diff --git a/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModel.kt b/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModel.kt index 0222cd40..906eeab9 100644 --- a/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModel.kt +++ b/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModel.kt @@ -53,6 +53,10 @@ class HybridViewModel(private val viewModel: ViewModel) : HybridViewModelSpec() } } + override fun getPropertiesAsync(): Promise> { + return Promise.rejected(UnsupportedOperationException("getPropertiesAsync is not supported on the legacy backend")) + } + override fun getPropertyCountAsync(): Promise { return Promise.async { propertyCount } } diff --git a/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModelInstance.kt b/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModelInstance.kt index b8bba139..0d90553f 100644 --- a/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModelInstance.kt +++ b/android/src/legacy/java/com/margelo/nitro/rive/HybridViewModelInstance.kt @@ -12,6 +12,10 @@ class HybridViewModelInstance(val viewModelInstance: ViewModelInstance) : Hybrid override val instanceName: String get() = viewModelInstance.name + override fun getPropertiesAsync(): Promise> { + return Promise.rejected(UnsupportedOperationException("getPropertiesAsync is not supported on the legacy backend")) + } + // Returns null if ViewModelException is thrown for iOS parity // (iOS SDK returns nil when property not found, Android SDK throws) private inline fun getPropertyOrNull(block: () -> T): T? { diff --git a/android/src/new/java/com/margelo/nitro/rive/HybridViewModel.kt b/android/src/new/java/com/margelo/nitro/rive/HybridViewModel.kt index b82f45f7..928889b5 100644 --- a/android/src/new/java/com/margelo/nitro/rive/HybridViewModel.kt +++ b/android/src/new/java/com/margelo/nitro/rive/HybridViewModel.kt @@ -5,6 +5,7 @@ import app.rive.RiveFile import app.rive.ViewModelInstance import app.rive.ViewModelSource import app.rive.core.CommandQueue +import app.rive.runtime.kotlin.core.ViewModel import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.core.Promise import kotlinx.coroutines.runBlocking @@ -22,6 +23,17 @@ class HybridViewModel( private const val TAG = "HybridViewModel" } + override fun getPropertiesAsync(): Promise> { + val name = viewModelName ?: return Promise.resolved(emptyArray()) + return Promise.async { + riveFile + .getViewModelProperties(name) + .map { prop -> + ViewModelPropertyInfo(name = prop.name, type = mapPropertyType(prop.type)) + }.toTypedArray() + } + } + override val propertyCount: Double get() { DeprecationWarning.warn("propertyCount", "getPropertyCountAsync") @@ -147,3 +159,19 @@ class HybridViewModel( } } } + +internal fun mapPropertyType(type: ViewModel.PropertyDataType): ViewModelPropertyType = when (type) { + ViewModel.PropertyDataType.NONE -> ViewModelPropertyType.NONE + ViewModel.PropertyDataType.STRING -> ViewModelPropertyType.STRING + ViewModel.PropertyDataType.NUMBER -> ViewModelPropertyType.NUMBER + ViewModel.PropertyDataType.BOOLEAN -> ViewModelPropertyType.BOOLEAN + ViewModel.PropertyDataType.COLOR -> ViewModelPropertyType.COLOR + ViewModel.PropertyDataType.LIST -> ViewModelPropertyType.LIST + ViewModel.PropertyDataType.ENUM -> ViewModelPropertyType.ENUM + ViewModel.PropertyDataType.TRIGGER -> ViewModelPropertyType.TRIGGER + ViewModel.PropertyDataType.VIEW_MODEL -> ViewModelPropertyType.VIEWMODEL + ViewModel.PropertyDataType.INTEGER -> ViewModelPropertyType.INTEGER + ViewModel.PropertyDataType.SYMBOL_LIST_INDEX -> ViewModelPropertyType.SYMBOLLISTINDEX + ViewModel.PropertyDataType.ASSET_IMAGE -> ViewModelPropertyType.ASSETIMAGE + ViewModel.PropertyDataType.ARTBOARD -> ViewModelPropertyType.ARTBOARD +} diff --git a/android/src/new/java/com/margelo/nitro/rive/HybridViewModelInstance.kt b/android/src/new/java/com/margelo/nitro/rive/HybridViewModelInstance.kt index 98622bf8..d6a562d1 100644 --- a/android/src/new/java/com/margelo/nitro/rive/HybridViewModelInstance.kt +++ b/android/src/new/java/com/margelo/nitro/rive/HybridViewModelInstance.kt @@ -44,6 +44,18 @@ class HybridViewModelInstance( override val instanceName: String get() = _instanceName ?: "" + override fun getPropertiesAsync(): Promise> { + val name = viewModelName ?: return Promise.resolved(emptyArray()) + val file = parentFile.riveFile ?: return Promise.resolved(emptyArray()) + return Promise.async { + file + .getViewModelProperties(name) + .map { prop -> + ViewModelPropertyInfo(name = prop.name, type = mapPropertyType(prop.type)) + }.toTypedArray() + } + } + override fun numberProperty(path: String): HybridViewModelNumberPropertySpec? { return try { runBlocking { viewModelInstance.getNumberFlow(path).first() } diff --git a/ios/legacy/HybridViewModel.swift b/ios/legacy/HybridViewModel.swift index bc5e2d11..12ec3316 100644 --- a/ios/legacy/HybridViewModel.swift +++ b/ios/legacy/HybridViewModel.swift @@ -13,7 +13,11 @@ class HybridViewModel: HybridViewModelSpec { var instanceCount: Double { Double(viewModel?.instanceCount ?? 0) } var modelName: String { viewModel?.name ?? "" } - + + func getPropertiesAsync() throws -> Promise<[ViewModelPropertyInfo]> { + throw RuntimeError.error(withMessage: "getPropertiesAsync is not supported on the legacy backend") + } + func createInstanceByIndex(index: Double) throws -> (any HybridViewModelInstanceSpec)? { guard index >= 0 else { return nil } guard let viewModel = viewModel, diff --git a/ios/legacy/HybridViewModelInstance.swift b/ios/legacy/HybridViewModelInstance.swift index 8185165f..b292adad 100644 --- a/ios/legacy/HybridViewModelInstance.swift +++ b/ios/legacy/HybridViewModelInstance.swift @@ -10,6 +10,10 @@ class HybridViewModelInstance: HybridViewModelInstanceSpec { var instanceName: String { viewModelInstance?.name ?? "" } + func getPropertiesAsync() throws -> Promise<[ViewModelPropertyInfo]> { + throw RuntimeError.error(withMessage: "getPropertiesAsync is not supported on the legacy backend") + } + func numberProperty(path: String) throws -> (any HybridViewModelNumberPropertySpec)? { guard let property = viewModelInstance?.numberProperty(fromPath: path) else { return nil } return HybridViewModelNumberProperty(property: property) diff --git a/ios/new/HybridViewModel.swift b/ios/new/HybridViewModel.swift index 3dc50bd7..17a2598b 100644 --- a/ios/new/HybridViewModel.swift +++ b/ios/new/HybridViewModel.swift @@ -34,6 +34,13 @@ class HybridViewModel: HybridViewModelSpec { } } + func getPropertiesAsync() throws -> Promise<[ViewModelPropertyInfo]> { + return Promise.async { + let props = try await self.file.getProperties(of: self.vmName) + return props.map { ViewModelPropertyInfo(name: $0.name, type: mapPropertyType($0.type)) } + } + } + func getPropertyCountAsync() throws -> Promise { return Promise.async { Double(try await self.file.getProperties(of: self.vmName).count) @@ -48,7 +55,7 @@ class HybridViewModel: HybridViewModelSpec { private func createDefaultInstanceImpl() async throws -> (any HybridViewModelInstanceSpec)? { let vmi = try await self.file.createViewModelInstance(.viewModelDefault(from: .name(self.vmName))) - return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker) + return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker, file: self.file, vmName: self.vmName) } private func createInstanceByIndexImpl(index: Double) async throws -> (any HybridViewModelInstanceSpec)? { @@ -57,7 +64,7 @@ class HybridViewModel: HybridViewModelSpec { guard idx >= 0 && idx < names.count else { return nil } let name = names[idx] let vmi = try await self.file.createViewModelInstance(.name(name, from: .name(self.vmName))) - return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker, instanceName: name) + return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker, instanceName: name, file: self.file, vmName: self.vmName) } // Deprecated: Use createInstanceByNameAsync instead @@ -68,7 +75,7 @@ class HybridViewModel: HybridViewModelSpec { private func createInstanceByNameImpl(name: String) async throws -> (any HybridViewModelInstanceSpec)? { let vmi = try await self.file.createViewModelInstance(.name(name, from: .name(self.vmName))) - return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker, instanceName: name) + return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker, instanceName: name, file: self.file, vmName: self.vmName) } // Deprecated: Use createInstanceByNameAsync instead @@ -93,7 +100,7 @@ class HybridViewModel: HybridViewModelSpec { private func createInstanceImpl() async throws -> (any HybridViewModelInstanceSpec)? { let vmi = try await self.file.createViewModelInstance(.blank(from: .name(self.vmName))) - return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker) + return HybridViewModelInstance(viewModelInstance: vmi, worker: self.worker, file: self.file, vmName: self.vmName) } // Deprecated: Use createBlankInstanceAsync instead @@ -106,3 +113,24 @@ class HybridViewModel: HybridViewModelSpec { return Promise.async { try await self.createInstanceImpl() } } } + +func mapPropertyType(_ type: RiveRuntime.ViewModelProperty.DataType) -> ViewModelPropertyType { + switch type { + case .none: return .none + case .string: return .string + case .number: return .number + case .boolean: return .boolean + case .color: return .color + case .list: return .list + case .enum: return .enum + case .trigger: return .trigger + case .viewModel: return .viewmodel + case .integer: return .integer + case .symbolListIndex: return .symbollistindex + case .assetImage: return .assetimage + case .artboard: return .artboard + case .input: return .input + case .any: return .any + @unknown default: return .none + } +} diff --git a/ios/new/HybridViewModelInstance.swift b/ios/new/HybridViewModelInstance.swift index df7d5263..494dc2f7 100644 --- a/ios/new/HybridViewModelInstance.swift +++ b/ios/new/HybridViewModelInstance.swift @@ -5,17 +5,27 @@ class HybridViewModelInstance: HybridViewModelInstanceSpec { let viewModelInstance: ViewModelInstance let worker: Worker private let _instanceName: String + private let file: File? + private let vmName: String? - init(viewModelInstance: ViewModelInstance, worker: Worker, instanceName: String = "") { + init(viewModelInstance: ViewModelInstance, worker: Worker, instanceName: String = "", file: File? = nil, vmName: String? = nil) { self.viewModelInstance = viewModelInstance self.worker = worker self._instanceName = instanceName + self.file = file + self.vmName = vmName } - // TODO: Workaround — rive-ios experimental SDK doesn't expose ViewModelInstance.name. - // Only works when caller knows the name (createInstanceByName). Falls back to "" otherwise. var instanceName: String { _instanceName } + func getPropertiesAsync() throws -> Promise<[ViewModelPropertyInfo]> { + guard let file = file, let vmName = vmName else { return Promise.resolved(withResult: []) } + return Promise.async { + let props = try await file.getProperties(of: vmName) + return props.map { ViewModelPropertyInfo(name: $0.name, type: mapPropertyType($0.type)) } + } + } + // Note: Unlike legacy API, experimental API can't sync-validate if property exists // Non-existent properties return wrapper objects that fail on getValue() // This is a known limitation documented in EXPERIMENTAL_IOS_API.md diff --git a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp index 6cdef82f..29dbc83c 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.cpp @@ -7,6 +7,10 @@ #include "JHybridViewModelInstanceSpec.hpp" +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } // Forward declaration of `HybridViewModelNumberPropertySpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelNumberPropertySpec; } // Forward declaration of `HybridViewModelStringPropertySpec` to properly resolve imports. @@ -29,6 +33,13 @@ namespace margelo::nitro::rive { class HybridViewModelArtboardPropertySpec; } namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include "ViewModelPropertyInfo.hpp" +#include +#include +#include +#include "JViewModelPropertyInfo.hpp" +#include "ViewModelPropertyType.hpp" +#include "JViewModelPropertyType.hpp" #include #include "HybridViewModelNumberPropertySpec.hpp" #include @@ -51,8 +62,6 @@ namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include "JHybridViewModelArtboardPropertySpec.hpp" #include "HybridViewModelInstanceSpec.hpp" #include "JHybridViewModelInstanceSpec.hpp" -#include -#include namespace margelo::nitro::rive { @@ -91,6 +100,31 @@ namespace margelo::nitro::rive { } // Methods + std::shared_ptr>> JHybridViewModelInstanceSpec::getPropertiesAsync() { + static const auto method = _javaPart->javaClassStatic()->getMethod()>("getPropertiesAsync"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise>::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { + auto __result = jni::static_ref_cast>(__boxedResult); + __promise->resolve([&]() { + size_t __size = __result->size(); + std::vector __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __result->getElement(__i); + __vector.push_back(__element->toCpp()); + } + return __vector; + }()); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } std::optional> JHybridViewModelInstanceSpec::numberProperty(const std::string& path) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* path */)>("numberProperty"); auto __result = method(_javaPart, jni::make_jstring(path)); diff --git a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp index b5b36233..1fc897f3 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelInstanceSpec.hpp @@ -54,6 +54,7 @@ namespace margelo::nitro::rive { public: // Methods + std::shared_ptr>> getPropertiesAsync() override; std::optional> numberProperty(const std::string& path) override; std::optional> stringProperty(const std::string& path) override; std::optional> booleanProperty(const std::string& path) override; diff --git a/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp b/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp index 66512d85..0946422b 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp @@ -7,12 +7,21 @@ #include "JHybridViewModelSpec.hpp" +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } // Forward declaration of `HybridViewModelInstanceSpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include "ViewModelPropertyInfo.hpp" +#include #include #include +#include "JViewModelPropertyInfo.hpp" +#include "ViewModelPropertyType.hpp" +#include "JViewModelPropertyType.hpp" #include #include "HybridViewModelInstanceSpec.hpp" #include @@ -65,6 +74,31 @@ namespace margelo::nitro::rive { } // Methods + std::shared_ptr>> JHybridViewModelSpec::getPropertiesAsync() { + static const auto method = _javaPart->javaClassStatic()->getMethod()>("getPropertiesAsync"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise>::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { + auto __result = jni::static_ref_cast>(__boxedResult); + __promise->resolve([&]() { + size_t __size = __result->size(); + std::vector __vector; + __vector.reserve(__size); + for (size_t __i = 0; __i < __size; __i++) { + auto __element = __result->getElement(__i); + __vector.push_back(__element->toCpp()); + } + return __vector; + }()); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } std::shared_ptr> JHybridViewModelSpec::getPropertyCountAsync() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getPropertyCountAsync"); auto __result = method(_javaPart); diff --git a/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp index ad4583da..340ebcc2 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp @@ -56,6 +56,7 @@ namespace margelo::nitro::rive { public: // Methods + std::shared_ptr>> getPropertiesAsync() override; std::shared_ptr> getPropertyCountAsync() override; std::shared_ptr> getInstanceCountAsync() override; std::optional> createInstanceByIndex(double index) override; diff --git a/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp b/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp new file mode 100644 index 00000000..f791ae80 --- /dev/null +++ b/nitrogen/generated/android/c++/JViewModelPropertyInfo.hpp @@ -0,0 +1,63 @@ +/// +/// JViewModelPropertyInfo.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "ViewModelPropertyInfo.hpp" + +#include "JViewModelPropertyType.hpp" +#include "ViewModelPropertyType.hpp" +#include + +namespace margelo::nitro::rive { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ struct "ViewModelPropertyInfo" and the the Kotlin data class "ViewModelPropertyInfo". + */ + struct JViewModelPropertyInfo final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ViewModelPropertyInfo;"; + + public: + /** + * Convert this Java/Kotlin-based struct to the C++ struct ViewModelPropertyInfo by copying all values to C++. + */ + [[maybe_unused]] + [[nodiscard]] + ViewModelPropertyInfo toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldName = clazz->getField("name"); + jni::local_ref name = this->getFieldValue(fieldName); + static const auto fieldType = clazz->getField("type"); + jni::local_ref type = this->getFieldValue(fieldType); + return ViewModelPropertyInfo( + name->toStdString(), + type->toCpp() + ); + } + + public: + /** + * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java. + */ + [[maybe_unused]] + static jni::local_ref fromCpp(const ViewModelPropertyInfo& value) { + using JSignature = JViewModelPropertyInfo(jni::alias_ref, jni::alias_ref); + static const auto clazz = javaClassStatic(); + static const auto create = clazz->getStaticMethod("fromCpp"); + return create( + clazz, + jni::make_jstring(value.name), + JViewModelPropertyType::fromCpp(value.type) + ); + } + }; + +} // namespace margelo::nitro::rive diff --git a/nitrogen/generated/android/c++/JViewModelPropertyType.hpp b/nitrogen/generated/android/c++/JViewModelPropertyType.hpp new file mode 100644 index 00000000..9ef32283 --- /dev/null +++ b/nitrogen/generated/android/c++/JViewModelPropertyType.hpp @@ -0,0 +1,97 @@ +/// +/// JViewModelPropertyType.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#include +#include "ViewModelPropertyType.hpp" + +namespace margelo::nitro::rive { + + using namespace facebook; + + /** + * The C++ JNI bridge between the C++ enum "ViewModelPropertyType" and the the Kotlin enum "ViewModelPropertyType". + */ + struct JViewModelPropertyType final: public jni::JavaClass { + public: + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/rive/ViewModelPropertyType;"; + + public: + /** + * Convert this Java/Kotlin-based enum to the C++ enum ViewModelPropertyType. + */ + [[maybe_unused]] + [[nodiscard]] + ViewModelPropertyType toCpp() const { + static const auto clazz = javaClassStatic(); + static const auto fieldOrdinal = clazz->getField("value"); + int ordinal = this->getFieldValue(fieldOrdinal); + return static_cast(ordinal); + } + + public: + /** + * Create a Java/Kotlin-based enum with the given C++ enum's value. + */ + [[maybe_unused]] + static jni::alias_ref fromCpp(ViewModelPropertyType value) { + static const auto clazz = javaClassStatic(); + switch (value) { + case ViewModelPropertyType::STRING: + static const auto fieldSTRING = clazz->getStaticField("STRING"); + return clazz->getStaticFieldValue(fieldSTRING); + case ViewModelPropertyType::NUMBER: + static const auto fieldNUMBER = clazz->getStaticField("NUMBER"); + return clazz->getStaticFieldValue(fieldNUMBER); + case ViewModelPropertyType::BOOLEAN: + static const auto fieldBOOLEAN = clazz->getStaticField("BOOLEAN"); + return clazz->getStaticFieldValue(fieldBOOLEAN); + case ViewModelPropertyType::NONE: + static const auto fieldNONE = clazz->getStaticField("NONE"); + return clazz->getStaticFieldValue(fieldNONE); + case ViewModelPropertyType::COLOR: + static const auto fieldCOLOR = clazz->getStaticField("COLOR"); + return clazz->getStaticFieldValue(fieldCOLOR); + case ViewModelPropertyType::LIST: + static const auto fieldLIST = clazz->getStaticField("LIST"); + return clazz->getStaticFieldValue(fieldLIST); + case ViewModelPropertyType::ENUM: + static const auto fieldENUM = clazz->getStaticField("ENUM"); + return clazz->getStaticFieldValue(fieldENUM); + case ViewModelPropertyType::TRIGGER: + static const auto fieldTRIGGER = clazz->getStaticField("TRIGGER"); + return clazz->getStaticFieldValue(fieldTRIGGER); + case ViewModelPropertyType::VIEWMODEL: + static const auto fieldVIEWMODEL = clazz->getStaticField("VIEWMODEL"); + return clazz->getStaticFieldValue(fieldVIEWMODEL); + case ViewModelPropertyType::INTEGER: + static const auto fieldINTEGER = clazz->getStaticField("INTEGER"); + return clazz->getStaticFieldValue(fieldINTEGER); + case ViewModelPropertyType::SYMBOLLISTINDEX: + static const auto fieldSYMBOLLISTINDEX = clazz->getStaticField("SYMBOLLISTINDEX"); + return clazz->getStaticFieldValue(fieldSYMBOLLISTINDEX); + case ViewModelPropertyType::ASSETIMAGE: + static const auto fieldASSETIMAGE = clazz->getStaticField("ASSETIMAGE"); + return clazz->getStaticFieldValue(fieldASSETIMAGE); + case ViewModelPropertyType::ARTBOARD: + static const auto fieldARTBOARD = clazz->getStaticField("ARTBOARD"); + return clazz->getStaticFieldValue(fieldARTBOARD); + case ViewModelPropertyType::INPUT: + static const auto fieldINPUT = clazz->getStaticField("INPUT"); + return clazz->getStaticFieldValue(fieldINPUT); + case ViewModelPropertyType::ANY: + static const auto fieldANY = clazz->getStaticField("ANY"); + return clazz->getStaticFieldValue(fieldANY); + default: + std::string stringValue = std::to_string(static_cast(value)); + throw std::invalid_argument("Invalid enum value (" + stringValue + "!"); + } + } + }; + +} // namespace margelo::nitro::rive diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt index dd360e91..3907b537 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelInstanceSpec.kt @@ -31,6 +31,10 @@ abstract class HybridViewModelInstanceSpec: HybridObject() { abstract val instanceName: String // Methods + @DoNotStrip + @Keep + abstract fun getPropertiesAsync(): Promise> + @DoNotStrip @Keep abstract fun numberProperty(path: String): HybridViewModelNumberPropertySpec? diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt index 087a3e82..1e8f63ac 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt @@ -39,6 +39,10 @@ abstract class HybridViewModelSpec: HybridObject() { abstract val modelName: String // Methods + @DoNotStrip + @Keep + abstract fun getPropertiesAsync(): Promise> + @DoNotStrip @Keep abstract fun getPropertyCountAsync(): Promise diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt new file mode 100644 index 00000000..506a8e2f --- /dev/null +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyInfo.kt @@ -0,0 +1,41 @@ +/// +/// ViewModelPropertyInfo.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.rive + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip + + +/** + * Represents the JavaScript object/struct "ViewModelPropertyInfo". + */ +@DoNotStrip +@Keep +data class ViewModelPropertyInfo( + @DoNotStrip + @Keep + val name: String, + @DoNotStrip + @Keep + val type: ViewModelPropertyType +) { + /* primary constructor */ + + companion object { + /** + * Constructor called from C++ + */ + @DoNotStrip + @Keep + @Suppress("unused") + @JvmStatic + private fun fromCpp(name: String, type: ViewModelPropertyType): ViewModelPropertyInfo { + return ViewModelPropertyInfo(name, type) + } + } +} diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyType.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyType.kt new file mode 100644 index 00000000..5840a61e --- /dev/null +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/ViewModelPropertyType.kt @@ -0,0 +1,36 @@ +/// +/// ViewModelPropertyType.kt +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +package com.margelo.nitro.rive + +import androidx.annotation.Keep +import com.facebook.proguard.annotations.DoNotStrip + +/** + * Represents the JavaScript enum/union "ViewModelPropertyType". + */ +@DoNotStrip +@Keep +enum class ViewModelPropertyType(@DoNotStrip @Keep val value: Int) { + STRING(0), + NUMBER(1), + BOOLEAN(2), + NONE(3), + COLOR(4), + LIST(5), + ENUM(6), + TRIGGER(7), + VIEWMODEL(8), + INTEGER(9), + SYMBOLLISTINDEX(10), + ASSETIMAGE(11), + ARTBOARD(12), + INPUT(13), + ANY(14); + + companion object +} diff --git a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp index 414fce11..7e007657 100644 --- a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp +++ b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.cpp @@ -331,6 +331,14 @@ namespace margelo::nitro::rive::bridge::swift { return swiftPart.toUnsafe(); } + // pragma MARK: std::function& /* result */)> + Func_void_std__vector_ViewModelPropertyInfo_ create_Func_void_std__vector_ViewModelPropertyInfo_(void* NON_NULL swiftClosureWrapper) noexcept { + auto swiftClosure = RNRive::Func_void_std__vector_ViewModelPropertyInfo_::fromUnsafe(swiftClosureWrapper); + return [swiftClosure = std::move(swiftClosure)](const std::vector& result) mutable -> void { + swiftClosure.call(result); + }; + } + // pragma MARK: std::function>& /* result */)> Func_void_std__optional_std__shared_ptr_HybridViewModelInstanceSpec__ create_Func_void_std__optional_std__shared_ptr_HybridViewModelInstanceSpec__(void* NON_NULL swiftClosureWrapper) noexcept { auto swiftClosure = RNRive::Func_void_std__optional_std__shared_ptr_HybridViewModelInstanceSpec__::fromUnsafe(swiftClosureWrapper); diff --git a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp index 64cd2eab..3be060dd 100644 --- a/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp +++ b/nitrogen/generated/ios/RNRive-Swift-Cxx-Bridge.hpp @@ -80,6 +80,10 @@ namespace margelo::nitro::rive { struct RiveError; } namespace margelo::nitro::rive { enum class RiveEventType; } // Forward declaration of `UnifiedRiveEvent` to properly resolve imports. namespace margelo::nitro::rive { struct UnifiedRiveEvent; } +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } // Forward declarations of Swift defined types // Forward declaration of `HybridBindableArtboardSpec_cxx` to properly resolve imports. @@ -164,6 +168,8 @@ namespace RNRive { class HybridViewModelTriggerPropertySpec_cxx; } #include "RiveErrorType.hpp" #include "RiveEventType.hpp" #include "UnifiedRiveEvent.hpp" +#include "ViewModelPropertyInfo.hpp" +#include "ViewModelPropertyType.hpp" #include #include #include @@ -1236,6 +1242,51 @@ namespace margelo::nitro::rive::bridge::swift { return Result::withError(error); } + // pragma MARK: std::vector + /** + * Specialized version of `std::vector`. + */ + using std__vector_ViewModelPropertyInfo_ = std::vector; + inline std::vector create_std__vector_ViewModelPropertyInfo_(size_t size) noexcept { + std::vector vector; + vector.reserve(size); + return vector; + } + + // pragma MARK: std::shared_ptr>> + /** + * Specialized version of `std::shared_ptr>>`. + */ + using std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___ = std::shared_ptr>>; + inline std::shared_ptr>> create_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___() noexcept { + return Promise>::create(); + } + inline PromiseHolder> wrap_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___(std::shared_ptr>> promise) noexcept { + return PromiseHolder>(std::move(promise)); + } + + // pragma MARK: std::function& /* result */)> + /** + * Specialized version of `std::function&)>`. + */ + using Func_void_std__vector_ViewModelPropertyInfo_ = std::function& /* result */)>; + /** + * Wrapper class for a `std::function& / * result * /)>`, this can be used from Swift. + */ + class Func_void_std__vector_ViewModelPropertyInfo__Wrapper final { + public: + explicit Func_void_std__vector_ViewModelPropertyInfo__Wrapper(std::function& /* result */)>&& func): _function(std::make_unique& /* result */)>>(std::move(func))) {} + inline void call(std::vector result) const noexcept { + _function->operator()(result); + } + private: + std::unique_ptr& /* result */)>> _function; + } SWIFT_NONCOPYABLE; + Func_void_std__vector_ViewModelPropertyInfo_ create_Func_void_std__vector_ViewModelPropertyInfo_(void* NON_NULL swiftClosureWrapper) noexcept; + inline Func_void_std__vector_ViewModelPropertyInfo__Wrapper wrap_Func_void_std__vector_ViewModelPropertyInfo_(Func_void_std__vector_ViewModelPropertyInfo_ value) noexcept { + return Func_void_std__vector_ViewModelPropertyInfo__Wrapper(std::move(value)); + } + // pragma MARK: std::shared_ptr>>> /** * Specialized version of `std::shared_ptr>>>`. @@ -1270,6 +1321,15 @@ namespace margelo::nitro::rive::bridge::swift { return Func_void_std__optional_std__shared_ptr_HybridViewModelInstanceSpec___Wrapper(std::move(value)); } + // pragma MARK: Result>>> + using Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____ = Result>>>; + inline Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____ create_Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____(const std::shared_ptr>>& value) noexcept { + return Result>>>::withValue(value); + } + inline Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____ create_Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____(const std::exception_ptr& error) noexcept { + return Result>>>::withError(error); + } + // pragma MARK: Result>>>> using Result_std__shared_ptr_Promise_std__optional_std__shared_ptr_HybridViewModelInstanceSpec_____ = Result>>>>; inline Result_std__shared_ptr_Promise_std__optional_std__shared_ptr_HybridViewModelInstanceSpec_____ create_Result_std__shared_ptr_Promise_std__optional_std__shared_ptr_HybridViewModelInstanceSpec_____(const std::shared_ptr>>>& value) noexcept { diff --git a/nitrogen/generated/ios/RNRive-Swift-Cxx-Umbrella.hpp b/nitrogen/generated/ios/RNRive-Swift-Cxx-Umbrella.hpp index 520fe707..a58cf37e 100644 --- a/nitrogen/generated/ios/RNRive-Swift-Cxx-Umbrella.hpp +++ b/nitrogen/generated/ios/RNRive-Swift-Cxx-Umbrella.hpp @@ -80,6 +80,10 @@ namespace margelo::nitro::rive { struct RiveError; } namespace margelo::nitro::rive { enum class RiveEventType; } // Forward declaration of `UnifiedRiveEvent` to properly resolve imports. namespace margelo::nitro::rive { struct UnifiedRiveEvent; } +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } // Include C++ defined types #include "Alignment.hpp" @@ -118,6 +122,8 @@ namespace margelo::nitro::rive { struct UnifiedRiveEvent; } #include "RiveErrorType.hpp" #include "RiveEventType.hpp" #include "UnifiedRiveEvent.hpp" +#include "ViewModelPropertyInfo.hpp" +#include "ViewModelPropertyType.hpp" #include #include #include diff --git a/nitrogen/generated/ios/c++/HybridViewModelInstanceSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridViewModelInstanceSpecSwift.hpp index 1d0e86ff..ecd4fd85 100644 --- a/nitrogen/generated/ios/c++/HybridViewModelInstanceSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridViewModelInstanceSpecSwift.hpp @@ -12,6 +12,10 @@ // Forward declaration of `HybridViewModelInstanceSpec_cxx` to properly resolve imports. namespace RNRive { class HybridViewModelInstanceSpec_cxx; } +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } // Forward declaration of `HybridViewModelNumberPropertySpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelNumberPropertySpec; } // Forward declaration of `HybridViewModelStringPropertySpec` to properly resolve imports. @@ -34,6 +38,10 @@ namespace margelo::nitro::rive { class HybridViewModelArtboardPropertySpec; } namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include "ViewModelPropertyInfo.hpp" +#include +#include +#include "ViewModelPropertyType.hpp" #include #include "HybridViewModelNumberPropertySpec.hpp" #include @@ -46,7 +54,6 @@ namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include "HybridViewModelListPropertySpec.hpp" #include "HybridViewModelArtboardPropertySpec.hpp" #include "HybridViewModelInstanceSpec.hpp" -#include #include "RNRive-Swift-Cxx-Umbrella.hpp" @@ -101,6 +108,14 @@ namespace margelo::nitro::rive { public: // Methods + inline std::shared_ptr>> getPropertiesAsync() override { + auto __result = _swiftPart.getPropertiesAsync(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } inline std::optional> numberProperty(const std::string& path) override { auto __result = _swiftPart.numberProperty(path); if (__result.hasError()) [[unlikely]] { diff --git a/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp index be193603..dabb7f20 100644 --- a/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp @@ -12,11 +12,18 @@ // Forward declaration of `HybridViewModelSpec_cxx` to properly resolve imports. namespace RNRive { class HybridViewModelSpec_cxx; } +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } // Forward declaration of `HybridViewModelInstanceSpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include "ViewModelPropertyInfo.hpp" +#include #include +#include "ViewModelPropertyType.hpp" #include #include "HybridViewModelInstanceSpec.hpp" #include @@ -80,6 +87,14 @@ namespace margelo::nitro::rive { public: // Methods + inline std::shared_ptr>> getPropertiesAsync() override { + auto __result = _swiftPart.getPropertiesAsync(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } inline std::shared_ptr> getPropertyCountAsync() override { auto __result = _swiftPart.getPropertyCountAsync(); if (__result.hasError()) [[unlikely]] { diff --git a/nitrogen/generated/ios/swift/Func_void_std__vector_ViewModelPropertyInfo_.swift b/nitrogen/generated/ios/swift/Func_void_std__vector_ViewModelPropertyInfo_.swift new file mode 100644 index 00000000..d2735035 --- /dev/null +++ b/nitrogen/generated/ios/swift/Func_void_std__vector_ViewModelPropertyInfo_.swift @@ -0,0 +1,46 @@ +/// +/// Func_void_std__vector_ViewModelPropertyInfo_.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Wraps a Swift `(_ value: [ViewModelPropertyInfo]) -> Void` as a class. + * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`. + */ +public final class Func_void_std__vector_ViewModelPropertyInfo_ { + public typealias bridge = margelo.nitro.rive.bridge.swift + + private let closure: (_ value: [ViewModelPropertyInfo]) -> Void + + public init(_ closure: @escaping (_ value: [ViewModelPropertyInfo]) -> Void) { + self.closure = closure + } + + @inline(__always) + public func call(value: bridge.std__vector_ViewModelPropertyInfo_) -> Void { + self.closure(value.map({ __item in __item })) + } + + /** + * Casts this instance to a retained unsafe raw pointer. + * This acquires one additional strong reference on the object! + */ + @inline(__always) + public func toUnsafe() -> UnsafeMutableRawPointer { + return Unmanaged.passRetained(self).toOpaque() + } + + /** + * Casts an unsafe pointer to a `Func_void_std__vector_ViewModelPropertyInfo_`. + * The pointer has to be a retained opaque `Unmanaged`. + * This removes one strong reference from the object! + */ + @inline(__always) + public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_std__vector_ViewModelPropertyInfo_ { + return Unmanaged.fromOpaque(pointer).takeRetainedValue() + } +} diff --git a/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec.swift b/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec.swift index aaa8e9ca..76df4286 100644 --- a/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec.swift +++ b/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec.swift @@ -13,6 +13,7 @@ public protocol HybridViewModelInstanceSpec_protocol: HybridObject { var instanceName: String { get } // Methods + func getPropertiesAsync() throws -> Promise<[ViewModelPropertyInfo]> func numberProperty(path: String) throws -> (any HybridViewModelNumberPropertySpec)? func stringProperty(path: String) throws -> (any HybridViewModelStringPropertySpec)? func booleanProperty(path: String) throws -> (any HybridViewModelBooleanPropertySpec)? diff --git a/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec_cxx.swift index 48fcb568..3f380ede 100644 --- a/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridViewModelInstanceSpec_cxx.swift @@ -129,6 +129,31 @@ open class HybridViewModelInstanceSpec_cxx { } // Methods + @inline(__always) + public final func getPropertiesAsync() -> bridge.Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____ { + do { + let __result = try self.__implementation.getPropertiesAsync() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___ in + let __promise = bridge.create_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___(__promise) + __result + .then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_ViewModelPropertyInfo_ in + var __vector = bridge.create_std__vector_ViewModelPropertyInfo_(__result.count) + for __item in __result { + __vector.push_back(__item) + } + return __vector + }()) }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____(__exceptionPtr) + } + } + @inline(__always) public final func numberProperty(path: std.string) -> bridge.Result_std__optional_std__shared_ptr_HybridViewModelNumberPropertySpec___ { do { diff --git a/nitrogen/generated/ios/swift/HybridViewModelSpec.swift b/nitrogen/generated/ios/swift/HybridViewModelSpec.swift index 0bcb3cc4..dbe38c72 100644 --- a/nitrogen/generated/ios/swift/HybridViewModelSpec.swift +++ b/nitrogen/generated/ios/swift/HybridViewModelSpec.swift @@ -15,6 +15,7 @@ public protocol HybridViewModelSpec_protocol: HybridObject { var modelName: String { get } // Methods + func getPropertiesAsync() throws -> Promise<[ViewModelPropertyInfo]> func getPropertyCountAsync() throws -> Promise func getInstanceCountAsync() throws -> Promise func createInstanceByIndex(index: Double) throws -> (any HybridViewModelInstanceSpec)? diff --git a/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift index c963c12a..05abaa94 100644 --- a/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift @@ -143,6 +143,31 @@ open class HybridViewModelSpec_cxx { } // Methods + @inline(__always) + public final func getPropertiesAsync() -> bridge.Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____ { + do { + let __result = try self.__implementation.getPropertiesAsync() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___ in + let __promise = bridge.create_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo___(__promise) + __result + .then({ __result in __promiseHolder.resolve({ () -> bridge.std__vector_ViewModelPropertyInfo_ in + var __vector = bridge.create_std__vector_ViewModelPropertyInfo_(__result.count) + for __item in __result { + __vector.push_back(__item) + } + return __vector + }()) }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_std__vector_ViewModelPropertyInfo____(__exceptionPtr) + } + } + @inline(__always) public final func getPropertyCountAsync() -> bridge.Result_std__shared_ptr_Promise_double___ { do { diff --git a/nitrogen/generated/ios/swift/ViewModelPropertyInfo.swift b/nitrogen/generated/ios/swift/ViewModelPropertyInfo.swift new file mode 100644 index 00000000..e81a5300 --- /dev/null +++ b/nitrogen/generated/ios/swift/ViewModelPropertyInfo.swift @@ -0,0 +1,34 @@ +/// +/// ViewModelPropertyInfo.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +import NitroModules + +/** + * Represents an instance of `ViewModelPropertyInfo`, backed by a C++ struct. + */ +public typealias ViewModelPropertyInfo = margelo.nitro.rive.ViewModelPropertyInfo + +public extension ViewModelPropertyInfo { + private typealias bridge = margelo.nitro.rive.bridge.swift + + /** + * Create a new instance of `ViewModelPropertyInfo`. + */ + init(name: String, type: ViewModelPropertyType) { + self.init(std.string(name), type) + } + + @inline(__always) + var name: String { + return String(self.__name) + } + + @inline(__always) + var type: ViewModelPropertyType { + return self.__type + } +} diff --git a/nitrogen/generated/ios/swift/ViewModelPropertyType.swift b/nitrogen/generated/ios/swift/ViewModelPropertyType.swift new file mode 100644 index 00000000..9538c3b7 --- /dev/null +++ b/nitrogen/generated/ios/swift/ViewModelPropertyType.swift @@ -0,0 +1,92 @@ +/// +/// ViewModelPropertyType.swift +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +/** + * Represents the JS union `ViewModelPropertyType`, backed by a C++ enum. + */ +public typealias ViewModelPropertyType = margelo.nitro.rive.ViewModelPropertyType + +public extension ViewModelPropertyType { + /** + * Get a ViewModelPropertyType for the given String value, or + * return `nil` if the given value was invalid/unknown. + */ + init?(fromString string: String) { + switch string { + case "string": + self = .string + case "number": + self = .number + case "boolean": + self = .boolean + case "none": + self = .none + case "color": + self = .color + case "list": + self = .list + case "enum": + self = .enum + case "trigger": + self = .trigger + case "viewModel": + self = .viewmodel + case "integer": + self = .integer + case "symbolListIndex": + self = .symbollistindex + case "assetImage": + self = .assetimage + case "artboard": + self = .artboard + case "input": + self = .input + case "any": + self = .any + default: + return nil + } + } + + /** + * Get the String value this ViewModelPropertyType represents. + */ + var stringValue: String { + switch self { + case .string: + return "string" + case .number: + return "number" + case .boolean: + return "boolean" + case .none: + return "none" + case .color: + return "color" + case .list: + return "list" + case .enum: + return "enum" + case .trigger: + return "trigger" + case .viewmodel: + return "viewModel" + case .integer: + return "integer" + case .symbollistindex: + return "symbolListIndex" + case .assetimage: + return "assetImage" + case .artboard: + return "artboard" + case .input: + return "input" + case .any: + return "any" + } + } +} diff --git a/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.cpp b/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.cpp index 961edebf..830eae4b 100644 --- a/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.cpp @@ -15,6 +15,7 @@ namespace margelo::nitro::rive { // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { prototype.registerHybridGetter("instanceName", &HybridViewModelInstanceSpec::getInstanceName); + prototype.registerHybridMethod("getPropertiesAsync", &HybridViewModelInstanceSpec::getPropertiesAsync); prototype.registerHybridMethod("numberProperty", &HybridViewModelInstanceSpec::numberProperty); prototype.registerHybridMethod("stringProperty", &HybridViewModelInstanceSpec::stringProperty); prototype.registerHybridMethod("booleanProperty", &HybridViewModelInstanceSpec::booleanProperty); diff --git a/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.hpp b/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.hpp index 9fa31918..4bc9443e 100644 --- a/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridViewModelInstanceSpec.hpp @@ -13,6 +13,8 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } // Forward declaration of `HybridViewModelNumberPropertySpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelNumberPropertySpec; } // Forward declaration of `HybridViewModelStringPropertySpec` to properly resolve imports. @@ -35,6 +37,9 @@ namespace margelo::nitro::rive { class HybridViewModelArtboardPropertySpec; } namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include "ViewModelPropertyInfo.hpp" +#include +#include #include #include "HybridViewModelNumberPropertySpec.hpp" #include @@ -47,7 +52,6 @@ namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include "HybridViewModelListPropertySpec.hpp" #include "HybridViewModelArtboardPropertySpec.hpp" #include "HybridViewModelInstanceSpec.hpp" -#include namespace margelo::nitro::rive { @@ -80,6 +84,7 @@ namespace margelo::nitro::rive { public: // Methods + virtual std::shared_ptr>> getPropertiesAsync() = 0; virtual std::optional> numberProperty(const std::string& path) = 0; virtual std::optional> stringProperty(const std::string& path) = 0; virtual std::optional> booleanProperty(const std::string& path) = 0; diff --git a/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp b/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp index f6605533..17b7631e 100644 --- a/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp @@ -17,6 +17,7 @@ namespace margelo::nitro::rive { prototype.registerHybridGetter("propertyCount", &HybridViewModelSpec::getPropertyCount); prototype.registerHybridGetter("instanceCount", &HybridViewModelSpec::getInstanceCount); prototype.registerHybridGetter("modelName", &HybridViewModelSpec::getModelName); + prototype.registerHybridMethod("getPropertiesAsync", &HybridViewModelSpec::getPropertiesAsync); prototype.registerHybridMethod("getPropertyCountAsync", &HybridViewModelSpec::getPropertyCountAsync); prototype.registerHybridMethod("getInstanceCountAsync", &HybridViewModelSpec::getInstanceCountAsync); prototype.registerHybridMethod("createInstanceByIndex", &HybridViewModelSpec::createInstanceByIndex); diff --git a/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp b/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp index 5564cc5c..34d39eb4 100644 --- a/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp @@ -13,10 +13,14 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif +// Forward declaration of `ViewModelPropertyInfo` to properly resolve imports. +namespace margelo::nitro::rive { struct ViewModelPropertyInfo; } // Forward declaration of `HybridViewModelInstanceSpec` to properly resolve imports. namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include "ViewModelPropertyInfo.hpp" +#include #include #include #include "HybridViewModelInstanceSpec.hpp" @@ -55,6 +59,7 @@ namespace margelo::nitro::rive { public: // Methods + virtual std::shared_ptr>> getPropertiesAsync() = 0; virtual std::shared_ptr> getPropertyCountAsync() = 0; virtual std::shared_ptr> getInstanceCountAsync() = 0; virtual std::optional> createInstanceByIndex(double index) = 0; diff --git a/nitrogen/generated/shared/c++/ViewModelPropertyInfo.hpp b/nitrogen/generated/shared/c++/ViewModelPropertyInfo.hpp new file mode 100644 index 00000000..13116f43 --- /dev/null +++ b/nitrogen/generated/shared/c++/ViewModelPropertyInfo.hpp @@ -0,0 +1,89 @@ +/// +/// ViewModelPropertyInfo.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +// Forward declaration of `ViewModelPropertyType` to properly resolve imports. +namespace margelo::nitro::rive { enum class ViewModelPropertyType; } + +#include +#include "ViewModelPropertyType.hpp" + +namespace margelo::nitro::rive { + + /** + * A struct which can be represented as a JavaScript object (ViewModelPropertyInfo). + */ + struct ViewModelPropertyInfo final { + public: + std::string name SWIFT_PRIVATE; + ViewModelPropertyType type SWIFT_PRIVATE; + + public: + ViewModelPropertyInfo() = default; + explicit ViewModelPropertyInfo(std::string name, ViewModelPropertyType type): name(name), type(type) {} + + public: + friend bool operator==(const ViewModelPropertyInfo& lhs, const ViewModelPropertyInfo& rhs) = default; + }; + +} // namespace margelo::nitro::rive + +namespace margelo::nitro { + + // C++ ViewModelPropertyInfo <> JS ViewModelPropertyInfo (object) + template <> + struct JSIConverter final { + static inline margelo::nitro::rive::ViewModelPropertyInfo fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + jsi::Object obj = arg.asObject(runtime); + return margelo::nitro::rive::ViewModelPropertyInfo( + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "name"))), + JSIConverter::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "type"))) + ); + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::rive::ViewModelPropertyInfo& arg) { + jsi::Object obj(runtime); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "name"), JSIConverter::toJSI(runtime, arg.name)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "type"), JSIConverter::toJSI(runtime, arg.type)); + return obj; + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isObject()) { + return false; + } + jsi::Object obj = value.getObject(runtime); + if (!nitro::isPlainObject(runtime, obj)) { + return false; + } + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "name")))) return false; + if (!JSIConverter::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "type")))) return false; + return true; + } + }; + +} // namespace margelo::nitro diff --git a/nitrogen/generated/shared/c++/ViewModelPropertyType.hpp b/nitrogen/generated/shared/c++/ViewModelPropertyType.hpp new file mode 100644 index 00000000..09dfd55e --- /dev/null +++ b/nitrogen/generated/shared/c++/ViewModelPropertyType.hpp @@ -0,0 +1,128 @@ +/// +/// ViewModelPropertyType.hpp +/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. +/// https://github.com/mrousavy/nitro +/// Copyright © Marc Rousavy @ Margelo +/// + +#pragma once + +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif +#if __has_include() +#include +#else +#error NitroModules cannot be found! Are you sure you installed NitroModules properly? +#endif + +namespace margelo::nitro::rive { + + /** + * An enum which can be represented as a JavaScript union (ViewModelPropertyType). + */ + enum class ViewModelPropertyType { + STRING SWIFT_NAME(string) = 0, + NUMBER SWIFT_NAME(number) = 1, + BOOLEAN SWIFT_NAME(boolean) = 2, + NONE SWIFT_NAME(none) = 3, + COLOR SWIFT_NAME(color) = 4, + LIST SWIFT_NAME(list) = 5, + ENUM SWIFT_NAME(enum) = 6, + TRIGGER SWIFT_NAME(trigger) = 7, + VIEWMODEL SWIFT_NAME(viewmodel) = 8, + INTEGER SWIFT_NAME(integer) = 9, + SYMBOLLISTINDEX SWIFT_NAME(symbollistindex) = 10, + ASSETIMAGE SWIFT_NAME(assetimage) = 11, + ARTBOARD SWIFT_NAME(artboard) = 12, + INPUT SWIFT_NAME(input) = 13, + ANY SWIFT_NAME(any) = 14, + } CLOSED_ENUM; + +} // namespace margelo::nitro::rive + +namespace margelo::nitro { + + // C++ ViewModelPropertyType <> JS ViewModelPropertyType (union) + template <> + struct JSIConverter final { + static inline margelo::nitro::rive::ViewModelPropertyType fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { + std::string unionValue = JSIConverter::fromJSI(runtime, arg); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("string"): return margelo::nitro::rive::ViewModelPropertyType::STRING; + case hashString("number"): return margelo::nitro::rive::ViewModelPropertyType::NUMBER; + case hashString("boolean"): return margelo::nitro::rive::ViewModelPropertyType::BOOLEAN; + case hashString("none"): return margelo::nitro::rive::ViewModelPropertyType::NONE; + case hashString("color"): return margelo::nitro::rive::ViewModelPropertyType::COLOR; + case hashString("list"): return margelo::nitro::rive::ViewModelPropertyType::LIST; + case hashString("enum"): return margelo::nitro::rive::ViewModelPropertyType::ENUM; + case hashString("trigger"): return margelo::nitro::rive::ViewModelPropertyType::TRIGGER; + case hashString("viewModel"): return margelo::nitro::rive::ViewModelPropertyType::VIEWMODEL; + case hashString("integer"): return margelo::nitro::rive::ViewModelPropertyType::INTEGER; + case hashString("symbolListIndex"): return margelo::nitro::rive::ViewModelPropertyType::SYMBOLLISTINDEX; + case hashString("assetImage"): return margelo::nitro::rive::ViewModelPropertyType::ASSETIMAGE; + case hashString("artboard"): return margelo::nitro::rive::ViewModelPropertyType::ARTBOARD; + case hashString("input"): return margelo::nitro::rive::ViewModelPropertyType::INPUT; + case hashString("any"): return margelo::nitro::rive::ViewModelPropertyType::ANY; + default: [[unlikely]] + throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum ViewModelPropertyType - invalid value!"); + } + } + static inline jsi::Value toJSI(jsi::Runtime& runtime, margelo::nitro::rive::ViewModelPropertyType arg) { + switch (arg) { + case margelo::nitro::rive::ViewModelPropertyType::STRING: return JSIConverter::toJSI(runtime, "string"); + case margelo::nitro::rive::ViewModelPropertyType::NUMBER: return JSIConverter::toJSI(runtime, "number"); + case margelo::nitro::rive::ViewModelPropertyType::BOOLEAN: return JSIConverter::toJSI(runtime, "boolean"); + case margelo::nitro::rive::ViewModelPropertyType::NONE: return JSIConverter::toJSI(runtime, "none"); + case margelo::nitro::rive::ViewModelPropertyType::COLOR: return JSIConverter::toJSI(runtime, "color"); + case margelo::nitro::rive::ViewModelPropertyType::LIST: return JSIConverter::toJSI(runtime, "list"); + case margelo::nitro::rive::ViewModelPropertyType::ENUM: return JSIConverter::toJSI(runtime, "enum"); + case margelo::nitro::rive::ViewModelPropertyType::TRIGGER: return JSIConverter::toJSI(runtime, "trigger"); + case margelo::nitro::rive::ViewModelPropertyType::VIEWMODEL: return JSIConverter::toJSI(runtime, "viewModel"); + case margelo::nitro::rive::ViewModelPropertyType::INTEGER: return JSIConverter::toJSI(runtime, "integer"); + case margelo::nitro::rive::ViewModelPropertyType::SYMBOLLISTINDEX: return JSIConverter::toJSI(runtime, "symbolListIndex"); + case margelo::nitro::rive::ViewModelPropertyType::ASSETIMAGE: return JSIConverter::toJSI(runtime, "assetImage"); + case margelo::nitro::rive::ViewModelPropertyType::ARTBOARD: return JSIConverter::toJSI(runtime, "artboard"); + case margelo::nitro::rive::ViewModelPropertyType::INPUT: return JSIConverter::toJSI(runtime, "input"); + case margelo::nitro::rive::ViewModelPropertyType::ANY: return JSIConverter::toJSI(runtime, "any"); + default: [[unlikely]] + throw std::invalid_argument("Cannot convert ViewModelPropertyType to JS - invalid value: " + + std::to_string(static_cast(arg)) + "!"); + } + } + static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { + if (!value.isString()) { + return false; + } + std::string unionValue = JSIConverter::fromJSI(runtime, value); + switch (hashString(unionValue.c_str(), unionValue.size())) { + case hashString("string"): + case hashString("number"): + case hashString("boolean"): + case hashString("none"): + case hashString("color"): + case hashString("list"): + case hashString("enum"): + case hashString("trigger"): + case hashString("viewModel"): + case hashString("integer"): + case hashString("symbolListIndex"): + case hashString("assetImage"): + case hashString("artboard"): + case hashString("input"): + case hashString("any"): + return true; + default: + return false; + } + } + }; + +} // namespace margelo::nitro diff --git a/src/index.tsx b/src/index.tsx index d1e5d126..062b44ce 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -32,6 +32,8 @@ export type { ViewModelImageProperty, ViewModelListProperty, ViewModelArtboardProperty, + ViewModelPropertyType, + ViewModelPropertyInfo, } from './specs/ViewModel.nitro'; export type { BindableArtboard } from './specs/BindableArtboard.nitro'; export { Fit } from './core/Fit'; diff --git a/src/specs/ViewModel.nitro.ts b/src/specs/ViewModel.nitro.ts index 8ef459d4..a90577ad 100644 --- a/src/specs/ViewModel.nitro.ts +++ b/src/specs/ViewModel.nitro.ts @@ -2,6 +2,28 @@ import type { HybridObject } from 'react-native-nitro-modules'; import type { RiveImage } from './RiveImage.nitro'; import type { BindableArtboard } from './BindableArtboard.nitro'; +export type ViewModelPropertyType = + | 'none' + | 'string' + | 'number' + | 'boolean' + | 'color' + | 'list' + | 'enum' + | 'trigger' + | 'viewModel' + | 'integer' + | 'symbolListIndex' + | 'assetImage' + | 'artboard' + | 'input' + | 'any'; + +export interface ViewModelPropertyInfo { + readonly name: string; + readonly type: ViewModelPropertyType; +} + /** * A Rive View Model as created in the Rive editor. * @see {@link https://rive.app/docs/runtimes/data-binding Rive Data Binding Documentation} @@ -14,6 +36,8 @@ export interface ViewModel readonly instanceCount: number; /** The name of the view model */ readonly modelName: string; + /** All properties defined on this view model */ + getPropertiesAsync(): Promise; /** The number of properties in the view model */ getPropertyCountAsync(): Promise; /** The number of view model instances in the view model */ @@ -46,6 +70,8 @@ export interface ViewModelInstance extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { /** The name of the view model instance */ readonly instanceName: string; + /** All properties available on this view model instance */ + getPropertiesAsync(): Promise; /** Get a number property from the view model instance at the given path */ numberProperty(path: string): ViewModelNumberProperty | undefined; diff --git a/yarn.lock b/yarn.lock index f1ef36b1..6d507750 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3147,17 +3147,17 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:30.2.0": - version: 30.2.0 - resolution: "@jest/console@npm:30.2.0" +"@jest/console@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/console@npm:30.4.1" dependencies: - "@jest/types": 30.2.0 + "@jest/types": 30.4.1 "@types/node": "*" chalk: ^4.1.2 - jest-message-util: 30.2.0 - jest-util: 30.2.0 + jest-message-util: 30.4.1 + jest-util: 30.4.1 slash: ^3.0.0 - checksum: 624645c28946c06a5ae6d225fade5c60ecb2bbdb7717d18cf5355ecba967e455f579d0d964a8fbf17de7e2e6dc02382d538ed109075b96d5717637dcc94d309d + checksum: 21d179fb96a17a622b1b15c3d2ced4c83ae9b3912012505e4720701383f8e0e0d32c41b4c6adeeaaadd193b821d5759425cd1a774ba8ab4924213f218bd50125 languageName: node linkType: hard @@ -3296,13 +3296,13 @@ __metadata: languageName: node linkType: hard -"@jest/pattern@npm:30.0.1": - version: 30.0.1 - resolution: "@jest/pattern@npm:30.0.1" +"@jest/pattern@npm:30.4.0": + version: 30.4.0 + resolution: "@jest/pattern@npm:30.4.0" dependencies: "@types/node": "*" - jest-regex-util: 30.0.1 - checksum: 1a1857df19be87e714786c3ab36862702bf8ed1e2665044b2ce5ffa787b5ab74c876f1756e83d3b09737dd98c1e980e259059b65b9b0f49b03716634463a8f9e + jest-regex-util: 30.4.0 + checksum: d0877dc7034cb59e9eafb8fedd6b977a1cd91191d7ac2574c0c0d046074ef7c895f0952af1586898469dcceb0153230a32b67a45bc4dd1ee2ae66df371b95363 languageName: node linkType: hard @@ -3352,6 +3352,15 @@ __metadata: languageName: node linkType: hard +"@jest/schemas@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/schemas@npm:30.4.1" + dependencies: + "@sinclair/typebox": ^0.34.0 + checksum: 25d0db478805adff276e02f9e1b5a90d5962e51020503eede22edee432de3958654edddca0e66988c515fa7bc06461f5220826de9f76fcc89c5824e88d624842 + languageName: node + linkType: hard + "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -3385,14 +3394,14 @@ __metadata: linkType: hard "@jest/test-result@npm:^30.2.0": - version: 30.2.0 - resolution: "@jest/test-result@npm:30.2.0" + version: 30.4.1 + resolution: "@jest/test-result@npm:30.4.1" dependencies: - "@jest/console": 30.2.0 - "@jest/types": 30.2.0 + "@jest/console": 30.4.1 + "@jest/types": 30.4.1 "@types/istanbul-lib-coverage": ^2.0.6 collect-v8-coverage: ^1.0.2 - checksum: 75151d0dc93a4adbf5e8c6309c5c8913698493357c840f7d112c0be2162846f753ac654377567737102ec8e2f6d458238a98d58aa2348959bd345da5aaab15b1 + checksum: 2db40181451f21b7dcc8295fb132a1172dd7487a1d63bf105263225bec2a0d973f764b0a424f9b5a2db2ceb9d0f507c27261834bb1867d5e3eecd9e6c824243c languageName: node linkType: hard @@ -3431,18 +3440,18 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:30.2.0": - version: 30.2.0 - resolution: "@jest/types@npm:30.2.0" +"@jest/types@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/types@npm:30.4.1" dependencies: - "@jest/pattern": 30.0.1 - "@jest/schemas": 30.0.5 + "@jest/pattern": 30.4.0 + "@jest/schemas": 30.4.1 "@types/istanbul-lib-coverage": ^2.0.6 "@types/istanbul-reports": ^3.0.4 "@types/node": "*" "@types/yargs": ^17.0.33 chalk: ^4.1.2 - checksum: e92a2c954f0e1e2703b16632c79428c50c891e50434b682234f310b9f0d292ae5a5da49ae625249f5103cbe34f7a396dfc8237edf5b73f7fe70b57d6295fa01b + checksum: 746fbb96609c8cc2638a59b23e1d0e590527a301909a22728bc6dab35593ec967f45664fbd00b51fb48a53934d9be2f5df625db7a741c5caae734746d7b41046 languageName: node linkType: hard @@ -7643,13 +7652,20 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.1.0, ci-info@npm:^4.2.0": +"ci-info@npm:^4.1.0": version: 4.3.1 resolution: "ci-info@npm:4.3.1" checksum: 66c159d92648e8a07acab0a3a0681bff6ccc39aa44916263208c4d97bbbeedbbc886d7611fd30c21df1aa624ce3c6fcdfde982e74689e3e014e064e1d0805f94 languageName: node linkType: hard +"ci-info@npm:^4.2.0": + version: 4.4.0 + resolution: "ci-info@npm:4.4.0" + checksum: 3418954c9ca192d4ab7f88637835f8463a327dfcb1d9fdd2434f0aba2715d8b2b0e79fd1a4297cc4a35efc5728f8fd74f3b31cb741c948469a4c07dfe8df3675 + languageName: node + linkType: hard + "cjs-module-lexer@npm:^1.0.0": version: 1.4.3 resolution: "cjs-module-lexer@npm:1.4.3" @@ -12542,20 +12558,21 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:30.2.0, jest-message-util@npm:^30.2.0": - version: 30.2.0 - resolution: "jest-message-util@npm:30.2.0" +"jest-message-util@npm:30.4.1, jest-message-util@npm:^30.2.0": + version: 30.4.1 + resolution: "jest-message-util@npm:30.4.1" dependencies: "@babel/code-frame": ^7.27.1 - "@jest/types": 30.2.0 + "@jest/types": 30.4.1 "@types/stack-utils": ^2.0.3 chalk: ^4.1.2 graceful-fs: ^4.2.11 - micromatch: ^4.0.8 - pretty-format: 30.2.0 + jest-util: 30.4.1 + picomatch: ^4.0.3 + pretty-format: 30.4.1 slash: ^3.0.0 stack-utils: ^2.0.6 - checksum: e1e2df36f77fc5245506ca304a8a558dea997aced255b3fdf1bc4be8807c837ab3f5f29b95a3c3e0d6ff9121109939319891f445cbacd9e8c23e6160f107b483 + checksum: 0361571c976e046d19569fa4d4617d1ef5926ed81710212869888059c5dd98ca13e77af2260fad2e756fe7041e1cf10f192cc0c38594b360643075dd42fa61c6 languageName: node linkType: hard @@ -12599,10 +12616,10 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:30.0.1": - version: 30.0.1 - resolution: "jest-regex-util@npm:30.0.1" - checksum: fa8dac80c3e94db20d5e1e51d1bdf101cf5ede8f4e0b8f395ba8b8ea81e71804ffd747452a6bb6413032865de98ac656ef8ae43eddd18d980b6442a2764ed562 +"jest-regex-util@npm:30.4.0": + version: 30.4.0 + resolution: "jest-regex-util@npm:30.4.0" + checksum: 8664fcc1d07c8236a3bd012c0f06ae9d14d96e758b32ee340a3a7c4c326d0b5052d8c4ae4f4c4184f08bf78723d905352f22923647df9658ace3604f03bf074f languageName: node linkType: hard @@ -12727,17 +12744,17 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:30.2.0, jest-util@npm:^30.2.0": - version: 30.2.0 - resolution: "jest-util@npm:30.2.0" +"jest-util@npm:30.4.1, jest-util@npm:^30.2.0": + version: 30.4.1 + resolution: "jest-util@npm:30.4.1" dependencies: - "@jest/types": 30.2.0 + "@jest/types": 30.4.1 "@types/node": "*" chalk: ^4.1.2 ci-info: ^4.2.0 graceful-fs: ^4.2.11 - picomatch: ^4.0.2 - checksum: 58d22fc71f1bd3926766dbbefca1292401127e6a2e2c369965f941c525a63e01f349ddd94d1e3fbd3670907a02bbe93b333cf3ed95bc830d28ecdafb3560f535 + picomatch: ^4.0.3 + checksum: 5b1b3e5cca87151f31dc9636a74ef2e78823f0bcd7e636a1bdc3e57645bf5970c01ff476db9156dea198984bd67415520c068bc5b3eddd464a2e6e9696308ecf languageName: node linkType: hard @@ -15412,11 +15429,11 @@ __metadata: linkType: hard "p-limit@npm:^7.1.1": - version: 7.2.0 - resolution: "p-limit@npm:7.2.0" + version: 7.3.0 + resolution: "p-limit@npm:7.3.0" dependencies: yocto-queue: ^1.2.1 - checksum: 6e9e5cc3e9fb41745e566cd16d02ac9f3a88e116f5c2df79b8a5e575e94aa8f3b8135b2de598116b31ea187b5d05b07d112094cc79bf085dfaa3deaa2afa9d15 + checksum: bd3f3487ec84401e2cbf243122eef11813edacb621a27808e60a425646d0e75a79514acc2c01e39c41911550dbae5ef0f0ab01caa61cfc1c541cd17a19e8f01b languageName: node linkType: hard @@ -15704,7 +15721,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": +"picomatch@npm:^4.0.3": version: 4.0.3 resolution: "picomatch@npm:4.0.3" checksum: 6817fb74eb745a71445debe1029768de55fd59a42b75606f478ee1d0dc1aa6e78b711d041a7c9d5550e042642029b7f373dc1a43b224c4b7f12d23436735dba0 @@ -15831,6 +15848,18 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:30.4.1": + version: 30.4.1 + resolution: "pretty-format@npm:30.4.1" + dependencies: + "@jest/schemas": 30.4.1 + ansi-styles: ^5.2.0 + react-is-18: "npm:react-is@^18.3.1" + react-is-19: "npm:react-is@^19.2.5" + checksum: 9602635027892d7a2f430b0a51972780226d30ce4072643349ad376ccee967539eb8180a656976976c0673d550604847da638b992eefc95c84bab7cebdf9faba + languageName: node + linkType: hard + "pretty-format@npm:^26.6.2": version: 26.6.2 resolution: "pretty-format@npm:26.6.2" @@ -16139,6 +16168,20 @@ __metadata: languageName: node linkType: hard +"react-is-18@npm:react-is@^18.3.1, react-is@npm:^18.0.0, react-is@npm:^18.3.1": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 + languageName: node + linkType: hard + +"react-is-19@npm:react-is@^19.2.5": + version: 19.2.6 + resolution: "react-is@npm:19.2.6" + checksum: aad99621b2e5c47ea715ab719a3caae60b6d2be828374dc5ad663372f4603ab26bde5f0c9f3efd6107ed9152dfff5f8f3df044121967a3280e00796e4c560635 + languageName: node + linkType: hard + "react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -16153,13 +16196,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0, react-is@npm:^18.3.1": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 - languageName: node - linkType: hard - "react-is@npm:^19.0.0, react-is@npm:^19.1.0": version: 19.2.0 resolution: "react-is@npm:19.2.0" @@ -18254,9 +18290,9 @@ __metadata: linkType: hard "tinyrainbow@npm:^3.0.3": - version: 3.0.3 - resolution: "tinyrainbow@npm:3.0.3" - checksum: e1de26bd599703a6ee5c69e8b66384fa1ef05b26cbb005ad438169f1858d199c98946fb5ec4b7862313bfcf9affd9fb8aaf8c0a42cc953acba8bbcbe739b016c + version: 3.1.0 + resolution: "tinyrainbow@npm:3.1.0" + checksum: dbb16b4aa5dc7398d2501c6ee216471b01f5f1a3c372233113254625d190b08eb2cfb532f1bb46d2cce7deb1bc3d418945949898b7f95e32e09167f5c797cf0a languageName: node linkType: hard @@ -19530,8 +19566,8 @@ __metadata: linkType: hard "zustand@npm:^5.0.5": - version: 5.0.10 - resolution: "zustand@npm:5.0.10" + version: 5.0.13 + resolution: "zustand@npm:5.0.13" peerDependencies: "@types/react": ">=18.0.0" immer: ">=9.0.6" @@ -19546,6 +19582,6 @@ __metadata: optional: true use-sync-external-store: optional: true - checksum: 52d39ad5a0a496a443ced50e773a47df4bda4f718c96e45a08c92675e45d7ac77ce75903b8e3754f17a2e99c71f5864ae8c2b2477aeb4c6f5c2a19e3e64e57ba + checksum: 37f9c1eb888fc6c570f80a182a54844752ffe05dca75356273038effad642892df3a839f16733636a2dd4a49f68c02be27a37b9ba767af03515ef1f8d97468de languageName: node linkType: hard