diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..863bcb7 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,12 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "semi": true, + "singleQuote": false, + "printWidth": 100, + "trailingComma": "all", + "bracketSpacing": true, + "arrowParens": "always", + "tabWidth": 4, + "sortPackageJson": false, + "ignorePatterns": [] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..88ffdf6 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,44 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "unicorn", "oxc"], + "categories": { + "correctness": "error", + "suspicious": "warn" + }, + "env": { + "builtin": true, + "browser": true + }, + "ignorePatterns": [ + "dist/**", + "assets/**", + "node_modules/**", + "dependency_sources/**", + "drivers/**", + "async-engine/**", + "webendpoint-cpp/**", + "emsdk/**" + ], + "overrides": [ + { + "files": ["**/*.test.ts", "**/__tests__/**", "**/__mocks__/**"], + "plugins": ["jest"], + "rules": { + "jest/expect-expect": "off", + "jest/require-to-throw-message": "off" + } + } + ], + "rules": { + "no-console": "off", + "no-shadow": "off", + "no-useless-constructor": "off", + "preserve-caught-error": "off", + "typescript/no-extraneous-class": "off", + "unicorn/prefer-query-selector": "off", + "unicorn/no-array-for-each": "off", + "unicorn/no-array-reduce": "off", + "unicorn/prefer-add-event-listener": "off", + "unicorn/require-post-message-target-origin": "off" + } +} diff --git a/README.md b/README.md index 949916e..f9c7350b 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,41 @@ The project uses a combined pipeline to compile the C++ core to Wasm and bundle | Command | Description | | --- | --- | -| `npm run build` | Runs the full pipeline: Clean -> Build Wasm -> Compile TS -> Bundle Webpack. | -| `npm run build:wasm` | Compiles the C++ source code to WebAssembly using `scripts/pipeline.sh`. | +| `npm run build` | Full release build: Clean → Build Wasm → Compile TS → Bundle Webpack. | +| `npm run build:debug` | Full debug build (see below). | +| `npm run build:wasm` | Compiles the C++ source to WebAssembly (release flags). | +| `npm run build:wasm:debug` | Compiles the C++ source to WebAssembly (debug flags). | | `npm run build:js` | Compiles TypeScript (`tsc`) and bundles assets (`webpack`). | | `npm run watch:types` | Watches for TypeScript changes. | +### Release vs Debug builds + +By default all builds are **release** builds: `-O3`, LTO enabled, `ASSERTIONS=0`, `SAFE_HEAP=0`. + +A **debug** build swaps in the following flags for the WASM module: + +| Flag | Release | Debug | +| --- | --- | --- | +| Optimisation | `-O3` + `-flto` | `-O0 -g` | +| Emscripten assertions | `ASSERTIONS=0` | `ASSERTIONS=2` | +| Heap safety checks | `SAFE_HEAP=0` | `SAFE_HEAP=1` | +| Stack overflow check | off | `STACK_OVERFLOW_CHECK=2` | +| Demangled stack traces | off | `DEMANGLE_SUPPORT=1` | +| C++ `DEBUG` macro | not defined | defined | + +```bash +# Full debug build (WASM + JS) +npm run build:debug + +# WASM only (faster iteration) +npm run build:wasm:debug + +# Or pass the env variable directly to the pipeline script +PRIVMX_BUILD_TYPE=debug npm run build:wasm +``` + +> **Note:** Debug builds are significantly larger and slower than release builds. Use them only for local development and troubleshooting. + ## Testing The project employs a dual testing strategy: **Jest** for unit logic and **Playwright** for End-to-End (E2E) integration testing. diff --git a/async-engine/CMakeLists.txt b/async-engine/CMakeLists.txt index d80889e..112dffc 100644 --- a/async-engine/CMakeLists.txt +++ b/async-engine/CMakeLists.txt @@ -34,11 +34,27 @@ Threads::Threads Pson ) -target_compile_options(asyncengine PUBLIC - -O3 - -pthread - -fexceptions # Ensure exceptions are enabled for async logic -) +# --------------------------------------------------------------------------- +# Build variant: release (default) or debug +# --------------------------------------------------------------------------- +set(PRIVMX_BUILD_TYPE "release" CACHE STRING "Build variant: release or debug") + +if(PRIVMX_BUILD_TYPE STREQUAL "debug") + message(STATUS "Building asyncengine: DEBUG") + target_compile_options(asyncengine PUBLIC + -O0 -g + -pthread + -fexceptions + -DDEBUG + ) +else() + message(STATUS "Building asyncengine: RELEASE") + target_compile_options(asyncengine PUBLIC + -O3 + -pthread + -fexceptions + ) +endif() target_link_options(asyncengine PUBLIC -L $ENV{SDK_DIR}/upstream/emscripten/cache/sysroot/lib diff --git a/drivers/privmx-webendpoint-drv-crypto/CMakeLists.txt b/drivers/privmx-webendpoint-drv-crypto/CMakeLists.txt index fbe6a0d..927f830 100644 --- a/drivers/privmx-webendpoint-drv-crypto/CMakeLists.txt +++ b/drivers/privmx-webendpoint-drv-crypto/CMakeLists.txt @@ -11,11 +11,20 @@ add_library(privmxdrvcrypto ${SOURCES}) target_include_directories(privmxdrvcrypto PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(privmxdrvcrypto PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/privmx/drv/crypto.h) target_link_libraries(privmxdrvcrypto embind) -target_compile_options(privmxdrvcrypto PUBLIC - -O3 - -pthread -) -set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") +# --------------------------------------------------------------------------- +# Build variant: release (default) or debug +# --------------------------------------------------------------------------- +set(PRIVMX_BUILD_TYPE "release" CACHE STRING "Build variant: release or debug") + +if(PRIVMX_BUILD_TYPE STREQUAL "debug") + message(STATUS "Building privmxdrvcrypto: DEBUG") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(privmxdrvcrypto PUBLIC -O0 -g -pthread -DDEBUG) +else() + message(STATUS "Building privmxdrvcrypto: RELEASE") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(privmxdrvcrypto PUBLIC -O3 -pthread) +endif() target_link_options(privmxdrvcrypto PUBLIC -sUSE_PTHREADS -sEXPORTED_RUNTIME_METHODS=['HEAPU8','ccall'] diff --git a/drivers/privmx-webendpoint-drv-ecc/CMakeLists.txt b/drivers/privmx-webendpoint-drv-ecc/CMakeLists.txt index 9491b5e..bbc454a 100644 --- a/drivers/privmx-webendpoint-drv-ecc/CMakeLists.txt +++ b/drivers/privmx-webendpoint-drv-ecc/CMakeLists.txt @@ -12,11 +12,20 @@ target_include_directories(privmxdrvecc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/incl set_target_properties(privmxdrvecc PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/privmx/drv/ecc.h) target_link_libraries(privmxdrvecc) target_link_libraries(privmxdrvecc embind) -target_compile_options(privmxdrvecc PUBLIC - -O3 - -pthread -) -set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") +# --------------------------------------------------------------------------- +# Build variant: release (default) or debug +# --------------------------------------------------------------------------- +set(PRIVMX_BUILD_TYPE "release" CACHE STRING "Build variant: release or debug") + +if(PRIVMX_BUILD_TYPE STREQUAL "debug") + message(STATUS "Building privmxdrvecc: DEBUG") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(privmxdrvecc PUBLIC -O0 -g -pthread -DDEBUG) +else() + message(STATUS "Building privmxdrvecc: RELEASE") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(privmxdrvecc PUBLIC -O3 -pthread) +endif() target_link_options(privmxdrvecc PUBLIC -L $ENV{SDK_DIR}/upstream/emscripten/cache/sysroot/lib -sUSE_PTHREADS diff --git a/drivers/privmx-webendpoint-drv-net/CMakeLists.txt b/drivers/privmx-webendpoint-drv-net/CMakeLists.txt index 6db03f6..f4b1608 100644 --- a/drivers/privmx-webendpoint-drv-net/CMakeLists.txt +++ b/drivers/privmx-webendpoint-drv-net/CMakeLists.txt @@ -10,11 +10,20 @@ add_library(privmxdrvnet ${SOURCES}) target_include_directories(privmxdrvnet PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(privmxdrvnet PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/include/privmx/drv/net.h) target_link_libraries(privmxdrvnet PRIVATE embind) -target_compile_options(privmxdrvnet PUBLIC - -O3 - -pthread -) -set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") +# --------------------------------------------------------------------------- +# Build variant: release (default) or debug +# --------------------------------------------------------------------------- +set(PRIVMX_BUILD_TYPE "release" CACHE STRING "Build variant: release or debug") + +if(PRIVMX_BUILD_TYPE STREQUAL "debug") + message(STATUS "Building privmxdrvnet: DEBUG") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(privmxdrvnet PUBLIC -O0 -g -pthread -DDEBUG) +else() + message(STATUS "Building privmxdrvnet: RELEASE") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(privmxdrvnet PUBLIC -O3 -pthread) +endif() target_link_options(privmxdrvnet PUBLIC -L $ENV{SDK_DIR}/upstream/emscripten/cache/sysroot/lib -sUSE_PTHREADS diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index bfcf0e1..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,95 +0,0 @@ -import typescriptEslint from "@typescript-eslint/eslint-plugin"; -import stylisticJs from "@stylistic/eslint-plugin"; -import indentEmptyLines from "eslint-plugin-indent-empty-lines"; -import globals from "globals"; -import tsParser from "@typescript-eslint/parser"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import prettierPlugin from "eslint-plugin-prettier"; -import prettierConfig from "eslint-config-prettier"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -export default [ - // JS / general language options - { - ignores: ["dependency_sources", "drivers", "async-engine", "dist", "webendpoint-cpp", "assets"], - }, - { - languageOptions: { - globals: { ...globals.node }, - ecmaVersion: 2025, - sourceType: "module", - }, - plugins: { - "@stylistic/js": stylisticJs, - "indent-empty-lines": indentEmptyLines, - }, - rules: { - "@stylistic/js/keyword-spacing": ["error", { before: true, after: true }], - "@stylistic/js/no-multiple-empty-lines": ["error", { max: 1, maxEOF: 1, maxBOF: 0 }], - "@stylistic/js/space-before-blocks": ["error", "always"], - "@stylistic/js/comma-spacing": ["error", { before: false, after: true }], - "@stylistic/js/space-infix-ops": ["error"], - "@stylistic/js/brace-style": ["error", "stroustrup"], - "@stylistic/js/key-spacing": ["error"], - "@stylistic/js/comma-dangle": ["error", { - arrays: "always-multiline", - objects: "always-multiline", - imports: "always-multiline", - exports: "always-multiline", - functions: "always-multiline", - }], - "@/quotes": ["error", "double", { avoidEscape: true }], - "@/semi": ["error", "always"], - "indent-empty-lines/indent-empty-lines": ["error", 4], - }, - }, - // Ignored - { - ignores: [ - "emsdk/**", - "playwright.config.ts", - ], - }, - // TypeScript - { - files: ["*.ts", "*.tsx"], - languageOptions: { - parser: tsParser, - parserOptions: { - project: "./tsconfig.json", - tsconfigRootDir: __dirname, - ecmaVersion: 2025, - sourceType: "module", - }, - globals: { ...globals.node }, - }, - plugins: { - "@typescript-eslint": typescriptEslint, - prettier: prettierPlugin, - }, - rules: { - ...typescriptEslint.configs["recommended"].rules, - ...typescriptEslint.configs["recommended-requiring-type-checking"].rules, - "prettier/prettier": ["error", prettierConfig, { usePrettierrc: true }], - "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], - "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": ["error", { default: "array" }], - "@typescript-eslint/dot-notation": "error", - "@typescript-eslint/no-empty-function": "error", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-floating-promises": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/triple-slash-reference": ["error", { path: "always", types: "prefer-import", lib: "always" }], - "@typescript-eslint/unified-signatures": "error", - }, - }, -]; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5069fcf..9050958 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,23 +14,15 @@ "aes-js": "^3.1.2" }, "devDependencies": { - "@eslint/js": "^9.39.2", "@playwright/test": "^1.57.0", - "@stylistic/eslint-plugin": "^5.6.1", "@types/aes-js": "^3.1.4", "@types/jest": "^29.5.14", "@types/node": "^20.9.0", "@types/webpack": "^5.28.5", - "@typescript-eslint/eslint-plugin": "^8.51.0", - "@typescript-eslint/parser": "^8.51.0", "copy-webpack-plugin": "^14.0.0", - "eslint": "^9.39.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-indent-empty-lines": "^1.0.2", - "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", "mongodb": "^7.0.0", - "prettier": "^3.7.4", + "oxlint": "^1.60.0", "ts-jest": "^29.2.5", "ts-loader": "^9.5.1", "ts-node": "^10.9.1", @@ -652,285 +644,6 @@ "node": ">=10.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://npm.simplito.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://npm.simplito.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://npm.simplito.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://npm.simplito.com/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/config-array/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://npm.simplito.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://npm.simplito.com/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://npm.simplito.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://npm.simplito.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://npm.simplito.com/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://npm.simplito.com/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://npm.simplito.com/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://npm.simplito.com/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://npm.simplito.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://npm.simplito.com/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://npm.simplito.com/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://npm.simplito.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://npm.simplito.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://npm.simplito.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1519,110 +1232,535 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://npm.simplito.com/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.61.0.tgz", + "integrity": "sha512-6eZBPgiigK5txqoVgRqxbaxiom4lM8AP8CyKPPvpzKnQ3iFRFOIDc+0AapF+qsUSwjOzr5SGk4SxQDpQhkSJMQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@playwright/test": { - "version": "1.57.0", - "resolved": "https://npm.simplito.com/@playwright/test/-/test-1.57.0.tgz", - "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-android-arm64/-/binding-android-arm64-1.61.0.tgz", + "integrity": "sha512-CkwLR69MUnyv5wjzebvbbtTSUwqLxM35CXE79bHqDIK+NtKmPEUpStTcLQRZMCo4MP0qRT6TXIQVpK0ZVScnMA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.57.0" - }, - "bin": { - "playwright": "cli.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=18" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://npm.simplito.com/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://npm.simplito.com/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.61.0.tgz", + "integrity": "sha512-8JbefTkbmvqkqWjmQrHke+MdpgT2UghhD/ktM4FOQSpGeCgbMToJEKdl9zwhr/YWTl92i4QI1KiTwVExpcUN8A==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://npm.simplito.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.61.0.tgz", + "integrity": "sha512-uWpoxDT47hTnDLcdEh5jVbso8rlTTu5o0zuqa9J8E0JAKmIWn7kGFEIB03Pycn2hd2vKxybPGLhjURy/9We5FQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@stylistic/eslint-plugin": { - "version": "5.6.1", - "resolved": "https://npm.simplito.com/@stylistic/eslint-plugin/-/eslint-plugin-5.6.1.tgz", - "integrity": "sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw==", + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.61.0.tgz", + "integrity": "sha512-K/o4hEyW7flfMel0iBVznmMBt7VIMHGdjADocHKpK1DUF9erpWnJ+BSSWd2W0c8K3mPtpph+CuHzRU6CI3l9jQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.0", - "@typescript-eslint/types": "^8.47.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=9.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://npm.simplito.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.61.0.tgz", + "integrity": "sha512-P6040ZkcyweJ0Po9yEFqJCdvZnf3VNCGs1SIHgXDf8AAQNC6ID/heXQs9iSgo2FH7gKaKq32VWc59XZwL34C5Q==", + "cpu": [ + "arm" + ], "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://npm.simplito.com/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.61.0.tgz", + "integrity": "sha512-bwxrGCzTZkuB+THv2TQ1aTkVEfv5oz8sl+0XZZCpoYzErJD8OhPQOTA0ENPd1zJz8QsVdSzSrS2umKtPq4/JXg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.61.0.tgz", + "integrity": "sha512-vkhb9/wKguMkLlrm3FoJW/Xmdv31GgYAE+x8lxxQ+7HeOxXUySI0q36a3NTVIuQUdLzxCI1zzMGsk1o37FOe3w==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.61.0.tgz", + "integrity": "sha512-bl1dQh8LnVqsj6oOQAcxwbuOmNJkwc4p6o//HTBZhNTzJy21TLDwAviMqUFNUxDHkPGpmdKTSN4tWTjLryP8xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.61.0.tgz", + "integrity": "sha512-QoOX6KB2IiEpyOj/HKqaxi+NQHPnOgNgnr22n9N4ANJCzXkUlj1UmeAbFb4PpqdlHIzvGDM5xZ0OKtcLq9RhiQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.61.0.tgz", + "integrity": "sha512-1TGcTerjY6p152wCof3oKElccq3xHljS/Mucp04gV/4ATpP6nO7YNnp7opEg6SHkv2a57/b4b8Ndm9znJ1/qAw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.61.0.tgz", + "integrity": "sha512-65wXEmZIrX2ADwC8i/qFL4EWLSbeuBpAm3suuX1vu4IQkKd+wLT/HU/BOl84kp91u2SxPkPDyQgu4yrqp8vwVA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.61.0.tgz", + "integrity": "sha512-TVvhgMvor7Qa6COeXxCJ7ENOM+lcAOGsQ0iUdPSCv2hxb9qSHLQ4XF1h50S6RE1gBOJ0WV3rNukg4JJJP1LWRA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.61.0.tgz", + "integrity": "sha512-SjpS5uYuFoDnDdZPwZE59ndF95AsY47R5MliuneTWR1pDm2CxGJaYXbKULI71t5TVfLQUWmrHEGRL9xvuq6dnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.61.0.tgz", + "integrity": "sha512-gGfAeGD4sNJGILZbc/yKcIimO9wQnPMoYp9swAaKeEtwsSQAbU+rsdQze5SBtIP6j0QDzeYd4XSSUCRCF+LIeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.61.0.tgz", + "integrity": "sha512-OlVT0LrG/ct33EVtWRyR+B/othwmDWeRxfi13wUdPeb3lAT5TgTcFDcfLfarZtzB4W1nWF/zICMgYdkggX2WmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.61.0.tgz", + "integrity": "sha512-vI//NZPJk6DToiovPtaiwD4iQ7kO1r5ReWQD0sOOyKRtP3E2f6jxin4uvwi3OvDzHA2EFfd7DcZl5dtkQh7g1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.61.0.tgz", + "integrity": "sha512-0ySj4/4zd2XjePs3XAQq7IigIstN4LPQZgCyigX5/ERMLjdWAJfnxcTsrtxZxuij8guJW8foXuHmhGxW0H4dDA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.61.0.tgz", + "integrity": "sha512-0xgSiyeqDLDZxXoe9CVJrOx3TUVsfyoOY7cNi03JbItNcC9WCZqrSNdrAbHONxhSPaVh/lzfnDcON1RqSUMhHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", + "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", + "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", + "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", + "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-rsa": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", + "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", + "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.1", + "@peculiar/asn1-pfx": "^2.6.1", + "@peculiar/asn1-pkcs8": "^2.6.1", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-x509-attr": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", + "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.6.0", + "resolved": "https://npm.simplito.com/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", + "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", + "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "asn1js": "^3.0.6", + "pvtsutils": "^1.3.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.6.1", + "resolved": "https://npm.simplito.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", + "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.1", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://npm.simplito.com/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.57.0", + "resolved": "https://npm.simplito.com/@playwright/test/-/test-1.57.0.tgz", + "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.57.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://npm.simplito.com/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://npm.simplito.com/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://npm.simplito.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", @@ -1753,14 +1891,16 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.21", + "version": "4.17.25", + "resolved": "https://npm.simplito.com/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { @@ -1854,14 +1994,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/qs": { "version": "6.9.10", "dev": true, @@ -1940,397 +2072,41 @@ }, "node_modules/@types/whatwg-url": { "version": "13.0.0", - "resolved": "https://npm.simplito.com/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://npm.simplito.com/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://npm.simplito.com/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://npm.simplito.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", - "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/type-utils": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.51.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://npm.simplito.com/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/parser/-/parser-8.51.0.tgz", - "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", - "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.51.0", - "@typescript-eslint/types": "^8.51.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/project-service/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", - "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", - "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", - "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0", - "@typescript-eslint/utils": "8.51.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/types": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/types/-/types-8.51.0.tgz", - "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", - "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.51.0", - "@typescript-eslint/tsconfig-utils": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://npm.simplito.com/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://npm.simplito.com/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "resolved": "https://npm.simplito.com/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/utils/-/utils-8.51.0.tgz", - "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://npm.simplito.com/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.51.0", - "resolved": "https://npm.simplito.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", - "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://npm.simplito.com/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@types/yargs-parser": "*" } }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://npm.simplito.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://npm.simplito.com/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -2568,16 +2344,6 @@ "acorn": "^8.14.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://npm.simplito.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/acorn-walk": { "version": "8.3.0", "dev": true, @@ -2592,23 +2358,6 @@ "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", "license": "MIT" }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://npm.simplito.com/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ajv-formats": { "version": "2.1.1", "dev": true, @@ -2725,6 +2474,21 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://npm.simplito.com/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://npm.simplito.com/babel-jest/-/babel-jest-29.7.0.tgz", @@ -3049,6 +2813,16 @@ "node": ">= 0.8" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://npm.simplito.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://npm.simplito.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -3475,13 +3249,6 @@ } } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://npm.simplito.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://npm.simplito.com/deepmerge/-/deepmerge-4.3.1.tgz", @@ -3736,328 +3503,37 @@ "node_modules/escalade": { "version": "3.2.0", "resolved": "https://npm.simplito.com/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://npm.simplito.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://npm.simplito.com/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://npm.simplito.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-indent-empty-lines": { - "version": "1.0.2", - "resolved": "https://npm.simplito.com/eslint-plugin-indent-empty-lines/-/eslint-plugin-indent-empty-lines-1.0.2.tgz", - "integrity": "sha512-F9ZWv0zuEyunNW4yxM6F834kmPO315JHrjWq4GloJcwO9fFEirz+rkwqW7T399YDUlzq1ahyOL9VZLsUeOUkvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://npm.simplito.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://npm.simplito.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://npm.simplito.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://npm.simplito.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://npm.simplito.com/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://npm.simplito.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://npm.simplito.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://npm.simplito.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://npm.simplito.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://npm.simplito.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://npm.simplito.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://npm.simplito.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://npm.simplito.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://npm.simplito.com/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/eslint-scope": { + "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.0.0" } }, "node_modules/esprima": { @@ -4074,29 +3550,6 @@ "node": ">=4" } }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://npm.simplito.com/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://npm.simplito.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "dev": true, @@ -4124,16 +3577,6 @@ "node": ">=4.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://npm.simplito.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://npm.simplito.com/etag/-/etag-1.8.1.tgz", @@ -4261,26 +3704,12 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://npm.simplito.com/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://npm.simplito.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://npm.simplito.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true, - "license": "MIT" - }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://npm.simplito.com/fast-uri/-/fast-uri-3.1.0.tgz", @@ -4327,19 +3756,6 @@ "bser": "2.1.1" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://npm.simplito.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://npm.simplito.com/fill-range/-/fill-range-7.1.1.tgz", @@ -4390,31 +3806,10 @@ "flat": "cli.js" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://npm.simplito.com/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://npm.simplito.com/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://npm.simplito.com/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.16.0", + "resolved": "https://npm.simplito.com/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -4422,6 +3817,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4849,43 +4245,6 @@ "node": ">=0.10.0" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://npm.simplito.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://npm.simplito.com/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://npm.simplito.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.1.0", "dev": true, @@ -6003,31 +5362,11 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://npm.simplito.com/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, "license": "MIT" }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://npm.simplito.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://npm.simplito.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true, - "license": "MIT" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://npm.simplito.com/json5/-/json5-2.2.3.tgz", @@ -6041,16 +5380,6 @@ "node": ">=6" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://npm.simplito.com/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -6088,20 +5417,6 @@ "node": ">=6" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://npm.simplito.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://npm.simplito.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -6141,13 +5456,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://npm.simplito.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://npm.simplito.com/make-dir/-/make-dir-4.0.0.tgz", @@ -6425,16 +5733,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-forge": { - "version": "1.4.0", - "resolved": "https://npm.simplito.com/node-forge/-/node-forge-1.4.0.tgz", - "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://npm.simplito.com/node-int64/-/node-int64-0.4.0.tgz", @@ -6549,22 +5847,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://npm.simplito.com/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/oxlint": { + "version": "1.61.0", + "resolved": "https://npm.simplito.com/oxlint/-/oxlint-1.61.0.tgz", + "integrity": "sha512-ZC0ALuhDZ6ivOFG+sy0D0pEDN49EvsId98zVlmYdkcXHsEM14m/qTNUEsUpiFiCVbpIxYtVBmmLE87nsbUHohQ==", "dev": true, "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "bin": { + "oxlint": "bin/oxlint" }, "engines": { - "node": ">= 0.8.0" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.61.0", + "@oxlint/binding-android-arm64": "1.61.0", + "@oxlint/binding-darwin-arm64": "1.61.0", + "@oxlint/binding-darwin-x64": "1.61.0", + "@oxlint/binding-freebsd-x64": "1.61.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.61.0", + "@oxlint/binding-linux-arm-musleabihf": "1.61.0", + "@oxlint/binding-linux-arm64-gnu": "1.61.0", + "@oxlint/binding-linux-arm64-musl": "1.61.0", + "@oxlint/binding-linux-ppc64-gnu": "1.61.0", + "@oxlint/binding-linux-riscv64-gnu": "1.61.0", + "@oxlint/binding-linux-riscv64-musl": "1.61.0", + "@oxlint/binding-linux-s390x-gnu": "1.61.0", + "@oxlint/binding-linux-x64-gnu": "1.61.0", + "@oxlint/binding-linux-x64-musl": "1.61.0", + "@oxlint/binding-openharmony-arm64": "1.61.0", + "@oxlint/binding-win32-arm64-msvc": "1.61.0", + "@oxlint/binding-win32-ia32-msvc": "1.61.0", + "@oxlint/binding-win32-x64-msvc": "1.61.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.18.0" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + } } }, "node_modules/p-limit": { @@ -6618,19 +5943,6 @@ "node": ">=6" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://npm.simplito.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://npm.simplito.com/parse-json/-/parse-json-5.2.0.tgz", @@ -6734,6 +6046,37 @@ "node": ">=8" } }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://npm.simplito.com/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://npm.simplito.com/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/playwright": { "version": "1.57.0", "resolved": "https://npm.simplito.com/playwright/-/playwright-1.57.0.tgz", @@ -6781,45 +6124,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://npm.simplito.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://npm.simplito.com/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.1", - "resolved": "https://npm.simplito.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", - "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://npm.simplito.com/pretty-format/-/pretty-format-29.7.0.tgz", @@ -6912,6 +6216,26 @@ ], "license": "MIT" }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://npm.simplito.com/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://npm.simplito.com/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/qs": { "version": "6.14.2", "resolved": "https://npm.simplito.com/qs/-/qs-6.14.2.tgz", @@ -7027,6 +6351,13 @@ "node": ">= 10.13.0" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://npm.simplito.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://npm.simplito.com/require-directory/-/require-directory-2.1.1.tgz", @@ -7205,15 +6536,17 @@ "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.4.1", + "version": "5.5.0", + "resolved": "https://npm.simplito.com/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "dev": true, "license": "MIT", "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/semver": { @@ -7740,22 +7073,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://npm.simplito.com/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://npm.simplito.com/tapable/-/tapable-2.3.0.tgz", @@ -7967,19 +7284,6 @@ "tslib": "2" } }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://npm.simplito.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/ts-jest": { "version": "29.4.1", "resolved": "https://npm.simplito.com/ts-jest/-/ts-jest-29.4.1.tgz", @@ -8106,23 +7410,32 @@ } }, "node_modules/tslib": { - "version": "2.6.2", + "version": "2.8.1", + "resolved": "https://npm.simplito.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://npm.simplito.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://npm.simplito.com/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "tslib": "^1.9.3" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6.0.0" } }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://npm.simplito.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://npm.simplito.com/type-detect/-/type-detect-4.0.8.tgz", @@ -8233,14 +7546,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "dev": true, @@ -8491,15 +7796,15 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.2.2", - "resolved": "https://npm.simplito.com/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", - "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "version": "5.2.3", + "resolved": "https://npm.simplito.com/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "dev": true, "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", + "@types/express": "^4.17.25", "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", @@ -8509,9 +7814,9 @@ "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", - "compression": "^1.7.4", + "compression": "^1.8.1", "connect-history-api-fallback": "^2.0.0", - "express": "^4.21.2", + "express": "^4.22.1", "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", @@ -8519,7 +7824,7 @@ "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", + "selfsigned": "^5.5.0", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -8625,16 +7930,6 @@ "dev": true, "license": "MIT" }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://npm.simplito.com/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://npm.simplito.com/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 6a92254..5ae0acc 100644 --- a/package.json +++ b/package.json @@ -40,16 +40,20 @@ "clean": "rm -rf ./dist", "test": "jest src", "build": "npm run clean && npm run build:wasm && npm run build:js && scripts/move_wasm_assets", + "build:debug": "npm run clean && npm run build:wasm:debug && npm run build:js && scripts/move_wasm_assets", "build:wasm": "scripts/pipeline.sh", + "build:wasm:debug": "PRIVMX_BUILD_TYPE=debug scripts/pipeline.sh", "build:js": "npm run compile && npm run bundle && npm run build:worker && cp ./dist/assets/* ./assets/ && cp ./dist/bundle/rms-processor.js ./assets/", "build:worker": "webpack --config ./webpack.worker.config.js", + "clean:wasm": "scripts/clean_wasm", "compile": "tsc --project tsconfig.build.json", "bundle": "webpack", "watch:types": "tsc -w --project tsconfig.build.json", "test:e2e": "playwright test --project=chromium", "test:e2e:manybrowsers": "playwright test", - "lint": "eslint -c eslint.config.mjs .", - "format": "prettier --write '{src,tests}/**/*.{ts,tsx,css,md}'", + "lint": "oxlint src/", + "format": "oxfmt src/", + "format:check": "oxfmt --check src/", "format:clang": "find webendpoint-cpp drivers async-engine -type f \\( -name '*.c' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \\) -print0 | xargs -0 clang-format -i", "lint:clang-format": "find webendpoint-cpp drivers async-engine -type f \\( -name '*.c' -o -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \\) -print0 | xargs -0 clang-format --dry-run --Werror", "prepack": "mkdir -p ./builds", @@ -68,23 +72,15 @@ "node": ">=4" }, "devDependencies": { - "@eslint/js": "^9.39.2", "@playwright/test": "^1.57.0", - "@stylistic/eslint-plugin": "^5.6.1", "@types/aes-js": "^3.1.4", "@types/jest": "^29.5.14", "@types/node": "^20.9.0", "@types/webpack": "^5.28.5", - "@typescript-eslint/eslint-plugin": "^8.51.0", - "@typescript-eslint/parser": "^8.51.0", "copy-webpack-plugin": "^14.0.0", - "eslint": "^9.39.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-indent-empty-lines": "^1.0.2", - "eslint-plugin-prettier": "^5.5.4", "jest": "^29.7.0", "mongodb": "^7.0.0", - "prettier": "^3.7.4", + "oxlint": "^1.60.0", "ts-jest": "^29.2.5", "ts-loader": "^9.5.1", "ts-node": "^10.9.1", diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index 86779f0..0000000 --- a/prettier.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - semi: true, - singleQuote: false, - printWidth: 100, - trailingComma: "all", - bracketSpacing: true, - arrowParens: "always", - tabWidth: 4, -}; \ No newline at end of file diff --git a/scripts/build_api b/scripts/build_api index d6dcf9c..a16868d 100755 --- a/scripts/build_api +++ b/scripts/build_api @@ -1,5 +1,6 @@ #!/bin/bash set -e + SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) if [ -z "$1" ]; then @@ -9,45 +10,33 @@ fi PRIVMX_ENDPOINT_VERSION_IN=$1 PRIVMX_ENDPOINT_VERSION="${PRIVMX_ENDPOINT_VERSION_IN//\//_}" +# Optional second argument: "debug" enables debug build flags. Defaults to "release". +PRIVMX_BUILD_TYPE="${2:-release}" + source "$SCRIPT_PATH/config.sh" source "$EMSDK_DIR/emsdk_env.sh" -echo "Checking API Interface checksum: $PRIVMX_WEBENDPOINT_API_SRC ..." -set +e -$SCRIPT_PATH/check_dir_checksum "$PRIVMX_WEBENDPOINT_API_SRC" -RESULT=$? -set -e -if [ -f "$PRIVMX_WEBENDPOINT_API_SRC/need_rebuild" ]; then - RESULT=1; - rm -f "$PRIVMX_WEBENDPOINT_API_SRC/need_rebuild" +cd "$PRIVMX_WEBENDPOINT_API_SRC" +cp "$PRIVMX_ENDPOINT_SRC-$PRIVMX_ENDPOINT_VERSION/emscripten/jslibrary/websocket.js" "$PRIVMX_WEBENDPOINT_API_SRC/js/" + +mkdir -p build-emscripten && cd build-emscripten + +# Reconfigure if: no cache yet, OR the requested build type differs from the cached one. +CACHED_BUILD_TYPE="" +if [ -f CMakeCache.txt ]; then + CACHED_BUILD_TYPE=$(grep -m1 "^PRIVMX_BUILD_TYPE:STRING=" CMakeCache.txt | cut -d= -f2 || true) fi -case "$RESULT" in - 0) - echo "No changes on Endpoint API Interface- skipping build" - ;; - 1) - echo "changes - rebuild..." - cd "$PRIVMX_WEBENDPOINT_API_SRC" - cp "$PRIVMX_ENDPOINT_SRC-$PRIVMX_ENDPOINT_VERSION/emscripten/jslibrary/websocket.js" "$PRIVMX_WEBENDPOINT_API_SRC/js/" - rm -rf ./build-emscripten - mkdir -p build-emscripten && cd build-emscripten - echo "EMSDK_DIR PASSED TO CMAKE: $EMSDK_DIR" - echo "=====================================" - SDK_DIR=$EMSDK_DIR emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel -D CMAKE_EXPORT_COMPILE_COMMANDS=ON - SDK_DIR=$EMSDK_DIR emmake make -j20 - - set +e - $SCRIPT_PATH/check_dir_checksum "$PRIVMX_WEBENDPOINT_API_SRC" - set -e - ;; - 2) - echo "\n\n\nBłąd wejścia" >&2 - exit 2 - ;; - *) - echo "\n\n\nNieznany kod wyjścia: $RESULT" >&2 - exit 3 - ;; -esac +if [ ! -f CMakeCache.txt ] || [ "$CACHED_BUILD_TYPE" != "$PRIVMX_BUILD_TYPE" ]; then + echo "Configuring (build type: $PRIVMX_BUILD_TYPE)..." + echo "EMSDK_DIR PASSED TO CMAKE: $EMSDK_DIR" + echo "=====================================" + SDK_DIR=$EMSDK_DIR emcmake cmake .. \ + -D CMAKE_BUILD_TYPE=MinSizeRel \ + -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -D PRIVMX_BUILD_TYPE="$PRIVMX_BUILD_TYPE" +else + echo "CMakeCache.txt exists with matching build type ($PRIVMX_BUILD_TYPE) — skipping cmake configure." +fi +SDK_DIR=$EMSDK_DIR emmake make -j20 diff --git a/scripts/build_async_engine b/scripts/build_async_engine index c389dc8..103bf63 100755 --- a/scripts/build_async_engine +++ b/scripts/build_async_engine @@ -7,39 +7,27 @@ SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) source "$SCRIPT_PATH/config.sh" source "$EMSDK_DIR/emsdk_env.sh" -echo "Checking checksum: $PRIVMX_WEB_ASYNC_ENGINE ..." -set +e -$SCRIPT_PATH/check_dir_checksum "$PRIVMX_WEB_ASYNC_ENGINE" -RESULT=$? -set -e -case "$RESULT" in - 0) - echo "No changes - skipping build" - ;; - 1) - echo "changes - rebuild..." - cd "$PRIVMX_WEB_ASYNC_ENGINE" - - if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel -D CMAKE_EXPORT_COMPILE_COMMANDS=ON - else - cd build-emscripten - fi - - emmake make -j20 - emmake make install - - set +e - $SCRIPT_PATH/check_dir_checksum "$PRIVMX_WEB_ASYNC_ENGINE" - set -e - ;; - 2) - echo "\n\n\nBłąd wejścia" >&2 - exit 2 - ;; - *) - echo "\n\n\nNieznany kod wyjścia: $RESULT" >&2 - exit 3 - ;; -esac +# Build variant: "debug" enables debug flags. Defaults to "release". +PRIVMX_BUILD_TYPE="${PRIVMX_BUILD_TYPE:-release}" + +cd "$PRIVMX_WEB_ASYNC_ENGINE" +mkdir -p build-emscripten && cd build-emscripten + +# Reconfigure if: no cache yet, OR the requested build type differs from the cached one. +CACHED_BUILD_TYPE="" +if [ -f CMakeCache.txt ]; then + CACHED_BUILD_TYPE=$(grep -m1 "^PRIVMX_BUILD_TYPE:STRING=" CMakeCache.txt | cut -d= -f2 || true) +fi + +if [ ! -f CMakeCache.txt ] || [ "$CACHED_BUILD_TYPE" != "$PRIVMX_BUILD_TYPE" ]; then + echo "Configuring async-engine (build type: $PRIVMX_BUILD_TYPE)..." + emcmake cmake .. \ + -D CMAKE_BUILD_TYPE=MinSizeRel \ + -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -D PRIVMX_BUILD_TYPE="$PRIVMX_BUILD_TYPE" +else + echo "CMakeCache.txt exists with matching build type ($PRIVMX_BUILD_TYPE) — skipping cmake configure." +fi + +emmake make -j20 +emmake make install diff --git a/scripts/build_gmp b/scripts/build_gmp index 2f94d0e..1a02056 100755 --- a/scripts/build_gmp +++ b/scripts/build_gmp @@ -20,14 +20,14 @@ OS_NAME=$(uname -s) echo "Detected OS: $OS_NAME" if [ "$OS_NAME" = "Darwin" ]; then - SDK_PATH=$(xcrun --show-sdk-path) - export CC_FOR_BUILD="/usr/bin/clang" + SDK_PATH=$(xcrun --show-sdk-path) + export CC_FOR_BUILD="/usr/bin/clang" export CPPFLAGS_FOR_BUILD="-I${SDK_PATH}/usr/include" export CFLAGS_FOR_BUILD="-W" echo " > Configured for macOS: SDK at $SDK_PATH" elif [ "$OS_NAME" = "Linux" ]; then - export CC_FOR_BUILD="/usr/bin/cc" - export CPPFLAGS_FOR_BUILD="" + export CC_FOR_BUILD="/usr/bin/cc" + export CPPFLAGS_FOR_BUILD="" export CFLAGS_FOR_BUILD="" echo " > Configured for Linux: Using /usr/bin/cc" else @@ -38,8 +38,7 @@ fi GMP_DIR="$SOURCE_DIR/gmp-${VERSION}" -if [ -d "$GMP_DIR" ]; -then +if [ -d "$GMP_DIR" ]; then echo "$GMP_DIR directory exists. Skip download of sources." else echo "$GMP_DIR directory does not exist. Get sources..." @@ -48,54 +47,27 @@ else tar -xf gmp.tar.xz fi +cd "$GMP_DIR" +mkdir -p build-emscripten && cd build-emscripten -echo "Checking checksum: $GMP_DIR ..." -set +e -$SCRIPT_PATH/check_dir_checksum "$GMP_DIR" -RESULT=$? -set -e -case "$RESULT" in - 0) - echo "No changes - skipping build" - ;; - 1) - echo "changes - rebuild..." - cd "$GMP_DIR" - - if [ ! -d "$GMP_DIR/build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - - echo "Running Configure..." - emconfigure ../configure \ - --disable-assembly \ - --host none \ - --enable-cxx \ - --prefix=$SYSROOT_DIR \ - CC_FOR_BUILD="$CC_FOR_BUILD" \ - CPPFLAGS_FOR_BUILD="$CPPFLAGS_FOR_BUILD" \ - CFLAGS_FOR_BUILD="$CFLAGS_FOR_BUILD" \ - CFLAGS="-Os" \ - CXXFLAGS="-Os" - else - cd build-emscripten - fi - - echo "Running Make..." - emmake make -j20 - emmake make check || echo "WARNING: Tests failed (Expected during cross-compilation)" - emmake make install - echo "Build Complete." +if [ ! -f Makefile ]; then + echo "Running Configure..." + emconfigure ../configure \ + --disable-assembly \ + --host none \ + --enable-cxx \ + --prefix=$SYSROOT_DIR \ + CC_FOR_BUILD="$CC_FOR_BUILD" \ + CPPFLAGS_FOR_BUILD="$CPPFLAGS_FOR_BUILD" \ + CFLAGS_FOR_BUILD="$CFLAGS_FOR_BUILD" \ + CFLAGS="-Os" \ + CXXFLAGS="-Os" +else + echo "Makefile exists — skipping configure." +fi - set +e - $SCRIPT_PATH/check_dir_checksum "$GMP_DIR" - set -e - ;; - 2) - echo "\n\n\nBłąd wejścia" >&2 - exit 2 - ;; - *) - echo "\n\n\nNieznany kod wyjścia: $RESULT" >&2 - exit 3 - ;; -esac +echo "Running Make..." +emmake make -j20 +emmake make check || echo "WARNING: Tests failed (Expected during cross-compilation)" +emmake make install +echo "Build Complete." diff --git a/scripts/build_poco b/scripts/build_poco index f2d479e..a0193de 100755 --- a/scripts/build_poco +++ b/scripts/build_poco @@ -15,60 +15,34 @@ source "$EMSDK_DIR/emsdk_env.sh" POCO_DIR="$SOURCE_DIR/poco-$VERSION-all" -if [ -d "$POCO_DIR" ]; -then +if [ -d "$POCO_DIR" ]; then echo "$POCO_DIR directory exists. Skip download of sources." else - echo "$POCO_DIR directory does not exist. Get sources..." + echo "$POCO_DIR directory does not exist. Get sources..." cd "$SOURCE_DIR" curl "https://pocoproject.org/releases/poco-$VERSION/poco-$VERSION-all.zip" --output poco.zip unzip -o poco.zip fi -echo "+++++++++++++++++++++" -echo $POCO_DIR -echo "+++++++++++++++++++++" - -echo "Checking checksum: $POCO_DIR ..." -set +e -$SCRIPT_PATH/check_dir_checksum "$POCO_DIR" -RESULT=$? -set -e -case "$RESULT" in - 0) - echo "No changes - skipping build" - ;; - 1) - echo "changes - rebuild..." - cd "$POCO_DIR" - # apply config patches for emscripten - patch --forward -d "$POCO_DIR" -p1 -i "$BASE_DIR/patches/poco-$VERSION-all.patch" || echo "OK" - - if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -DENABLE_JWT=OFF -DENABLE_DATA=OFF -DENABLE_DATA_SQLITE=OFF -DENABLE_DATA_MYSQL=OFF -DENABLE_DATA_POSTGRESQL=OFF -DENABLE_DATA_ODBC=OFF \ - -DENABLE_MONGODB=OFF -DENABLE_REDIS=OFF -DENABLE_PDF=OFF -DENABLE_UTIL=OFF -DENABLE_ZIP=OFF -DENABLE_SEVENZIP=OFF \ - -DENABLE_APACHECONNECTOR=OFF -DENABLE_CPPPARSER=OFF -DENABLE_ENCODINGS=OFF -DENABLE_ENCODINGS_COMPILER=OFF \ - -DENABLE_PAGECOMPILER=OFF -DENABLE_PAGECOMPILER_FILE2PAGE=OFF -DENABLE_POCODOC=OFF -DENABLE_TESTS=OFF -DENABLE_LONG_RUNNING_TESTS=OFF \ - -DENABLE_NET=OFF -DENABLE_CRYPTO=OFF -DENABLE_NETSSL=OFF -DCMAKE_BUILD_TYPE=MinSizeRel - else - cd build-emscripten - fi - - emmake make -j20 - emmake make install - - set +e - $SCRIPT_PATH/check_dir_checksum "$POCO_DIR" - set -e - ;; - 2) - echo "\n\n\nBłąd wejścia" >&2 - exit 2 - ;; - *) - echo "\n\n\nNieznany kod wyjścia: $RESULT" >&2 - exit 3 - ;; -esac +cd "$POCO_DIR" +# apply config patches for emscripten +patch --forward -d "$POCO_DIR" -p1 -i "$BASE_DIR/patches/poco-$VERSION-all.patch" || echo "OK" + +mkdir -p build-emscripten && cd build-emscripten + +if [ ! -f CMakeCache.txt ]; then + emcmake cmake .. \ + -DENABLE_JWT=OFF -DENABLE_DATA=OFF -DENABLE_DATA_SQLITE=OFF -DENABLE_DATA_MYSQL=OFF \ + -DENABLE_DATA_POSTGRESQL=OFF -DENABLE_DATA_ODBC=OFF -DENABLE_MONGODB=OFF -DENABLE_REDIS=OFF \ + -DENABLE_PDF=OFF -DENABLE_UTIL=OFF -DENABLE_ZIP=OFF -DENABLE_SEVENZIP=OFF \ + -DENABLE_APACHECONNECTOR=OFF -DENABLE_CPPPARSER=OFF -DENABLE_ENCODINGS=OFF \ + -DENABLE_ENCODINGS_COMPILER=OFF -DENABLE_PAGECOMPILER=OFF -DENABLE_PAGECOMPILER_FILE2PAGE=OFF \ + -DENABLE_POCODOC=OFF -DENABLE_TESTS=OFF -DENABLE_LONG_RUNNING_TESTS=OFF \ + -DENABLE_NET=OFF -DENABLE_CRYPTO=OFF -DENABLE_NETSSL=OFF \ + -DCMAKE_BUILD_TYPE=MinSizeRel +else + echo "CMakeCache.txt exists — skipping cmake configure." +fi +emmake make -j20 +emmake make install diff --git a/scripts/build_privmx_endpoint b/scripts/build_privmx_endpoint index 2153e0c..50fb5f8 100755 --- a/scripts/build_privmx_endpoint +++ b/scripts/build_privmx_endpoint @@ -1,7 +1,9 @@ #!/bin/bash set -e + SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) + if [ -z "$1" ]; then echo "$0: Parameter missing." exit -1; @@ -13,7 +15,6 @@ source "$SCRIPT_PATH/config.sh" source "$EMSDK_DIR/emsdk_env.sh" PRIVMX_ENDPOINT_DIR="$SOURCE_DIR/privmx-endpoint-$VERSION_AS_DIR" -LAST_BUILT_VERSION_CHECK_FILE="/tmp/privmx_endpoint_last_built_version" if [ -d "$PRIVMX_ENDPOINT_DIR" ]; then echo "$PRIVMX_ENDPOINT_DIR directory exists. Skip download of sources." @@ -30,9 +31,9 @@ else if [ -n "$RELEASE_EXISTS" ]; then echo "Release $VERSION found. Downloading release zip..." curl -L \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/repos/simplito/privmx-endpoint/zipball/$VERSION -o "$ZIP_TMP_DIR/$VERSION.zip" + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/simplito/privmx-endpoint/zipball/$VERSION -o "$ZIP_TMP_DIR/$VERSION.zip" unzip "$ZIP_TMP_DIR/$VERSION.zip" -d "$OUT_TMP_DIR" rm -rf "$ZIP_TMP_DIR" @@ -43,7 +44,7 @@ else rm -rf "$OUT_TMP_DIR" else echo "Release $VERSION not found. Trying to checkout branch/commit/tag $VERSION..." - git clone https://github.com/simplito/privmx-endpoint.git $OUT_TMP_DIR + git clone https://github.com/simplito/privmx-endpoint.git "$OUT_TMP_DIR" cd "$OUT_TMP_DIR" git fetch --all --tags >/dev/null 2>&1 @@ -60,74 +61,36 @@ else elif git rev-parse --verify "$VERSION" >/dev/null 2>&1; then git checkout "$VERSION" echo "Checked out commit $VERSION (detached HEAD)." - else echo "Error: $VERSION is not a branch, tag, or commit." exit 1 fi - + mv "$OUT_TMP_DIR" "$PRIVMX_ENDPOINT_DIR" cd "$SOURCE_DIR" rm -rf "$OUT_TMP_DIR" fi fi -echo "Checking privmx_endpoint checksum: $PRIVMX_ENDPOINT_DIR ..." -set +e -$SCRIPT_PATH/check_dir_checksum "$PRIVMX_ENDPOINT_DIR" -RESULT=$? -set -e - -echo "Checking if build exists.." -if [ ! -d "$PRIVMX_ENDPOINT_DIR/build-emscripten" ]; then - RESULT=1 -fi - -echo "Checking last built version/branch..." -LAST_BUILT_VERSION="" -if [ -f $LAST_BUILT_VERSION_CHECK_FILE ]; then - LAST_BUILT_VERSION=`cat "$LAST_BUILT_VERSION_CHECK_FILE"` -fi -if [ "$RESULT" -eq 0 ] && [ "$LAST_BUILT_VERSION" != "$PRIVMX_ENDPOINT_DIR" ]; then - cd "$PRIVMX_ENDPOINT_DIR"/build-emscripten - emmake make install - ## notify api to rebuild after - touch "$PRIVMX_WEBENDPOINT_API_SRC/need_rebuild" - echo "need to rebuild api" - echo "$PRIVMX_ENDPOINT_DIR" > "$LAST_BUILT_VERSION_CHECK_FILE" +cd "$PRIVMX_ENDPOINT_DIR" +mkdir -p build-emscripten && cd build-emscripten + +if [ ! -f CMakeCache.txt ]; then + emcmake cmake .. \ + -D PRIVMX_EXECUTOR_THREAD_POOL_SIZE=2 \ + -D PRIVMX_EMSCRIPTEN=ON \ + -D PRIVMX_BUILD_ENDPOINT=ON \ + -D PRIVMX_DRIVER_CRYPTO=ON \ + -D PRIVMX_DRIVER_NET=ON \ + -D PRIVMX_ENABLE_LOGGER=ON \ + -D PRIVMX_BUILD_LOGGER=ON \ + -D PRIVMX_LOGGER_LEVEL=3 \ + -D PRIVMX_LOGGER_OUTPUT_STDERR=OFF \ + -D PRIVMX_LOGGER_OUTPUT_STDOUT=ON \ + -D CMAKE_BUILD_TYPE=MinSizeRel +else + echo "CMakeCache.txt exists — skipping cmake configure." fi -case "$RESULT" in - 0) - echo "No changes on Endpoint Core - skipping build" - ;; - 1) - echo "Enpoint Core changes - rebuild..." - ## notify api to rebuild after - touch "$PRIVMX_WEBENDPOINT_API_SRC/need_rebuild" - - cd "$PRIVMX_ENDPOINT_DIR" - rm -rf ./build-emscripten - - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -D PRIVMX_EXECUTOR_THREAD_POOL_SIZE=2 -D PRIVMX_EMSCRIPTEN=ON -D PRIVMX_BUILD_ENDPOINT=ON -D PRIVMX_DRIVER_CRYPTO=ON -D PRIVMX_DRIVER_NET=ON \ - -D PRIVMX_ENABLE_LOGGER=ON -D PRIVMX_BUILD_LOGGER=ON -D PRIVMX_LOGGER_LEVEL=3 -D PRIVMX_LOGGER_OUTPUT_STDERR=OFF -D PRIVMX_LOGGER_OUTPUT_STDOUT=ON \ - -D CMAKE_BUILD_TYPE=MinSizeRel - emmake make -j20 - emmake make install - - set +e - $SCRIPT_PATH/check_dir_checksum "$PRIVMX_ENDPOINT_DIR" - echo "$PRIVMX_ENDPOINT_DIR" > "$LAST_BUILT_VERSION_CHECK_FILE" - set -e - ;; - 2) - echo "\n\n\nBłąd wejścia" >&2 - exit 2 - ;; - *) - echo "\n\n\nNieznany kod wyjścia: $RESULT" >&2 - sleep 3 - exit 3 - ;; -esac +emmake make -j20 +emmake make install diff --git a/scripts/build_pson b/scripts/build_pson index f5cce5b..d21efd7 100755 --- a/scripts/build_pson +++ b/scripts/build_pson @@ -1,6 +1,8 @@ #!/bin/bash set -e + SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) + if [ -z "$1" ]; then echo "$0: Parameter missing." exit -1; @@ -12,72 +14,46 @@ source "$EMSDK_DIR/emsdk_env.sh" PSON_DIR="$SOURCE_DIR/pson-cpp-$VERSION" -if [ -d "$PSON_DIR" ]; -then +if [ -d "$PSON_DIR" ]; then echo "$PSON_DIR directory exists. Skip download of sources." else - echo "$PSON_DIR directory does not exist. Get sources..." + echo "$PSON_DIR directory does not exist. Get sources..." ZIP_TMP_DIR=$(mktemp -d) OUT_TMP_DIR=$(mktemp -d) curl -L \ - -H "Accept: application/vnd.github+json" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/repos/simplito/pson-cpp/zipball/$VERSION -o "$ZIP_TMP_DIR/$VERSION.zip" - - unzip "$ZIP_TMP_DIR/$VERSION.zip" -d $OUT_TMP_DIR - rm -rf $ZIP_TMP_DIR - cd $OUT_TMP_DIR - ZIP_INNER_DIR=`ls` - mv $ZIP_INNER_DIR $PSON_DIR + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/repos/simplito/pson-cpp/zipball/$VERSION -o "$ZIP_TMP_DIR/$VERSION.zip" + + unzip "$ZIP_TMP_DIR/$VERSION.zip" -d "$OUT_TMP_DIR" + rm -rf "$ZIP_TMP_DIR" + cd "$OUT_TMP_DIR" + ZIP_INNER_DIR=$(ls) + mv "$ZIP_INNER_DIR" "$PSON_DIR" cd "$SOURCE_DIR" - rm -rf $OUT_TMP_DIR + rm -rf "$OUT_TMP_DIR" fi +cd "$PSON_DIR" -echo "Checking checksum: $PSON_DIR ..." +# apply config patches for emscripten set +e -$SCRIPT_PATH/check_dir_checksum "$PSON_DIR" -RESULT=$? +patch_out=$(patch --forward -d "$PSON_DIR" -p1 -i "$BASE_DIR/patches/pson-cpp.patch") +status=$? +if [ $status -eq 1 ]; then + if [[ $patch_out == *"FAILED"* ]]; then + echo "Patching PSON FAILED"; exit -1; + fi +fi set -e -case "$RESULT" in - 0) - echo "No changes - skipping build" - ;; - 1) - echo "changes - rebuild..." - cd "$PSON_DIR" - # apply config patches for emscripte - set +e - patch_out=$(patch --forward -d "$PSON_DIR" -p1 -i "$BASE_DIR/patches/pson-cpp.patch") - status=$? - if [ $status -eq 1 ]; then - if [[ $patch_out == *"FAILED"* ]]; then - echo "Patching PSON FAILED"; exit -1; - fi - fi - set -e +mkdir -p build-emscripten && cd build-emscripten - if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel - else - cd build-emscripten - fi - emmake make -j20 - emmake make install - - set +e - $SCRIPT_PATH/check_dir_checksum "$PSON_DIR" - set -e - ;; - 2) - echo "\n\n\nBłąd wejścia" >&2 - exit 2 - ;; - *) - echo "\n\n\nNieznany kod wyjścia: $RESULT" >&2 - exit 3 - ;; -esac +if [ ! -f CMakeCache.txt ]; then + emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel +else + echo "CMakeCache.txt exists — skipping cmake configure." +fi +emmake make -j20 +emmake make install diff --git a/scripts/build_secp b/scripts/build_secp index 48817ac..c65c787 100755 --- a/scripts/build_secp +++ b/scripts/build_secp @@ -9,21 +9,22 @@ source "$EMSDK_DIR/emsdk_env.sh" SECP_DIR="$SOURCE_DIR/secp256k1" -if [ -d "$SECP_DIR" ]; -then +if [ -d "$SECP_DIR" ]; then echo "$SECP_DIR directory exists. Skip download of sources." else - echo "$SECP_DIR directory does not exist. Get sources..." - git clone https://github.com/bitcoin-core/secp256k1.git $SECP_DIR + echo "$SECP_DIR directory does not exist. Get sources..." + git clone https://github.com/bitcoin-core/secp256k1.git "$SECP_DIR" fi cd "$SECP_DIR" git checkout v0.7.0 -if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten + +mkdir -p build-emscripten && cd build-emscripten + +if [ ! -f CMakeCache.txt ]; then emcmake cmake -DSECP256K1_ENABLE_MODULE_ECDH=ON -DCMAKE_BUILD_TYPE=Release .. else - cd build-emscripten + echo "CMakeCache.txt exists — skipping cmake configure." fi emmake make -j20 diff --git a/scripts/build_webdrivers b/scripts/build_webdrivers index d811f1b..1925fa0 100755 --- a/scripts/build_webdrivers +++ b/scripts/build_webdrivers @@ -7,42 +7,47 @@ SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) source "$SCRIPT_PATH/config.sh" source "$EMSDK_DIR/emsdk_env.sh" +# Build variant: "debug" enables debug flags. Defaults to "release". +PRIVMX_BUILD_TYPE="${PRIVMX_BUILD_TYPE:-release}" + sep() { echo "=========================== $1 ==========================" } +configure_if_needed() { + local label="$1" + CACHED_BUILD_TYPE="" + if [ -f CMakeCache.txt ]; then + CACHED_BUILD_TYPE=$(grep -m1 "^PRIVMX_BUILD_TYPE:STRING=" CMakeCache.txt | cut -d= -f2 || true) + fi + if [ ! -f CMakeCache.txt ] || [ "$CACHED_BUILD_TYPE" != "$PRIVMX_BUILD_TYPE" ]; then + echo "Configuring $label (build type: $PRIVMX_BUILD_TYPE)..." + emcmake cmake .. \ + -D CMAKE_BUILD_TYPE=MinSizeRel \ + -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -D PRIVMX_BUILD_TYPE="$PRIVMX_BUILD_TYPE" + else + echo "CMakeCache.txt exists with matching build type ($PRIVMX_BUILD_TYPE) — skipping cmake configure." + fi +} + sep "PRIVMX_WEBENDPOINT_DRV_CRYPTO_SRC" cd "$PRIVMX_WEBENDPOINT_DRV_CRYPTO_SRC" - -if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel -D CMAKE_EXPORT_COMPILE_COMMANDS=ON -else - cd build-emscripten -fi +mkdir -p build-emscripten && cd build-emscripten +configure_if_needed "drv-crypto" emmake make -j20 emmake make install sep "PRIVMX_WEBENDPOINT_DRV_ECC_SRC" cd "$PRIVMX_WEBENDPOINT_DRV_ECC_SRC" - -if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel -D CMAKE_EXPORT_COMPILE_COMMANDS=ON -else - cd build-emscripten -fi +mkdir -p build-emscripten && cd build-emscripten +configure_if_needed "drv-ecc" emmake make -j20 emmake make install sep "PRIVMX_WEBENDPOINT_DRV_NET_SRC" cd "$PRIVMX_WEBENDPOINT_DRV_NET_SRC" - -if [ ! -d "./build-emscripten" ]; then - mkdir -p build-emscripten && cd build-emscripten - emcmake cmake .. -D CMAKE_BUILD_TYPE=MinSizeRel -D CMAKE_EXPORT_COMPILE_COMMANDS=ON -else - cd build-emscripten -fi +mkdir -p build-emscripten && cd build-emscripten +configure_if_needed "drv-net" emmake make -j20 emmake make install diff --git a/scripts/check_dir_checksum b/scripts/check_dir_checksum deleted file mode 100755 index e2a980d..0000000 --- a/scripts/check_dir_checksum +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) -set -euo pipefail - -# ====== WALIDACJA PARAMETRÓW ====== -if [[ $# -ne 1 ]]; then - echo "Usage: $0 " >&2 - exit 2 -fi -echo "Checking dir: $1" -DIR_TO_CHECK="$1/" - -if [[ ! -d "$DIR_TO_CHECK" ]]; then - echo "Error: '$DIR_TO_CHECK' is not a directory" >&2 - exit 2 -fi -# ====== PLIKI STANU ====== -DIR_HASH="$(echo -n "$DIR_TO_CHECK" | sha256sum | cut -d' ' -f1)" -STATE_FILE="/tmp/dir_checksum.${DIR_HASH}.prev" -TMP_FILE="$(mktemp)" - -# ====== LICZENIE CHECKSUM ====== -find "$DIR_TO_CHECK" -type f -print0 \ - | sort -z \ - | xargs -0 sha256sum > "$TMP_FILE" - - -# ====== PORÓWNANIE ====== -if [[ ! -f "$STATE_FILE" ]]; then - cp "$TMP_FILE" "$STATE_FILE" - rm -f "$TMP_FILE" - exit 1 # A – pierwszy raz - -elif ! cmp -s "$TMP_FILE" "$STATE_FILE"; then - cp "$TMP_FILE" "$STATE_FILE" - rm -f "$TMP_FILE" - exit 1 # A – zmiana - -else - rm -f "$TMP_FILE" - exit 0 # B – brak zmian -fi diff --git a/scripts/clean_wasm b/scripts/clean_wasm new file mode 100755 index 0000000..7f1dd3b --- /dev/null +++ b/scripts/clean_wasm @@ -0,0 +1,29 @@ +#!/bin/bash +# Removes all CMake/autoconf build directories for every WASM component. +# After running this, the next build will fully reconfigure and recompile. + +set -e + +SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) +source "$SCRIPT_PATH/config.sh" + +remove() { + if [ -d "$1" ]; then + echo "Removing $1" + rm -rf "$1" + fi +} + +# First-party C++ components +remove "$PRIVMX_WEB_ASYNC_ENGINE/build-emscripten" +remove "$PRIVMX_WEBENDPOINT_API_SRC/build-emscripten" +remove "$PRIVMX_WEBENDPOINT_DRV_CRYPTO_SRC/build-emscripten" +remove "$PRIVMX_WEBENDPOINT_DRV_ECC_SRC/build-emscripten" +remove "$PRIVMX_WEBENDPOINT_DRV_NET_SRC/build-emscripten" + +# Third-party dependencies — each lives in dependency_sources//build-emscripten/ +for dep_dir in "$SOURCE_DIR"/*/; do + remove "${dep_dir}build-emscripten" +done + +echo "WASM build directories cleaned." diff --git a/scripts/pipeline.sh b/scripts/pipeline.sh index 9eac09a..e348f4c 100755 --- a/scripts/pipeline.sh +++ b/scripts/pipeline.sh @@ -5,6 +5,10 @@ set -o pipefail SCRIPT_PATH=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) source "$SCRIPT_PATH/../build-manifest.sh" +# Build variant: release (default) or debug. +# Set via environment variable: PRIVMX_BUILD_TYPE=debug npm run build:wasm +PRIVMX_BUILD_TYPE="${PRIVMX_BUILD_TYPE:-release}" + # ============================================================================== # CONFIGURATION # ============================================================================== @@ -155,6 +159,7 @@ fi echo "${BLUE}----------------------------------------" echo " Starting Build Process..." +echo " Build type: ${PRIVMX_BUILD_TYPE}" echo "---------------------------------------${RESET}" run_step "Download and Install Emscripten SDK" "$SCRIPT_PATH/get_emsdk" @@ -165,7 +170,7 @@ run_step "Build secp256k1 Cryptography Library" "$SCRIPT_PATH/build_secp" run_step "Build Async Engine" "$SCRIPT_PATH/build_async_engine" run_step "Build Web Browser Drivers" "$SCRIPT_PATH/build_webdrivers" run_step "Build PrivMX Endpoint Module" "$SCRIPT_PATH/build_privmx_endpoint" $PRIVMX_ENDPOINT -run_step "Build API Interface" "$SCRIPT_PATH/build_api" $PRIVMX_ENDPOINT +run_step "Build API Interface" "$SCRIPT_PATH/build_api" $PRIVMX_ENDPOINT "$PRIVMX_BUILD_TYPE" run_step "Add Built Assets to package" "$SCRIPT_PATH/move_wasm_assets" echo "${BLUE}----------------------------------------" diff --git a/src/FinalizationHelper.ts b/src/FinalizationHelper.ts index f7ca3ce..3a34c3e 100644 --- a/src/FinalizationHelper.ts +++ b/src/FinalizationHelper.ts @@ -1,6 +1,3 @@ -import { ApiStatic } from "./api/ApiStatic"; -import { ExtKeyNative } from "./api/ExtKeyNative"; - interface NativeObjInfo { ptr: number; onFree: () => Promise; @@ -29,7 +26,6 @@ export class FinalizationHelper { private constructor(private wasmLib: any) { this.finalizationRegistry = new FinalizationRegistry((onCleanup) => { - const api = ApiStatic.getInstance(); this.finalizationQueue.push(onCleanup.onFree); this.scheduleCleanup(); }); diff --git a/src/ServerTypes.ts b/src/ServerTypes.ts index 8ae2776..3086993 100644 --- a/src/ServerTypes.ts +++ b/src/ServerTypes.ts @@ -1,6 +1,6 @@ import type * as ServerTypes from "./webStreams/types/ApiTypes"; import type * as StreamsApi from "./webStreams/types/StreamsApiTypes"; -import type { AppRequest, RequestOpaque } from "./webStreams/types/BaseServerTypes"; +import type { AppRequest } from "./webStreams/types/BaseServerTypes"; import type * as SignalingFromServer from "./webStreams/types/SignalingSenderTypes"; import type * as SignalingApi from "./webStreams/types/SignalingReceiverTypes"; import type * as MediaServerApiTypes from "./webStreams/types/MediaServerWebSocketApiTypes"; diff --git a/src/api/StreamApiNative.ts b/src/api/StreamApiNative.ts index 9e54ca9..be92fae 100644 --- a/src/api/StreamApiNative.ts +++ b/src/api/StreamApiNative.ts @@ -9,7 +9,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { Jsep, SdpWithRoomModel } from "../service/WebRtcInterface"; +import { Jsep } from "../service/WebRtcInterface"; import { ContainerPolicy, PagingList, @@ -27,7 +27,6 @@ import { WebRtcInterfaceImpl } from "../webStreams/WebRtcInterfaceImpl"; import { Api } from "./Api"; import { BaseNative } from "./BaseNative"; import * as Types from "../Types"; -import { StreamId } from "../webStreams/types/ApiTypes"; export class StreamApiNative extends BaseNative { protected static bindingId: number = -1; diff --git a/src/crypto/EmCrypto.ts b/src/crypto/EmCrypto.ts index 16bd795..6ed19f2 100644 --- a/src/crypto/EmCrypto.ts +++ b/src/crypto/EmCrypto.ts @@ -19,7 +19,7 @@ import { secp256k1 as secp } from "@noble/curves/secp256k1.js"; const subtle = typeof crypto !== "undefined" ? crypto.subtle - : (globalThis as unknown as { crypto?: { subtle?: SubtleCrypto } }).crypto?.subtle!; + : (globalThis as unknown as { crypto: { subtle: SubtleCrypto } }).crypto.subtle; const textEncoder = new TextEncoder(); diff --git a/src/extra/PublicConnection.ts b/src/extra/PublicConnection.ts index 996b975..739c155 100644 --- a/src/extra/PublicConnection.ts +++ b/src/extra/PublicConnection.ts @@ -1,5 +1,5 @@ import { Inboxes } from "."; -import { Connection, EndpointFactory, InboxApi, StoreApi, ThreadApi, KvdbApi } from "../service"; +import { Connection, EndpointFactory, InboxApi, StoreApi, ThreadApi } from "../service"; import { InboxEntryPayload } from "./inbox"; diff --git a/src/extra/__mocks__/mockEventQueue.ts b/src/extra/__mocks__/mockEventQueue.ts index f7b2473..e0c8b5d 100644 --- a/src/extra/__mocks__/mockEventQueue.ts +++ b/src/extra/__mocks__/mockEventQueue.ts @@ -38,7 +38,7 @@ export class MockEventQueue { async emitBreakEvent() { return new Promise((resolve) => { - resolve; + resolve(); }); } } diff --git a/src/extra/managers.ts b/src/extra/managers.ts index ea5b4bc..77dd0db 100644 --- a/src/extra/managers.ts +++ b/src/extra/managers.ts @@ -67,7 +67,7 @@ export interface GenericEvent extends Types.Event { } export abstract class BaseEventDispatcherManager { - private _listenersSymbols = new Map(); + private _listenerssymbols = new Map(); private _listeners = new Map(); get listeners() { @@ -87,8 +87,8 @@ export abstract class BaseEventDispatcherManager { } } - unregisterCallback(symbol: Symbol) { - this._listenersSymbols.delete(symbol); + unregisterCallback(symbol: symbol) { + this._listenerssymbols.delete(symbol); for (const keys of this._listeners.keys()) { const listeners = this._listeners.get(keys); if (listeners) { @@ -113,7 +113,7 @@ export abstract class BaseEventDispatcherManager { const subscription = subscriptions[i]; this._listeners.set(id, subscription.callbacks); for (const cb of subscription.callbacks) { - this._listenersSymbols.set(cb.symbol, id); + this._listenerssymbols.set(cb.symbol, id); } return subscription; }); @@ -123,7 +123,7 @@ export abstract class BaseEventDispatcherManager { async unsubscribeFrom(subscriptionsId: string[]) { const knownIds: string[] = []; for (const subscriptionId of subscriptionsId) { - for (const [key, callbackSubscription] of this._listenersSymbols.entries()) { + for (const [key, callbackSubscription] of this._listenerssymbols.entries()) { if (callbackSubscription === subscriptionId) { knownIds.push(subscriptionId); this.unregisterCallback(key); diff --git a/src/extra/subscriptions.ts b/src/extra/subscriptions.ts index bd54468..cb4085d 100644 --- a/src/extra/subscriptions.ts +++ b/src/extra/subscriptions.ts @@ -82,7 +82,7 @@ export type EventsCallbackPayload = Types.ContextCustomEventData; export type EventCallback = { callback: (e: Types.Event | GenericEvent) => void; - symbol: Symbol; + symbol: symbol; }; export interface Subscription { diff --git a/src/service/BaseApi.ts b/src/service/BaseApi.ts index f081a5b..d8b0775 100644 --- a/src/service/BaseApi.ts +++ b/src/service/BaseApi.ts @@ -9,8 +9,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { BaseNative } from "../api/BaseNative"; - export class BaseApi { private _servicePtr: number; diff --git a/src/service/Connection.ts b/src/service/Connection.ts index c2cae73..f2841b6 100644 --- a/src/service/Connection.ts +++ b/src/service/Connection.ts @@ -16,7 +16,6 @@ import { PagingList, Context, UserInfo, - PKIVerificationOptions, ConnectionEventType, ConnectionEventSelectorType, } from "../Types"; diff --git a/src/service/StreamApi.ts b/src/service/StreamApi.ts index d439c7c..b085104 100644 --- a/src/service/StreamApi.ts +++ b/src/service/StreamApi.ts @@ -5,7 +5,6 @@ import { AudioLevelsStats, WebRtcClient } from "../webStreams/WebRtcClient"; import { DataChannelMeta, StreamCreateMeta, - StreamId, StreamTrackId, } from "../webStreams/types/ApiTypes"; import { BaseApi } from "./BaseApi"; @@ -25,15 +24,13 @@ import { RemoteStreamListener, } from "../Types"; import { StreamApiNative } from "../api/StreamApiNative"; -import { DataChannelCryptor } from "../webStreams/DataChannelCryptor"; -import { Logger } from "../webStreams/Logger"; export interface StreamTrack { id: Types.StreamTrackId; streamHandle: StreamHandle; track?: MediaStreamTrack; dataChannelMeta: DataChannelMeta; - published: Boolean; + published: boolean; markedToRemove?: boolean; } @@ -300,7 +297,7 @@ export class StreamApi extends BaseApi { "[removeStreamTrack]: there is no Stream with given Id: " + streamHandle, ); } - for (const [key, streamTrack] of this.streamTracks.entries()) { + for (const [_key, streamTrack] of this.streamTracks.entries()) { if ( streamTrack.track && streamTrack.track?.id === meta.track?.id && diff --git a/src/webStreams/DataChannelCryptor.ts b/src/webStreams/DataChannelCryptor.ts index d558650..a99e3c4 100644 --- a/src/webStreams/DataChannelCryptor.ts +++ b/src/webStreams/DataChannelCryptor.ts @@ -3,9 +3,7 @@ import { DataChannelCryptorDecryptStatus } from "../Types"; import { KeyStore } from "./KeyStore"; import { Logger } from "./Logger"; -const AES_GCM_KEY_LENGTH_BYTES = 32; const GCM_NONCE_LENGTH_BYTES = 12; -const GCM_TAG_LENGTH_BITS = 128; const VERSION_LENGTH_BYTES = 1; const KEY_ID_LENGTH_BYTES = 1; const SEQUENCE_NUMBER_LENGTH_BYTES = 4; diff --git a/src/webStreams/Utils.ts b/src/webStreams/Utils.ts index d782e6d..465b460 100644 --- a/src/webStreams/Utils.ts +++ b/src/webStreams/Utils.ts @@ -1,5 +1,3 @@ -import { CryptoFacade } from "../crypto/CryptoFacade"; - export class Utils { public static generateNumericId(): number { return new DataView(crypto.getRandomValues(new Uint8Array(6)).buffer).getUint32(0, false); diff --git a/src/webStreams/WebRtcClientTypes.ts b/src/webStreams/WebRtcClientTypes.ts index a976a5b..e3007fa 100644 --- a/src/webStreams/WebRtcClientTypes.ts +++ b/src/webStreams/WebRtcClientTypes.ts @@ -1,4 +1,3 @@ -import { MediaServerApiTypes } from "../ServerTypes"; import { NewPublisherEvent } from "../service/WebRtcInterface"; import { StreamRoomId } from "./types/ApiTypes"; export declare class RTCRtpScriptTransform { diff --git a/src/webStreams/WebRtcConfig.ts b/src/webStreams/WebRtcConfig.ts index a8b5b45..a0fa288 100644 --- a/src/webStreams/WebRtcConfig.ts +++ b/src/webStreams/WebRtcConfig.ts @@ -1,5 +1,4 @@ import { TurnCredentials } from "../Types"; -import { PeerCredentials } from "./WebRtcClientTypes"; export class WebRtcConfig { // TMP IV diff --git a/src/webStreams/WebRtcInterfaceImpl.ts b/src/webStreams/WebRtcInterfaceImpl.ts index e19ba23..3b8dc67 100644 --- a/src/webStreams/WebRtcInterfaceImpl.ts +++ b/src/webStreams/WebRtcInterfaceImpl.ts @@ -10,12 +10,10 @@ limitations under the License. */ import { - CurrentPublishersData, Jsep, RoomModel, SdpWithRoomModel, SetAnswerAndSetRemoteDescriptionModel, - StreamsUpdatedData, UpdateKeysModel, WebRtcInterface, } from "../service/WebRtcInterface"; diff --git a/src/webStreams/WebWorkerHelper.ts b/src/webStreams/WebWorkerHelper.ts index f8160fe..37e8edd 100644 --- a/src/webStreams/WebWorkerHelper.ts +++ b/src/webStreams/WebWorkerHelper.ts @@ -4,7 +4,7 @@ import { InitializeEvent, SetKeysEvent } from "./worker/WorkerEvents"; interface WorkerLogEvent { data: | { - data: Object | String; + data: object | string; type: "error" | "debug"; } | { @@ -43,7 +43,7 @@ export class WebWorker { }); } } - } catch (e) { + } catch { console.error("[Worker]: invalid event"); } }; diff --git a/src/webStreams/audio/ActiveSpeakerDetector.ts b/src/webStreams/audio/ActiveSpeakerDetector.ts index e88c551..1bda2c4 100644 --- a/src/webStreams/audio/ActiveSpeakerDetector.ts +++ b/src/webStreams/audio/ActiveSpeakerDetector.ts @@ -68,10 +68,7 @@ export class ActiveSpeakerDetector { } private selectActiveSpeakers(now: number): SpeakerState[] { - let bestId: SpeakerId | null = null; - let bestRms = -Infinity; - - for (const [id, state] of this.speakers.entries()) { + for (const [_id, state] of this.speakers.entries()) { state.active = now - state.lastAboveThresholdTs <= this.opts.activityWindowMs && now - state.activeSince < this.opts.holdMs; diff --git a/webendpoint-cpp/CMakeLists.txt b/webendpoint-cpp/CMakeLists.txt index 736c7eb..d3ac3ac 100644 --- a/webendpoint-cpp/CMakeLists.txt +++ b/webendpoint-cpp/CMakeLists.txt @@ -2,28 +2,61 @@ project(endpoint-wasm-module) cmake_minimum_required(VERSION 3.18) set(CMAKE_CXX_STANDARD 17) +# --------------------------------------------------------------------------- +# Build variant: release (default) or debug +# Pass -DPRIVMX_BUILD_TYPE=debug to emcmake to get a debug build. +# --------------------------------------------------------------------------- +set(PRIVMX_BUILD_TYPE "release" CACHE STRING "Build variant: release or debug") + file(GLOB_RECURSE SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) add_executable(endpoint-wasm-module main.cpp ${SRC_FILES}) target_include_directories(endpoint-wasm-module PUBLIC ${PROJECT_SOURCE_DIR}/include) find_package(Threads REQUIRED) find_package(Poco REQUIRED COMPONENTS Foundation JSON) target_link_libraries(endpoint-wasm-module secp256k1 Threads::Threads Poco::Foundation Poco::JSON Pson gmp privmx privmxendpointcore privmxendpointcrypto privmxendpointthread privmxendpointstore privmxendpointinbox privmxendpointkvdb privmxendpointevent embind privmxdrvcrypto privmxdrvecc privmxdrvnet privmxendpointstream asyncengine) -set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread -flto") -target_compile_options(endpoint-wasm-module PUBLIC - -O3 -) -target_link_options(endpoint-wasm-module PUBLIC - -L $ENV{SDK_DIR}/upstream/emscripten/cache/sysroot/lib - -flto - -sASSERTIONS=0 -sEXPORT_EXCEPTION_HANDLING_HELPERS -sLLD_REPORT_UNDEFINED -sUSE_PTHREADS -sSAFE_HEAP=0 - -sNO_EXIT_RUNTIME -sWASM=1 -sMODULARIZE -sEXPORT_NAME=endpointWasmModule - -sALLOW_MEMORY_GROWTH=0 -sALLOW_BLOCKING_ON_MAIN_THREAD=0 -sPTHREAD_POOL_SIZE=0 - -sPTHREAD_POOL_SIZE_STRICT=0 - -sTEXTDECODER=1 - -sENVIRONMENT=web - -sINITIAL_MEMORY=260046848 - "SHELL:-s EXPORTED_RUNTIME_METHODS=['HEAPU8','ccall']" - "SHELL:--js-library=${PROJECT_SOURCE_DIR}/js/websocket.js" - "SHELL:--pre-js=${PROJECT_SOURCE_DIR}/js/loader.js" - "SHELL:--extern-post-js=${PROJECT_SOURCE_DIR}/js/extern-post.js" -) + +if(PRIVMX_BUILD_TYPE STREQUAL "debug") + message(STATUS "Building endpoint-wasm-module: DEBUG") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread") + target_compile_options(endpoint-wasm-module PUBLIC + -O0 -g + -DDEBUG + ) + target_link_options(endpoint-wasm-module PUBLIC + -L $ENV{SDK_DIR}/upstream/emscripten/cache/sysroot/lib + -O0 -g + -sASSERTIONS=2 -sEXPORT_EXCEPTION_HANDLING_HELPERS -sLLD_REPORT_UNDEFINED -sUSE_PTHREADS -sSAFE_HEAP=1 + -sNO_EXIT_RUNTIME -sWASM=1 -sMODULARIZE -sEXPORT_NAME=endpointWasmModule + -sALLOW_MEMORY_GROWTH=0 -sALLOW_BLOCKING_ON_MAIN_THREAD=0 -sPTHREAD_POOL_SIZE=0 + -sPTHREAD_POOL_SIZE_STRICT=0 + -sTEXTDECODER=1 + -sENVIRONMENT=web + -sINITIAL_MEMORY=260046848 + -sSTACK_OVERFLOW_CHECK=2 + "SHELL:-s EXPORTED_RUNTIME_METHODS=['HEAPU8','ccall']" + "SHELL:--js-library=${PROJECT_SOURCE_DIR}/js/websocket.js" + "SHELL:--pre-js=${PROJECT_SOURCE_DIR}/js/loader.js" + "SHELL:--extern-post-js=${PROJECT_SOURCE_DIR}/js/extern-post.js" + ) +else() + message(STATUS "Building endpoint-wasm-module: RELEASE") + set(CMAKE_CXX_FLAGS "-std=c++17 -fexceptions -pthread -flto") + target_compile_options(endpoint-wasm-module PUBLIC + -O3 + ) + target_link_options(endpoint-wasm-module PUBLIC + -L $ENV{SDK_DIR}/upstream/emscripten/cache/sysroot/lib + -flto + -sASSERTIONS=0 -sEXPORT_EXCEPTION_HANDLING_HELPERS -sLLD_REPORT_UNDEFINED -sUSE_PTHREADS -sSAFE_HEAP=0 + -sNO_EXIT_RUNTIME -sWASM=1 -sMODULARIZE -sEXPORT_NAME=endpointWasmModule + -sALLOW_MEMORY_GROWTH=0 -sALLOW_BLOCKING_ON_MAIN_THREAD=0 -sPTHREAD_POOL_SIZE=0 + -sPTHREAD_POOL_SIZE_STRICT=0 + -sTEXTDECODER=1 + -sENVIRONMENT=web + -sINITIAL_MEMORY=260046848 + "SHELL:-s EXPORTED_RUNTIME_METHODS=['HEAPU8','ccall']" + "SHELL:--js-library=${PROJECT_SOURCE_DIR}/js/websocket.js" + "SHELL:--pre-js=${PROJECT_SOURCE_DIR}/js/loader.js" + "SHELL:--extern-post-js=${PROJECT_SOURCE_DIR}/js/extern-post.js" + ) +endif()