diff --git a/packages/webgpu/README.md b/packages/webgpu/README.md index 0ae1359b4..b70d20367 100644 --- a/packages/webgpu/README.md +++ b/packages/webgpu/README.md @@ -151,6 +151,41 @@ const style = StyleSheet.create({ }); ``` +## Dawn Debug Toggles + +Dawn instance toggles are configured natively before WebGPU is installed. +This keeps initialization order deterministic and avoids JS import-order issues. + +On iOS, add the following keys to your app's `Info.plist`: + +```xml +RNWebGPUEnableToggles + + allow_unsafe_apis + +RNWebGPUDisableToggles + + disallow_spirv + +``` + +On Android, add `meta-data` entries to your app's `AndroidManifest.xml`: + +```xml + + + + +``` + +Android toggle lists are comma-separated strings. Empty entries are ignored. +If you inject these values from build-time environment variables or config plugins, +emit them into `Info.plist` and `AndroidManifest.xml`. + ## Example App To run the example app you first need to [install Dawn](#installing-dawn). diff --git a/packages/webgpu/android/cpp/cpp-adapter.cpp b/packages/webgpu/android/cpp/cpp-adapter.cpp index 2a441c218..2fe1b3aaa 100644 --- a/packages/webgpu/android/cpp/cpp-adapter.cpp +++ b/packages/webgpu/android/cpp/cpp-adapter.cpp @@ -19,7 +19,8 @@ std::shared_ptr manager; extern "C" JNIEXPORT void JNICALL Java_com_webgpu_WebGPUModule_initializeNative( JNIEnv *env, jobject /* this */, jlong jsRuntime, - jobject jsCallInvokerHolder, jobject blobModule) { + jobject jsCallInvokerHolder, jobject blobModule, + jobjectArray enableToggles, jobjectArray disableToggles) { auto runtime = reinterpret_cast(jsRuntime); jobject globalBlobModule = env->NewGlobalRef(blobModule); auto jsCallInvoker{ @@ -29,8 +30,48 @@ extern "C" JNIEXPORT void JNICALL Java_com_webgpu_WebGPUModule_initializeNative( ->getCallInvoker()}; auto platformContext = std::make_shared(globalBlobModule); - manager = std::make_shared(runtime, jsCallInvoker, - platformContext); + + // Convert Java string arrays to std::vector + std::vector enableVec; + std::vector disableVec; + if (enableToggles != nullptr) { + jsize len = env->GetArrayLength(enableToggles); + for (jsize i = 0; i < len; i++) { + auto jstr = (jstring)env->GetObjectArrayElement(enableToggles, i); + if (jstr == nullptr) { + continue; + } + const char *cstr = env->GetStringUTFChars(jstr, nullptr); + if (cstr == nullptr) { + env->DeleteLocalRef(jstr); + continue; + } + enableVec.emplace_back(cstr); + env->ReleaseStringUTFChars(jstr, cstr); + env->DeleteLocalRef(jstr); + } + } + if (disableToggles != nullptr) { + jsize len = env->GetArrayLength(disableToggles); + for (jsize i = 0; i < len; i++) { + auto jstr = (jstring)env->GetObjectArrayElement(disableToggles, i); + if (jstr == nullptr) { + continue; + } + const char *cstr = env->GetStringUTFChars(jstr, nullptr); + if (cstr == nullptr) { + env->DeleteLocalRef(jstr); + continue; + } + disableVec.emplace_back(cstr); + env->ReleaseStringUTFChars(jstr, cstr); + env->DeleteLocalRef(jstr); + } + } + + manager = std::make_shared( + runtime, jsCallInvoker, platformContext, + std::move(enableVec), std::move(disableVec)); } extern "C" JNIEXPORT void JNICALL Java_com_webgpu_WebGPUView_onSurfaceChanged( @@ -68,4 +109,4 @@ extern "C" JNIEXPORT void JNICALL Java_com_webgpu_WebGPUView_onSurfaceDestroy( JNIEnv *env, jobject thiz, jint contextId) { auto ®istry = rnwgpu::SurfaceRegistry::getInstance(); registry.removeSurfaceInfo(contextId); -} \ No newline at end of file +} diff --git a/packages/webgpu/android/src/main/java/com/webgpu/WebGPUModule.java b/packages/webgpu/android/src/main/java/com/webgpu/WebGPUModule.java index 75375700e..86e6e6593 100644 --- a/packages/webgpu/android/src/main/java/com/webgpu/WebGPUModule.java +++ b/packages/webgpu/android/src/main/java/com/webgpu/WebGPUModule.java @@ -1,11 +1,14 @@ package com.webgpu; -import android.util.Log; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.os.Bundle; +import androidx.annotation.Nullable; import androidx.annotation.OptIn; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.ReactApplicationContext; @@ -14,7 +17,6 @@ import com.facebook.react.common.annotations.FrameworkAPI; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.blob.BlobModule; -import com.facebook.react.modules.blob.BlobProvider; import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; @@ -40,11 +42,53 @@ public boolean install() { if (blobModule == null) { throw new RuntimeException("React Native's BlobModule was not found!"); } - initializeNative(jsContext.get(), (CallInvokerHolderImpl) callInvokerHolder, blobModule); + + String[] enableToggles = readToggleMetadata("com.webgpu.enable_toggles"); + String[] disableToggles = readToggleMetadata("com.webgpu.disable_toggles"); + + initializeNative(jsContext.get(), (CallInvokerHolderImpl) callInvokerHolder, blobModule, + enableToggles, disableToggles); return true; } + private String[] readToggleMetadata(String key) { + Bundle metadata = getApplicationMetadata(); + if (metadata == null) { + return new String[0]; + } + return parseToggleList(metadata.getString(key)); + } + + @Nullable + private Bundle getApplicationMetadata() { + ReactApplicationContext context = getReactApplicationContext(); + try { + ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo( + context.getPackageName(), PackageManager.GET_META_DATA); + return appInfo.metaData; + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } + + private static String[] parseToggleList(@Nullable String rawValue) { + if (rawValue == null || rawValue.trim().isEmpty()) { + return new String[0]; + } + + List toggles = new ArrayList<>(); + String[] parts = rawValue.split(","); + for (String part : parts) { + String toggle = part.trim(); + if (!toggle.isEmpty()) { + toggles.add(toggle); + } + } + return toggles.toArray(new String[0]); + } + @OptIn(markerClass = FrameworkAPI.class) @DoNotStrip - private native void initializeNative(long jsRuntime, CallInvokerHolderImpl jsInvoker, BlobModule blobModule); + private native void initializeNative(long jsRuntime, CallInvokerHolderImpl jsInvoker, + BlobModule blobModule, String[] enableToggles, String[] disableToggles); } diff --git a/packages/webgpu/app.plugin.js b/packages/webgpu/app.plugin.js new file mode 100644 index 000000000..6f0bb1c4e --- /dev/null +++ b/packages/webgpu/app.plugin.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const config_plugins_1 = require("@expo/config-plugins"); +const withWebGPUAndroid = (config, { enableToggles = [], disableToggles = [] } = {}) => { + return (0, config_plugins_1.withAndroidManifest)(config, (config) => { + const app = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults); + if (!app['meta-data']) + app['meta-data'] = []; + if (enableToggles.length > 0) { + app['meta-data'].push({ + $: { + 'android:name': 'com.webgpu.enable_toggles', + 'android:value': enableToggles.join(','), + }, + }); + } + if (disableToggles.length > 0) { + app['meta-data'].push({ + $: { + 'android:name': 'com.webgpu.disable_toggles', + 'android:value': disableToggles.join(','), + }, + }); + } + return config; + }); +}; +const withWebGPUIos = (config, { enableToggles = [], disableToggles = [] } = {}) => { + return (0, config_plugins_1.withInfoPlist)(config, (config) => { + if (enableToggles.length > 0) { + config.modResults['RNWebGPUEnableToggles'] = enableToggles; + } + if (disableToggles.length > 0) { + config.modResults['RNWebGPUDisableToggles'] = disableToggles; + } + return config; + }); +}; +const withWebGPU = (config, options = {}) => { + config = withWebGPUAndroid(config, options); + config = withWebGPUIos(config, options); + return config; +}; +exports.default = withWebGPU; diff --git a/packages/webgpu/apple/WebGPUModule.mm b/packages/webgpu/apple/WebGPUModule.mm index d3ca8c392..11a85767e 100644 --- a/packages/webgpu/apple/WebGPUModule.mm +++ b/packages/webgpu/apple/WebGPUModule.mm @@ -20,6 +20,30 @@ @interface RCTBridge (JSIRuntime) - (void *)runtime; @end +static std::vector ReadToggleArray(NSDictionary *infoDictionary, + NSString *key) { + std::vector toggles; + id value = infoDictionary[key]; + if (![value isKindOfClass:[NSArray class]]) { + return toggles; + } + + for (id item in (NSArray *)value) { + if (![item isKindOfClass:[NSString class]]) { + continue; + } + NSString *toggle = [(NSString *)item + stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if (toggle.length == 0) { + continue; + } + toggles.push_back(toggle.UTF8String); + } + + return toggles; +} + @implementation WebGPUModule RCT_EXPORT_MODULE(WebGPUModule) @@ -72,10 +96,17 @@ - (void)invalidate { return [NSNumber numberWithBool:NO]; } + NSDictionary *infoDictionary = NSBundle.mainBundle.infoDictionary ?: @{}; + auto enableToggles = + ReadToggleArray(infoDictionary, @"RNWebGPUEnableToggles"); + auto disableToggles = + ReadToggleArray(infoDictionary, @"RNWebGPUDisableToggles"); + std::shared_ptr platformContext = std::make_shared(); - webgpuManager = std::make_shared(runtime, jsInvoker, - platformContext); + webgpuManager = std::make_shared( + runtime, jsInvoker, platformContext, + std::move(enableToggles), std::move(disableToggles)); return @true; } diff --git a/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp b/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp index 5a2decc09..914a7e75a 100644 --- a/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp +++ b/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.cpp @@ -53,14 +53,18 @@ namespace rnwgpu { RNWebGPUManager::RNWebGPUManager( jsi::Runtime *jsRuntime, std::shared_ptr jsCallInvoker, - std::shared_ptr platformContext) + std::shared_ptr platformContext, + std::vector enableToggles, + std::vector disableToggles) : _jsRuntime(jsRuntime), _jsCallInvoker(jsCallInvoker), _platformContext(platformContext) { // Register main runtime for RuntimeAwareCache BaseRuntimeAwareCache::setMainJsRuntime(_jsRuntime); - auto gpu = std::make_shared(*_jsRuntime); + auto gpu = std::make_shared(*_jsRuntime, + std::move(enableToggles), + std::move(disableToggles)); auto rnWebGPU = std::make_shared(gpu, _platformContext, _jsCallInvoker); _gpu = gpu->get(); diff --git a/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.h b/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.h index 2043c9658..9bb7603bc 100644 --- a/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.h +++ b/packages/webgpu/cpp/rnwgpu/RNWebGPUManager.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include "GPU.h" #include "PlatformContext.h" @@ -24,7 +26,9 @@ class RNWebGPUManager { public: RNWebGPUManager(jsi::Runtime *jsRuntime, std::shared_ptr jsCallInvoker, - std::shared_ptr platformContext); + std::shared_ptr platformContext, + std::vector enableToggles = {}, + std::vector disableToggles = {}); ~RNWebGPUManager(); /** diff --git a/packages/webgpu/cpp/rnwgpu/api/GPU.cpp b/packages/webgpu/cpp/rnwgpu/api/GPU.cpp index 764a9aa32..c208eadc4 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPU.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPU.cpp @@ -13,13 +13,33 @@ namespace rnwgpu { -GPU::GPU(jsi::Runtime &runtime) : NativeObject(CLASS_NAME) { +GPU::GPU(jsi::Runtime &runtime, + std::vector enableToggles, + std::vector disableToggles) + : NativeObject(CLASS_NAME), + _enableToggles(std::move(enableToggles)), + _disableToggles(std::move(disableToggles)) { static const auto kTimedWaitAny = wgpu::InstanceFeatureName::TimedWaitAny; wgpu::InstanceDescriptor instanceDesc{.requiredFeatureCount = 1, .requiredFeatures = &kTimedWaitAny}; wgpu::InstanceLimits limits{.timedWaitAnyMaxCount = 64}; instanceDesc.requiredLimits = &limits; + + // Build Dawn toggles descriptor and chain it if any toggles are specified + std::vector enablePtrs, disablePtrs; + wgpu::DawnTogglesDescriptor togglesDesc; + if (!_enableToggles.empty() || !_disableToggles.empty()) { + for (const auto &s : _enableToggles) enablePtrs.push_back(s.c_str()); + for (const auto &s : _disableToggles) disablePtrs.push_back(s.c_str()); + togglesDesc.enabledToggles = enablePtrs.empty() ? nullptr : enablePtrs.data(); + togglesDesc.enabledToggleCount = enablePtrs.size(); + togglesDesc.disabledToggles = disablePtrs.empty() ? nullptr : disablePtrs.data(); + togglesDesc.disabledToggleCount = disablePtrs.size(); + togglesDesc.nextInChain = instanceDesc.nextInChain; + instanceDesc.nextInChain = &togglesDesc; + } + _instance = wgpu::CreateInstance(&instanceDesc); auto dispatcher = std::make_shared(runtime); @@ -39,11 +59,32 @@ async::AsyncTaskHandle GPU::requestAdapter( constexpr auto kDefaultBackendType = wgpu::BackendType::Vulkan; #endif aOptions.backendType = kDefaultBackendType; + + // Capture toggle strings by value so the lambda owns them + auto enableToggles = _enableToggles; + auto disableToggles = _disableToggles; + return _async->postTask( - [this, aOptions](const async::AsyncTaskHandle::ResolveFunction &resolve, - const async::AsyncTaskHandle::RejectFunction &reject) { + [this, aOptions, enableToggles = std::move(enableToggles), + disableToggles = std::move(disableToggles)]( + const async::AsyncTaskHandle::ResolveFunction &resolve, + const async::AsyncTaskHandle::RejectFunction &reject) { + // Build Dawn toggles chain inside the task so pointers remain valid + std::vector enablePtrs, disablePtrs; + wgpu::DawnTogglesDescriptor togglesDesc; + auto localOptions = aOptions; + if (!enableToggles.empty() || !disableToggles.empty()) { + for (const auto &s : enableToggles) enablePtrs.push_back(s.c_str()); + for (const auto &s : disableToggles) disablePtrs.push_back(s.c_str()); + togglesDesc.enabledToggles = enablePtrs.empty() ? nullptr : enablePtrs.data(); + togglesDesc.enabledToggleCount = enablePtrs.size(); + togglesDesc.disabledToggles = disablePtrs.empty() ? nullptr : disablePtrs.data(); + togglesDesc.disabledToggleCount = disablePtrs.size(); + togglesDesc.nextInChain = localOptions.nextInChain; + localOptions.nextInChain = &togglesDesc; + } _instance.RequestAdapter( - &aOptions, wgpu::CallbackMode::AllowProcessEvents, + &localOptions, wgpu::CallbackMode::AllowProcessEvents, [asyncRunner = _async, resolve, reject](wgpu::RequestAdapterStatus status, wgpu::Adapter adapter, wgpu::StringView message) { diff --git a/packages/webgpu/cpp/rnwgpu/api/GPU.h b/packages/webgpu/cpp/rnwgpu/api/GPU.h index f6bb4ede3..5093c7e40 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPU.h +++ b/packages/webgpu/cpp/rnwgpu/api/GPU.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "Unions.h" @@ -27,7 +28,9 @@ class GPU : public NativeObject { public: static constexpr const char *CLASS_NAME = "GPU"; - explicit GPU(jsi::Runtime &runtime); + explicit GPU(jsi::Runtime &runtime, + std::vector enableToggles = {}, + std::vector disableToggles = {}); public: std::string getBrand() { return CLASS_NAME; } @@ -53,6 +56,8 @@ class GPU : public NativeObject { private: wgpu::Instance _instance; std::shared_ptr _async; + std::vector _enableToggles; + std::vector _disableToggles; }; } // namespace rnwgpu diff --git a/packages/webgpu/cpp/rnwgpu/api/GPUAdapter.cpp b/packages/webgpu/cpp/rnwgpu/api/GPUAdapter.cpp index 27bf14f8b..c4cdbdf47 100644 --- a/packages/webgpu/cpp/rnwgpu/api/GPUAdapter.cpp +++ b/packages/webgpu/cpp/rnwgpu/api/GPUAdapter.cpp @@ -93,6 +93,7 @@ async::AsyncTaskHandle GPUAdapter::requestDevice( creationRuntime](const async::AsyncTaskHandle::ResolveFunction &resolve, const async::AsyncTaskHandle::RejectFunction &reject) { (void)descriptor; + _instance.RequestDevice( &aDescriptor, wgpu::CallbackMode::AllowProcessEvents, [asyncRunner = _async, resolve, reject, label, creationRuntime, @@ -131,6 +132,8 @@ async::AsyncTaskHandle GPUAdapter::requestDevice( break; case wgpu::LoggingType::Verbose: logLevel = "Verbose"; + Logger::logToConsole("%s: %.*s", logLevel, + static_cast(msg.length), msg.data); break; case wgpu::LoggingType::Info: logLevel = "Info"; diff --git a/packages/webgpu/package.json b/packages/webgpu/package.json index dd7992f21..3dcc8e4cc 100644 --- a/packages/webgpu/package.json +++ b/packages/webgpu/package.json @@ -7,9 +7,14 @@ "types": "lib/typescript/src/index.d.ts", "react-native": "src/index", "source": "src/index", + "expo": { + "plugin": "./app.plugin" + }, "files": [ "src/**", "lib/**", + "app.plugin.js", + "plugin/src/**", "!**/__tests__/**", "android/build.gradle", "android/CMakeLists.txt", @@ -26,6 +31,7 @@ "test:ref": "REFERENCE=true NODE_OPTIONS='--experimental-require-module' jest -i", "lint": "eslint . --ext .ts,.tsx --max-warnings 0 --cache --fix", "tsc": "tsc --noEmit", + "build:plugin": "tsc -p plugin/tsconfig.json", "build": "bob build", "build-dawn": "tsx scripts/build/dawn.ts", "clean-dawn": "rimraf ./libs && rimraf ../../externals/dawn/out", @@ -56,6 +62,7 @@ "registry": "https://registry.npmjs.org/" }, "devDependencies": { + "@expo/config-plugins": "^9.0.0", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.5", "@types/node": "^20.14.7", diff --git a/packages/webgpu/plugin/src/app.plugin.ts b/packages/webgpu/plugin/src/app.plugin.ts new file mode 100644 index 000000000..3724eb819 --- /dev/null +++ b/packages/webgpu/plugin/src/app.plugin.ts @@ -0,0 +1,67 @@ +import { + ConfigPlugin, + withAndroidManifest, + withInfoPlist, + AndroidConfig, +} from '@expo/config-plugins'; + +type WebGPUPluginOptions = { + enableToggles?: string[]; + disableToggles?: string[]; +}; + +const withWebGPUAndroid: ConfigPlugin = ( + config, + { enableToggles = [], disableToggles = [] } = {} +) => { + return withAndroidManifest(config, (config) => { + const app = AndroidConfig.Manifest.getMainApplicationOrThrow( + config.modResults + ); + if (!app['meta-data']) app['meta-data'] = []; + + if (enableToggles.length > 0) { + app['meta-data'].push({ + $: { + 'android:name': 'com.webgpu.enable_toggles', + 'android:value': enableToggles.join(','), + }, + }); + } + if (disableToggles.length > 0) { + app['meta-data'].push({ + $: { + 'android:name': 'com.webgpu.disable_toggles', + 'android:value': disableToggles.join(','), + }, + }); + } + return config; + }); +}; + +const withWebGPUIos: ConfigPlugin = ( + config, + { enableToggles = [], disableToggles = [] } = {} +) => { + return withInfoPlist(config, (config) => { + if (enableToggles.length > 0) { + config.modResults['RNWebGPUEnableToggles'] = enableToggles; + } + if (disableToggles.length > 0) { + config.modResults['RNWebGPUDisableToggles'] = disableToggles; + } + return config; + }); +}; + +const withWebGPU: ConfigPlugin = ( + config, + options = {} +) => { + config = withWebGPUAndroid(config, options); + config = withWebGPUIos(config, options); + return config; +}; + +export default withWebGPU; diff --git a/packages/webgpu/plugin/tsconfig.json b/packages/webgpu/plugin/tsconfig.json new file mode 100644 index 000000000..f6f5a8fad --- /dev/null +++ b/packages/webgpu/plugin/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2019", + "module": "commonjs", + "lib": ["ES2019"], + "strict": true, + "outDir": "../", + "rootDir": "./src", + "declaration": false, + "skipLibCheck": true + }, + "include": ["./src"], + "exclude": ["../node_modules"] +} diff --git a/yarn.lock b/yarn.lock index 959df01a9..df53c694b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,15 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:~7.10.4": + version: 7.10.4 + resolution: "@babel/code-frame@npm:7.10.4" + dependencies: + "@babel/highlight": ^7.10.4 + checksum: feb4543c8a509fe30f0f6e8d7aa84f82b41148b963b826cd330e34986f649a85cb63b2f13dd4effdf434ac555d16f14940b8ea5f4433297c2f5ff85486ded019 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.6": version: 7.28.6 resolution: "@babel/compat-data@npm:7.28.6" @@ -248,7 +257,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.28.5": +"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" checksum: 5a251a6848e9712aea0338f659a1a3bd334d26219d5511164544ca8ec20774f098c3a6661e9da65a0d085c745c00bb62c8fada38a62f08fa1f8053bc0aeb57e4 @@ -283,6 +292,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.10.4": + version: 7.25.9 + resolution: "@babel/highlight@npm:7.25.9" + dependencies: + "@babel/helper-validator-identifier": ^7.25.9 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: a6e0ac0a1c4bef7401915ca3442ab2b7ae4adf360262ca96b91396bfb9578abb28c316abf5e34460b780696db833b550238d9256bdaca60fade4ba7a67645064 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.28.6": version: 7.28.6 resolution: "@babel/parser@npm:7.28.6" @@ -2060,6 +2081,63 @@ __metadata: languageName: node linkType: hard +"@expo/config-plugins@npm:^9.0.0": + version: 9.1.7 + resolution: "@expo/config-plugins@npm:9.1.7" + dependencies: + "@expo/config-types": ^53.0.0 + "@expo/json-file": ~9.1.3 + "@expo/plist": ^0.3.3 + "@expo/sdk-runtime-versions": ^1.0.0 + chalk: ^4.1.2 + debug: ^4.3.5 + getenv: ^1.0.0 + glob: ^10.4.2 + resolve-from: ^5.0.0 + semver: ^7.5.4 + slash: ^3.0.0 + slugify: ^1.6.6 + xcode: ^3.0.1 + xml2js: 0.6.0 + checksum: 8eba71d88100c1c0572307256900b10b8375d3fac2496d0486e7d9d66d8dc4a979e907a12e5dfb3a7811871bef4ba5cc906559ceb371517b7308bd909f17730a + languageName: node + linkType: hard + +"@expo/config-types@npm:^53.0.0": + version: 53.0.5 + resolution: "@expo/config-types@npm:53.0.5" + checksum: 3f4db2d9590c18fb178f7395739ee2200512ad7c253655be0bad7f3f0d948df89c1c69c7e949f202faa98eecbd4bbae3edfcf9264f97f49d4f7087f85c68af5d + languageName: node + linkType: hard + +"@expo/json-file@npm:~9.1.3": + version: 9.1.5 + resolution: "@expo/json-file@npm:9.1.5" + dependencies: + "@babel/code-frame": ~7.10.4 + json5: ^2.2.3 + checksum: beedf9077dcff476acd895219e391e18079d3c375e58bb4902a4147fffe9774e11d4d1607cfc3488f8e9daec2c30e4d7c17c46fb701035ad7aabacaaf6d465b4 + languageName: node + linkType: hard + +"@expo/plist@npm:^0.3.3": + version: 0.3.5 + resolution: "@expo/plist@npm:0.3.5" + dependencies: + "@xmldom/xmldom": ^0.8.8 + base64-js: ^1.2.3 + xmlbuilder: ^15.1.1 + checksum: b78fda216c63ab553b24e75e87021be09155cd16e0fcf666846c1a5ea33defa2d7f631ea504788a8e2c5d67b5f59b35d6a46fa79a244d5890ee26870caffec22 + languageName: node + linkType: hard + +"@expo/sdk-runtime-versions@npm:^1.0.0": + version: 1.0.0 + resolution: "@expo/sdk-runtime-versions@npm:1.0.0" + checksum: 0942d5a356f590e8dc795761456cc48b3e2d6a38ad2a02d6774efcdc5a70424e05623b4e3e5d2fec0cdc30f40dde05c14391c781607eed3971bf8676518bfd9d + languageName: node + linkType: hard + "@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": version: 9.3.0 resolution: "@hapi/hoek@npm:9.3.0" @@ -4924,6 +5002,13 @@ __metadata: languageName: node linkType: hard +"@xmldom/xmldom@npm:^0.8.8": + version: 0.8.11 + resolution: "@xmldom/xmldom@npm:0.8.11" + checksum: 72020f3d5c74b54e25d19f2cd7b2d87484926cc7febdf02347dc3e06364186641d54e9e94baaaaba30e99528e6727adcd1baef6d0809e7460aee3a5be890b132 + languageName: node + linkType: hard + "Example@workspace:apps/example": version: 0.0.0-use.local resolution: "Example@workspace:apps/example" @@ -5121,7 +5206,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.0": +"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: @@ -5650,7 +5735,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": +"base64-js@npm:^1.2.3, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -5673,6 +5758,13 @@ __metadata: languageName: node linkType: hard +"big-integer@npm:1.6.x": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 6e86885787a20fed96521958ae9086960e4e4b5e74d04f3ef7513d4d0ad631a9f3bde2730fc8aaa4b00419fc865f6ec573e5320234531ef37505da7da192c40b + languageName: node + linkType: hard + "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -5691,6 +5783,24 @@ __metadata: languageName: node linkType: hard +"bplist-creator@npm:0.1.1": + version: 0.1.1 + resolution: "bplist-creator@npm:0.1.1" + dependencies: + stream-buffers: 2.2.x + checksum: b0d40d1d1623f1afdbb575cfc8075d742d2c4f0eb458574be809e3857752d1042a39553b3943d2d7f505dde92bcd43e1d7bdac61c9cd44475d696deb79f897ce + languageName: node + linkType: hard + +"bplist-parser@npm:0.3.2": + version: 0.3.2 + resolution: "bplist-parser@npm:0.3.2" + dependencies: + big-integer: 1.6.x + checksum: fad0f6eb155a9b636b4096a1725ce972a0386490d7d38df7be11a3a5645372446b7c44aacbc6626d24d2c17d8b837765361520ebf2960aeffcaf56765811620e + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.12 resolution: "brace-expansion@npm:1.1.12" @@ -5909,6 +6019,17 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + "chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -6796,7 +6917,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -8529,6 +8650,13 @@ __metadata: languageName: node linkType: hard +"getenv@npm:^1.0.0": + version: 1.0.0 + resolution: "getenv@npm:1.0.0" + checksum: 19ae5cad603a1cf1bcb8fa3bed48e00d062eb0572a4404c02334b67f3b3499f238383082b064bb42515e9e25c2b08aef1a3e3d2b6852347721aa8b174825bd56 + languageName: node + linkType: hard + "glamor@npm:~2.20.40": version: 2.20.40 resolution: "glamor@npm:2.20.40" @@ -8560,7 +8688,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.3.7": +"glob@npm:^10.3.7, glob@npm:^10.4.2": version: 10.5.0 resolution: "glob@npm:10.5.0" dependencies: @@ -8693,6 +8821,13 @@ __metadata: languageName: node linkType: hard +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -12247,7 +12382,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -12311,6 +12446,17 @@ __metadata: languageName: node linkType: hard +"plist@npm:^3.0.5": + version: 3.1.0 + resolution: "plist@npm:3.1.0" + dependencies: + "@xmldom/xmldom": ^0.8.8 + base64-js: ^1.5.1 + xmlbuilder: ^15.1.1 + checksum: c8ea013da8646d4c50dff82f9be39488054621cc229957621bb00add42b5d4ce3657cf58d4b10c50f7dea1a81118f825838f838baeb4e6f17fab453ecf91d424 + languageName: node + linkType: hard + "pngjs@npm:^6.0.0": version: 6.0.0 resolution: "pngjs@npm:6.0.0" @@ -12881,6 +13027,7 @@ __metadata: version: 0.0.0-use.local resolution: "react-native-wgpu@workspace:packages/webgpu" dependencies: + "@expo/config-plugins": ^9.0.0 "@types/jest": ^29.5.12 "@types/lodash": ^4.17.5 "@types/node": ^20.14.7 @@ -13537,6 +13684,13 @@ __metadata: languageName: node linkType: hard +"sax@npm:>=0.6.0": + version: 1.5.0 + resolution: "sax@npm:1.5.0" + checksum: e143cbeb6ca59345db142d97d1bbb620553beb8b166eda36ffeaba4b01af47dcf0423cd8781d0805b75feea69462cf80d0db7bf0a7e6dd87b711fda51b9153df + languageName: node + linkType: hard + "scheduler@npm:0.24.0-canary-efb381bbf-20230505": version: 0.24.0-canary-efb381bbf-20230505 resolution: "scheduler@npm:0.24.0-canary-efb381bbf-20230505" @@ -13812,6 +13966,17 @@ __metadata: languageName: node linkType: hard +"simple-plist@npm:^1.1.0": + version: 1.4.0 + resolution: "simple-plist@npm:1.4.0" + dependencies: + bplist-creator: 0.1.1 + bplist-parser: 0.3.2 + plist: ^3.0.5 + checksum: fa8086f6b781c289f1abad21306481dda4af6373b32a5d998a70e53c2b7218a1d21ebb5ae3e736baae704c21d311d3d39d01d0e6a2387eda01b4020b9ebd909e + languageName: node + linkType: hard + "simple-swizzle@npm:^0.2.2": version: 0.2.4 resolution: "simple-swizzle@npm:0.2.4" @@ -13853,6 +14018,13 @@ __metadata: languageName: node linkType: hard +"slugify@npm:^1.6.6": + version: 1.6.6 + resolution: "slugify@npm:1.6.6" + checksum: 04773c2d3b7aea8d2a61fa47cc7e5d29ce04e1a96cbaec409da57139df906acb3a449fac30b167d203212c806e73690abd4ff94fbad0a9a7b7ea109a2a638ae9 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -14035,6 +14207,13 @@ __metadata: languageName: node linkType: hard +"stream-buffers@npm:2.2.x": + version: 2.2.0 + resolution: "stream-buffers@npm:2.2.0" + checksum: 4587d9e8f050d689fb38b4295e73408401b16de8edecc12026c6f4ae92956705ecfd995ae3845d7fa3ebf19502d5754df9143d91447fd881d86e518f43882c1c + languageName: node + linkType: hard + "streamx@npm:^2.15.0, streamx@npm:^2.21.0": version: 2.23.0 resolution: "streamx@npm:2.23.0" @@ -14262,6 +14441,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -15073,6 +15261,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^7.0.3": + version: 7.0.3 + resolution: "uuid@npm:7.0.3" + bin: + uuid: dist/bin/uuid + checksum: f5b7b5cc28accac68d5c083fd51cca64896639ebd4cca88c6cfb363801aaa83aa439c86dfc8446ea250a7a98d17afd2ad9e88d9d4958c79a412eccb93bae29de + languageName: node + linkType: hard + "v8-to-istanbul@npm:^9.0.1": version: 9.3.0 resolution: "v8-to-istanbul@npm:9.3.0" @@ -15963,6 +16160,40 @@ __metadata: languageName: node linkType: hard +"xcode@npm:^3.0.1": + version: 3.0.1 + resolution: "xcode@npm:3.0.1" + dependencies: + simple-plist: ^1.1.0 + uuid: ^7.0.3 + checksum: 908ff85851f81aec6e36ca24427db092e1cc068f052716e14de5e762196858039efabbe053a1abe8920184622501049e74a93618e8692b982f7604a9847db108 + languageName: node + linkType: hard + +"xml2js@npm:0.6.0": + version: 0.6.0 + resolution: "xml2js@npm:0.6.0" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 437f353fd66d367bf158e9555a0625df9965d944e499728a5c6bc92a54a2763179b144f14b7e1c725040f56bbd22b0fa6cfcb09ec4faf39c45ce01efe631f40b + languageName: node + linkType: hard + +"xmlbuilder@npm:^15.1.1": + version: 15.1.1 + resolution: "xmlbuilder@npm:15.1.1" + checksum: 14f7302402e28d1f32823583d121594a9dca36408d40320b33f598bd589ca5163a352d076489c9c64d2dc1da19a790926a07bf4191275330d4de2b0d85bb1843 + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + "xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2"