diff --git a/.gitignore b/.gitignore index 67f3212..b8ae22f 100644 --- a/.gitignore +++ b/.gitignore @@ -78,9 +78,5 @@ android/keystores/debug.keystore # generated by bob lib/ -# React Native Codegen -ios/generated -android/generated - # React Native Nitro Modules nitrogen/ diff --git a/README.md b/README.md index 62dae37..7944679 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,14 @@ Try the benchmarks in the [example](./example) app. npm install react-native-quick-base64 ``` +> [!IMPORTANT] +> **Requires the New Architecture.** Version `3.0.0`+ is a pure C++ TurboModule and only registers when the app runs with React Native's New Architecture enabled: +> +> - Bare React Native: `newArchEnabled=true` (default on RN 0.76+; forced on 0.85+). +> - Expo: SDK 54+ (New Architecture is default), or SDK 53 with New Architecture explicitly enabled. +> +> On the Old Architecture you'll get `TurboModuleRegistry.getEnforcing(...): 'QuickBase64' could not be found`. Enable the New Architecture and rebuild (`cd android && ./gradlew clean`), or pin `react-native-quick-base64@2.2.2` to stay on the Old Architecture. + --- This module installs its native bindings automatically. diff --git a/android/generated/java/com/quickbase64/NativeQuickBase64Spec.java b/android/generated/java/com/quickbase64/NativeQuickBase64Spec.java new file mode 100644 index 0000000..ab78eac --- /dev/null +++ b/android/generated/java/com/quickbase64/NativeQuickBase64Spec.java @@ -0,0 +1,43 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJavaSpec.js + * + * @nolint + */ + +package com.quickbase64; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeQuickBase64Spec extends ReactContextBaseJavaModule implements TurboModule { + public static final String NAME = "QuickBase64"; + + public NativeQuickBase64Spec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod(isBlockingSynchronousMethod = true) + @DoNotStrip + public abstract String base64FromArrayBuffer(ReadableMap buf, boolean urlSafe); + + @ReactMethod(isBlockingSynchronousMethod = true) + @DoNotStrip + public abstract WritableMap base64ToArrayBuffer(String b64, boolean removeLinebreaks); +} diff --git a/android/generated/jni/CMakeLists.txt b/android/generated/jni/CMakeLists.txt new file mode 100644 index 0000000..0c27f37 --- /dev/null +++ b/android/generated/jni/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) Meta Platforms, Inc. and affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE on) + +file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/QuickBase64Spec/*.cpp) + +add_library( + react_codegen_QuickBase64Spec + OBJECT + ${react_codegen_SRCS} +) + +target_include_directories(react_codegen_QuickBase64Spec PUBLIC . react/renderer/components/QuickBase64Spec) + +target_link_libraries( + react_codegen_QuickBase64Spec + fbjni + jsi + # We need to link different libraries based on whether we are building rncore or not, that's necessary + # because we want to break a circular dependency between react_codegen_rncore and reactnative + reactnative +) + +target_compile_reactnative_options(react_codegen_QuickBase64Spec PRIVATE) diff --git a/android/generated/jni/QuickBase64Spec-generated.cpp b/android/generated/jni/QuickBase64Spec-generated.cpp new file mode 100644 index 0000000..fe14eca --- /dev/null +++ b/android/generated/jni/QuickBase64Spec-generated.cpp @@ -0,0 +1,38 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniCpp.js + */ + +#include "QuickBase64Spec.h" + +namespace facebook::react { + +static facebook::jsi::Value __hostFunction_NativeQuickBase64SpecJSI_base64FromArrayBuffer(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, StringKind, "base64FromArrayBuffer", "(Lcom/facebook/react/bridge/ReadableMap;Z)Ljava/lang/String;", args, count, cachedMethodId); +} + +static facebook::jsi::Value __hostFunction_NativeQuickBase64SpecJSI_base64ToArrayBuffer(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule).invokeJavaMethod(rt, ObjectKind, "base64ToArrayBuffer", "(Ljava/lang/String;Z)Lcom/facebook/react/bridge/WritableMap;", args, count, cachedMethodId); +} + +NativeQuickBase64SpecJSI::NativeQuickBase64SpecJSI(const JavaTurboModule::InitParams ¶ms) + : JavaTurboModule(params) { + methodMap_["base64FromArrayBuffer"] = MethodMetadata {2, __hostFunction_NativeQuickBase64SpecJSI_base64FromArrayBuffer}; + methodMap_["base64ToArrayBuffer"] = MethodMetadata {2, __hostFunction_NativeQuickBase64SpecJSI_base64ToArrayBuffer}; +} + +std::shared_ptr QuickBase64Spec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + if (moduleName == "QuickBase64") { + return std::make_shared(params); + } + return nullptr; +} + +} // namespace facebook::react diff --git a/android/generated/jni/QuickBase64Spec.h b/android/generated/jni/QuickBase64Spec.h new file mode 100644 index 0000000..3803c5c --- /dev/null +++ b/android/generated/jni/QuickBase64Spec.h @@ -0,0 +1,31 @@ + +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleJniH.js + */ + +#pragma once + +#include +#include +#include + +namespace facebook::react { + +/** + * JNI C++ class for module 'NativeQuickBase64' + */ +class JSI_EXPORT NativeQuickBase64SpecJSI : public JavaTurboModule { +public: + NativeQuickBase64SpecJSI(const JavaTurboModule::InitParams ¶ms); +}; + + +JSI_EXPORT +std::shared_ptr QuickBase64Spec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace facebook::react diff --git a/android/generated/jni/react/renderer/components/QuickBase64Spec/QuickBase64SpecJSI.h b/android/generated/jni/react/renderer/components/QuickBase64Spec/QuickBase64SpecJSI.h new file mode 100644 index 0000000..dfcf43f --- /dev/null +++ b/android/generated/jni/react/renderer/components/QuickBase64Spec/QuickBase64SpecJSI.h @@ -0,0 +1,49 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + +template +class JSI_EXPORT NativeQuickBase64CxxSpec : public TurboModule { +public: + static constexpr std::string_view kModuleName = "QuickBase64"; + +protected: + NativeQuickBase64CxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeQuickBase64CxxSpec::kModuleName}, jsInvoker) { + methodMap_["base64FromArrayBuffer"] = MethodMetadata {.argCount = 2, .invoker = __base64FromArrayBuffer}; + methodMap_["base64ToArrayBuffer"] = MethodMetadata {.argCount = 2, .invoker = __base64ToArrayBuffer}; + } + +private: + static jsi::Value __base64FromArrayBuffer(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_assert( + bridging::getParameterCount(&T::base64FromArrayBuffer) == 3, + "Expected base64FromArrayBuffer(...) to have 3 parameters"); + return bridging::callFromJs(rt, &T::base64FromArrayBuffer, static_cast(&turboModule)->jsInvoker_, static_cast(&turboModule), + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool()); + } + + static jsi::Value __base64ToArrayBuffer(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_assert( + bridging::getParameterCount(&T::base64ToArrayBuffer) == 3, + "Expected base64ToArrayBuffer(...) to have 3 parameters"); + return bridging::callFromJs(rt, &T::base64ToArrayBuffer, static_cast(&turboModule)->jsInvoker_, static_cast(&turboModule), + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool()); + } +}; + +} // namespace facebook::react diff --git a/ios/generated/ReactCodegen/QuickBase64Spec/QuickBase64Spec-generated.mm b/ios/generated/ReactCodegen/QuickBase64Spec/QuickBase64Spec-generated.mm new file mode 100644 index 0000000..ab562ec --- /dev/null +++ b/ios/generated/ReactCodegen/QuickBase64Spec/QuickBase64Spec-generated.mm @@ -0,0 +1,46 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#import "QuickBase64Spec.h" + + +@implementation NativeQuickBase64SpecBase + + +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper +{ + _eventEmitterCallback = std::move(eventEmitterCallbackWrapper->_eventEmitterCallback); +} +@end + + +namespace facebook::react { + + static facebook::jsi::Value __hostFunction_NativeQuickBase64SpecJSI_base64FromArrayBuffer(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, StringKind, "base64FromArrayBuffer", @selector(base64FromArrayBuffer:urlSafe:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeQuickBase64SpecJSI_base64ToArrayBuffer(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, ObjectKind, "base64ToArrayBuffer", @selector(base64ToArrayBuffer:removeLinebreaks:), args, count); + } + + NativeQuickBase64SpecJSI::NativeQuickBase64SpecJSI(const ObjCTurboModule::InitParams ¶ms) + : ObjCTurboModule(params) { + + methodMap_["base64FromArrayBuffer"] = MethodMetadata {2, __hostFunction_NativeQuickBase64SpecJSI_base64FromArrayBuffer}; + + + methodMap_["base64ToArrayBuffer"] = MethodMetadata {2, __hostFunction_NativeQuickBase64SpecJSI_base64ToArrayBuffer}; + + } +} // namespace facebook::react diff --git a/ios/generated/ReactCodegen/QuickBase64Spec/QuickBase64Spec.h b/ios/generated/ReactCodegen/QuickBase64Spec/QuickBase64Spec.h new file mode 100644 index 0000000..751bfd9 --- /dev/null +++ b/ios/generated/ReactCodegen/QuickBase64Spec/QuickBase64Spec.h @@ -0,0 +1,65 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleObjCpp + * + * We create an umbrella header (and corresponding implementation) here since + * Cxx compilation in BUCK has a limitation: source-code producing genrule()s + * must have a single output. More files => more genrule()s => slower builds. + */ + +#ifndef __cplusplus +#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm. +#endif + +// Avoid multiple includes of QuickBase64Spec symbols +#ifndef QuickBase64Spec_H +#define QuickBase64Spec_H + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + + +NS_ASSUME_NONNULL_BEGIN + +@protocol NativeQuickBase64Spec + +- (NSString *)base64FromArrayBuffer:(NSDictionary *)buf + urlSafe:(BOOL)urlSafe; +- (NSDictionary *)base64ToArrayBuffer:(NSString *)b64 + removeLinebreaks:(BOOL)removeLinebreaks; + +@end + +@interface NativeQuickBase64SpecBase : NSObject { +@protected +facebook::react::EventEmitterCallback _eventEmitterCallback; +} +- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper; + + +@end + +namespace facebook::react { + /** + * ObjC++ class for module 'NativeQuickBase64' + */ + class JSI_EXPORT NativeQuickBase64SpecJSI : public ObjCTurboModule { + public: + NativeQuickBase64SpecJSI(const ObjCTurboModule::InitParams ¶ms); + }; +} // namespace facebook::react + +NS_ASSUME_NONNULL_END +#endif // QuickBase64Spec_H diff --git a/ios/generated/ReactCodegen/QuickBase64SpecJSI.h b/ios/generated/ReactCodegen/QuickBase64SpecJSI.h new file mode 100644 index 0000000..dfcf43f --- /dev/null +++ b/ios/generated/ReactCodegen/QuickBase64SpecJSI.h @@ -0,0 +1,49 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * + * Do not edit this file as changes may cause incorrect behavior and will be lost + * once the code is regenerated. + * + * @generated by codegen project: GenerateModuleH.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + + +template +class JSI_EXPORT NativeQuickBase64CxxSpec : public TurboModule { +public: + static constexpr std::string_view kModuleName = "QuickBase64"; + +protected: + NativeQuickBase64CxxSpec(std::shared_ptr jsInvoker) : TurboModule(std::string{NativeQuickBase64CxxSpec::kModuleName}, jsInvoker) { + methodMap_["base64FromArrayBuffer"] = MethodMetadata {.argCount = 2, .invoker = __base64FromArrayBuffer}; + methodMap_["base64ToArrayBuffer"] = MethodMetadata {.argCount = 2, .invoker = __base64ToArrayBuffer}; + } + +private: + static jsi::Value __base64FromArrayBuffer(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_assert( + bridging::getParameterCount(&T::base64FromArrayBuffer) == 3, + "Expected base64FromArrayBuffer(...) to have 3 parameters"); + return bridging::callFromJs(rt, &T::base64FromArrayBuffer, static_cast(&turboModule)->jsInvoker_, static_cast(&turboModule), + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool()); + } + + static jsi::Value __base64ToArrayBuffer(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) { + static_assert( + bridging::getParameterCount(&T::base64ToArrayBuffer) == 3, + "Expected base64ToArrayBuffer(...) to have 3 parameters"); + return bridging::callFromJs(rt, &T::base64ToArrayBuffer, static_cast(&turboModule)->jsInvoker_, static_cast(&turboModule), + count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt), + count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asBool()); + } +}; + +} // namespace facebook::react