From 484792dbbb0071c32e285ecf27ff1e7c94b050dd Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Sun, 6 Jul 2025 07:50:00 -0700 Subject: [PATCH 1/6] experiment: add Webassembly support Depends on https://github.com/EmbeddedEnterprises/cmake-ts/pull/61 --- .gitignore | 3 + CMakeLists.txt | 56 +- browser/index.html | 7 + browser/index.js | 22 + browser/package.json | 15 + browser/pnpm-lock.yaml | 1786 ++++++++++++++++++++++++++++++++++++++++ package.json | 6 +- pnpm-lock.yaml | 18 +- src/wasm.cc | 21 + test/tsconfig.json | 2 +- test/types.d.ts | 8 + 11 files changed, 1930 insertions(+), 14 deletions(-) create mode 100644 browser/index.html create mode 100644 browser/index.js create mode 100644 browser/package.json create mode 100644 browser/pnpm-lock.yaml create mode 100644 src/wasm.cc create mode 100644 test/types.d.ts diff --git a/.gitignore b/.gitignore index 8beec4d6..89776041 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ compile_commands.json /smoke-test-* /*.tgz /build-artifacts +.parcel-cache/ +dist/ +*.wasm diff --git a/CMakeLists.txt b/CMakeLists.txt index be34e2e4..9ace62f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,42 @@ if(${ZMQ_ENABLE_SANITIZER_UNDEFINED}) set(ENABLE_SANITIZER_UNDEFINED "ENABLE_SANITIZER_UNDEFINED") endif() +option(ZMQ_WASM "Build for WebAssembly" OFF) +set_option_from_env(ZMQ_WASM) + +if(ZMQ_WASM OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + set(ZMQ_WASM TRUE) + + # Compile for WebAssembly + set(VCPKG_HOST_TRIPLET wasm32-emscripten) + set(VCPKG_TARGET_TRIPLET wasm32-emscripten) + + include($ENV{EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake) + + set(CMAKE_LINKER "$ENV{EMSCRIPTEN_ROOT}/bin/lld${CMAKE_EXECUTABLE_SUFFIX}" CACHE STRING "Linker" FORCE) + + # export an indirect function table for napi-wasm + add_link_options("--export-table") + + # Add WebAssembly-specific exports for napi-wasm + add_link_options("SHELL:-s EXPORTED_FUNCTIONS=['_malloc','_free','napi_wasm_malloc','napi_register_module_v1']") + add_link_options("SHELL:-s EXPORTED_RUNTIME_METHODS=['ccall','cwrap']") + add_link_options("SHELL:-s ALLOW_MEMORY_GROWTH=1") + add_link_options("SHELL:-s MODULARIZE=1") + add_link_options("SHELL:-s EXPORT_NAME='createModule'") + add_link_options("SHELL:-s ENVIRONMENT='web,worker'") + add_link_options("--no-entry") + add_link_options("SHELL:-Wl,--strip-all") + add_link_options("SHELL:-fvisibility=hidden") + add_link_options("SHELL:-fvisibility-inlines-hidden") + add_link_options("SHELL:-Wl,-gc-sections") + add_compile_options("-flto=full") + add_link_options("-flto=full") + + # Allow undefined symbols on Linux for runtime loading + add_link_options("SHELL:-Wl,--unresolved-symbols=ignore-all") +endif() + # Set MacOS deployment target if(APPLE) option(MACOSX_DEPLOYMENT_TARGET "MacOS deployment target" "10.15") @@ -126,8 +162,14 @@ project_options( ${ENABLE_SANITIZER_UNDEFINED} ) -file(GLOB_RECURSE SOURCES "./src/*.cc") -add_library(addon SHARED ${SOURCES}) +file(GLOB_RECURSE SOURCES "./src/*.cc" "./src/*.cpp") + +if(ZMQ_WASM) + # For WebAssembly, create an executable instead of a shared library + add_executable(addon ${SOURCES}) +else() + add_library(addon SHARED ${SOURCES}) +endif() if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang @@ -145,6 +187,10 @@ if(ZMQ_NO_SYNC_RESOLVE) target_compile_definitions(addon PRIVATE ZMQ_NO_SYNC_RESOLVE) endif() +if(ZMQ_WASM) + target_compile_definitions(addon PRIVATE ZMQ_WASM) +endif() + # ZeroMQ find_package(ZeroMQ CONFIG REQUIRED) target_link_system_libraries(addon PRIVATE libzmq libzmq-static) @@ -168,7 +214,11 @@ if(WIN32) endif() # Use `.node` for the library without any "lib" prefix -set_target_properties(addon PROPERTIES PREFIX "" SUFFIX ".node") +if(ZMQ_WASM) + set_target_properties(addon PROPERTIES PREFIX "" SUFFIX ".wasm") +else() + set_target_properties(addon PROPERTIES PREFIX "" SUFFIX ".node") +endif() # Windows delay load node.exe if(WIN32) diff --git a/browser/index.html b/browser/index.html new file mode 100644 index 00000000..846785db --- /dev/null +++ b/browser/index.html @@ -0,0 +1,7 @@ + + + ZeroMQ + + + + diff --git a/browser/index.js b/browser/index.js new file mode 100644 index 00000000..c0dfa088 --- /dev/null +++ b/browser/index.js @@ -0,0 +1,22 @@ +import {Environment, napi} from "napi-wasm" + +async function main() { + const response = await fetch("./addon.wasm") + const bytes = await response.arrayBuffer() + const {instance} = await WebAssembly.instantiate( + bytes, + { + env: napi, + }, + ) + + // Create an environment. + let env = new Environment(instance) + let exports = env.exports + + console.log(exports) +} + +main().catch(err => { + throw err +}) diff --git a/browser/package.json b/browser/package.json new file mode 100644 index 00000000..2170541c --- /dev/null +++ b/browser/package.json @@ -0,0 +1,15 @@ +{ + "name": "browser", + "version": "1.0.0", + "description": "", + "scripts": { + "start": "parcel index.html" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.8.0", + "devDependencies": { + "parcel": "^2.15.4" + } +} diff --git a/browser/pnpm-lock.yaml b/browser/pnpm-lock.yaml new file mode 100644 index 00000000..b0512bb6 --- /dev/null +++ b/browser/pnpm-lock.yaml @@ -0,0 +1,1786 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + parcel: + specifier: ^2.15.4 + version: 2.15.4(@swc/helpers@0.5.17) + +packages: + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lmdb/lmdb-darwin-arm64@2.8.5': + resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@2.8.5': + resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@2.8.5': + resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@2.8.5': + resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@2.8.5': + resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-x64@2.8.5': + resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} + cpu: [x64] + os: [win32] + + '@mischnic/json-sourcemap@0.1.1': + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@parcel/bundler-default@2.15.4': + resolution: {integrity: sha512-4vkaZuwGqL8L7NqEgjRznz9/QoeVKk0Z6z2nzfpdnSWA4xX3moUj+JeoqGUbyFGuPzfCma4SA4+txnQbKu0edQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/cache@2.15.4': + resolution: {integrity: sha512-x/QgMuVvXQV6uNhIF+6kz6SzhVVkwf6WPSVG/xQvGMEiBabForDVYIhIEuN3RzUXCU352CGM6d8TtLLg61W1fw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/codeframe@2.15.4': + resolution: {integrity: sha512-ErAPEQaJIpB+ocNZ3rl8AEK6piA7JBInwZLNU0eHMthm01Ssb10JkpAadyn1w9IVfCey+kqQcEeWv47Yh6mL1Q==} + engines: {node: '>= 16.0.0'} + + '@parcel/compressor-raw@2.15.4': + resolution: {integrity: sha512-gECePZxVXBwyo0DYbAq4V4SimVzHaJ3p8QOgFIfOqNmlEBbhLf3QSjArFPJNKiHZaJuclh4a+IShFBN+u6tXXw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/config-default@2.15.4': + resolution: {integrity: sha512-chUE4NpcSXpMfTcSmgl4Q78zH+ZFe0qdgZLBtF4EH2QQakW7wAXAYRxS2/P3xFkUj0/51sExhbCFWgulrlGDPw==} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/core@2.15.4': + resolution: {integrity: sha512-+TXxTm58lFwXXObFAEclwKX1p1AdixcD+M7T4NeFIQzQ4F20Vr+6oybCSqW1exNA3uHqVDDFLx7TT78seVjvkg==} + engines: {node: '>= 16.0.0'} + + '@parcel/diagnostic@2.15.4': + resolution: {integrity: sha512-8MAqefwzBKceNN3364OLm+p4HRD7AfimfFW3MntLxPB6bnelc9UBg5c9zEm34zYEctbmky8gqYgAUSDjqYC5Hw==} + engines: {node: '>= 16.0.0'} + + '@parcel/error-overlay@2.15.4': + resolution: {integrity: sha512-xxeaWm8fV8Z4uGy/c09mOvmFSHBOgF1gCMQwLCwZvfMLqIWkdZaUQ2cRhWZIS6pOXaRVC7YpcXzk2DOiSUNSbQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/events@2.15.4': + resolution: {integrity: sha512-SBq4zstaFr7XQaXNaQmUuVh1swCUHrhtPCOSofvkJoQGhjsuhQlh4t0NmUikyKNdj7C1j40xCS1kGHuUO29b0g==} + engines: {node: '>= 16.0.0'} + + '@parcel/feature-flags@2.15.4': + resolution: {integrity: sha512-DJqZVtbfjWJseM0gk7yyDkAuOhP7/FVwZ/YVqjozIqXBhmQm07xctiqNQyZX2vBbQsxmVbjpqyq+DOj45WPEzQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/fs@2.15.4': + resolution: {integrity: sha512-5cahD2ByQaSi+YN0aDvrMWXZvs3mP7C5ey8zcDTDn7JxJa51sMqOQcdU3VUTzQFtAPeRM2KxUkxLhBBXgQqHZA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/graph@3.5.4': + resolution: {integrity: sha512-uF7kyQXWK2fQZvG5eE0N3avYGLQE5Q0vyJsyypNcFW3kXNnrkZCUtbG7urmdae9mmZ2jXIVN4q4Bhd9pefGj9A==} + engines: {node: '>= 16.0.0'} + + '@parcel/logger@2.15.4': + resolution: {integrity: sha512-rQ7F5+FMQ7t+w5NGFRT8CWHhym0aunduufCjlafvRzUSKEN/5/nwTfCe9I5QsthGlXJWs+ZTy4zQ+wLtZQRBKQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/markdown-ansi@2.15.4': + resolution: {integrity: sha512-u5Lwcr4ZVBSLFbKYht+mJqJ3ZMXvJdmDMU5eDtrIEKPpu9LrIDdPpDEXBoyO6pDsoV/2AqyXUUMzBRyCatkkoQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/namer-default@2.15.4': + resolution: {integrity: sha512-EXsoQ1S+5ZIfy8431E7F0vVS7bfH5JpZ+vFVcUpArJDkhmMG7T/eP6Kp9CXHLJmn7ki1x7iIVytrja0XXRQWBQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/node-resolver-core@3.6.4': + resolution: {integrity: sha512-g3+usMnr7pfRqbMAksOpNA7GJk7HUNW1Wxx7Shhp4w0K9JUdVrd2LRKwZxbqL7H9NqWtVvUOT9cZbMlDR6bO1w==} + engines: {node: '>= 16.0.0'} + + '@parcel/optimizer-css@2.15.4': + resolution: {integrity: sha512-KQLuqwcvVFTNFtM+bzfvQivwunmhVAngmR4NiI8zQaykidYH28V8YkVAQmpbLbgoGad/UgG7grb0UshvnrQHpw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/optimizer-html@2.15.4': + resolution: {integrity: sha512-gBvt6RdDVMyO1Flvdtc8DxpxLgIXhaKuVXEjHdAP7sEW0SMdSd6r/tl6Plmcszig7sDwhDf6IsQOIvbzGHYZZg==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/optimizer-image@2.15.4': + resolution: {integrity: sha512-M8fo7eEL6JRcmLhSX9pUUGU4MPrPrE9cMNcwIt3DQLnSvQ+sshhUDa6t9hKWeHHhs16BHvxrvksN2TIbkgHODQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/optimizer-svg@2.15.4': + resolution: {integrity: sha512-pPdjRaLPqjAEROXIHLc6JWLLki56alhuUNbalhLqBCgktZrrq2dGCjBEVgxqRczc9D+ePCX/e/xci4tC0Tkcbg==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/optimizer-swc@2.15.4': + resolution: {integrity: sha512-2m5cYESVCq6AGx252eSTArZ1Oc1Ve4GBGL7NhvgbNqOthyXlc2qAed6rCkARrBd8pfEl5+2XHeK1ijDAZdIZ/A==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/package-manager@2.15.4': + resolution: {integrity: sha512-KZONBcEJ24moQdrpU0zJh9CYk3KKbpB5RUM70utAORem1yQKms+0Y4YED3njq6nZzbgwUN/Csc+powUHLZStvg==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/packager-css@2.15.4': + resolution: {integrity: sha512-bzSaNf+I5lmJFu95wSG2k7pGwjCDesZsV6Y9sozIL2LoSxqvkGhm/ABXAa3Ed7dLe3tSAEBzJcyqShQgLzSzuw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/packager-html@2.15.4': + resolution: {integrity: sha512-Uayux6A2Anm66Kmq22QhD0TuVp9LiRCMuPUzBd6n4ekNlG0Lzm6K3/okMkPG65nKbNjq5qcPscFWlDxggvjt2g==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/packager-js@2.15.4': + resolution: {integrity: sha512-96bqhs1jyd28CfWQD+Yn8rSsd1ar7voHWyBtMLimsK+bDJIzL26Z7jWyRDwXRuLErYC01EoXRIRctxtmeRVJ2Q==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/packager-raw@2.15.4': + resolution: {integrity: sha512-CaSpDt5jjcO0SYCtsDhw6yfTDQuDFQ875H42W/ftvSQL7RfLRljPthnbdcy9chvKBbvRBQF+0z8Sxwehrd5hsA==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/packager-svg@2.15.4': + resolution: {integrity: sha512-qHsyOgnzoA2XGMLIYUnX79XAaV327VTWQvIzju/OmOjcff4o3uiEcNL8w9k3p2w2oPXOLoQ0THMiivoUQSM8GQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/packager-wasm@2.15.4': + resolution: {integrity: sha512-YPVij7zrBchtXr/y29P4uh3C/+19PMhhLibYF/8oMJKkFkeU3Uv00/XLm915vdBPrIPjgw0YuIfLzUKip1uGtg==} + engines: {node: '>=16.0.0', parcel: ^2.15.4} + + '@parcel/plugin@2.15.4': + resolution: {integrity: sha512-XVehjmzk8ZDOFf/BXo26L76ZqCGNKIQcN2ngxAnq0KRY/WFanL8yLaL0qQq+c9whlu09hkGz1CuhFBLAIjJMYQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/profiler@2.15.4': + resolution: {integrity: sha512-ezVZlttUmQ1MQD5e8yVb07vSGYEFOB59Y/jaxL9mGSLZkVhMIIHe/7SuA+4qVAH8dlg6bslXRqlsunLMPEgPsg==} + engines: {node: '>= 16.0.0'} + + '@parcel/reporter-cli@2.15.4': + resolution: {integrity: sha512-us0HIwuJqpSguf+yi4n8foabVs26JGvRB/eSOf0KkRldxFciYLn4NJ8rt3Xm1zvxlDiSkD4v2n77u+ouIZ+AEQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/reporter-dev-server@2.15.4': + resolution: {integrity: sha512-uCNeDyArNNXI9YThlxyTx7+5ZSxlewyUdyrLdDZCqvn8s1xNB9W8sUNVps7mJZQSc+2ZRk3wyDemURD67uJk/A==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/reporter-tracer@2.15.4': + resolution: {integrity: sha512-9W1xsb/FtobCQ4z847nI6hFDaTZHLeThv/z05EF77R30RX2k+unG9ac5NQB1v4KLx09Bhfre32+sjYNReWxWlg==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/resolver-default@2.15.4': + resolution: {integrity: sha512-4uKo3FFnubtIc4rM9jZiQQXpa1slawyRy5btJEfTFvbcnz0dm3WThLrsPDMfmPwNr9F/n5x8yzDLI6/fZ/elgA==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/runtime-browser-hmr@2.15.4': + resolution: {integrity: sha512-KRGzbxDUOQUkrJKxxY0WyU7oVaa9TvWTRlpuGJXzQJs/hw8vkAAoAm8+ptpypvBC8LnxFHzGbSyHPfL8C8MQOw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/runtime-js@2.15.4': + resolution: {integrity: sha512-zNRK+693CMkYiA0ckjPOmz+JVHD9bVzp27itcMyuDH6l/Or8m09RgCC4DIdIxBqiplsDSe39DwEc5X7b0vvcjw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/runtime-rsc@2.15.4': + resolution: {integrity: sha512-yHc4HEwzCQYLqa6Q1WtZ8xJeaDAk0p2i0b3ABq2I+izmRjer4jertlsEwh9mf9Z1eUGtJobdGYzl8Ai1VfhC3g==} + engines: {node: '>= 12.0.0', parcel: ^2.15.4} + + '@parcel/runtime-service-worker@2.15.4': + resolution: {integrity: sha512-NGq/wS34GIVzo2ZURBjCqgHV+PU7eTcngCzmmk/wrCEeWnr13ld+CAIxVZoqyNJwYsF6VQanrjSM2/LhCXEdyA==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/rust-darwin-arm64@2.15.4': + resolution: {integrity: sha512-cEpNDeEtvM5Nhj0QLN95QbcZ9yY6Z5W3+2OeHvnojEAP8Rp1XGzqVTTZdlyKyN1KTiyfzIOiQJCiEcr+kMc5Nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@parcel/rust-darwin-x64@2.15.4': + resolution: {integrity: sha512-jL9i13sXKeBXXz8Z3BNYoScPOi+ljBA0ubAE3PN5DCoAA6wS4/FsAiRSIUw+3uxqASBD7+JvaT5sDUga1Xft5g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@parcel/rust-linux-arm-gnueabihf@2.15.4': + resolution: {integrity: sha512-c8HpVdDugCutlMILoOlkTioih9HGJpQrzS2G3cg/O1a5ZTacooGf3eGJGoh6dUBEv9WEaEb6zsTRwFv2BgtZcA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@parcel/rust-linux-arm64-gnu@2.15.4': + resolution: {integrity: sha512-Wcfs/JY4FnuLxQaU+VX2rI4j376Qo2LkZmq4zp9frnsajaAqmloVQfnbUkdnQPEL4I38eHXerzBX3LoXSxnZKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@parcel/rust-linux-arm64-musl@2.15.4': + resolution: {integrity: sha512-xf9HxosEn3dU5M0zDSXqBaG8rEjLThRdTYqpkxHW/qQGzy0Se+/ntg8PeDHsSG5E9OK8xrcKH46Lhaw0QBF/Zw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@parcel/rust-linux-x64-gnu@2.15.4': + resolution: {integrity: sha512-RigXVCFj6h0AXmkuxU61rfgYuW+PXBR6qSkR2I20yKnAXoMfxLaZy9YJ3sAPMEjT9zXgzGAX+3syItMF+bRjaw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@parcel/rust-linux-x64-musl@2.15.4': + resolution: {integrity: sha512-tHlRgonSr5ca8OvhbGzZUggCgCOirRz5dHhPSCm4ajMxeDMamwprq6lKy0sCNTXht4TXIEyugBcfEuRKEeVIBw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@parcel/rust-win32-x64-msvc@2.15.4': + resolution: {integrity: sha512-YsX6vMl/bfyxqZSN7yiaZQKLoJKELSZYcvg8gIv4CF1xkaTdmfr6gvq2iCyoV+bwrodNohN4Xfl8r7Wniu1/UA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@parcel/rust@2.15.4': + resolution: {integrity: sha512-OxOux8z8YEYg23+15uMmYaloFp3x1RwcliBay6HqxUW7RTmtI1/z+xd8AtienCckACD60gvDGy04LjgbEGdJVg==} + engines: {node: '>= 16.0.0'} + peerDependencies: + napi-wasm: ^1.1.2 + peerDependenciesMeta: + napi-wasm: + optional: true + + '@parcel/source-map@2.1.1': + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + + '@parcel/transformer-babel@2.15.4': + resolution: {integrity: sha512-rb4nqZcTLkLD3nvuYJ9wwNb8x6cajBK2l6csdYMLEI4516SkIzkO/gs2cZ9M5q+CMhxAqpdEnrwektbOtQQasg==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-css@2.15.4': + resolution: {integrity: sha512-6tVwSJsOssXgcB5XMAQGsexAffoBEi8GVql3YQqzI1EwVYs9zr+B5mfbesb4aWcegR02w99NHJYFP9CrOr3SWw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-html@2.15.4': + resolution: {integrity: sha512-gzYPbbyEuV8nzPojw86eD5Kf93AYUWcY8lu33gu0XHROJH7mq5MAwPwtb/U+EfpeCd0/oKbLzA2mkQksM1NncQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-image@2.15.4': + resolution: {integrity: sha512-KOVwj2gKjUybuzHwarC/YVqRf3r2BD4/2ysckozj6DIji/bq3fd2rE9yqxWXO+zt918PsOSTzMKwRnaseaXLKQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/transformer-js@2.15.4': + resolution: {integrity: sha512-HX76PalPjqCLmXJnuSeMr2km8WlnUsW8oaRZ6FuZtSo9QD8BqIcwKGxSbIy9JHkObBgmrMOVpGtYrJM4/BlYbg==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@parcel/transformer-json@2.15.4': + resolution: {integrity: sha512-1ASeOSH3gPeaXyy/TZ7ce2TOfJ3ZeK5SBnDs+MM8LFcQsTwdRJKjX/4Qq9RgtMRryYAGHgMa09Gvp9FuFRyd+w==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-node@2.15.4': + resolution: {integrity: sha512-zV5jvZA971eQMcFtaWZkW1UfAH/G6XVM/87oJ2B4ip9o9aKUWIl296rrfg2xWxUQyPhy11B17CJ6b8NgieqqrQ==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-postcss@2.15.4': + resolution: {integrity: sha512-cNueSpOj3ulmMX85xr9clh/t0+mzVE+Q3H7Cf/OammqUkG/xjmilq4q7ZTgQFyUtUdWpE9LWWHojbJuz6k2Ulw==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-posthtml@2.15.4': + resolution: {integrity: sha512-dETI+CeKMwu5Dpvu8BrQtex6nwzbNWKQkXseiM5x6+Wf3j9RD2NVpAMBRMjLkw1XlC9Whz1egxLSgKlMKbjg0w==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-raw@2.15.4': + resolution: {integrity: sha512-pY2j09UCW2v1fwQtVLlCztSdPOxhq0YcWmTHCk/mRp8zuUR+eyHgsz48FrUxRF7cr/EBjc0zlFcregRMRcaTMg==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-react-refresh-wrap@2.15.4': + resolution: {integrity: sha512-MgoQrV8+BVjrczAns5ZZbTERGB3/U4MaCBmbg3CuiTiIyS8IJQnGi+OhYRdKAB4NlsgpMZ5T2JrRbQUIm9MM8Q==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/transformer-svg@2.15.4': + resolution: {integrity: sha512-Q22e0VRbx62VXFlvJWIlc8ihlLaPQgtnAZz5E1/+ojiNb+k0PmIRjNJclVWPF6IdCsLO5tnGfUOaXe2OnZz28Q==} + engines: {node: '>= 16.0.0', parcel: ^2.15.4} + + '@parcel/types-internal@2.15.4': + resolution: {integrity: sha512-kl5QEZ8PTWRvMkwmk7IG3VpP/5/MSGwt9Nrj9ctXLdZkDdXZpK7IbXAthLQ4zrByMaqZULL2IyDuBqBgfuAqlQ==} + + '@parcel/types@2.15.4': + resolution: {integrity: sha512-fS3UMMinLtzn/NTSx/qx38saBgRniylldh0XZEUcGeME4D2Llu/QlLv+YZ/LJqrFci3fPRM+YAn2K+JT/u+/0w==} + + '@parcel/utils@2.15.4': + resolution: {integrity: sha512-29m09sfPx0GHnmy1kkZ5XezprepdFGKKKUEJkyiYA4ERf55jjdnU2/GP4sWlZXxjh2Y+JFoCAFlCamEClq/8eA==} + engines: {node: '>= 16.0.0'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@parcel/workers@2.15.4': + resolution: {integrity: sha512-wZ/5/mfjs5aeqhXY0c6fwuaBFeNpOXoOq2CKPSMDXt+GX2u/9/1bpVxN9XeGTAJO+ZD++CLq0hyzTnIHy58nyw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.15.4 + + '@swc/core-darwin-arm64@1.12.9': + resolution: {integrity: sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.12.9': + resolution: {integrity: sha512-hv2kls7Ilkm2EpeJz+I9MCil7pGS3z55ZAgZfxklEuYsxpICycxeH+RNRv4EraggN44ms+FWCjtZFu0LGg2V3g==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.12.9': + resolution: {integrity: sha512-od9tDPiG+wMU9wKtd6y3nYJdNqgDOyLdgRRcrj1/hrbHoUPOM8wZQZdwQYGarw63iLXGgsw7t5HAF9Yc51ilFA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.12.9': + resolution: {integrity: sha512-6qx1ka9LHcLzxIgn2Mros+CZLkHK2TawlXzi/h7DJeNnzi8F1Hw0Yzjp8WimxNCg6s2n+o3jnmin1oXB7gg8rw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.12.9': + resolution: {integrity: sha512-yghFZWKPVVGbUdqiD7ft23G0JX6YFGDJPz9YbLLAwGuKZ9th3/jlWoQDAw1Naci31LQhVC+oIji6ozihSuwB2A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.12.9': + resolution: {integrity: sha512-SFUxyhWLZRNL8QmgGNqdi2Q43PNyFVkRZ2zIif30SOGFSxnxcf2JNeSeBgKIGVgaLSuk6xFVVCtJ3KIeaStgRg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.12.9': + resolution: {integrity: sha512-9FB0wM+6idCGTI20YsBNBg9xSWtkDBymnpaTCsZM3qDc0l4uOpJMqbfWhQvp17x7r/ulZfb2QY8RDvQmCL6AcQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.12.9': + resolution: {integrity: sha512-zHOusMVbOH9ik5RtRrMiGzLpKwxrPXgXkBm3SbUCa65HAdjV33NZ0/R9Rv1uPESALtEl2tzMYLUxYA5ECFDFhA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.12.9': + resolution: {integrity: sha512-aWZf0PqE0ot7tCuhAjRkDFf41AzzSQO0x2xRfTbnhpROp57BRJ/N5eee1VULO/UA2PIJRG7GKQky5bSGBYlFug==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.12.9': + resolution: {integrity: sha512-C25fYftXOras3P3anSUeXXIpxmEkdAcsIL9yrr0j1xepTZ/yKwpnQ6g3coj8UXdeJy4GTVlR6+Ow/QiBgZQNOg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.12.9': + resolution: {integrity: sha512-O+LfT2JlVMsIMWG9x+rdxg8GzpzeGtCZQfXV7cKc1PjIKUkLFf1QJ7okuseA4f/9vncu37dQ2ZcRrPKy0Ndd5g==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@swc/types@0.1.23': + resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caniuse-lite@1.0.30001726: + resolution: {integrity: sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + electron-to-chromium@1.5.179: + resolution: {integrity: sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + get-port@4.2.0: + resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} + engines: {node: '>=6'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lmdb@2.8.5: + resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} + hasBin: true + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.4: + resolution: {integrity: sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + ordered-binary@1.6.0: + resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} + + parcel@2.15.4: + resolution: {integrity: sha512-eZHQ/omuQ7yBYB9XezyzSqhc826oy/uhloCNiej1CTZ+twAqJVtp4MRvTGMcivKhE+WE8QkYD5XkJHLLQsJQcg==} + engines: {node: '>= 16.0.0'} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + react-refresh@0.16.0: + resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + +snapshots: + + '@lezer/common@1.2.3': {} + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lmdb/lmdb-darwin-arm64@2.8.5': + optional: true + + '@lmdb/lmdb-darwin-x64@2.8.5': + optional: true + + '@lmdb/lmdb-linux-arm64@2.8.5': + optional: true + + '@lmdb/lmdb-linux-arm@2.8.5': + optional: true + + '@lmdb/lmdb-linux-x64@2.8.5': + optional: true + + '@lmdb/lmdb-win32-x64@2.8.5': + optional: true + + '@mischnic/json-sourcemap@0.1.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/lr': 1.4.2 + json5: 2.2.3 + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@parcel/bundler-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/graph': 3.5.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/cache@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/logger': 2.15.4 + '@parcel/utils': 2.15.4 + lmdb: 2.8.5 + transitivePeerDependencies: + - napi-wasm + + '@parcel/codeframe@2.15.4': + dependencies: + chalk: 4.1.2 + + '@parcel/compressor-raw@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/config-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': + dependencies: + '@parcel/bundler-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/compressor-raw': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/namer-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/optimizer-css': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/optimizer-html': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/optimizer-image': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/optimizer-svg': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/optimizer-swc': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) + '@parcel/packager-css': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/packager-html': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/packager-js': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/packager-raw': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/packager-svg': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/packager-wasm': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/reporter-dev-server': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/resolver-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/runtime-browser-hmr': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/runtime-js': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/runtime-rsc': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/runtime-service-worker': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-babel': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-css': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-html': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-image': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-js': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-json': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-node': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-postcss': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-posthtml': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-raw': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-react-refresh-wrap': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/transformer-svg': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@swc/helpers' + - napi-wasm + + '@parcel/core@2.15.4(@swc/helpers@0.5.17)': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/diagnostic': 2.15.4 + '@parcel/events': 2.15.4 + '@parcel/feature-flags': 2.15.4 + '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/graph': 3.5.4 + '@parcel/logger': 2.15.4 + '@parcel/package-manager': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/profiler': 2.15.4 + '@parcel/rust': 2.15.4 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + base-x: 3.0.11 + browserslist: 4.25.1 + clone: 2.1.2 + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + json5: 2.2.3 + msgpackr: 1.11.4 + nullthrows: 1.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - '@swc/helpers' + - napi-wasm + + '@parcel/diagnostic@2.15.4': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + + '@parcel/error-overlay@2.15.4': {} + + '@parcel/events@2.15.4': {} + + '@parcel/feature-flags@2.15.4': {} + + '@parcel/fs@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/feature-flags': 2.15.4 + '@parcel/rust': 2.15.4 + '@parcel/types-internal': 2.15.4 + '@parcel/utils': 2.15.4 + '@parcel/watcher': 2.5.1 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - napi-wasm + + '@parcel/graph@3.5.4': + dependencies: + '@parcel/feature-flags': 2.15.4 + nullthrows: 1.1.1 + + '@parcel/logger@2.15.4': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/events': 2.15.4 + + '@parcel/markdown-ansi@2.15.4': + dependencies: + chalk: 4.1.2 + + '@parcel/namer-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/node-resolver-core@3.6.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.15.4 + '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + nullthrows: 1.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/optimizer-css@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + browserslist: 4.25.1 + lightningcss: 1.30.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/optimizer-html@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/optimizer-image@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - napi-wasm + + '@parcel/optimizer-svg@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/optimizer-swc@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + '@swc/core': 1.12.9(@swc/helpers@0.5.17) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + - napi-wasm + + '@parcel/package-manager@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/diagnostic': 2.15.4 + '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/logger': 2.15.4 + '@parcel/node-resolver-core': 3.6.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@swc/core': 1.12.9(@swc/helpers@0.5.17) + semver: 7.7.2 + transitivePeerDependencies: + - '@swc/helpers' + - napi-wasm + + '@parcel/packager-css@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + lightningcss: 1.30.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/packager-html@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/packager-js@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/packager-raw@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/packager-svg@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/packager-wasm@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/plugin@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/profiler@2.15.4': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/events': 2.15.4 + '@parcel/types-internal': 2.15.4 + chrome-trace-event: 1.0.4 + + '@parcel/reporter-cli@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/types': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/reporter-dev-server@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/codeframe': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/reporter-tracer@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + chrome-trace-event: 1.0.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/resolver-default@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/node-resolver-core': 3.6.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/runtime-browser-hmr@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/runtime-js@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/runtime-rsc@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/runtime-service-worker@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/rust-darwin-arm64@2.15.4': + optional: true + + '@parcel/rust-darwin-x64@2.15.4': + optional: true + + '@parcel/rust-linux-arm-gnueabihf@2.15.4': + optional: true + + '@parcel/rust-linux-arm64-gnu@2.15.4': + optional: true + + '@parcel/rust-linux-arm64-musl@2.15.4': + optional: true + + '@parcel/rust-linux-x64-gnu@2.15.4': + optional: true + + '@parcel/rust-linux-x64-musl@2.15.4': + optional: true + + '@parcel/rust-win32-x64-msvc@2.15.4': + optional: true + + '@parcel/rust@2.15.4': + optionalDependencies: + '@parcel/rust-darwin-arm64': 2.15.4 + '@parcel/rust-darwin-x64': 2.15.4 + '@parcel/rust-linux-arm-gnueabihf': 2.15.4 + '@parcel/rust-linux-arm64-gnu': 2.15.4 + '@parcel/rust-linux-arm64-musl': 2.15.4 + '@parcel/rust-linux-x64-gnu': 2.15.4 + '@parcel/rust-linux-x64-musl': 2.15.4 + '@parcel/rust-win32-x64-msvc': 2.15.4 + + '@parcel/source-map@2.1.1': + dependencies: + detect-libc: 1.0.3 + + '@parcel/transformer-babel@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + browserslist: 4.25.1 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-css@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + browserslist: 4.25.1 + lightningcss: 1.30.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-html@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-image@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + nullthrows: 1.1.1 + transitivePeerDependencies: + - napi-wasm + + '@parcel/transformer-js@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.15.4 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@swc/helpers': 0.5.17 + browserslist: 4.25.1 + nullthrows: 1.1.1 + regenerator-runtime: 0.14.1 + semver: 7.7.2 + transitivePeerDependencies: + - napi-wasm + + '@parcel/transformer-json@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-node@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-postcss@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + '@parcel/utils': 2.15.4 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.7.2 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-posthtml@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-raw@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-react-refresh-wrap@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/error-overlay': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + react-refresh: 0.16.0 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/transformer-svg@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/plugin': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/rust': 2.15.4 + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/types-internal@2.15.4': + dependencies: + '@parcel/diagnostic': 2.15.4 + '@parcel/feature-flags': 2.15.4 + '@parcel/source-map': 2.1.1 + utility-types: 3.11.0 + + '@parcel/types@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/types-internal': 2.15.4 + '@parcel/workers': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + transitivePeerDependencies: + - '@parcel/core' + - napi-wasm + + '@parcel/utils@2.15.4': + dependencies: + '@parcel/codeframe': 2.15.4 + '@parcel/diagnostic': 2.15.4 + '@parcel/logger': 2.15.4 + '@parcel/markdown-ansi': 2.15.4 + '@parcel/rust': 2.15.4 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + transitivePeerDependencies: + - napi-wasm + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + + '@parcel/workers@2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))': + dependencies: + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/diagnostic': 2.15.4 + '@parcel/logger': 2.15.4 + '@parcel/profiler': 2.15.4 + '@parcel/types-internal': 2.15.4 + '@parcel/utils': 2.15.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - napi-wasm + + '@swc/core-darwin-arm64@1.12.9': + optional: true + + '@swc/core-darwin-x64@1.12.9': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.12.9': + optional: true + + '@swc/core-linux-arm64-gnu@1.12.9': + optional: true + + '@swc/core-linux-arm64-musl@1.12.9': + optional: true + + '@swc/core-linux-x64-gnu@1.12.9': + optional: true + + '@swc/core-linux-x64-musl@1.12.9': + optional: true + + '@swc/core-win32-arm64-msvc@1.12.9': + optional: true + + '@swc/core-win32-ia32-msvc@1.12.9': + optional: true + + '@swc/core-win32-x64-msvc@1.12.9': + optional: true + + '@swc/core@1.12.9(@swc/helpers@0.5.17)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.23 + optionalDependencies: + '@swc/core-darwin-arm64': 1.12.9 + '@swc/core-darwin-x64': 1.12.9 + '@swc/core-linux-arm-gnueabihf': 1.12.9 + '@swc/core-linux-arm64-gnu': 1.12.9 + '@swc/core-linux-arm64-musl': 1.12.9 + '@swc/core-linux-x64-gnu': 1.12.9 + '@swc/core-linux-x64-musl': 1.12.9 + '@swc/core-win32-arm64-msvc': 1.12.9 + '@swc/core-win32-ia32-msvc': 1.12.9 + '@swc/core-win32-x64-msvc': 1.12.9 + '@swc/helpers': 0.5.17 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.23': + dependencies: + '@swc/counter': 0.1.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001726 + electron-to-chromium: 1.5.179 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + caniuse-lite@1.0.30001726: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chrome-trace-event@1.0.4: {} + + clone@2.1.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@12.1.0: {} + + detect-libc@1.0.3: {} + + detect-libc@2.0.4: {} + + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.6.1 + + dotenv@16.6.1: {} + + electron-to-chromium@1.5.179: {} + + escalade@3.2.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + get-port@4.2.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + has-flag@4.0.0: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + json5@2.2.3: {} + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lmdb@2.8.5: + dependencies: + msgpackr: 1.11.4 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.1.1 + ordered-binary: 1.6.0 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.8.5 + '@lmdb/lmdb-darwin-x64': 2.8.5 + '@lmdb/lmdb-linux-arm': 2.8.5 + '@lmdb/lmdb-linux-arm64': 2.8.5 + '@lmdb/lmdb-linux-x64': 2.8.5 + '@lmdb/lmdb-win32-x64': 2.8.5 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.4: + optionalDependencies: + msgpackr-extract: 3.0.3 + + node-addon-api@6.1.0: {} + + node-addon-api@7.1.1: {} + + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.0.4 + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.4 + optional: true + + node-releases@2.0.19: {} + + nullthrows@1.1.1: {} + + ordered-binary@1.6.0: {} + + parcel@2.15.4(@swc/helpers@0.5.17): + dependencies: + '@parcel/config-default': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) + '@parcel/core': 2.15.4(@swc/helpers@0.5.17) + '@parcel/diagnostic': 2.15.4 + '@parcel/events': 2.15.4 + '@parcel/feature-flags': 2.15.4 + '@parcel/fs': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/logger': 2.15.4 + '@parcel/package-manager': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17))(@swc/helpers@0.5.17) + '@parcel/reporter-cli': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/reporter-dev-server': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/reporter-tracer': 2.15.4(@parcel/core@2.15.4(@swc/helpers@0.5.17)) + '@parcel/utils': 2.15.4 + chalk: 4.1.2 + commander: 12.1.0 + get-port: 4.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - napi-wasm + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + postcss-value-parser@4.2.0: {} + + react-refresh@0.16.0: {} + + regenerator-runtime@0.14.1: {} + + safe-buffer@5.2.1: {} + + semver@7.7.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + term-size@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.8.1: {} + + type-fest@0.20.2: {} + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + utility-types@3.11.0: {} + + weak-lru-cache@1.2.2: {} diff --git a/package.json b/package.json index 5fdcee4a..e4aee72a 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,9 @@ }, "homepage": "http://zeromq.github.io/zeromq.js/", "dependencies": { - "cmake-ts": "1.0.2", - "node-addon-api": "^8.3.1" + "cmake-ts": "link:../cmake-ts", + "node-addon-api": "^8.3.1", + "napi-wasm": "^1.1.3" }, "devDependencies": { "@types/benchmark": "~2.1.5", @@ -115,6 +116,7 @@ "docs.deploy": "run-s docs.build && gh-pages --dist \"./docs\"", "build.native": "cmake-ts build --logger=debug", "build.native.debug": "cross-env npm_config_zmq_enable_sanitizer_undefined=true cmake-ts build --config debug", + "build.wasm": "cmake-ts build --logger=debug --config cross-wasm32-unknown-node-minsizerel", "build": "run-p build.js build.native", "build.debug": "run-s build.js build.native.debug", "test": "run-s test.unit test.examples", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3762b01..69ab443d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,8 +13,11 @@ importers: .: dependencies: cmake-ts: - specifier: 1.0.2 - version: 1.0.2 + specifier: link:../cmake-ts + version: link:../cmake-ts + napi-wasm: + specifier: ^1.1.3 + version: 1.1.3 node-addon-api: specifier: ^8.3.1 version: 8.3.1 @@ -1044,10 +1047,6 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - cmake-ts@1.0.2: - resolution: {integrity: sha512-5l++JHE7MxFuyV/OwJf3ek7ZZN1aGPFPM5oUz6AnK5inQAPe4TFXRMz5sA2qg2FRgByPWdqO+gSfIPo8GzoKNQ==} - hasBin: true - coffeescript@1.12.7: resolution: {integrity: sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==} engines: {node: '>=0.8.0'} @@ -2426,6 +2425,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-wasm@1.1.3: + resolution: {integrity: sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4576,8 +4578,6 @@ snapshots: dependencies: mimic-response: 1.0.1 - cmake-ts@1.0.2: {} - coffeescript@1.12.7: optional: true @@ -6310,6 +6310,8 @@ snapshots: nanoid@3.3.8: {} + napi-wasm@1.1.3: {} + natural-compare@1.4.0: {} no-case@2.3.2: diff --git a/src/wasm.cc b/src/wasm.cc new file mode 100644 index 00000000..8cf42a69 --- /dev/null +++ b/src/wasm.cc @@ -0,0 +1,21 @@ +#ifdef ZMQ_WASM + +#include +#include + +extern "C" uint8_t* napi_wasm_malloc(size_t size) { + const size_t align = alignof(size_t); + + if (size > 0) { + void* ptr = std::aligned_alloc(align, size); + if (ptr != nullptr) { + return static_cast(ptr); + } + } else { + return reinterpret_cast(align); + } + + std::abort(); +} + +#endif diff --git a/test/tsconfig.json b/test/tsconfig.json index d9a119c0..3325fe3e 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../tsconfig.json", - "include": ["./unit/**/*.ts", "./*.ts"], + "include": ["./unit/**/*.ts", "./*.ts", "../wasm.mts"], "compilerOptions": { "skipLibCheck": true }, diff --git a/test/types.d.ts b/test/types.d.ts new file mode 100644 index 00000000..5e4bedd6 --- /dev/null +++ b/test/types.d.ts @@ -0,0 +1,8 @@ +declare module 'napi-wasm' { + export class Environment { + constructor(instance: WebAssembly.Instance); + exports: any; + } + + export const napi: Record; +} From e574de7a69e13bd62e78056addad7af8a50b47fd Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Sun, 6 Jul 2025 08:04:16 -0700 Subject: [PATCH 2/6] fix: simplify the linker options --- CMakeLists.txt | 7 +------ {test => browser}/types.d.ts | 0 test/tsconfig.json | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) rename {test => browser}/types.d.ts (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ace62f6..bb80e0f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,13 +98,8 @@ if(ZMQ_WASM OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") add_link_options("SHELL:-s MODULARIZE=1") add_link_options("SHELL:-s EXPORT_NAME='createModule'") add_link_options("SHELL:-s ENVIRONMENT='web,worker'") - add_link_options("--no-entry") + add_link_options("SHELL:--no-entry") add_link_options("SHELL:-Wl,--strip-all") - add_link_options("SHELL:-fvisibility=hidden") - add_link_options("SHELL:-fvisibility-inlines-hidden") - add_link_options("SHELL:-Wl,-gc-sections") - add_compile_options("-flto=full") - add_link_options("-flto=full") # Allow undefined symbols on Linux for runtime loading add_link_options("SHELL:-Wl,--unresolved-symbols=ignore-all") diff --git a/test/types.d.ts b/browser/types.d.ts similarity index 100% rename from test/types.d.ts rename to browser/types.d.ts diff --git a/test/tsconfig.json b/test/tsconfig.json index 3325fe3e..d9a119c0 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "../tsconfig.json", - "include": ["./unit/**/*.ts", "./*.ts", "../wasm.mts"], + "include": ["./unit/**/*.ts", "./*.ts"], "compilerOptions": { "skipLibCheck": true }, From 1ced70e2c75164fab7c72c64db3f7c8444eebe99 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 23 Jul 2025 01:53:09 -0700 Subject: [PATCH 3/6] fix: fix finding the emscripten sdk --- CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb80e0f7..2d96cf6b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,9 +84,16 @@ if(ZMQ_WASM OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") set(VCPKG_HOST_TRIPLET wasm32-emscripten) set(VCPKG_TARGET_TRIPLET wasm32-emscripten) - include($ENV{EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake) + if ("$ENV{EMSCRIPTEN_ROOT}" STREQUAL "") + find_program(EMCC emcc REQUIRED) + get_filename_component(EMSCRIPTEN_ROOT "${EMCC}" DIRECTORY) + else() + set(EMSCRIPTEN_ROOT "$ENV{EMSCRIPTEN_ROOT}") + endif() + + include(${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake) - set(CMAKE_LINKER "$ENV{EMSCRIPTEN_ROOT}/bin/lld${CMAKE_EXECUTABLE_SUFFIX}" CACHE STRING "Linker" FORCE) + set(CMAKE_LINKER "${EMSCRIPTEN_ROOT}/bin/lld${CMAKE_EXECUTABLE_SUFFIX}" CACHE STRING "Linker" FORCE) # export an indirect function table for napi-wasm add_link_options("--export-table") From b711419ff9ad49ddb2e3998ad9fa33fe887b2312 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 23 Jul 2025 02:08:13 -0700 Subject: [PATCH 4/6] fix: fix the napi wasm entry --- CMakeLists.txt | 10 ++++++---- src/module.cc | 21 +++++++++++++++++++++ src/wasm.cc | 21 --------------------- 3 files changed, 27 insertions(+), 25 deletions(-) delete mode 100644 src/wasm.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d96cf6b..b88eed8d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,20 +95,22 @@ if(ZMQ_WASM OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") set(CMAKE_LINKER "${EMSCRIPTEN_ROOT}/bin/lld${CMAKE_EXECUTABLE_SUFFIX}" CACHE STRING "Linker" FORCE) + add_compile_definitions("-D__wasm__" "-D__EMSCRIPTEN__") + # export an indirect function table for napi-wasm add_link_options("--export-table") + add_compile_options("-fwasm-exceptions") + # Add WebAssembly-specific exports for napi-wasm - add_link_options("SHELL:-s EXPORTED_FUNCTIONS=['_malloc','_free','napi_wasm_malloc','napi_register_module_v1']") + add_link_options("SHELL:-s EXPORTED_FUNCTIONS=['_malloc','_free','_napi_register_wasm_v1']") add_link_options("SHELL:-s EXPORTED_RUNTIME_METHODS=['ccall','cwrap']") add_link_options("SHELL:-s ALLOW_MEMORY_GROWTH=1") add_link_options("SHELL:-s MODULARIZE=1") - add_link_options("SHELL:-s EXPORT_NAME='createModule'") add_link_options("SHELL:-s ENVIRONMENT='web,worker'") - add_link_options("SHELL:--no-entry") - add_link_options("SHELL:-Wl,--strip-all") # Allow undefined symbols on Linux for runtime loading + add_link_options("SHELL:-s ERROR_ON_UNDEFINED_SYMBOLS=0") add_link_options("SHELL:-Wl,--unresolved-symbols=ignore-all") endif() diff --git a/src/module.cc b/src/module.cc index bed5f00f..080e13f6 100644 --- a/src/module.cc +++ b/src/module.cc @@ -117,5 +117,26 @@ Module::Module(Napi::Env env, Napi::Object exports) : MsgTrash(env) { } } // namespace zmq +#ifdef ZMQ_WASM + +EXTERN_C_START +NAPI_MODULE_EXPORT uint8_t* napi_wasm_malloc(size_t size) { + const size_t align = alignof(size_t); + + if (size > 0) { + void* ptr = std::aligned_alloc(align, size); + if (ptr != nullptr) { + return static_cast(ptr); + } + } else { + return reinterpret_cast(align); + } + + std::abort(); +} +EXTERN_C_END + +#endif + using Module = zmq::Module; NODE_API_ADDON(Module) diff --git a/src/wasm.cc b/src/wasm.cc deleted file mode 100644 index 8cf42a69..00000000 --- a/src/wasm.cc +++ /dev/null @@ -1,21 +0,0 @@ -#ifdef ZMQ_WASM - -#include -#include - -extern "C" uint8_t* napi_wasm_malloc(size_t size) { - const size_t align = alignof(size_t); - - if (size > 0) { - void* ptr = std::aligned_alloc(align, size); - if (ptr != nullptr) { - return static_cast(ptr); - } - } else { - return reinterpret_cast(align); - } - - std::abort(); -} - -#endif From a143019de5a201f0bf9dcbf0d8fef94d2803992b Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 23 Jul 2025 02:28:04 -0700 Subject: [PATCH 5/6] fix add wasm example for nodejs --- CMakeLists.txt | 2 -- browser/index.js | 22 ------------- {browser => examples/wasm}/index.html | 2 +- examples/wasm/index.mjs | 39 +++++++++++++++++++++++ {browser => examples/wasm}/package.json | 2 +- {browser => examples/wasm}/pnpm-lock.yaml | 0 {browser => examples/wasm}/types.d.ts | 0 7 files changed, 41 insertions(+), 26 deletions(-) delete mode 100644 browser/index.js rename {browser => examples/wasm}/index.html (57%) create mode 100644 examples/wasm/index.mjs rename {browser => examples/wasm}/package.json (85%) rename {browser => examples/wasm}/pnpm-lock.yaml (100%) rename {browser => examples/wasm}/types.d.ts (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b88eed8d..c0ff5fc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,8 +106,6 @@ if(ZMQ_WASM OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") add_link_options("SHELL:-s EXPORTED_FUNCTIONS=['_malloc','_free','_napi_register_wasm_v1']") add_link_options("SHELL:-s EXPORTED_RUNTIME_METHODS=['ccall','cwrap']") add_link_options("SHELL:-s ALLOW_MEMORY_GROWTH=1") - add_link_options("SHELL:-s MODULARIZE=1") - add_link_options("SHELL:-s ENVIRONMENT='web,worker'") # Allow undefined symbols on Linux for runtime loading add_link_options("SHELL:-s ERROR_ON_UNDEFINED_SYMBOLS=0") diff --git a/browser/index.js b/browser/index.js deleted file mode 100644 index c0dfa088..00000000 --- a/browser/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import {Environment, napi} from "napi-wasm" - -async function main() { - const response = await fetch("./addon.wasm") - const bytes = await response.arrayBuffer() - const {instance} = await WebAssembly.instantiate( - bytes, - { - env: napi, - }, - ) - - // Create an environment. - let env = new Environment(instance) - let exports = env.exports - - console.log(exports) -} - -main().catch(err => { - throw err -}) diff --git a/browser/index.html b/examples/wasm/index.html similarity index 57% rename from browser/index.html rename to examples/wasm/index.html index 846785db..d5d78b44 100644 --- a/browser/index.html +++ b/examples/wasm/index.html @@ -2,6 +2,6 @@ ZeroMQ - + diff --git a/examples/wasm/index.mjs b/examples/wasm/index.mjs new file mode 100644 index 00000000..86eff076 --- /dev/null +++ b/examples/wasm/index.mjs @@ -0,0 +1,39 @@ +import {Environment, napi} from "napi-wasm" + +async function getWasm() { + if (typeof window === "undefined") { + // Nodejs + const fs = await import("fs/promises") + const path = await import("path") + const url = await import("url") + + const __dirname = path.dirname(url.fileURLToPath(import.meta.url)) + + return (await fs.readFile(path.join(__dirname, "addon.wasm"))) + } + + // Browser + const response = await fetch("./addon.wasm") + if (!response.ok) { + throw new Error(`Failed to fetch wasm: ${response.statusText}`) + } + return await response.arrayBuffer() +} + +async function main() { + const wasm = await getWasm() + + const {instance} = await WebAssembly.instantiate(wasm, { + env: napi, + }) + + // Create an environment. + let env = new Environment(instance) + let exports = env.exports + + console.log(exports) +} + +main().catch(err => { + throw err +}) diff --git a/browser/package.json b/examples/wasm/package.json similarity index 85% rename from browser/package.json rename to examples/wasm/package.json index 2170541c..a5427658 100644 --- a/browser/package.json +++ b/examples/wasm/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "", "scripts": { - "start": "parcel index.html" + "start": "parcel serve index.html" }, "keywords": [], "author": "", diff --git a/browser/pnpm-lock.yaml b/examples/wasm/pnpm-lock.yaml similarity index 100% rename from browser/pnpm-lock.yaml rename to examples/wasm/pnpm-lock.yaml diff --git a/browser/types.d.ts b/examples/wasm/types.d.ts similarity index 100% rename from browser/types.d.ts rename to examples/wasm/types.d.ts From 24e24b93f70135151b4c93b0207329bc88883ec3 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Wed, 23 Jul 2025 02:45:01 -0700 Subject: [PATCH 6/6] fix: compile for the node env --- CMakeLists.txt | 9 ++++----- examples/wasm/index.mjs | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c0ff5fc4..6b0733d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,16 +100,14 @@ if(ZMQ_WASM OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten") # export an indirect function table for napi-wasm add_link_options("--export-table") - add_compile_options("-fwasm-exceptions") - # Add WebAssembly-specific exports for napi-wasm add_link_options("SHELL:-s EXPORTED_FUNCTIONS=['_malloc','_free','_napi_register_wasm_v1']") add_link_options("SHELL:-s EXPORTED_RUNTIME_METHODS=['ccall','cwrap']") add_link_options("SHELL:-s ALLOW_MEMORY_GROWTH=1") - - # Allow undefined symbols on Linux for runtime loading + add_link_options("SHELL:-s ENVIRONMENT='node'") add_link_options("SHELL:-s ERROR_ON_UNDEFINED_SYMBOLS=0") - add_link_options("SHELL:-Wl,--unresolved-symbols=ignore-all") + add_link_options("SHELL:-s DISABLE_EXCEPTION_CATCHING=0") + add_link_options("--no-entry") endif() # Set MacOS deployment target @@ -162,6 +160,7 @@ project_options( ENABLE_CACHE ENABLE_COMPILE_COMMANDS_SYMLINK ${ENABLE_SANITIZER_UNDEFINED} + ENABLE_INTERPROCEDURAL_OPTIMIZATION ) file(GLOB_RECURSE SOURCES "./src/*.cc" "./src/*.cpp") diff --git a/examples/wasm/index.mjs b/examples/wasm/index.mjs index 86eff076..330c5a6a 100644 --- a/examples/wasm/index.mjs +++ b/examples/wasm/index.mjs @@ -24,7 +24,8 @@ async function main() { const wasm = await getWasm() const {instance} = await WebAssembly.instantiate(wasm, { - env: napi, + napi: napi, + env: {} // The env imports will be provided by napi-wasm }) // Create an environment.