diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index cb144c83..46e593f1 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ FROM mcr.microsoft.com/devcontainers/javascript-node:22 RUN apt-get update -RUN apt-get install -y openjdk-17-jdk +RUN apt-get install -y openjdk-17-jdk gdb diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 031ae065..fb149f0e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -9,7 +9,8 @@ "streetsidesoftware.code-spell-checker", "bierner.markdown-emoji", "smulyono.reveal", - "ms-azuretools.vscode-docker" + "ms-azuretools.vscode-docker", + "ms-vscode.cpptools-extension-pack" ] } } diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 35faebd6..4fb4d569 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - nodeVersion: [ 16, 18, 20, 22 ] + nodeVersion: [ 18, 20, 22 ] jdkVersion: [ openjdk9, openjdk10, openjdk11, openjdk21 ] steps: - name: Checkout source code diff --git a/.github/workflows/pull-requests.yml b/.github/workflows/pull-requests.yml index a7fdcfea..07e69021 100644 --- a/.github/workflows/pull-requests.yml +++ b/.github/workflows/pull-requests.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - nodeVersion: [ 16, 18, 20, 22 ] + nodeVersion: [ 18, 20, 22 ] jdkVersion: [ openjdk9, openjdk10, openjdk11, openjdk21 ] steps: - name: Checkout source code diff --git a/.vscode/settings.json b/.vscode/settings.json index d531f16a..4f164947 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,25 @@ { "cSpell.words": [ - "Ferner" + "clazz", + "clazzclazz", + "Ferner", + "jarray", + "jboolean", + "jbyte", + "jchar", + "jclass", + "jdouble", + "jfloat", + "jint", + "jlong", + "jmethod", + "jobj", + "jobject", + "jshort", + "jsize", + "jthrowable", + "jvalue", + "Ljava", + "varargs" ] } \ No newline at end of file diff --git a/README.md b/README.md index 6462c5f1..4be0944a 100644 --- a/README.md +++ b/README.md @@ -904,7 +904,7 @@ Either `postInstall.js` didn't run or there was a problem detecting java. Try ru npm install node-gyp build --debug - gdb --args `which node` ./node_modules/.bin/nodeunit test + gdb --args "$(which node)" ./node_modules/.bin/vitest test ## License diff --git a/package-lock.json b/package-lock.json index ec4743c6..25ace04d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,127 +18,402 @@ }, "devDependencies": { "chalk": "2.4.2", - "nodeunit": "^0.11.3", + "vitest": "^3.1.3", "when": "3.7.8" }, "engines": { "node": ">=7.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, "node_modules/@isaacs/cliui": { @@ -237,41 +512,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -279,17 +519,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@npmcli/agent": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", @@ -334,161 +563,473 @@ "node": ">=14" } }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", + "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", + "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", + "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", + "cpu": [ + "arm64" + ], "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/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", + "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", + "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", + "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", + "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", + "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", + "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", + "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", + "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", + "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", + "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", + "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", + "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", + "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", + "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", + "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", + "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", + "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.3.tgz", + "integrity": "sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "node_modules/@vitest/mocker": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", + "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", "dev": true, "license": "MIT", "dependencies": { - "default-require-extensions": "^2.0.0" + "@vitest/spy": "3.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "node_modules/@vitest/pretty-format": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.3.tgz", + "integrity": "sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "node_modules/@vitest/runner": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.3.tgz", + "integrity": "sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.1.3", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@vitest/snapshot": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.3.tgz", + "integrity": "sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@vitest/pretty-format": "3.1.3", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/@vitest/spy": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.3.tgz", + "integrity": "sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": "~2.1.0" + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/@vitest/utils": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==", "dev": true, "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.1.3", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "license": "ISC", "engines": { - "node": ">=0.8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, "node_modules/balanced-match": { @@ -496,48 +1037,16 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bind-obj-methods": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.2.tgz", - "integrity": "sha512-bUkRdEOppT1Xg/jG0+bp0JSjUD9U0r7skxb/42WeBUjfBpW6COQTIgQmKX5J2Z3aMXcORKgN2N+d7IQwTK3pag==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cacache": { "version": "18.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", @@ -576,52 +1085,23 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", "dependencies": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/capture-stack-trace": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", - "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -660,6 +1140,16 @@ "node": ">=4" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -678,201 +1168,31 @@ "node": ">=6" } }, - "node_modules/clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "license": "ISC", "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "color-name": "1.1.3" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/coveralls": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", - "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" - }, - "bin": { - "coveralls": "bin/coveralls.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, + "dependencies": { + "ms": "^2.1.3" + }, "engines": { "node": ">=6.0" }, @@ -882,57 +1202,14 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": ">=6" } }, "node_modules/eastasianwidth": { @@ -941,35 +1218,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "license": "MIT" - }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -994,113 +1242,90 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "license": "MIT" }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/estree": "^1.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/expect-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", + "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": ">=12.0.0" } }, - "node_modules/events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", - "dev": true, - "license": "ISC" - }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": ">=6" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/find-java-home": { @@ -1112,62 +1337,6 @@ "winreg": "~1.2.2" } }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", - "dev": true, - "license": "ISC" - }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", @@ -1189,48 +1358,19 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-loop": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", - "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/glob": { @@ -1340,97 +1480,22 @@ "node": ">= 8" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", - "dependencies": { - "is-stream": "^1.0.1" - }, "engines": { "node": ">=4" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -1450,22 +1515,6 @@ "node": ">= 14" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -1509,25 +1558,6 @@ "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -1553,179 +1583,17 @@ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "license": "BSD-3-Clause" }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "license": "MIT" }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "append-transform": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -1741,200 +1609,23 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "lcov-parse": "bin/cli.js" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, "license": "MIT" }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=0.8.6" - } - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, "node_modules/make-fetch-happen": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", @@ -1967,83 +1658,16 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "license": "MIT", + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "license": "ISC", "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "license": "ISC", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect/node_modules/minipass": { @@ -2171,13 +1795,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -2209,23 +1826,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nan": { "version": "2.22.2", @@ -2233,6 +1838,25 @@ "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", @@ -2242,13 +1866,6 @@ "node": ">= 0.6" } }, - "node_modules/nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true, - "license": "MIT" - }, "node_modules/node-gyp": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", @@ -2297,21 +1914,6 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/nodeunit": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", - "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", - "deprecated": "you are strongly encouraged to use other testing options", - "dev": true, - "license": "MIT", - "dependencies": { - "ejs": "^2.5.2", - "tap": "^12.0.1" - }, - "bin": { - "nodeunit": "bin/nodeunit" - } - }, "node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", @@ -2327,177 +1929,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", - "dev": true, - "license": "ISC" - }, - "node_modules/own-or-env": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", - "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", - "dev": true, - "license": "ISC", - "dependencies": { - "own-or": "^1.0.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -2513,72 +1944,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2587,13 +1958,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -2625,36 +1989,23 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/path-type/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 14.16" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2662,27 +2013,46 @@ "dev": true, "license": "ISC" }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "find-up": "^3.0.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=6" + "node": "^10 || ^12 || >=14" } }, "node_modules/proc-log": { @@ -2694,14 +2064,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -2715,265 +2077,60 @@ "node": ">=10" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" + "engines": { + "node": ">= 4" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/rollup": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", + "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "license": "ISC", - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "@types/estree": "1.0.7" }, "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "rollup": "dist/bin/rollup" }, "engines": { - "node": "*" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", + "fsevents": "~2.3.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true + "optional": true }, "node_modules/semver": { "version": "7.7.1", @@ -2987,13 +2144,6 @@ "node": ">=10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3013,10 +2163,10 @@ "node": ">=8" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, @@ -3058,124 +2208,16 @@ "node": ">= 14" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-wrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "node_modules/spawn-wrap/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -3197,52 +2239,19 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, - "node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } + "license": "MIT" }, "node_modules/string-width-cjs": { "name": "string-width", @@ -3259,301 +2268,44 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tap": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/tap/-/tap-12.7.0.tgz", - "integrity": "sha512-SjglJmRv0pqrQQ7d5ZBEY8ZOqv3nYDBXEX51oyycOH7piuhn82JKT/yDNewwmOsodTD/RZL9MccA96EjDgK+Eg==", - "dev": true, - "license": "ISC", - "dependencies": { - "bind-obj-methods": "^2.0.0", - "browser-process-hrtime": "^1.0.0", - "capture-stack-trace": "^1.0.0", - "clean-yaml-object": "^0.1.0", - "color-support": "^1.1.0", - "coveralls": "^3.0.2", - "domain-browser": "^1.2.0", - "esm": "^3.2.5", - "foreground-child": "^1.3.3", - "fs-exists-cached": "^1.0.0", - "function-loop": "^1.0.1", - "glob": "^7.1.3", - "isexe": "^2.0.0", - "js-yaml": "^3.13.1", - "minipass": "^2.3.5", - "mkdirp": "^0.5.1", - "nyc": "^14.0.0", - "opener": "^1.5.1", - "os-homedir": "^1.0.2", - "own-or": "^1.0.0", - "own-or-env": "^1.0.1", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.0", - "source-map-support": "^0.5.10", - "stack-utils": "^1.0.2", - "tap-mocha-reporter": "^3.0.9", - "tap-parser": "^7.0.0", - "tmatch": "^4.0.0", - "trivial-deferred": "^1.0.1", - "ts-node": "^8.0.2", - "tsame": "^2.0.1", - "typescript": "^3.3.3", - "write-file-atomic": "^2.4.2", - "yapool": "^1.0.0" - }, - "bin": { - "tap": "bin/run.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tap-mocha-reporter": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.9.tgz", - "integrity": "sha512-VO07vhC9EG27EZdOe7bWBj1ldbK+DL9TnRadOgdQmiQOVZjFpUEQuuqO7+rNSO2kfmkq5hWeluYXDWNG/ytXTQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "color-support": "^1.1.0", - "debug": "^2.1.3", - "diff": "^1.3.2", - "escape-string-regexp": "^1.0.3", - "glob": "^7.0.5", - "js-yaml": "^3.3.1", - "tap-parser": "^5.1.0", - "unicode-length": "^1.0.0" - }, - "bin": { - "tap-mocha-reporter": "index.js" - }, - "optionalDependencies": { - "readable-stream": "^2.1.5" - } - }, - "node_modules/tap-mocha-reporter/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tap-mocha-reporter/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tap-mocha-reporter/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/tap-mocha-reporter/node_modules/tap-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", - "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", - "dev": true, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "dependencies": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7" - }, - "bin": { - "tap-parser": "bin/cmd.js" - }, - "optionalDependencies": { - "readable-stream": "^2" + "engines": { + "node": ">=8" } }, - "node_modules/tap-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", - "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", - "dev": true, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "events-to-array": "^1.0.1", - "js-yaml": "^3.2.7", - "minipass": "^2.2.0" + "ansi-regex": "^5.0.1" }, - "bin": { - "tap-parser": "bin/cmd.js" + "engines": { + "node": ">=8" } }, - "node_modules/tap/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, "node_modules/tar": { @@ -3624,170 +2376,67 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tmatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", - "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", - "dev": true, - "license": "ISC" - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } + "license": "MIT" }, - "node_modules/trivial-deferred": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.1.2.tgz", - "integrity": "sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==", + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, - "license": "ISC", - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "node_modules/ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, "license": "MIT", "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tsame": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.1.tgz", - "integrity": "sha512-jxyxgKVKa4Bh5dPcO42TJL22lIvfd9LOVJwdovKOnJa4TLLrHxquK+DlGm4rkGmrcur+GRx+x4oW00O2pY/fFw==", - "dev": true, - "license": "ISC" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, + "license": "MIT", "engines": { - "node": "*" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=4.2.0" + "node": ">=14.0.0" } }, - "node_modules/unicode-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", - "integrity": "sha512-rZKNhIqioUp7H49afr26tivLDCvUSqOXwmwEEnsCwnPX67S1CYbOL45Y5IP3K/XHN73/lg21HlrB8SNlYXKQTg==", + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "license": "MIT", - "dependencies": { - "punycode": "^1.3.2", - "strip-ansi": "^3.0.1" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/unicode-length/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" - }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -3812,67 +2461,159 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "node_modules/vite-node": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.3.tgz", + "integrity": "sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" + "node_modules/vitest": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.3.tgz", + "integrity": "sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.1.3", + "@vitest/mocker": "3.1.3", + "@vitest/pretty-format": "^3.1.3", + "@vitest/runner": "3.1.3", + "@vitest/snapshot": "3.1.3", + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.13", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.3", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.1.3", + "@vitest/ui": "3.1.3", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } }, "node_modules/when": { "version": "3.7.8", @@ -3888,33 +2629,28 @@ "which": "bin/which" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/winreg": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", - "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" } }, + "node_modules/winreg": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz", + "integrity": "sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=" + }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", @@ -4006,109 +2742,6 @@ "engines": { "node": ">=8" } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yapool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", - "integrity": "sha512-RONBZndo8Lo8pKPfORRxr2DIk2NZKIml654o4kaIu7RXVxQCKsAN6AqrcoZsI3h+2H5YO2mD/04Wy4LbAgd+Pg==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } } } } diff --git a/package.json b/package.json index a5807d01..4f4943f3 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ }, "devDependencies": { "chalk": "2.4.2", - "nodeunit": "^0.11.3", + "vitest": "^3.1.3", "when": "3.7.8" }, "scripts": { diff --git a/src/methodCallBaton.cpp b/src/methodCallBaton.cpp index 8b4902e8..c2a10159 100644 --- a/src/methodCallBaton.cpp +++ b/src/methodCallBaton.cpp @@ -115,7 +115,7 @@ v8::Local MethodCallBaton::resultsToV8(JNIEnv *env) { return scope.Escape(err); } - return scope.Escape(javaToV8(m_java, env, m_result)); + return scope.Escape(javaToV8(m_java, env, m_result)); } void NewInstanceBaton::ExecuteInternal(JNIEnv* env) { diff --git a/src/utils.cpp b/src/utils.cpp index 067511f7..bd1c9bf7 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -575,17 +575,10 @@ v8::Local javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArra case TYPE_BOOLEAN: { jboolean* elems = env->GetBooleanArrayElements((jbooleanArray)objArray, 0); -#if (NODE_VERSION_AT_LEAST(4, 0, 0)) - size_t byteLength = arraySize; - v8::Local ab = newArrayBuffer(elems, byteLength); - env->ReleaseBooleanArrayElements((jbooleanArray)objArray, elems, 0); - return v8::Uint8Array::New(ab, 0, arraySize); -#else for(jsize i=0; iSet(i, Nan::New(elems[i])); + result->Set(Nan::GetCurrentContext(), i, Nan::New(elems[i])); } env->ReleaseBooleanArrayElements((jbooleanArray)objArray, elems, 0); -#endif } break; diff --git a/test8/TestLambda$IntegerMath.class b/test/TestLambda$IntegerMath.class similarity index 100% rename from test8/TestLambda$IntegerMath.class rename to test/TestLambda$IntegerMath.class diff --git a/test8/TestLambda.class b/test/TestLambda.class similarity index 100% rename from test8/TestLambda.class rename to test/TestLambda.class diff --git a/test8/TestLambda.java b/test/TestLambda.java similarity index 100% rename from test8/TestLambda.java rename to test/TestLambda.java diff --git a/test/TestLambda.test.js b/test/TestLambda.test.js new file mode 100644 index 00000000..423170b1 --- /dev/null +++ b/test/TestLambda.test.js @@ -0,0 +1,26 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Java8', () => { + test('call methods of a class that uses lambda expressions', () => { + try { + const TestLambda = java.import('TestLambda'); + const lambda = new TestLambda(); + const sum = lambda.testLambdaAdditionSync(23, 42); + expect(sum).toBe(65); + const diff = lambda.testLambdaSubtractionSync(23, 42); + expect(diff).toBe(-19); + } + catch (err) { + const unsupportedVersion = java.instanceOf(err.cause, 'java.lang.UnsupportedClassVersionError'); + if (unsupportedVersion) { + console.log('JRE 1.8 not available'); + } else { + console.error('Java8 test failed with unknown error:', err); + throw err; + } + } + }); +}); diff --git a/test/awt-test.js b/test/awt-test.js deleted file mode 100644 index e0c4e3bb..00000000 --- a/test/awt-test.js +++ /dev/null @@ -1,18 +0,0 @@ - -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); -var path = require('path'); - -exports['AWT'] = nodeunit.testCase({ - "calling AWT method (see issue 1)": function(test) { - var headlessVal = java.callStaticMethodSync("java.lang.System", "getProperty", "java.awt.headless"); - console.log("java.awt.headless =", headlessVal); - test.equal(headlessVal, 'true'); - var filename = path.join(path.dirname(__filename), "nodejs.png"); - var file = java.newInstanceSync("java.io.File", filename); - var image = java.callStaticMethodSync("javax.imageio.ImageIO", "read", file); - test.done(); - } -}); diff --git a/test/awt.test.js b/test/awt.test.js new file mode 100644 index 00000000..5d13d78c --- /dev/null +++ b/test/awt.test.js @@ -0,0 +1,18 @@ + +import path from 'node:path'; +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('AWT', () => { + test("calling AWT method (see issue 1)", () => { + const headlessVal = java.callStaticMethodSync("java.lang.System", "getProperty", "java.awt.headless"); + console.log("java.awt.headless =", headlessVal); + expect(headlessVal).toBe('true'); + const filename = path.join(path.dirname(__filename), "nodejs.png"); + const file = java.newInstanceSync("java.io.File", filename); + const image = java.callStaticMethodSync("javax.imageio.ImageIO", "read", file); + expect(image).toBeTruthy(); + }); +}); diff --git a/test/dynamicProxy-test.js b/test/dynamicProxy-test.js deleted file mode 100644 index aef5fab7..00000000 --- a/test/dynamicProxy-test.js +++ /dev/null @@ -1,298 +0,0 @@ -'use strict'; - -var java = require("../testHelpers").java; -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Dynamic Proxy'] = nodeunit.testCase({ - "0 Arguments": function (test) { - var callCount = 0; - - var myProxy = java.newProxy('RunInterface$Interface0Arg', { - run: function () { - callCount++; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - runInterface.run0ArgsSync(myProxy); - - test.equals(callCount, 2); - - test.done(); - }, - - "1 Arguments": function (test) { - var runData = ''; - - var myProxy = java.newProxy('RunInterface$Interface1Arg', { - run: function (str) { - runData += str; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - runInterface.run1ArgsSync(myProxy); - - test.equals(runData, 'test1test1'); - - test.done(); - }, - - "1 Arguments with return data": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - run: function (i) { - return i + 1; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runWithReturnSync(myProxy); - - test.equals(result, 43); - - test.done(); - }, - - "Listener test": function (test) { - var runData = ''; - - var myProxy = java.newProxy('ListenerInterface', { - onEvent: function (list, runtime) { - runData = 'onEvent'; - } - }); - - var listenerTester = java.newInstanceSync("ListenerTester"); - listenerTester.setListenerSync(myProxy); - listenerTester.raiseEventSync(); - - test.equals(runData, 'onEvent'); - - test.done(); - }, - - "thread": function (test) { - var callCount = 0; - - var myProxy = java.newProxy('java.lang.Runnable', { - run: function () { - callCount++; - } - }); - - var thread = java.newInstanceSync("java.lang.Thread", myProxy); - thread.startSync(); - - var timeout = 50; - - function waitForThread() { - if (callCount === 1) { - return test.done(); - } - timeout--; - if (timeout < 0) { - test.done(new Error("Timeout")); - } - setTimeout(waitForThread, 100); - } - - waitForThread(); - }, - - "thread issue #143": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - run: function (i) { - return i - 1; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - runInterface.runInAnotherThread(myProxy, function(err, result) { - test.equals(result, 45); - - test.done(); - }); - }, - - "java equals()": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - }); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runEqualsSync(myProxy); - - test.equals(result, false); - - test.done(); - }, - - "java equals() same instance": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - }); - - var runInterface = java.newInstanceSync("RunInterface"); - runInterface.setInstanceSync(myProxy); - var result = runInterface.runEqualsInstanceSync(myProxy); - - test.equals(result, true); - - test.done(); - }, - - "java equals() different instance": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', {}); - var myProxy2 = java.newProxy('RunInterface$InterfaceWithReturn', {}); - - var runInterface = java.newInstanceSync("RunInterface"); - runInterface.setInstanceSync(myProxy); - var result = runInterface.runEqualsInstanceSync(myProxy2); - - test.equals(result, false); - - test.done(); - }, - - "js equals()": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - equals: function (obj) { - return true; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runEqualsSync(myProxy); - - test.equals(result, true); - - test.done(); - }, - - "java hashCode()": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - }); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runHashCodeSync(myProxy); - var result2 = runInterface.runHashCodeSync(myProxy); - var systemHashCode = java.callStaticMethodSync("java.lang.System", "identityHashCode", myProxy); - - test.equals(result, result2); - test.equals(result, systemHashCode); - - test.done(); - }, - - "js hashCode()": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - hashCode: function() { - return 1234; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runHashCodeSync(myProxy); - - test.equals(result, 1234); - - test.done(); - }, - - "java toString()": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', {}); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runToStringSync(myProxy); - - test.equals(result, "[object Object]"); - - test.done(); - }, - - "js toString()": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - toString: function() { - return "myRunInterface"; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - var result = runInterface.runToStringSync(myProxy); - - test.equals(result, "myRunInterface"); - - test.done(); - }, - - "js string error": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - run: function (i) { - throw 'myError'; - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - try { - runInterface.runWithReturnSync(myProxy); - test.fail("Exception was not thrown"); - } catch (e) { - test.equals(e.cause.getClassSync().getNameSync(), "java.lang.RuntimeException"); - test.ok(/Caused by: node\.NodeJsException:.*myError/.test(e.message)); - } - - test.done(); - }, - - "js Error": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - run: function (i) { - throw new Error('newError'); - } - }); - - var runInterface = java.newInstanceSync("RunInterface"); - try { - runInterface.runWithReturnSync(myProxy); - test.fail("Exception was not thrown"); - } catch (e) { - test.equals(e.cause.getClassSync().getNameSync(), "java.lang.RuntimeException"); - test.ok(/Caused by: node\.NodeJsException:.*newError/.test(e.message)); - } - - test.done(); - }, - - "invocationHandler": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - run: function (i) { - return i + 2; - } - }); - - var result = myProxy.invocationHandler.run(42); - - test.equals(result, 44); - - test.done(); - }, - - "unref": function (test) { - var myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { - run: function (i) { - return i + 1; - } - }); - - myProxy.unref(); - - try { - myProxy.invocationHandler.run(42); - } catch (e) { - test.equals(e.message, "dynamicProxyData has been destroyed or corrupted"); - } - - // call again - myProxy.unref(); - test.done(); - } -}); diff --git a/test/dynamicProxy.test.js b/test/dynamicProxy.test.js new file mode 100644 index 00000000..997a2396 --- /dev/null +++ b/test/dynamicProxy.test.js @@ -0,0 +1,269 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Dynamic Proxy', () => { + test("0 Arguments", () => { + let callCount = 0; + + const myProxy = java.newProxy('RunInterface$Interface0Arg', { + run: function () { + callCount++; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + runInterface.run0ArgsSync(myProxy); + + expect(callCount).toBe(2); + }); + + test("1 Arguments", () => { + let runData = ''; + + const myProxy = java.newProxy('RunInterface$Interface1Arg', { + run: function (str) { + runData += str; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + runInterface.run1ArgsSync(myProxy); + + expect(runData).toBe('test1test1'); + }); + + test("1 Arguments with return data", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + run: function (i) { + return i + 1; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runWithReturnSync(myProxy); + + expect(result).toBe(43); + }); + + test("Listener test", () => { + let runData = ''; + + const myProxy = java.newProxy('ListenerInterface', { + onEvent: function (list, runtime) { + runData = 'onEvent'; + } + }); + + const listenerTester = java.newInstanceSync("ListenerTester"); + listenerTester.setListenerSync(myProxy); + listenerTester.raiseEventSync(); + + expect(runData).toBe('onEvent'); + }); + + test("thread", async () => { + await new Promise((resolve, reject) => { + let callCount = 0; + + const myProxy = java.newProxy('java.lang.Runnable', { + run: function () { + callCount++; + } + }); + + const thread = java.newInstanceSync("java.lang.Thread", myProxy); + thread.startSync(); + + let timeout = 50; + + function waitForThread() { + if (callCount === 1) { + return resolve(); + } + timeout--; + if (timeout < 0) { + return reject(new Error("Timeout")); + } + setTimeout(waitForThread, 100); + } + + waitForThread(); + }); + }); + + test("thread issue #143", async () => { + await new Promise(resolve => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + run: function (i) { + return i - 1; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + runInterface.runInAnotherThread(myProxy, function (err, result) { + expect(result).toBe(45); + resolve(); + }); + }); + }); + + test("java equals()", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + }); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runEqualsSync(myProxy); + + expect(result).toBe(false); + }); + + test("java equals() same instance", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + }); + + const runInterface = java.newInstanceSync("RunInterface"); + runInterface.setInstanceSync(myProxy); + const result = runInterface.runEqualsInstanceSync(myProxy); + + expect(result).toBe(true); + }); + + test("java equals() different instance", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', {}); + const myProxy2 = java.newProxy('RunInterface$InterfaceWithReturn', {}); + + const runInterface = java.newInstanceSync("RunInterface"); + runInterface.setInstanceSync(myProxy); + const result = runInterface.runEqualsInstanceSync(myProxy2); + + expect(result).toBe(false); + }); + + test("js equals()", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + equals: function (obj) { + return true; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runEqualsSync(myProxy); + + expect(result).toBe(true); + }); + + test("java hashCode()", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + }); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runHashCodeSync(myProxy); + const result2 = runInterface.runHashCodeSync(myProxy); + const systemHashCode = java.callStaticMethodSync("java.lang.System", "identityHashCode", myProxy); + + expect(result).toBe(result2); + expect(result).toBe(systemHashCode); + }); + + test("js hashCode()", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + hashCode: function () { + return 1234; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runHashCodeSync(myProxy); + + expect(result).toBe(1234); + }); + + test("java toString()", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', {}); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runToStringSync(myProxy); + + expect(result).toBe("[object Object]"); + }); + + test("js toString()", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + toString: function () { + return "myRunInterface"; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + const result = runInterface.runToStringSync(myProxy); + + expect(result).toBe("myRunInterface"); + }); + + test("js string error", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + run: function (i) { + throw 'myError'; + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + try { + runInterface.runWithReturnSync(myProxy); + throw new Error("Exception was not thrown"); + } catch (e) { + expect(e.cause.getClassSync().getNameSync()).toBe("java.lang.RuntimeException"); + expect(e.message).toMatch(/Caused by: node\.NodeJsException:.*myError/); + } + }); + + test("js Error", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + run: function (i) { + throw new Error('newError'); + } + }); + + const runInterface = java.newInstanceSync("RunInterface"); + try { + runInterface.runWithReturnSync(myProxy); + throw new Error("Exception was not thrown"); + } catch (e) { + expect(e.cause.getClassSync().getNameSync()).toBe("java.lang.RuntimeException"); + expect(e.message).toMatch(/Caused by: node\.NodeJsException:.*newError/); + } + }); + + test("invocationHandler", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + run: function (i) { + return i + 2; + } + }); + + const result = myProxy.invocationHandler.run(42); + + expect(result).toBe(44); + }); + + test("unref", () => { + const myProxy = java.newProxy('RunInterface$InterfaceWithReturn', { + run: function (i) { + return i + 1; + } + }); + + myProxy.unref(); + + try { + myProxy.invocationHandler.run(42); + } catch (e) { + expect(e.message).toBe("dynamicProxyData has been destroyed or corrupted"); + } + + // call again + myProxy.unref(); + }); +}); diff --git a/test/importClass-test.js b/test/importClass-test.js deleted file mode 100644 index 1fc66d01..00000000 --- a/test/importClass-test.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -var java = require("../testHelpers").java; -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Import Class'] = nodeunit.testCase({ - tearDown: function (callback) { - java.setStaticFieldValue("Test", "staticFieldInt", 42); - callback(); - }, - - "import": function (test) { - var Test = java.import('Test'); - test.equals(42, Test.staticFieldInt); - Test.staticFieldInt = 200; - test.equals(200, Test.staticFieldInt); - - test.equals(100, Test.staticMethodSync(99)); - Test.staticMethod(99, function (err, result) { - test.ok(!err); - test.equals(100, result); - - var testObj = new Test(5); - test.equals(5, testObj.getIntSync()); - test.done(); - }); - }, - - "import TestEnum with unsable name": function (test) { - test.expect(5); - var TestEnum = java.import('Test$Enum'); - - // 'foo' and 'bar' are valid enum names - test.strictEqual(TestEnum.foo.toStringSync(), "foo"); - test.strictEqual(TestEnum.bar.toStringSync(), "bar"); - - ['name', 'arguments', 'caller'].forEach(function(prop) { - test.throws( - function() { - // The enum also defines 'name', 'caller', and 'attributes', but Javascript prevents us from using them, - // since these are unwritable properties of Function. - var x = TestEnum[prop].toStringSync(); - }, - TypeError - ); - }); - test.done(); - }, - - "import TestEnum and use alternate name": function (test) { - test.expect(5); - var TestEnum = java.import('Test$Enum'); - - // 'foo' and 'bar' are valid enum names - test.strictEqual(TestEnum.foo.toStringSync(), "foo"); - test.strictEqual(TestEnum.bar.toStringSync(), "bar"); - - // 'name', 'caller', and 'arguments' are not, so we must use e.g. 'name_' to reference the enum. - // But note that the value is still e.g. "name". - test.strictEqual(TestEnum.name_.toStringSync(), "name"); - test.strictEqual(TestEnum.arguments_.toStringSync(), "arguments"); - test.strictEqual(TestEnum.caller_.toStringSync(), "caller"); - test.done(); - } - -}); diff --git a/test/importClass.test.js b/test/importClass.test.js new file mode 100644 index 00000000..72466712 --- /dev/null +++ b/test/importClass.test.js @@ -0,0 +1,59 @@ +import { afterEach, describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Import Class', () => { + afterEach(() => { + java.setStaticFieldValue("Test", "staticFieldInt", 42); + }); + + test("import", async () => { + const Test = java.import('Test'); + expect(Test.staticFieldInt).toBe(42); + Test.staticFieldInt = 200; + expect(Test.staticFieldInt).toBe(200); + + expect(Test.staticMethodSync(99)).toBe(100); + await new Promise(resolve => { + Test.staticMethod(99, (err, result) => { + expect(err).toBeFalsy(); + expect(result).toBe(100); + + const testObj = new Test(5); + expect(testObj.getIntSync()).toBe(5); + resolve(); + }); + }); + }); + + test("import TestEnum with unsable name", () => { + const TestEnum = java.import('Test$Enum'); + + // 'foo' and 'bar' are valid enum names + expect(TestEnum.foo.toStringSync()).toBe("foo"); + expect(TestEnum.bar.toStringSync()).toBe("bar"); + + ['name', 'arguments', 'caller'].forEach(function (prop) { + expect(() => { + // The enum also defines 'name', 'caller', and 'attributes', but Javascript prevents us from using them, + // since these are unwritable properties of Function. + const x = TestEnum[prop].toStringSync(); + }).toThrow(TypeError) + }); + }); + + test("import TestEnum and use alternate name", () => { + const TestEnum = java.import('Test$Enum'); + + // 'foo' and 'bar' are valid enum names + expect(TestEnum.foo.toStringSync()).toBe("foo"); + expect(TestEnum.bar.toStringSync()).toBe("bar"); + + // 'name', 'caller', and 'arguments' are not, so we must use e.g. 'name_' to reference the enum. + // But note that the value is still e.g. "name". + expect(TestEnum.name_.toStringSync()).toBe("name"); + expect(TestEnum.arguments_.toStringSync()).toBe("arguments"); + expect(TestEnum.caller_.toStringSync()).toBe("caller"); + }); +}); diff --git a/test/instanceof-test.js b/test/instanceof-test.js deleted file mode 100644 index f90720e1..00000000 --- a/test/instanceof-test.js +++ /dev/null @@ -1,32 +0,0 @@ -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['instanceOf'] = nodeunit.testCase({ - "working": function(test) { - var subclass = java.newInstanceSync("Test$SubClass"); - if (!java.instanceOf(subclass, "Test$SuperClass")) { - test.fail(subclass.getNameSync() + " should be an instance of Test$SuperClass"); - } - test.done(); - }, - - "non-java object": function(test) { - if (java.instanceOf({}, "Test$SuperClass")) { - test.fail("javascript objects are not instances of anything"); - } - test.done(); - }, - - "bad type": function(test) { - var subclass = java.newInstanceSync("Test$SubClass"); - try { - java.instanceOf(subclass, "BadClassName"); - test.fail("should have thrown an exception.") - } catch (e) { - // OK - } - test.done(); - } -}); diff --git a/test/instanceof.test.js b/test/instanceof.test.js new file mode 100644 index 00000000..d04e33c1 --- /dev/null +++ b/test/instanceof.test.js @@ -0,0 +1,26 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('instanceOf', () => { + test("working", () => { + const subclass = java.newInstanceSync("Test$SubClass"); + if (!java.instanceOf(subclass, "Test$SuperClass")) { + throw new Error(subclass.getNameSync() + " should be an instance of Test$SuperClass"); + } + }); + + test("non-java object", () => { + if (java.instanceOf({}, "Test$SuperClass")) { + throw new Error("javascript objects are not instances of anything"); + } + }); + + test("bad type", () => { + const subclass = java.newInstanceSync("Test$SubClass"); + expect(() => { + java.instanceOf(subclass, "BadClassName"); + }).toThrow(); + }); +}); diff --git a/test/java-ambiguousMethod-test.js b/test/java-ambiguousMethod-test.js deleted file mode 100644 index 7dd0c146..00000000 --- a/test/java-ambiguousMethod-test.js +++ /dev/null @@ -1,106 +0,0 @@ -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Java - Call Ambiguous Method'] = nodeunit.testCase({ - "staticMethodAmbiguous (sync) - int passed to double": function(test) { - var result = java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/Double;)I', 1); - test.equal(result, 1); - test.done(); - }, - - "staticMethodAmbiguous (sync) - double passed to int": function(test) { - var result = java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1.1); - test.equal(result, 2); - test.done(); - }, - - "staticMethodAmbiguous (sync) - method not found wrong argument type": function(test) { - try { - java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/String;)I', 1); - test.fail("should throw"); - } catch (e) { - console.log(e); - } - test.done(); - }, - - "staticMethodAmbiguous (sync) - method failed because argument count mismatch": function(test) { - try { - java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1, 2); - test.fail("should throw argument length mismatch"); - } catch (e) { - console.log(e); - } - test.done(); - }, - - "staticMethodAmbiguous - int passed to double": function(test) { - java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/Double;)I', 1, function(err, result) { - test.ok(!err); - test.equal(result, 1); - test.done(); - }) - }, - - "staticMethodAmbiguous - double passed to int": function(test) { - java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1.1, function(err, result) { - test.ok(!err); - test.equal(result, 2); - test.done(); - }); - }, - - "staticMethodAmbiguous - method not found": function(test) { - java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/String;)I', 1, function(err, result) { - test.ok(err); - console.log(err); - test.done(); - }); - }, - - "staticMethodAmbiguous - method argument count mismatch": function(test) { - java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1, 2, function(err, result) { - test.ok(err); - console.log(err); - test.done(); - }); - }, - - "methodAmbiguous (sync) - int passed to double": function(test) { - var myTest = java.newInstanceSync("Test"); - var result = java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/Double;)I', 1); - test.equal(result, 1); - test.done(); - }, - - "methodAmbiguous (sync) - double passed to int": function(test) { - var myTest = java.newInstanceSync("Test"); - var result = java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/Integer;)I', 1.1); - test.equal(result, 2); - test.done(); - }, - - "methodAmbiguous (sync) - method not found wrong argument type": function(test) { - var myTest = java.newInstanceSync("Test"); - try { - java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/String;)I', 1); - test.fail("should throw"); - } catch (e) { - console.log(e); - } - test.done(); - }, - - "methodAmbiguous (sync) - method failed because argument count mismatch": function(test) { - var myTest = java.newInstanceSync("Test"); - try { - java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/Integer;)I', 1, 2); - test.fail("should throw argument length mismatch"); - } catch (e) { - console.log(e); - } - test.done(); - } -}); diff --git a/test/java-ambiguousMethod.test.js b/test/java-ambiguousMethod.test.js new file mode 100644 index 00000000..efbdfa01 --- /dev/null +++ b/test/java-ambiguousMethod.test.js @@ -0,0 +1,94 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Java - Call Ambiguous Method', () => { + test("staticMethodAmbiguous (sync) - int passed to double", () => { + const result = java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/Double;)I', 1); + expect(result).toBe(1); + }); + + test("staticMethodAmbiguous (sync) - double passed to int", () => { + const result = java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1.1); + expect(result).toBe(2); + }); + + test("staticMethodAmbiguous (sync) - method not found wrong argument type", () => { + expect(() => { + java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/String;)I', 1); + }).toThrow(); + }); + + test("staticMethodAmbiguous (sync) - method failed because argument count mismatch", () => { + expect(() => { + java.callStaticMethodSync('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1, 2); + }).toThrow(); + }); + + test("staticMethodAmbiguous - int passed to double", async () => { + await new Promise(resolve => { + java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/Double;)I', 1, function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBe(1); + resolve(); + }); + }); + }); + + test("staticMethodAmbiguous - double passed to int", async () => { + await new Promise(resolve => { + java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1.1, function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBe(2); + resolve(); + }); + }); + }); + + test("staticMethodAmbiguous - method not found", async () => { + await new Promise(resolve => { + java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/String;)I', 1, function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("staticMethodAmbiguous - method argument count mismatch", async () => { + await new Promise(resolve => { + java.callStaticMethod('Test', 'staticMethodAmbiguous(Ljava/lang/Integer;)I', 1, 2, function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("methodAmbiguous (sync) - int passed to double", () => { + const myTest = java.newInstanceSync("Test"); + const result = java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/Double;)I', 1); + expect(result).toBe(1); + }); + + test("methodAmbiguous (sync) - double passed to int", () => { + const myTest = java.newInstanceSync("Test"); + const result = java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/Integer;)I', 1.1); + expect(result).toBe(2); + }); + + test("methodAmbiguous (sync) - method not found wrong argument type", () => { + const myTest = java.newInstanceSync("Test"); + expect(() => { + java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/String;)I', 1); + }).toThrow(); + }); + + test("methodAmbiguous (sync) - method failed because argument count mismatch", () => { + const myTest = java.newInstanceSync("Test"); + expect(() => { + java.callMethodSync(myTest, 'methodAmbiguous(Ljava/lang/Integer;)I', 1, 2); + }).toThrow(); + }); +}); diff --git a/test/java-callStaticMethod-test.js b/test/java-callStaticMethod-test.js deleted file mode 100644 index 0e9bf17e..00000000 --- a/test/java-callStaticMethod-test.js +++ /dev/null @@ -1,292 +0,0 @@ -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Java - Call Static Method'] = nodeunit.testCase({ - "callStaticMethod": function(test) { - java.callStaticMethod("Test", "staticMethod", function(err, result) { - test.ok(result); - test.equal(result, "staticMethod called"); - test.done(); - }); - }, - - "callStaticMethod without a callback": function(test) { - var result = java.callStaticMethod("Test", "staticMethod"); - console.log("callStaticMethod without a callback result message", result); - test.done(); - }, - - "callStaticMethodSync": function(test) { - var result = java.callStaticMethodSync("Test", "staticMethod"); - test.ok(result); - test.equal(result, "staticMethod called"); - test.done(); - }, - - "callStaticMethod with args": function(test) { - java.callStaticMethod("Test", "staticMethod", 42, function(err, result) { - if (err) { - return test.done(err); - } - test.ok(result); - test.equal(result, 43); - test.done(); - }); - }, - - "callStaticMethodSync with args": function(test) { - var result = java.callStaticMethodSync("Test", "staticMethod", 42); - test.ok(result); - test.equal(result, 43); - test.done(); - }, - - "callStaticMethodSync with BigDecimal": function(test) { - var bigDecimal = java.newInstanceSync("java.math.BigDecimal", 100.1); - var result = java.callStaticMethodSync("Test", "staticBigDecimalToString", bigDecimal); - test.ok(result); - test.ok(Math.abs(parseFloat(result) - 100.1) < 0.0001); - test.done(); - }, - - "callStaticMethod bad class name": function(test) { - java.callStaticMethod("BadClassName", "staticMethod", function(err, result) { - test.ok(err); - test.ok(!result); - test.done(); - }); - }, - - - "callStaticMethodSync bad class name": function(test) { - test.throws(function() { - java.callStaticMethodSync("BadClassName", "staticMethod"); - }); - test.done(); - }, - - "callStaticMethod bad arg types": function(test) { - java.callStaticMethod("Test", "staticMethod", "z", function(err, result) { - test.ok(err); - test.ok(!result); - test.done(); - }); - }, - - "callStaticMethodSync bad arg types": function(test) { - test.throws(function() { - java.callStaticMethodSync("Test", "staticMethod", "z"); - }); - test.done(); - }, - - "callStaticMethod bad number of args": function(test) { - java.callStaticMethod("Test", "staticMethod", 42, "z", function(err, result) { - test.ok(err); - test.equals(undefined, result); - test.done(); - }); - }, - - "callStaticMethodSync bad number of args": function(test) { - test.throws(function() { - java.callStaticMethodSync("Test", "staticMethod", 42, "z"); - }); - test.done(); - }, - - "callStaticMethod bad method name": function(test) { - java.callStaticMethod("Test", "badMethodName", function(err, result) { - test.ok(err); - test.ok(!result); - test.done(); - }); - }, - - "callStaticMethodSync bad method name": function(test) { - test.throws(function() { - java.callStaticMethodSync("Test", "badMethodName"); - }); - test.done(); - }, - - "callStaticMethod exception thrown from method (sync)": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - var result; - try { - result = java.callStaticMethodSync("Test", "staticMethodThrows", ex); - } catch (err) { - test.ok(err); - test.equals('my exception', err.cause.getMessageSync()); - test.ok(err.toString().match(/my exception/)); - test.ok(!result); - test.done(); - } - }, - - "staticMethodThrows exception thrown from method (sync)": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - try { - java.callStaticMethodSync("Test", "staticMethodThrows", ex); - test.fail("should throw"); - } catch (err) { - test.ok(err.toString().match(/my exception/)); - } - test.done(); - }, - - "staticMethodThrows exception thrown from method": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - java.callStaticMethod("Test", "staticMethodThrows", ex, function(err, result) { - test.ok(err); - test.equals('my exception', err.cause.getMessageSync()); - test.ok(err.toString().match(/my exception/)); - test.ok(!result); - test.done(); - }); - }, - - "staticMethodThrowsNewException exception thrown from method (sync)": function(test) { - try { - java.callStaticMethodSync("Test", "staticMethodThrowsNewException"); - test.fail("should throw"); - } catch (err) { - test.ok(err.toString().match(/my exception/)); - } - test.done(); - }, - - "staticMethodThrowsNewException exception thrown from method": function(test) { - java.callStaticMethod("Test", "staticMethodThrowsNewException", function(err, result) { - test.ok(err); - test.equals('my exception', err.cause.getMessageSync()); - test.ok(err.toString().match(/my exception/)); - test.ok(!result); - test.done(); - }); - }, - - "methodThrows exception thrown from method (sync)": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - var myTest = java.newInstanceSync("Test"); - try { - myTest.methodThrowsSync(ex); - test.fail("should throw"); - } catch (err) { - test.ok(err.toString().match(/my exception/)); - } - test.done(); - }, - - "methodThrows exception thrown from method": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - var myTest = java.newInstanceSync("Test"); - return myTest.methodThrows(ex, function(err) { - test.ok(err.toString().match(/my exception/)); - test.done(); - }); - }, - - "methodThrowsNewException exception thrown from method (sync)": function(test) { - var myTest = java.newInstanceSync("Test"); - try { - myTest.methodThrowsNewExceptionSync(); - test.fail("should throw"); - } catch (err) { - test.ok(err.toString().match(/my exception/)); - } - test.done(); - }, - - "methodThrowsNewException exception thrown from method": function(test) { - var myTest = java.newInstanceSync("Test"); - return myTest.methodThrowsNewException(function(err) { - test.ok(err.toString().match(/my exception/)); - test.done(); - }); - }, - - "char array": function(test) { - var charArray = java.newArray("char", "hello world\n".split('')); - java.callStaticMethod("Test", "staticMethodCharArrayToString", charArray, function(err, result) { - if (err) { - return test.done(err); - } - test.ok(result); - test.equal(result, "hello world\n"); - test.done(); - }); - }, - - "String passed in for Object": function(test) { - java.callStaticMethod("Test", "static2Objects", "1", "2", function(err, result) { - if (err) { - return test.done(err); - } - test.equal(result, false); - test.done(); - }); - }, - - "java.lang.Long addition": function(test) { - var javaLong = java.newInstanceSync("java.lang.Long", 5); - test.equal(javaLong.toString(), '5'); - var result = javaLong + 1; - test.equal(result, 6); - test.done(); - }, - - "java.lang.Long calls (java Long)": function(test) { - var javaLong = java.newInstanceSync("java.lang.Long", 5); - java.callStaticMethod("Test", "staticMethodLongToString", javaLong, function(err, result) { - if (err) { - return test.done(err); - } - test.ok(result); - test.equal(result, "5"); - test.done(); - }); - }, - - "Call method that returns a long": function(test) { - java.callStaticMethod("Test", "staticMethodReturnLong", function(err, result) { - if (err) { - return test.done(err); - } - test.ok(result); - test.equal(result.longValue, "9223372036854775807"); - test.done(); - }); - }, - - "Call method with nested enum value": function(test) { - var Test = java.import("Test"); - Test.staticEnumToStringSync(Test.StaticEnum.Value1); - var str = Test.staticEnumToStringSync(Test.StaticEnum.Value1); // call it twice to ensure memo-ize is working - test.equal(str, "Value1"); - test.done(); - }, - - "Call static method with varargs": function(test) { - var Test = java.import("Test"); - - var str = Test.staticVarargsSync(5, java.newArray('java.lang.String', ['a', 'b', 'c'])); - test.equal(str, "5abc"); - - str = Test.staticVarargsSync(5, 'a', 'b', 'c'); - test.equal(str, "5abc"); - - test.done(); - }, - - "Call static method named name_": function(test) { - test.expect(1); - var Test = java.import("Test"); - Test.name_(function(err) { - test.ifError(err); - test.done(); - }); - } -}); diff --git a/test/java-callStaticMethod.test.js b/test/java-callStaticMethod.test.js new file mode 100644 index 00000000..d6885e47 --- /dev/null +++ b/test/java-callStaticMethod.test.js @@ -0,0 +1,292 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Java - Call Static Method', () => { + test("callStaticMethod", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethod", (err, result) => { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result).toBe("staticMethod called"); + resolve(); + }); + }); + }); + + test("callStaticMethod without a callback", () => { + const result = java.callStaticMethod("Test", "staticMethod"); + expect(result).toBe(`"Static method 'staticMethod' called without a callback did you mean to use the Sync version?"`); + }); + + test("callStaticMethodSync", () => { + const result = java.callStaticMethodSync("Test", "staticMethod"); + expect(result).toBeTruthy(); + expect(result).toBe("staticMethod called"); + }); + + test("callStaticMethod with args", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethod", 42, (err, result) => { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result).toBe(43); + resolve(); + }); + }); + }); + + test("callStaticMethodSync with args", () => { + const result = java.callStaticMethodSync("Test", "staticMethod", 42); + expect(result).toBeTruthy(); + expect(result).toBe(43); + }); + + test("callStaticMethodSync with BigDecimal", () => { + const bigDecimal = java.newInstanceSync("java.math.BigDecimal", 100.1); + const result = java.callStaticMethodSync("Test", "staticBigDecimalToString", bigDecimal); + expect(result).toBeTruthy(); + expect(Math.abs(parseFloat(result) - 100.1) < 0.0001).toBeTruthy(); + }); + + test("callStaticMethod bad class name", async () => { + await new Promise(resolve => { + java.callStaticMethod("BadClassName", "staticMethod", function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + + test("callStaticMethodSync bad class name", () => { + expect(() => { + java.callStaticMethodSync("BadClassName", "staticMethod"); + }).toThrow(); + }); + + test("callStaticMethod bad arg types", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethod", "z", function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("callStaticMethodSync bad arg types", () => { + expect(() => { + java.callStaticMethodSync("Test", "staticMethod", "z"); + }).toThrow(); + }); + + test("callStaticMethod bad number of args", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethod", 42, "z", function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("callStaticMethodSync bad number of args", () => { + expect(() => { + java.callStaticMethodSync("Test", "staticMethod", 42, "z"); + }).toThrow(); + }); + + test("callStaticMethod bad method name", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "badMethodName", function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("callStaticMethodSync bad method name", () => { + expect(() => { + java.callStaticMethodSync("Test", "badMethodName"); + }).toThrow(); + }); + + test("callStaticMethod exception thrown from method (sync)", () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + let result; + try { + result = java.callStaticMethodSync("Test", "staticMethodThrows", ex); + throw new Error('expected error'); + } catch (err) { + expect(err.cause.getMessageSync()).toBe('my exception'); + expect(err.toString()).toMatch(/my exception/); + expect(result).toBeFalsy(); + } + }); + + test("staticMethodThrows exception thrown from method (sync)", () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + try { + java.callStaticMethodSync("Test", "staticMethodThrows", ex); + throw new Error("should throw"); + } catch (err) { + expect(err.toString()).toMatch(/my exception/); + } + }); + + test("staticMethodThrows exception thrown from method", async () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethodThrows", ex, function (err, result) { + expect(err).toBeTruthy(); + expect(err.cause.getMessageSync()).toBe('my exception'); + expect(err.toString()).toMatch(/my exception/); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("staticMethodThrowsNewException exception thrown from method (sync)", () => { + try { + java.callStaticMethodSync("Test", "staticMethodThrowsNewException"); + throw new Error("should throw"); + } catch (err) { + expect(err.toString()).toMatch(/my exception/); + } + }); + + test("staticMethodThrowsNewException exception thrown from method", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethodThrowsNewException", function (err, result) { + expect(err).toBeTruthy(); + expect(err.cause.getMessageSync()).toBe('my exception'); + expect(err.toString()).toMatch(/my exception/); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("methodThrows exception thrown from method (sync)", () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + const myTest = java.newInstanceSync("Test"); + try { + myTest.methodThrowsSync(ex); + throw new Error("should throw"); + } catch (err) { + expect(err.toString()).toMatch(/my exception/); + } + }); + + test("methodThrows exception thrown from method", async () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + const myTest = java.newInstanceSync("Test"); + await new Promise(resolve => { + return myTest.methodThrows(ex, function (err) { + expect(err.toString()).toMatch(/my exception/); + resolve(); + }); + }); + }); + + test("methodThrowsNewException exception thrown from method (sync)", () => { + const myTest = java.newInstanceSync("Test"); + try { + myTest.methodThrowsNewExceptionSync(); + throw new Error("should throw"); + } catch (err) { + expect(err.toString()).toMatch(/my exception/); + } + }); + + test("methodThrowsNewException exception thrown from method", async () => { + const myTest = java.newInstanceSync("Test"); + await new Promise(resolve => { + myTest.methodThrowsNewException((err) => { + expect(err.toString()).toMatch(/my exception/); + resolve(); + }); + }); + }); + + test("char array", async () => { + const charArray = java.newArray("char", "hello world\n".split('')); + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethodCharArrayToString", charArray, function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result).toBe("hello world\n"); + resolve(); + }); + }); + }); + + test("String passed in for Object", async () => { + await new Promise(resolve => { + java.callStaticMethod("Test", "static2Objects", "1", "2", function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBe(false); + resolve(); + }); + }); + }); + + test("java.lang.Long addition", () => { + const javaLong = java.newInstanceSync("java.lang.Long", 5); + expect(javaLong.toString()).toBe('5'); + const result = javaLong + 1; + expect(result).toBe(6); + }); + + test("java.lang.Long calls (java Long)", async () => { + const javaLong = java.newInstanceSync("java.lang.Long", 5); + await new Promise(resolve => { + java.callStaticMethod("Test", "staticMethodLongToString", javaLong, function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result).toBe("5"); + resolve(); + }); + }); + }); + + test("Call method that returns a long", () => { + java.callStaticMethod("Test", "staticMethodReturnLong", function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result.longValue).toBe("9223372036854775807"); + }); + }); + + test("Call method with nested enum value", () => { + const Test = java.import("Test"); + Test.staticEnumToStringSync(Test.StaticEnum.Value1); + const str = Test.staticEnumToStringSync(Test.StaticEnum.Value1); // call it twice to ensure memo-ize is working + expect(str).toBe("Value1"); + }); + + test("Call static method with varargs", () => { + const Test = java.import("Test"); + + let str = Test.staticVarargsSync(5, java.newArray('java.lang.String', ['a', 'b', 'c'])); + expect(str).toBe("5abc"); + + str = Test.staticVarargsSync(5, 'a', 'b', 'c'); + expect(str).toBe("5abc"); + }); + + test("Call static method named name_", async () => { + await new Promise(resolve => { + const Test = java.import("Test"); + Test.name_((err) => { + expect(err).toBeFalsy(); + resolve(); + }); + }); + }); +}); diff --git a/test/java-newInstance-test.js b/test/java-newInstance-test.js deleted file mode 100644 index 393bafba..00000000 --- a/test/java-newInstance-test.js +++ /dev/null @@ -1,121 +0,0 @@ - -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Java - New Instance'] = nodeunit.testCase({ - "newInstance": function(test) { - java.newInstance("Test", function(err, result) { - test.ok(result); - test.equal(result.getClassSync().toStringSync(), "class Test"); - test.ok(result.getInt); - test.ok(result.getIntSync); - test.ok(!result.staticMethod); - test.ok(!result.staticMethodSync); - test.equal(result.nonstaticInt, 42); - test.done(); - }); - }, - - "newInstanceSync": function(test) { - var result = java.newInstanceSync("Test"); - test.ok(result); - test.equal(result.getClassSync().toStringSync(), "class Test"); - test.done(); - }, - - "newInstance with args": function(test) { - java.newInstance("Test", 42, function(err, result) { - test.ok(result); - test.equal(result.getIntSync(), 42); - test.done(); - }); - }, - - "newInstanceSync with args": function(test) { - var result = java.newInstanceSync("Test", 42); - test.ok(result); - test.equal(result.getIntSync(), 42); - test.done(); - }, - - "newInstance bad class name": function(test) { - java.newInstance("BadClassName", function(err, result) { - test.ok(err); - test.ok(!result); - test.done(); - }); - }, - - "newInstanceSync bad class name": function(test) { - test.throws(function() { - java.newInstanceSync("BadClassName"); - }); - test.done(); - }, - - "newInstance bad arg types": function(test) { - java.newInstance("Test", 'a', function(err, result) { - test.ok(err); - test.ok(!result); - test.done(); - }); - }, - - "newInstanceSync bad arg types": function(test) { - test.throws(function() { - java.newInstanceSync("Test", 'a'); - }); - test.done(); - }, - - "newInstance bad number of args": function(test) { - java.newInstance("Test", 42, 15, function(err, result) { - test.ok(err); - test.ok(!result); - test.done(); - }); - }, - - "newInstanceSync bad number of args": function(test) { - test.throws(function() { - java.newInstanceSync("Test", 42, 15); - }); - test.done(); - }, - - "newInstance exception thrown from constructor": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - java.newInstance("TestExceptions", ex, function(err, result) { - test.ok(err); - test.ok(err.toString().match(/my exception/)); - test.ok(!result); - test.done(); - }); - }, - - "newInstanceSync exception thrown from constructor": function(test) { - var ex = java.newInstanceSync("java.lang.Exception", "my exception"); - try { - java.newInstanceSync("TestExceptions", ex); - test.fail("should throw"); - } catch(err) { - test.ok(err.toString().match(/my exception/)); - } - test.done(); - }, - - "newInstanceSync with varargs": function(test) { - var result = java.newInstanceSync("Test", 42, java.newArray('java.lang.String', ["a", "b"])); - test.ok(result); - - result = java.newInstanceSync("Test", 42, "a"); - test.ok(result); - - result = java.newInstanceSync("Test", 42, "a", "b", "c"); - test.ok(result); - - test.done(); - } -}); diff --git a/test/java-newInstance.test.js b/test/java-newInstance.test.js new file mode 100644 index 00000000..2e7c4df3 --- /dev/null +++ b/test/java-newInstance.test.js @@ -0,0 +1,121 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Java - New Instance', () => { + test("newInstance", async () => { + await new Promise(resolve => { + java.newInstance("Test", (err, result) => { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result.getClassSync().toStringSync()).toBe("class Test"); + expect(result.getInt).toBeTruthy(); + expect(result.getIntSync).toBeTruthy(); + expect(result.staticMethod).toBeFalsy(); + expect(result.staticMethodSync).toBeFalsy(); + expect(result.nonstaticInt).toBe(42); + resolve(); + }); + }); + }); + + test("newInstanceSync", () => { + const result = java.newInstanceSync("Test"); + expect(result).toBeTruthy(); + expect(result.getClassSync().toStringSync()).toBe("class Test"); + }); + + test("newInstance with args", async () => { + await new Promise(resolve => { + java.newInstance("Test", 42, function (err, result) { + expect(err).toBeFalsy(); + expect(result).toBeTruthy(); + expect(result.getIntSync()).toBe(42); + resolve(); + }); + }) + }); + + test("newInstanceSync with args", () => { + const result = java.newInstanceSync("Test", 42); + expect(result).toBeTruthy(); + expect(result.getIntSync()).toBe(42); + }); + + test("newInstance bad class name", async () => { + await new Promise(resolve => { + java.newInstance("BadClassName", (err, result) => { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("newInstanceSync bad class name", () => { + expect(() => { + java.newInstanceSync("BadClassName"); + }).toThrow(); + }); + + test("newInstance bad arg types", async () => { + await new Promise(resolve => { + java.newInstance("Test", 'a', function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("newInstanceSync bad arg types", () => { + expect(() => { + java.newInstanceSync("Test", 'a'); + }).toThrow(); + }); + + test("newInstance bad number of args", async () => { + await new Promise(resolve => { + java.newInstance("Test", 42, 15, function (err, result) { + expect(err).toBeTruthy(); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("newInstanceSync bad number of args", () => { + expect(() => { + java.newInstanceSync("Test", 42, 15); + }).toThrow(); + }); + + test("newInstance exception thrown from constructor", async () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + await new Promise(resolve => { + java.newInstance("TestExceptions", ex, function (err, result) { + expect(err).toBeTruthy(); + expect(err.toString()).toMatch(/my exception/); + expect(result).toBeFalsy(); + resolve(); + }); + }); + }); + + test("newInstanceSync exception thrown from constructor", () => { + const ex = java.newInstanceSync("java.lang.Exception", "my exception"); + expect(() => java.newInstanceSync("TestExceptions", ex)).toThrowError(/my exception/); + }); + + test("newInstanceSync with varargs", () => { + let result = java.newInstanceSync("Test", 42, java.newArray('java.lang.String', ["a", "b"])); + expect(result).toBeTruthy(); + + result = java.newInstanceSync("Test", 42, "a"); + expect(result).toBeTruthy(); + + result = java.newInstanceSync("Test", 42, "a", "b", "c"); + expect(result).toBeTruthy(); + }); +}); diff --git a/test/java-staticField-test.js b/test/java-staticField-test.js deleted file mode 100644 index d3f4fad0..00000000 --- a/test/java-staticField-test.js +++ /dev/null @@ -1,45 +0,0 @@ - -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Java - Static Field'] = nodeunit.testCase({ - tearDown: function (callback) { - java.setStaticFieldValue("Test", "staticFieldInt", 42); - callback(); - }, - - "getStaticFieldValue int": function(test) { - var val = java.getStaticFieldValue("Test", "staticFieldInt"); - test.equal(val, 42); - test.done(); - }, - - "setStaticFieldValue int": function(test) { - java.setStaticFieldValue("Test", "staticFieldInt", 112); - var val = java.getStaticFieldValue("Test", "staticFieldInt"); - test.equal(val, 112); - test.done(); - }, - - "getStaticFieldValue double": function(test) { - var val = java.getStaticFieldValue("Test", "staticFieldDouble"); - test.equal(val, 42.5); - test.done(); - }, - - "setStaticFieldValue double": function(test) { - java.setStaticFieldValue("Test", "staticFieldDouble", 112.12); - var val = java.getStaticFieldValue("Test", "staticFieldDouble"); - test.equal(val, 112.12); - test.done(); - }, - - "setStaticFieldValue double (set int)": function(test) { - java.setStaticFieldValue("Test", "staticFieldDouble", 112); - var val = java.getStaticFieldValue("Test", "staticFieldDouble"); - test.equal(val, 112); - test.done(); - }, -}); diff --git a/test/java-staticField.test.js b/test/java-staticField.test.js new file mode 100644 index 00000000..1abe110f --- /dev/null +++ b/test/java-staticField.test.js @@ -0,0 +1,38 @@ +import { afterEach, describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Java - Static Field', () => { + afterEach(() => { + java.setStaticFieldValue("Test", "staticFieldInt", 42); + }); + + test("getStaticFieldValue int", () => { + const val = java.getStaticFieldValue("Test", "staticFieldInt"); + expect(val).toBe(42); + }); + + test("setStaticFieldValue int", () => { + java.setStaticFieldValue("Test", "staticFieldInt", 112); + const val = java.getStaticFieldValue("Test", "staticFieldInt"); + expect(val).toBe(112); + }); + + test("getStaticFieldValue double", () => { + const val = java.getStaticFieldValue("Test", "staticFieldDouble"); + expect(val).toBe(42.5); + }); + + test("setStaticFieldValue double", () => { + java.setStaticFieldValue("Test", "staticFieldDouble", 112.12); + const val = java.getStaticFieldValue("Test", "staticFieldDouble"); + expect(val).toBe(112.12); + }); + + test("setStaticFieldValue double (set int)", () => { + java.setStaticFieldValue("Test", "staticFieldDouble", 112); + const val = java.getStaticFieldValue("Test", "staticFieldDouble"); + expect(val).toBe(112); + }); +}); diff --git a/test/javaObject-test.js b/test/javaObject-test.js deleted file mode 100644 index c99ec95f..00000000 --- a/test/javaObject-test.js +++ /dev/null @@ -1,19 +0,0 @@ - -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Java Object'] = nodeunit.testCase({ - setUp: function(callback) { - this.testObj = java.newInstanceSync("Test"); - callback(); - }, - - "field": function(test) { - test.equal(this.testObj.nonstaticInt, 42); - this.testObj.nonstaticInt = 112; - test.equal(this.testObj.nonstaticInt, 112); - test.done(); - } -}); diff --git a/test/javaObject.test.js b/test/javaObject.test.js new file mode 100644 index 00000000..24ad054a --- /dev/null +++ b/test/javaObject.test.js @@ -0,0 +1,18 @@ +import { beforeEach, describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Java Object', () => { + let testObj; + + beforeEach(() => { + testObj = java.newInstanceSync("Test"); + }) + + test("field", () => { + expect(testObj.nonstaticInt).toBe(42); + testObj.nonstaticInt = 112; + expect(testObj.nonstaticInt).toBe(112); + }); +}); diff --git a/test/promises-test.js b/test/promises-test.js deleted file mode 100644 index 9bf82480..00000000 --- a/test/promises-test.js +++ /dev/null @@ -1,151 +0,0 @@ -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -function isOpenJDK() { - var javaVendor = java.callStaticMethodSync('java.lang.System', 'getProperty', 'java.vendor'); - var javaVersion = java.callStaticMethodSync('java.lang.System', 'getProperty', 'java.version'); - return /Sun Microsystems Inc/.test(javaVendor) && /^1\.6/.test(javaVersion); -} - -exports['Promises'] = nodeunit.testCase({ - "create an instance of a class and call methods (getClassPromise & getNamePromise)": function(test) { - // Adapted from a test in simple-test.js - java.newInstance("java.util.ArrayList", function(err, list) { - test.ifError(err); - test.ok(list); - list.getClassPromise() - .then(function(clazz) { - test.ok(clazz); - return clazz.getNamePromise(); - }) - .then(function(name) { - test.strictEqual(name, "java.util.ArrayList"); - }) - .catch(function(err) { - test.ifError(err); - }) - .then(function() { - test.expect(4); - test.done(); - }); - }); - }, - - "import and execute promisified static method": function (test) { - var Test = java.import('Test'); - Test.staticMethodPromise(99) - .then(function (result) { - test.strictEqual(100, result); - }) - .catch(function (err) { - test.ifError(err); - }) - .then(function() { - test.expect(1); - test.done(); - }); - }, - - "run promisified method of Java module (newInstancePromise)": function (test) { - java.newInstancePromise("java.util.ArrayList") - .then(function(list) { - test.ok(list); - return list.getClassPromise(); - }) - .then(function(clazz) { - test.ok(clazz); - return clazz.getNamePromise(); - }) - .then(function(name) { - test.strictEqual(name, "java.util.ArrayList"); - }) - .catch(function(err) { - test.ifError(err); - }) - .then(function() { - test.expect(3); - test.done(); - }); - }, - - "run chained promisified methods (of class java.util.ArrayList)": function (test) { - var openJDK = isOpenJDK(); - if (openJDK) { - // This test exposes a latent node-java bug with OpenJDK 1.6. - // See https://github.com/joeferner/node-java/issues/186 - // For now, we simply don't run this test on OpenJDK 1.6. - test.done(); - return; - } - var list; - var it; - var expectException = false; - java.newInstancePromise("java.util.ArrayList") - .then(function(_list) { - test.ok(_list); - list = _list; - return list.getClassPromise(); - }) - .then(function(clazz) { - test.ok(clazz); - return clazz.getNamePromise(); - }) - .then(function(name) { - test.strictEqual(name, "java.util.ArrayList"); - }) - .then(function() { - return list.addPromise('hello'); - }) - .then(function() { - return list.addPromise('world'); - }) - .then(function() { - return list.addPromise('boo'); - }) - .then(function() { - return list.iteratorPromise(); - }) - .then(function(_it) { - test.ok(_it); - it = _it; - return it.nextPromise(); - }) - .then(function(val) { - test.ok(val); - console.log(typeof val, val); - test.strictEqual(val, 'hello'); // java.lang.InternalError exception thrown here with OpenJDK - return it.nextPromise(); - }) - .then(function(val) { - test.ok(val); - console.log(typeof val, val); - test.strictEqual(val, 'world'); - return it.nextPromise(); - }) - .then(function(val) { - test.ok(val); - console.log(typeof val, val); - test.strictEqual(val, 'boo'); - return it.hasNextPromise(); - }) - .then(function(more) { - console.log(typeof more, more); - test.strictEqual(more, false); - expectException = true; - return it.nextPromise(); - }) - .catch(function(err) { - console.log("DEBUG: expectException is %s. err = %s", - expectException, err); - test.ok(expectException); - }) - .then(function() { - test.expect(12); - test.done(); - }); - } - -}); - diff --git a/test/promises.test.js b/test/promises.test.js new file mode 100644 index 00000000..ceebc43c --- /dev/null +++ b/test/promises.test.js @@ -0,0 +1,74 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Promises', () => { + test("create an instance of a class and call methods (getClassPromise & getNamePromise)", async () => { + // Adapted from a test in simple-test.js + const list = await java.newInstancePromise("java.util.ArrayList"); + expect(list).toBeTruthy(); + + const clazz = await list.getClassPromise(); + expect(clazz).toBeTruthy(); + + const name = await clazz.getNamePromise(); + expect(name).toBe("java.util.ArrayList"); + }); + + test("import and execute promisified static method", async () => { + var Test = java.import('Test'); + const result = await Test.staticMethodPromise(99); + expect(result).toBe(100); + }); + + test("run promisified method of Java module (newInstancePromise)", async () => { + const list = await java.newInstancePromise("java.util.ArrayList"); + expect(list).toBeTruthy(); + + const clazz = await list.getClassPromise(); + expect(clazz).toBeTruthy(); + + const name = await clazz.getNamePromise(); + expect(name).toBe("java.util.ArrayList"); + }); + + test("run chained promisified methods (of class java.util.ArrayList)", async () => { + const list = await java.newInstancePromise("java.util.ArrayList"); + expect(list).toBeTruthy(); + + const clazz = await list.getClassPromise(); + expect(clazz).toBeTruthy(); + + const name = await clazz.getNamePromise(); + expect(name).toBe("java.util.ArrayList"); + + await list.addPromise('hello'); + await list.addPromise('world'); + await list.addPromise('boo'); + const it = await list.iteratorPromise(); + expect(it).toBeTruthy(); + + let val = await it.nextPromise(); + expect(val).toBeTruthy(); + console.log(typeof val, val); + expect(val).toBe('hello'); // java.lang.InternalError exception thrown here with OpenJDK + + val = await it.nextPromise(); + expect(val).toBeTruthy(); + console.log(typeof val, val); + expect(val).toBe('world'); + + val = await it.nextPromise(); + expect(val).toBeTruthy(); + console.log(typeof val, val); + expect(val).toBe('boo'); + + const more = await it.hasNextPromise(); + console.log(typeof more, more); + expect(more).toBeFalsy(false); + + expect(async () => await it.nextPromise()).rejects.toThrowError(); + }); +}); + diff --git a/test/simple-test.js b/test/simple-test.js deleted file mode 100644 index bcf87a84..00000000 --- a/test/simple-test.js +++ /dev/null @@ -1,375 +0,0 @@ -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Simple'] = nodeunit.testCase({ - "test classpath commons lang": function(test) { - var result = java.callStaticMethodSync("org.apache.commons.lang3.ObjectUtils", "toString", "test"); - console.log("org.apache.commons.lang3.ObjectUtils.toString:", result); - test.equal(result, "test"); - test.done(); - }, - - "test adding to classpath after other calls are made": function(test) { - java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); - try { - console.log('classpath', java.classpath); - java.classpath = ["test/"]; - test.fail("Exception should be thrown"); - } catch (e) { - // ok - } - test.done(); - }, - - "test changing options after other calls are made": function(test) { - java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); - try { - console.log('options', java.options); - java.options = ["newoption"]; - test.fail("Exception should be thrown"); - } catch (e) { - // ok - } - test.done(); - }, - - "test changing nativeBindingLocation after other calls are made": function(test) { - java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); - try { - console.log('nativeBindingLocation', java.nativeBindingLocation); - java.nativeBindingLocation = "newNativeBindingLocation"; - test.fail("Exception should be thrown"); - } catch (e) { - // ok - } - test.done(); - }, - - "test static calls": function(test) { - var result = java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); - console.log("currentTimeMillis:", result); - test.ok(result); - test.done(); - }, - - "test static calls single argument": function(test) { - var result = java.callStaticMethodSync("java.lang.System", "getProperty", "os.version"); - console.log("os.version:", result); - test.ok(result); - test.done(); - }, - - "test method does not exists (sync)": function(test) { - test.throws( - function() { - java.callStaticMethodSync("java.lang.System", "badMethod"); - } - ); - test.done(); - }, - - "test method does not exists (async)": function(test) { - java.callStaticMethod("java.lang.System", "badMethod", function(err, result) { - if (err) { - test.done(); - return; - } - test.done(new Error("should throw exception")); - }); - }, - - "create an instance of a class and call methods (getName) (async)": function(test) { - java.newInstance("java.util.ArrayList", function(err, list) { - if (err) { - console.log(err); - return; - } - test.ok(list); - if (list) { - list.getClass(function(err, result) { - if (err) { - console.log(err); - return; - } - result.getName(function(err, result) { - if (err) { - console.log(err); - return; - } - test.equal(result, "java.util.ArrayList"); - test.done(); - }); - }); - } - }); - }, - - "create an instance of a class and call methods (getName) (sync)": function(test) { - var list = java.newInstanceSync("java.util.ArrayList"); - test.equal(list.sizeSync(), 0); - list.addSync("hello"); - list.addSync("world"); - test.equal(list.sizeSync(), 2); - var item0 = list.getSync(0); - test.equal(item0, "hello"); - var clazz = list.getClassSync(); - var result = clazz.getNameSync(); - test.equal(result, "java.util.ArrayList"); - test.done(); - }, - - "create an instance of a class and call methods (size) (async)": function(test) { - java.newInstance("java.util.ArrayList", function(err, list) { - if (err) { - console.log(err); - return; - } - test.ok(list); - if (list) { - list.size(function(err, result) { - if (err) { - console.log(err); - return; - } - test.equal(result, 0); - test.done(); - }); - } - }); - }, - - "passing objects to methods": function(test) { - var dataArray = "hello world\n".split('').map(function(c) { return java.newByte(c.charCodeAt(0)); }); - var data = java.newArray("byte", dataArray); - //console.log("data", data.toStringSync()); - var stream = java.newInstanceSync("java.io.ByteArrayInputStream", data); - //console.log("stream", stream); - var reader = java.newInstanceSync("java.io.InputStreamReader", stream); - //console.log("reader", reader); - var bufferedReader = java.newInstanceSync("java.io.BufferedReader", reader); - var str = bufferedReader.readLineSync(); - console.log("bufferedReader.readLineSync", str); - test.equal(str, "hello world"); - test.done(); - }, - - "method returning an array of ints sync": function(test) { - var arr = java.callStaticMethodSync("Test", "getArrayOfInts"); - console.log(arr); - test.done(); - }, - - "method returning an array of bytes sync": function(test) { - var arr = java.callStaticMethodSync("Test", "getArrayOfBytes"); - console.log(arr); - test.done(); - }, - - "method returning an array of bools sync": function(test) { - var arr = java.callStaticMethodSync("Test", "getArrayOfBools"); - console.log(arr); - test.done(); - }, - - "method returning an array of doubles sync": function(test) { - var arr = java.callStaticMethodSync("Test", "getArrayOfDoubles"); - console.log(arr); - test.done(); - }, - - "method returning an array of floats sync": function(test) { - var arr = java.callStaticMethodSync("Test", "getArrayOfFloats"); - console.log(arr); - test.done(); - }, - - "method returning an array of longs sync": function(test) { - var arr = java.callStaticMethodSync("Test", "getArrayOfLongs"); - arr = arr.map(function(l) { - return l.toStringSync(); - }); - console.log(arr); - test.done(); - }, - - "method returning a string (Unicode BMP)": function(test) { - var s = java.callStaticMethodSync("Test", "getUnicodeBMP"); - console.log(s); - test.equal("\u2605", s); - test.done(); - }, - - "method returning a string (Unicode SMP)": function(test) { - var s = java.callStaticMethodSync("Test", "getUnicodeSMP"); - console.log(s); - // The below string is U+1F596, represented as surrogate pairs - test.equal("\uD83D\uDD96", s); - test.done(); - }, - - "method returning a string (NULL char)": function(test) { - var s = java.callStaticMethodSync("Test", "getUnicodeNull"); - console.log(s); - test.equal("\0", s); - test.done(); - }, - - "method taking a byte": function(test) { - var b = java.newByte(1); - test.equal('java.lang.Byte', b.getClassSync().getNameSync()); - test.equal('1', b.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticByte", b); - console.log(r); - test.equal(r, 1); - test.done(); - }, - - "method taking a short": function(test) { - var s = java.newShort(1); - test.equal('java.lang.Short', s.getClassSync().getNameSync()); - test.equal('1', s.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticShort", s); - console.log(r); - test.equal(r, 1); - test.done(); - }, - - "method taking a double": function(test) { - var s = java.newDouble(3.14); - test.equal('java.lang.Double', s.getClassSync().getNameSync()); - test.equal('3.14', s.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticDouble", s); - console.log(r); - test.ok(Math.abs(r - 3.14) < 0.0001, r + " != 3.14"); - test.done(); - }, - - "method taking a float": function(test) { - var s = java.newFloat(3.14); - test.equal('java.lang.Float', s.getClassSync().getNameSync()); - test.equal('3.14', s.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticFloat", s); - console.log(r); - test.ok(Math.abs(r - 3.14) < 0.0001, r + " != 3.14"); - test.done(); - }, - - "method taking a long": function(test) { - var l = java.newLong(1); - test.equal('java.lang.Long', l.getClassSync().getNameSync()); - test.equal('1', l.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticLong", l); - console.log(r); - test.equal(r, 1); - test.done(); - }, - - "method taking a char (number)": function(test) { - var ch = java.newChar(97); // 'a' - test.equal('java.lang.Character', ch.getClassSync().getNameSync()); - test.equal('a', ch.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticChar", ch); - console.log(r); - test.equal(r, 97); - test.done(); - }, - - "method taking a char (string)": function(test) { - var ch = java.newChar('a'); - test.equal('java.lang.Character', ch.getClassSync().getNameSync()); - test.equal('a', ch.toStringSync()); - var r = java.callStaticMethodSync("Test", "staticChar", ch); - console.log(r); - test.equal(r, 97); - test.done(); - }, - - "method taking a string (Unicode BMP)": function(test) { - var s = "\u2605"; - var r = java.callStaticMethodSync("Test", "staticString", s); - console.log(r); - test.equal(r, s); - test.done(); - }, - - "method taking a string (Unicode SMP)": function(test) { - // The below string is U+1F596, represented as surrogate pairs - var s = "\uD83D\uDD96"; - var r = java.callStaticMethodSync("Test", "staticString", s); - console.log(r); - test.equal(r, s); - test.done(); - }, - - "method taking a string (with null char)": function(test) { - var s = "\0"; - var r = java.callStaticMethodSync("Test", "staticString", s); - console.log(r); - test.equal(r, s); - test.done(); - }, - - "new boolean array object": function(test) { - var booleanArray = java.newArray("java.lang.Boolean", [true, false]); - var r = java.callStaticMethodSync("Test", "staticBooleanArray", booleanArray); - test.equal(r.length, 2); - test.equal(r[0], true); - test.equal(r[1], false); - test.done(); - }, - "new byte array object": function(test) { - var byteArray = java.newArray("byte", [1, 2, 3]); - test.equal(byteArray.length, 3); - test.equal(byteArray[0], 1); - test.equal(byteArray[1], 2); - test.equal(byteArray[2], 3); - test.done(); - }, - "new boolean array": function(test) { - var booleanArray = java.newArray("boolean", [true, false]); - var r = java.callStaticMethodSync("Test", "staticBooleanArray", booleanArray); - test.equal(r.length, 2); - test.equal(r[0], true); - test.equal(r[1], false); - test.done(); - }, - - "new int array": function(test) { - var intArray = java.newArray("int", [1, 2]); - var r = java.callStaticMethodSync("Test", "staticIntArray", intArray); - test.equal(r.length, 2); - test.equal(r[0], 1); - test.equal(r[1], 2); - test.done(); - }, - - "new double array": function(test) { - var doubleArray = java.newArray("double", [1.2, 4]); - var r = java.callStaticMethodSync("Test", "staticDoubleArray", doubleArray); - test.equal(r.length, 2); - test.equal(r[0], 1.2); - test.equal(r[1], 4); - test.done(); - }, - - "new short array objects": function(test) { - var shortArray = java.newArray("java.lang.Short", [1, 2].map(function(c) { return java.newShort(c); })); - var r = java.callStaticMethodSync("Test", "staticShortArray", shortArray); - test.equal(r.length, 2); - test.equal(r[0], 1); - test.equal(r[1], 2); - test.done(); - }, - - "new short array": function(test) { - var shortArray = java.newArray("short", [1, 2]); - var r = java.callStaticMethodSync("Test", "staticShortArray", shortArray); - test.equal(r.length, 2); - test.equal(r[0], 1); - test.equal(r[1], 2); - test.done(); - } -}); - diff --git a/test/simple.test.js b/test/simple.test.js new file mode 100644 index 00000000..fc908ccb --- /dev/null +++ b/test/simple.test.js @@ -0,0 +1,338 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('Simple', () => { + test("test classpath commons lang", () => { + const result = java.callStaticMethodSync("org.apache.commons.lang3.ObjectUtils", "toString", "test"); + console.log("org.apache.commons.lang3.ObjectUtils.toString:", result); + expect(result).toBe("test"); + }); + + test("test adding to classpath after other calls are made", () => { + java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); + try { + console.log('classpath', java.classpath); + java.classpath = ["test/"]; + throw new Error("Exception should be thrown"); + } catch (e) { + // ok + } + }); + + test("test changing options after other calls are made", () => { + java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); + try { + console.log('options', java.options); + java.options = ["newoption"]; + throw new Error("Exception should be thrown"); + } catch (e) { + // ok + } + }); + + test("test changing nativeBindingLocation after other calls are made", () => { + java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); + try { + console.log('nativeBindingLocation', java.nativeBindingLocation); + java.nativeBindingLocation = "newNativeBindingLocation"; + throw new Error("Exception should be thrown"); + } catch (e) { + // ok + } + }); + + test("test static calls", () => { + const result = java.callStaticMethodSync("java.lang.System", "currentTimeMillis"); + console.log("currentTimeMillis:", result); + expect(result).toBeTruthy(); + }); + + test("test static calls single argument", () => { + const result = java.callStaticMethodSync("java.lang.System", "getProperty", "os.version"); + console.log("os.version:", result); + expect(result).toBeTruthy(); + }); + + test("test method does not exists (sync)", () => { + expect(() => { + java.callStaticMethodSync("java.lang.System", "badMethod"); + }).toThrow(); + }); + + test("test method does not exists (async)", () => { + java.callStaticMethod("java.lang.System", "badMethod", function (err, result) { + if (err) { + + return; + } + test.done(new Error("should throw exception")); + }); + }); + + test("create an instance of a class and call methods (getName) (async)", async () => { + await new Promise(resolve => { + java.newInstance("java.util.ArrayList", (err, list) => { + expect(err).toBeFalsy(); + expect(list).toBeTruthy(); + list.getClass((err, result) => { + expect(err).toBeFalsy(); + result.getName((err, result) => { + expect(err).toBeFalsy(); + expect(result).toBe("java.util.ArrayList"); + resolve(); + }); + }); + }); + }); + }); + + test("create an instance of a class and call methods (getName) (sync)", () => { + const list = java.newInstanceSync("java.util.ArrayList"); + expect(list.sizeSync()).toBe(0); + list.addSync("hello"); + list.addSync("world"); + expect(list.sizeSync()).toBe(2); + const item0 = list.getSync(0); + expect(item0).toBe("hello"); + const clazz = list.getClassSync(); + const result = clazz.getNameSync(); + expect(result).toBe("java.util.ArrayList"); + }); + + test("create an instance of a class and call methods (size) (async)", async () => { + await new Promise((resolve) => { + java.newInstance("java.util.ArrayList", (err, list) => { + expect(err).toBeFalsy(); + expect(list).toBeTruthy(); + list.size((err, result) => { + expect(err).toBeFalsy(); + expect(result).toBe(0); + resolve(); + }); + }); + }) + }); + + test("passing objects to methods", () => { + const dataArray = "hello world\n".split('').map(function (c) { return java.newByte(c.charCodeAt(0)); }); + const data = java.newArray("byte", dataArray); + const stream = java.newInstanceSync("java.io.ByteArrayInputStream", data); + const reader = java.newInstanceSync("java.io.InputStreamReader", stream); + const bufferedReader = java.newInstanceSync("java.io.BufferedReader", reader); + const str = bufferedReader.readLineSync(); + expect(str).toBe("hello world"); + }); + + test("method returning an array of ints sync", () => { + const arr = java.callStaticMethodSync("Test", "getArrayOfInts"); + expect(arr.length).toBe(5); + expect(arr[0]).toBe(1); + expect(arr[1]).toBe(2); + expect(arr[2]).toBe(3); + expect(arr[3]).toBe(4); + expect(arr[4]).toBe(5); + }); + + test("method returning an array of bytes sync", () => { + const arr = java.callStaticMethodSync("Test", "getArrayOfBytes"); + expect(arr.length).toBe(5); + expect(arr[0]).toBe(1); + expect(arr[1]).toBe(2); + expect(arr[2]).toBe(3); + expect(arr[3]).toBe(4); + expect(arr[4]).toBe(5); + }); + + test("method returning an array of bools sync", () => { + const arr = java.callStaticMethodSync("Test", "getArrayOfBools"); + expect(arr.length).toBe(5); + expect(arr[0]).toBe(true); + expect(arr[1]).toBe(true); + expect(arr[2]).toBe(false); + expect(arr[3]).toBe(true); + expect(arr[4]).toBe(false); + }); + + test("method returning an array of doubles sync", () => { + const arr = java.callStaticMethodSync("Test", "getArrayOfDoubles"); + expect(arr.length).toBe(5); + expect(arr[0]).toBe(1); + expect(arr[1]).toBe(2); + expect(arr[2]).toBe(3); + expect(arr[3]).toBe(4); + expect(arr[4]).toBe(5); + }); + + test("method returning an array of floats sync", () => { + const arr = java.callStaticMethodSync("Test", "getArrayOfFloats"); + expect(arr.length).toBe(5); + expect(arr[0]).toBe(1); + expect(arr[1]).toBe(2); + expect(arr[2]).toBe(3); + expect(arr[3]).toBe(4); + expect(arr[4]).toBe(5); + }); + + test("method returning an array of longs sync", () => { + let arr = java.callStaticMethodSync("Test", "getArrayOfLongs"); + arr = arr.map(function (l) { + return l.toStringSync(); + }); + expect(arr.length).toBe(5); + expect(arr[0]).toBe('9223372036854775807'); + expect(arr[1]).toBe('-9223372036854775808'); + expect(arr[2]).toBe('3'); + expect(arr[3]).toBe('4'); + expect(arr[4]).toBe('5'); + }); + + test("method returning a string (Unicode BMP)", () => { + const s = java.callStaticMethodSync("Test", "getUnicodeBMP"); + expect(s).toBe("\u2605"); + }); + + test("method returning a string (Unicode SMP)", () => { + const s = java.callStaticMethodSync("Test", "getUnicodeSMP"); + // The below string is U+1F596, represented as surrogate pairs + expect(s).toBe("\uD83D\uDD96"); + }); + + test("method returning a string (NULL char)", () => { + const s = java.callStaticMethodSync("Test", "getUnicodeNull"); + expect(s).toBe("\0"); + }); + + test("method taking a byte", () => { + const b = java.newByte(1); + expect(b.getClassSync().getNameSync()).toBe('java.lang.Byte'); + expect(b.toStringSync()).toBe('1'); + const r = java.callStaticMethodSync("Test", "staticByte", b); + expect(r).toBe(1); + }); + + test("method taking a short", () => { + const s = java.newShort(1); + expect(s.getClassSync().getNameSync()).toBe('java.lang.Short'); + expect(s.toStringSync()).toBe('1'); + const r = java.callStaticMethodSync("Test", "staticShort", s); + expect(r).toBe(1); + }); + + test("method taking a double", () => { + const s = java.newDouble(3.14); + expect(s.getClassSync().getNameSync()).toBe('java.lang.Double'); + expect(s.toStringSync()).toBe('3.14'); + const r = java.callStaticMethodSync("Test", "staticDouble", s); + expect(Math.abs(r - 3.14) < 0.0001, r + " != 3.14").toBeTruthy(); + }); + + test("method taking a float", () => { + const s = java.newFloat(3.14); + expect(s.getClassSync().getNameSync()).toBe('java.lang.Float'); + expect(s.toStringSync()).toBe('3.14'); + const r = java.callStaticMethodSync("Test", "staticFloat", s); + expect(Math.abs(r - 3.14) < 0.0001, r + " != 3.14").toBeTruthy(); + }); + + test("method taking a long", () => { + const l = java.newLong(1); + expect(l.getClassSync().getNameSync()).toBe('java.lang.Long'); + expect(l.toStringSync()).toBe('1'); + const r = java.callStaticMethodSync("Test", "staticLong", l); + expect(r).toBe(1); + }); + + test("method taking a char (number)", () => { + const ch = java.newChar(97); // 'a' + expect(ch.getClassSync().getNameSync()).toBe('java.lang.Character'); + expect(ch.toStringSync()).toBe('a'); + const r = java.callStaticMethodSync("Test", "staticChar", ch); + expect(r).toBe(97); + }); + + test("method taking a char (string)", () => { + const ch = java.newChar('a'); + expect(ch.getClassSync().getNameSync()).toBe('java.lang.Character'); + expect(ch.toStringSync()).toBe('a'); + const r = java.callStaticMethodSync("Test", "staticChar", ch); + expect(r).toBe(97); + }); + + test("method taking a string (Unicode BMP)", () => { + const s = "\u2605"; + const r = java.callStaticMethodSync("Test", "staticString", s); + expect(r).toBe(s); + }); + + test("method taking a string (Unicode SMP)", () => { + // The below string is U+1F596, represented as surrogate pairs + const s = "\uD83D\uDD96"; + const r = java.callStaticMethodSync("Test", "staticString", s); + expect(r).toBe(s); + }); + + test("method taking a string (with null char)", () => { + const s = "\0"; + const r = java.callStaticMethodSync("Test", "staticString", s); + expect(r).toBe(s); + }); + + test("new boolean array object", () => { + const booleanArray = java.newArray("java.lang.Boolean", [true, false]); + const r = java.callStaticMethodSync("Test", "staticBooleanArray", booleanArray); + expect(r.length).toBe(2); + expect(r[0]).toBe(true); + expect(r[1]).toBe(false); + }); + + test("new byte array object", () => { + const byteArray = java.newArray("byte", [1, 2, 3]); + expect(byteArray.length).toBe(3); + expect(byteArray[0]).toBe(1); + expect(byteArray[1]).toBe(2); + expect(byteArray[2]).toBe(3); + }); + + test("new boolean array", () => { + const booleanArray = java.newArray("boolean", [true, false]); + const r = java.callStaticMethodSync("Test", "staticBooleanArray", booleanArray); + expect(r.length).toBe(2); + expect(r[0]).toBe(true); + expect(r[1]).toBe(false); + }); + + test("new int array", () => { + const intArray = java.newArray("int", [1, 2]); + const r = java.callStaticMethodSync("Test", "staticIntArray", intArray); + expect(r.length).toBe(2); + expect(r[0]).toBe(1); + expect(r[1]).toBe(2); + }); + + test("new double array", () => { + const doubleArray = java.newArray("double", [1.2, 4]); + const r = java.callStaticMethodSync("Test", "staticDoubleArray", doubleArray); + expect(r.length).toBe(2); + expect(r[0]).toBe(1.2); + expect(r[1]).toBe(4); + }); + + test("new short array objects", () => { + const shortArray = java.newArray("java.lang.Short", [1, 2].map(function (c) { return java.newShort(c); })); + const r = java.callStaticMethodSync("Test", "staticShortArray", shortArray); + expect(r.length).toBe(2); + expect(r[0]).toBe(1); + expect(r[1]).toBe(2); + }); + + test("new short array", () => { + const shortArray = java.newArray("short", [1, 2]); + const r = java.callStaticMethodSync("Test", "staticShortArray", shortArray); + expect(r.length).toBe(2); + expect(r[0]).toBe(1); + expect(r[1]).toBe(2); + }); +}); + diff --git a/test/utils-types-test.js b/test/utils-types-test.js deleted file mode 100644 index 327e7d3e..00000000 --- a/test/utils-types-test.js +++ /dev/null @@ -1,70 +0,0 @@ - -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Utils - Types'] = nodeunit.testCase({ - "Array of Objects": function(test) { - var val = java.getStaticFieldValue("Test", "staticArrayObjects"); - test.equal(null, val); - - java.setStaticFieldValue("Test", "staticArrayObjects", java.newArray("Test", [ - java.newInstanceSync("Test", 1), - java.newInstanceSync("Test", 2), - java.newInstanceSync("Test", 3) - ])); - - val = java.getStaticFieldValue("Test", "staticArrayObjects"); - test.ok(val); - test.equal(val.length, 3); - test.equal(val[0].getIntSync(), 1); - test.equal(val[1].getIntSync(), 2); - test.equal(val[2].getIntSync(), 3); - test.done(); - }, - - "Static Method Overload": function(test) { - var result = java.callStaticMethodSync("Test", "staticMethodOverload", "a"); - test.equal(result, 1); - result = java.callStaticMethodSync("Test", "staticMethodOverload", 1); - test.equal(result, 2); - result = java.callStaticMethodSync("Test", "staticMethodOverload", java.newInstanceSync("Test$SuperClass")); - test.equal(result, 3); - result = java.callStaticMethodSync("Test", "staticMethodOverload", java.newInstanceSync("Test$SubClass")); - test.equal(result, 4); - test.done(); - }, - - "Method Overload": function(test) { - var testObj = java.newInstanceSync("Test"); - var result = testObj.methodOverloadSync("a"); - test.equal(result, 1); - result = testObj.methodOverloadSync(1); - test.equal(result, 2); - result = testObj.methodOverloadSync(java.newInstanceSync("Test$SuperClass")); - test.equal(result, 3); - result = testObj.methodOverloadSync(java.newInstanceSync("Test$SubClass")); - test.equal(result, 4); - test.done(); - }, - - "Char array": function(test) { - var originalArray = "hello 世界\n".split(''); - var Arrays = java.import("java.util.Arrays"); - var arr1 = java.newArray("char", originalArray); - var list = Arrays.asListSync(arr1); - var arr2 = list.toArraySync(); - test.equal(arr2.length, 1); - test.equal(arr2[0].length, 9); - var isTypedArrayReturn = !(typeof arr2[0][0] === 'string'); - for(var i=0; i { + test("Array of Objects", () => { + let val = java.getStaticFieldValue("Test", "staticArrayObjects"); + expect(val).toBeNull(); + + java.setStaticFieldValue("Test", "staticArrayObjects", java.newArray("Test", [ + java.newInstanceSync("Test", 1), + java.newInstanceSync("Test", 2), + java.newInstanceSync("Test", 3) + ])); + + val = java.getStaticFieldValue("Test", "staticArrayObjects"); + expect(val).toBeTruthy(); + expect(val.length).toBe(3); + expect(val[0].getIntSync()).toBe(1); + expect(val[1].getIntSync()).toBe(2); + expect(val[2].getIntSync()).toBe(3); + }); + + test("Static Method Overload", () => { + let result = java.callStaticMethodSync("Test", "staticMethodOverload", "a"); + expect(result).toBe(1); + result = java.callStaticMethodSync("Test", "staticMethodOverload", 1); + expect(result).toBe(2); + result = java.callStaticMethodSync("Test", "staticMethodOverload", java.newInstanceSync("Test$SuperClass")); + expect(result).toBe(3); + result = java.callStaticMethodSync("Test", "staticMethodOverload", java.newInstanceSync("Test$SubClass")); + expect(result).toBe(4); + }); + + test("Method Overload", () => { + const testObj = java.newInstanceSync("Test"); + let result = testObj.methodOverloadSync("a"); + expect(result).toBe(1); + result = testObj.methodOverloadSync(1); + expect(result).toBe(2); + result = testObj.methodOverloadSync(java.newInstanceSync("Test$SuperClass")); + expect(result).toBe(3); + result = testObj.methodOverloadSync(java.newInstanceSync("Test$SubClass")); + expect(result).toBe(4); + }); + + test("Char array", () => { + const originalArray = "hello 世界\n".split(''); + const Arrays = java.import("java.util.Arrays"); + const arr1 = java.newArray("char", originalArray); + const list = Arrays.asListSync(arr1); + const arr2 = list.toArraySync(); + expect(arr2.length).toBe(1); + expect(arr2[0].length).toBe(9); + const isTypedArrayReturn = !(typeof arr2[0][0] === 'string'); + for (let i = 0; i < originalArray.length; i++) { + if (isTypedArrayReturn) { + expect(arr2[0][i]).toBe(originalArray[i].charCodeAt(0)); + } else { + expect(arr2[0][i]).toBe(originalArray[i]); + } + } + }); +}); diff --git a/test/varargs-test.js b/test/varargs-test.js deleted file mode 100644 index 3db1776c..00000000 --- a/test/varargs-test.js +++ /dev/null @@ -1,109 +0,0 @@ -'use strict'; - -var java = require('../testHelpers').java; - -var nodeunit = require('nodeunit'); -var util = require('util'); - -exports['varargs'] = nodeunit.testCase({ - - 'array signature inferrence': function(test) { - test.expect(9); - var Test = java.import('Test'); - test.strictEqual(Test.varArgsSignatureSync([]), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync(['a', 'b']), 'String...'); - test.strictEqual(Test.varArgsSignatureSync([1, 2]), 'Integer...'); - test.strictEqual(Test.varArgsSignatureSync([1.1, 2]), 'Number...'); - test.strictEqual(Test.varArgsSignatureSync([1.1, 'a']), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync([true, 'a']), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync([true, 1]), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync([true, 1.1]), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync([true, false]), 'Boolean...'); - test.done(); - }, - - 'variadic signature inferrence': function(test) { - test.expect(9); - var Test = java.import('Test'); - test.strictEqual(Test.varArgsSignatureSync(), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync('a', 'b'), 'String...'); - test.strictEqual(Test.varArgsSignatureSync(1, 2), 'Integer...'); - test.strictEqual(Test.varArgsSignatureSync(1.1, 2), 'Number...'); - test.strictEqual(Test.varArgsSignatureSync(1.1, 'a'), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync(true, 'a'), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync(true, 1), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync(true, 1.1), 'Object...'); - test.strictEqual(Test.varArgsSignatureSync(true, false), 'Boolean...'); - test.done(); - }, - - 'variadic no args': function(test) { - test.expect(1); - var String = java.import('java.lang.String'); - test.strictEqual(String.formatSync('nothing'), 'nothing'); - test.done(); - }, - - 'variadic one args': function(test) { - test.expect(1); - var String = java.import('java.lang.String'); - test.strictEqual(String.formatSync('%s', 'hello'), 'hello'); - test.done(); - }, - - 'variadic two args': function(test) { - test.expect(1); - var String = java.import('java.lang.String'); - test.strictEqual(String.formatSync('%s--%s', 'hello', 'world'), 'hello--world'); - test.done(); - }, - - 'newArray(Object) no args passed': function(test) { - test.expect(1); - var String = java.import('java.lang.String'); - test.strictEqual(String.formatSync('nothing', java.newArray('java.lang.Object', [])), 'nothing'); - test.done(); - }, - - 'newArray(Object) one args': function(test) { - test.expect(1); - var String = java.import('java.lang.String'); - test.strictEqual(String.formatSync('%s', java.newArray('java.lang.Object', ['hello'])), 'hello'); - test.done(); - }, - - 'newArray(Object) two args': function(test) { - test.expect(1); - var String = java.import('java.lang.String'); - test.strictEqual(String.formatSync('%s--%s', java.newArray('java.lang.Object', ['hello', 'world'])), 'hello--world'); - test.done(); - }, - - 'Call static method with variadic varargs': function(test) { - test.expect(4); - var Test = java.import('Test'); - test.equal(Test.staticVarargsSync(5), '5'); - test.equal(Test.staticVarargsSync(5, 'a'), '5a'); - test.equal(Test.staticVarargsSync(5, 'a', 'b'), '5ab'); - test.equal(Test.staticVarargsSync(5, 'a', 'b', 'c'), '5abc'); - test.done(); - }, - - 'Call static varargs method with plain array': function(test) { - test.expect(3); - var Test = java.import('Test'); - test.equal(Test.staticVarargsSync(5, ['a']), '5a'); - test.equal(Test.staticVarargsSync(5, ['a', 'b']), '5ab'); - test.equal(Test.staticVarargsSync(5, ['a', 'b', 'c']), '5abc'); - test.done(); - }, - - 'Call static varags method with newArray': function(test) { - test.expect(2); - var Test = java.import('Test'); - test.equal(Test.staticVarargsSync(5, java.newArray('java.lang.String', ['a'])), '5a'); - test.equal(Test.staticVarargsSync(5, java.newArray('java.lang.String', ['a', 'b', 'c'])), '5abc'); - test.done(); - } - -}); diff --git a/test/varargs.test.js b/test/varargs.test.js new file mode 100644 index 00000000..a7f69e70 --- /dev/null +++ b/test/varargs.test.js @@ -0,0 +1,83 @@ +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava(); + +describe('varargs', () => { + test('array signature inference', () => { + const Test = java.import('Test'); + expect(Test.varArgsSignatureSync([])).toBe('Object...'); + expect(Test.varArgsSignatureSync(['a', 'b'])).toBe('String...'); + expect(Test.varArgsSignatureSync([1, 2])).toBe('Integer...'); + expect(Test.varArgsSignatureSync([1.1, 2])).toBe('Number...'); + expect(Test.varArgsSignatureSync([1.1, 'a'])).toBe('Object...'); + expect(Test.varArgsSignatureSync([true, 'a'])).toBe('Object...'); + expect(Test.varArgsSignatureSync([true, 1])).toBe('Object...'); + expect(Test.varArgsSignatureSync([true, 1.1])).toBe('Object...'); + expect(Test.varArgsSignatureSync([true, false])).toBe('Boolean...'); + }); + + test('variadic signature inference', () => { + const Test = java.import('Test'); + expect(Test.varArgsSignatureSync()).toBe('Object...'); + expect(Test.varArgsSignatureSync('a', 'b')).toBe('String...'); + expect(Test.varArgsSignatureSync(1, 2)).toBe('Integer...'); + expect(Test.varArgsSignatureSync(1.1, 2)).toBe('Number...'); + expect(Test.varArgsSignatureSync(1.1, 'a')).toBe('Object...'); + expect(Test.varArgsSignatureSync(true, 'a')).toBe('Object...'); + expect(Test.varArgsSignatureSync(true, 1)).toBe('Object...'); + expect(Test.varArgsSignatureSync(true, 1.1)).toBe('Object...'); + expect(Test.varArgsSignatureSync(true, false)).toBe('Boolean...'); + }); + + test('variadic no args', () => { + const String = java.import('java.lang.String'); + expect(String.formatSync('nothing')).toBe('nothing'); + }); + + test('variadic one args', () => { + const String = java.import('java.lang.String'); + expect(String.formatSync('%s', 'hello')).toBe('hello'); + }); + + test('variadic two args', () => { + const String = java.import('java.lang.String'); + expect(String.formatSync('%s--%s', 'hello', 'world')).toBe('hello--world'); + }); + + test('newArray(Object) no args passed', () => { + const String = java.import('java.lang.String'); + expect(String.formatSync('nothing', java.newArray('java.lang.Object', []))).toBe('nothing'); + }); + + test('newArray(Object) one args', () => { + const String = java.import('java.lang.String'); + expect(String.formatSync('%s', java.newArray('java.lang.Object', ['hello']))).toBe('hello'); + }); + + test('newArray(Object) two args', () => { + const String = java.import('java.lang.String'); + expect(String.formatSync('%s--%s', java.newArray('java.lang.Object', ['hello', 'world']))).toBe('hello--world'); + }); + + test('Call static method with variadic varargs', () => { + const Test = java.import('Test'); + expect(Test.staticVarargsSync(5)).toBe('5'); + expect(Test.staticVarargsSync(5, 'a')).toBe('5a'); + expect(Test.staticVarargsSync(5, 'a', 'b')).toBe('5ab'); + expect(Test.staticVarargsSync(5, 'a', 'b', 'c')).toBe('5abc'); + }); + + test('Call static varargs method with plain array', () => { + const Test = java.import('Test'); + expect(Test.staticVarargsSync(5, ['a'])).toBe('5a'); + expect(Test.staticVarargsSync(5, ['a', 'b'])).toBe('5ab'); + expect(Test.staticVarargsSync(5, ['a', 'b', 'c'])).toBe('5abc'); + }); + + test('Call static varags method with newArray', () => { + const Test = java.import('Test'); + expect(Test.staticVarargsSync(5, java.newArray('java.lang.String', ['a']))).toBe('5a'); + expect(Test.staticVarargsSync(5, java.newArray('java.lang.String', ['a', 'b', 'c']))).toBe('5abc'); + }); +}); diff --git a/test8/testLambda.js b/test8/testLambda.js deleted file mode 100644 index 994ad026..00000000 --- a/test8/testLambda.js +++ /dev/null @@ -1,27 +0,0 @@ -var java = require("../testHelpers").java; - -var nodeunit = require("nodeunit"); -var util = require("util"); - -exports['Java8'] = nodeunit.testCase({ - "call methods of a class that uses lambda expressions": function(test) { - try { - var TestLambda = java.import('TestLambda'); - var lambda = new TestLambda(); - var sum = lambda.testLambdaAdditionSync(23, 42); - test.equal(sum, 65); - var diff = lambda.testLambdaSubtractionSync(23, 42); - test.equal(diff, -19); - } - catch (err) { - var unsupportedVersion = java.instanceOf(err.cause, 'java.lang.UnsupportedClassVersionError'); - test.ok(unsupportedVersion); - if (unsupportedVersion) - console.log('JRE 1.8 not available'); - else - console.error('Java8 test failed with unknown error:', err); - } - test.done(); - } -}); - diff --git a/testAsyncOptions/allThreeSuffix.test.js b/testAsyncOptions/allThreeSuffix.test.js new file mode 100644 index 00000000..6a0dd13b --- /dev/null +++ b/testAsyncOptions/allThreeSuffix.test.js @@ -0,0 +1,86 @@ +// All three variants have non-empty suffix, i.e a suffix is required for any variant. + +import { getJava } from "../testHelpers"; +import { describe, test, expect } from "vitest"; + +const java = getJava({ + syncSuffix: "Sync", + asyncSuffix: "Async", + promiseSuffix: 'Promise', + promisify: require('when/node').lift // https://github.com/cujojs/when +}); + +describe('allThreeSuffix', () => { + test('api', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeDefined(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addAsync !== 'undefined', 'Expected `addAsync` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addPromise !== 'undefined', 'Expected `addPromise` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.add === 'undefined', 'Expected `add` to NOT be present, but it is.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + const ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + const arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.sizeSync()).toBe(0); + }); + + test('staticAPI', () => { + const String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + const api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatPromise'), 'Expected `formatPromise` to be present, but it is NOT.').toBeTruthy(); + expect(!api.includes('format'), 'Expected `format` to NOT be present, but it is.').toBeTruthy(); + expect(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeTruthy(); + }); + + test('syncCalls', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.addSync("hello"); + arrayList.addSync("world"); + expect(arrayList.sizeSync()).toBe(2); + }); + + test('staticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + const String = java.import("java.lang.String"); + expect(String.formatSync('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('asyncCalls', async () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + await new Promise(resolve => { + arrayList.addAsync("hello", function (err, result) { + expect(err).toBeUndefined(); + arrayList.addAsync("world", function (err, result) { + expect(err).toBeUndefined(); + arrayList.sizeAsync(function (err, size) { + expect(err).toBeUndefined(); + expect(size).toBe(2); + resolve(); + }); + }); + }); + }); + }); + + test('promiseCalls', async () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + await arrayList.addPromise("hello") + .then(() => { return arrayList.addPromise("world"); }) + .then(() => { return arrayList.sizePromise(); }) + .then((size) => { + expect(size).toBe(2); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/asyncSuffixSyncDefault.test.js b/testAsyncOptions/asyncSuffixSyncDefault.test.js new file mode 100644 index 00000000..67e8d240 --- /dev/null +++ b/testAsyncOptions/asyncSuffixSyncDefault.test.js @@ -0,0 +1,131 @@ +// Use "Async" for the asyncSuffix, and "" for the syncSuffix. + +import { beforeAll, describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('asyncSuffixSyncDefault', () => { + beforeAll(async () => { + await new Promise(resolve => { + java.asyncOptions = { + syncSuffix: "", + asyncSuffix: "Async", + ifReadOnlySuffix: "_alt" + }; + + function before(callback) { + java.classpath.push('test/'); + expect(java.isJvmCreated()).toBeFalsy(); + callback(); + } + + function after(callback) { + expect(java.isJvmCreated()).toBeTruthy(); + callback(); + } + + java.registerClient(before, after); + + java.ensureJvm(function (err) { + expect(err).toBeNull(); + expect(java.isJvmCreated()).toBeTruthy(); + resolve(); + }); + }); + }); + + test('api', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeTruthy(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(typeof arrayList.addAsync !== 'undefined', 'Expected `addAsync` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addPromise === 'undefined', 'Expected `addPromise` to NOT be present, but it is.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + const ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + const arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.size()).toBe(0); + }); + + test('staticAPI', () => { + const String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + const api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('format'), 'Expected `format` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to be present, but it is NOT.').toBeTruthy(); + expect(!api.includes('formatSync'), 'Expected `formatSync` to NOT be present, but it is.').toBeTruthy(); + expect(!api.includes('formatPromise'), 'Expected `formatPromise` to NOT be present, but it is.').toBeTruthy(); + expect(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeTruthy(); + }); + + test('syncCalls', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.add("hello"); + arrayList.add("world"); + expect(arrayList.size()).toBe(2); + }); + + test('staticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + const String = java.import("java.lang.String"); + expect(String.format('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('asyncCalls', async () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + await new Promise(resolve => { + arrayList.addAsync("hello", function (err, result) { + expect(err).toBeUndefined(); + arrayList.addAsync("world", function (err, result) { + expect(err).toBeUndefined(); + arrayList.sizeAsync(function (err, size) { + expect(err).toBeUndefined(); + expect(size).toBe(2); + resolve(); + }); + }); + }); + }); + }); + + // See testUnusableMethodName.js for the purpose of these last two tests. + // In that test, Test.name_alt() is an async method. + // In this test, it is a sync method. + test('unusableMethodNameThrows', () => { + const Test = java.import("Test"); + expect(Test).toBeTruthy(); + expect(() => Test.name()).toThrowError(TypeError); + }); + + test('alternateMethodNameWorks', () => { + const Test = java.import("Test"); + expect(Test).toBeTruthy(); + expect(Test.name_alt()).toBe("name"); + expect(Test.caller_alt()).toBe("caller"); + expect(Test.arguments_alt()).toBe("arguments"); + }); + + test('reservedFieldName', () => { + const TestEnum = java.import("Test$Enum"); + expect(TestEnum).toBeTruthy(); + + // 'foo' and 'bar' are valid enum names + expect(TestEnum.foo.toString()).toBe("foo"); + expect(TestEnum.bar.toString()).toBe("bar"); + + // TestEnum.name is actually the name of the proxy constructor function. + expect(TestEnum.name).toBe("javaClassConstructorProxy"); + + // Instead we need to access TestEnum.name_alt + expect(TestEnum.name_alt.toString()).toBe("name"); + expect(TestEnum.caller_alt.toString()).toBe("caller"); + expect(TestEnum.arguments_alt.toString()).toBe("arguments"); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/clientBeforeError.test.js b/testAsyncOptions/clientBeforeError.test.js new file mode 100644 index 00000000..24b165fc --- /dev/null +++ b/testAsyncOptions/clientBeforeError.test.js @@ -0,0 +1,29 @@ +import { describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('clientBeforeError', () => { + test('clientBeforeError', async () => { + await new Promise(resolve => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + }; + + function before(callback) { + expect(java.isJvmCreated()).toBeFalsy(); + callback(new Error('dummy error')); + } + + java.registerClient(before); + + java.ensureJvm(function (err) { + expect(err && typeof err === 'object').toBeTruthy(); + expect(err).toBeInstanceOf(Error); + expect(err.message).toBe('dummy error'); + expect(java.isJvmCreated()).toBeFalsy(); + resolve(); + }); + }); + }); +}); diff --git a/testAsyncOptions/clientBeforeSyncThrows.test.js b/testAsyncOptions/clientBeforeSyncThrows.test.js new file mode 100644 index 00000000..43fa4277 --- /dev/null +++ b/testAsyncOptions/clientBeforeSyncThrows.test.js @@ -0,0 +1,29 @@ +import { describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('clientBeforeSyncThrows', () => { + test('clientBeforeSyncThrows', async () => { + await new Promise(resolve => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + }; + + function before() { + expect(java.isJvmCreated()).toBeFalsy(); + throw new Error('dummy error'); + } + + java.registerClient(before); + + java.ensureJvm(function (err) { + expect(err && typeof err === 'object').toBeTruthy(); + expect(err).instanceOf(Error); + expect(err.message).toBe('dummy error'); + expect(java.isJvmCreated()).toBeFalsy(); + resolve(); + }); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/clientBeforeThrows.test.js b/testAsyncOptions/clientBeforeThrows.test.js new file mode 100644 index 00000000..9072cb67 --- /dev/null +++ b/testAsyncOptions/clientBeforeThrows.test.js @@ -0,0 +1,29 @@ +import { describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('clientBeforeThrows', () => { + test('clientBeforeThrows', async () => { + await new Promise(resolve => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + }; + + function before(callback) { + expect(java.isJvmCreated()).toBeFalsy(); + throw new Error('dummy error'); + } + + java.registerClient(before); + + java.ensureJvm(function (err) { + expect(err && typeof err === 'object').toBeTruthy(); + expect(err).instanceOf(Error); + expect(err.message).toBe('dummy error'); + expect(java.isJvmCreated()).toBeFalsy(); + resolve(); + }); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/clientPBeforeError.test.js b/testAsyncOptions/clientPBeforeError.test.js new file mode 100644 index 00000000..ee5037c2 --- /dev/null +++ b/testAsyncOptions/clientPBeforeError.test.js @@ -0,0 +1,40 @@ +import { describe, expect, test } from "vitest"; +import when from 'when'; +import { java } from "../testHelpers"; + +describe('clientPBeforeError', () => { + test('clientPBeforeError', async () => { + await new Promise((resolve) => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + promiseSuffix: 'Promise', + promisify: require('when/node').lift // https://github.com/cujojs/when + }; + + function beforeP() { + var promise = when.promise((_resolve, reject) => { + expect(java.isJvmCreated()).toBeFalsy(); + reject(new Error('dummy error')); + }); + return promise; + } + + java.registerClientP(beforeP); + + java.ensureJvm().done( + () => { + throw new Error('expect error'); + }, + (err) => { + expect(err && typeof err === 'object').toBeTruthy(); + expect(err).instanceOf(Error); + expect(err.message).toBe('dummy error'); + expect(java.isJvmCreated()).toBeFalsy(); + resolve(); + } + ); + }); + }); +}); diff --git a/testAsyncOptions/clientPBeforeThrows.test.js b/testAsyncOptions/clientPBeforeThrows.test.js new file mode 100644 index 00000000..d731cde1 --- /dev/null +++ b/testAsyncOptions/clientPBeforeThrows.test.js @@ -0,0 +1,40 @@ +import { describe, expect, test } from "vitest"; +import when from 'when'; +import { java } from "../testHelpers"; + +describe('clientPBeforeThrows', () => { + test('clientPBeforeThrows', async () => { + await new Promise(resolve => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + promiseSuffix: 'Promise', + promisify: require('when/node').lift // https://github.com/cujojs/when + }; + + function beforeP() { + var promise = when.promise(function (resolve, reject) { + expect(java.isJvmCreated()).toBeFalsy(); + throw new Error('dummy error'); + }); + return promise; + } + + java.registerClientP(beforeP); + + java.ensureJvm().done( + () => { + throw new Error('expected error'); + }, + (err) => { + expect(err && typeof err === 'object').toBeTruthy(); + expect(err).instanceOf(Error); + expect(err.message).toBe('dummy error'); + expect(java.isJvmCreated()).toBeFalsy(); + resolve(); + } + ); + }); + }); +}); diff --git a/testAsyncOptions/defacto.test.js b/testAsyncOptions/defacto.test.js new file mode 100644 index 00000000..5364bb69 --- /dev/null +++ b/testAsyncOptions/defacto.test.js @@ -0,0 +1,104 @@ +// In the defacto case, the developer sets asyncOptions, but specifies the defacto standard behavior. + +import { beforeAll, describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('defacto', () => { + beforeAll(async () => { + await new Promise(resolve => { + const api = Object.keys(java).filter((key) => typeof java[key] === 'function'); + expect(api.includes('isJvmCreated'), 'Expected `isJvmCreated` to be present, but it is NOT.').toBeTruthy(); + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + asyncSuffix: "" + }; + + function before() { + expect(java.isJvmCreated()).toBeFalsy(); + } + + function after() { + expect(java.isJvmCreated()).toBeTruthy(); + } + + java.registerClient(before, after); + java.registerClient(undefined, after); + java.registerClient(before, undefined); + + java.ensureJvm(function (err) { + expect(err).toBeFalsy(); + expect(java.isJvmCreated()).toBeTruthy(); + + // Verify that ensureJvm is idempotent + java.ensureJvm(function (err) { + expect(err).toBeFalsy(); + resolve(); + }); + }); + }); + }); + + test('api', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeTruthy(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addPromise === 'undefined', 'Expected `addPromise` to NOT be present, but it is.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + const ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + const arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.sizeSync()).toBe(0); + }); + + test('staticAPI', () => { + const String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + const api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('format'), 'Expected `format` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatPromise'), 'Expected `formatPromise` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeFalsy(); + }); + + test('syncCalls', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.addSync("hello"); + arrayList.addSync("world"); + expect(arrayList.sizeSync()).toBe(2); + }); + + test('staticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + const String = java.import("java.lang.String"); + expect(String.formatSync('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('asyncCalls', async () => { + await new Promise(resolve => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.add("hello", function (err, result) { + expect(err).toBeFalsy(); + arrayList.add("world", function (err, result) { + expect(err).toBeFalsy(); + arrayList.size(function (err, size) { + expect(err).toBeFalsy(); + expect(size).toBe(2); + resolve(); + }); + }); + }); + }); + }); +}); diff --git a/testAsyncOptions/defactoPlusPromise.test.js b/testAsyncOptions/defactoPlusPromise.test.js new file mode 100644 index 00000000..4da19c40 --- /dev/null +++ b/testAsyncOptions/defactoPlusPromise.test.js @@ -0,0 +1,115 @@ +// The defacto case but with promises also enabled. + +import { beforeAll, describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('defactoPlusPromise', () => { + beforeAll(async () => { + await new Promise(resolve => { + const api = Object.keys(java).filter((key) => typeof java[key] === 'function'); + expect(api.includes('isJvmCreated'), 'Expected `isJvmCreated` to be present, but it is NOT.').toBeTruthy(); + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + asyncSuffix: "", + promiseSuffix: 'Promise', + promisify: require('when/node').lift // https://github.com/cujojs/when + }; + + function before(callback) { + expect(java.isJvmCreated()).toBeFalsy(); + callback(); + } + + function after(callback) { + expect(java.isJvmCreated()).toBeTruthy(); + callback(); + } + + java.registerClient(before, after); + java.registerClient(null, after); + java.registerClient(before); + + java.ensureJvm().done(function () { + expect(java.isJvmCreated()).toBeTruthy(); + resolve(); + }); + }); + }); + + test('api', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeTruthy(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.').toBeTruthy(); + expect(arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.').toBeTruthy(); + expect(arrayList.addPromise !== 'undefined', 'Expected `addPromise` to be present, but it is NOT.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + const ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + const arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.sizeSync()).toBe(0); + }); + + test('staticAPI', () => { + const String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + const api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('format'), 'Expected `format` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatPromise'), 'Expected `formatPromise` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeFalsy(); + }); + + test('syncCalls', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.addSync("hello"); + arrayList.addSync("world"); + expect(arrayList.sizeSync()).toBe(2); + }); + + test('staticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + const String = java.import("java.lang.String"); + expect(String.formatSync('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('asyncCalls', async () => { + await new Promise(resolve => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.add("hello", function (err, result) { + expect(err).toBeFalsy(); + arrayList.add("world", function (err, result) { + expect(err).toBeFalsy(); + arrayList.size(function (err, size) { + expect(err).toBeFalsy(); + expect(size).toBe(2); + resolve(); + }); + }); + }); + }); + }); + + test('promiseCalls', async () => { + await new Promise(resolve => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.addPromise("hello") + .then(() => { return arrayList.addPromise("world"); }) + .then(() => { return arrayList.sizePromise(); }) + .then((size) => { + expect(size).toBe(2); + resolve(); + }); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/default.test.js b/testAsyncOptions/default.test.js new file mode 100644 index 00000000..dfe147f6 --- /dev/null +++ b/testAsyncOptions/default.test.js @@ -0,0 +1,69 @@ +// In the default case, the developer does not set asyncOptions. +// We should get the defacto standard behavior. + +import { describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('default', () => { + test('api', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeTruthy(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addPromise === 'undefined', 'Expected `addPromise` to NOT be present, but it is.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + const ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + const arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.sizeSync()).toBe(0); + }); + + test('staticAPI', () => { + const String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + const api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('format'), 'Expected `format` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatPromise'), 'Expected `formatPromise` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeFalsy(); + }); + + test('syncCalls', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.addSync("hello"); + arrayList.addSync("world"); + expect(arrayList.sizeSync()).toBe(2); + }); + + test('staticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + const String = java.import("java.lang.String"); + expect(String.formatSync('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('asyncCalls', async () => { + await new Promise(resolve => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.add("hello", function (err, result) { + expect(err).toBeFalsy(); + arrayList.add("world", function (err, result) { + expect(err).toBeFalsy(); + arrayList.size(function (err, size) { + expect(err).toBeFalsy(); + expect(size).toBe(2); + resolve(); + }); + }); + }); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/invalidLaunch.test.js b/testAsyncOptions/invalidLaunch.test.js new file mode 100644 index 00000000..d88f181b --- /dev/null +++ b/testAsyncOptions/invalidLaunch.test.js @@ -0,0 +1,51 @@ +import { describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('invalidLaunch', () => { + test('failedLaunch', () => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "Sync", + asyncSuffix: "" + }; + + // First show that if asyncOptions.promisify is undefined, using the promise variant of ensureJvm throws an error. + expect(() => { java.ensureJvm(); }).toThrow(/requires its one argument to be a callback function/); + + expect(java.isJvmCreated()).toBeFalsy(); + }); + + test('callbackNotAFunction', () => { + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "", + promiseSuffix: 'P', + promisify: require('when/node').lift // https://github.com/cujojs/when + }; + + expect(() => { java.ensureJvm('foo') }).toThrow(/requires its one argument to be a callback function/); + + expect(java.isJvmCreated()).toBeFalsy(); + }); + + test('jvmCanStillBeLaunched', async () => { + // None of the previous tests should have caused the JVM to be created, so it should still be possible to create one. + + expect(java.isJvmCreated()).toBeFalsy(); + + java.asyncOptions = { + syncSuffix: "", + promiseSuffix: 'P', + promisify: require('when/node').lift // https://github.com/cujojs/when + }; + + await new Promise(resolve => { + java.ensureJvm().done(function () { + expect(java.isJvmCreated()).toBeTruthy(); + resolve(); + }); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/noAsync.test.js b/testAsyncOptions/noAsync.test.js new file mode 100644 index 00000000..7b57fbde --- /dev/null +++ b/testAsyncOptions/noAsync.test.js @@ -0,0 +1,104 @@ +// Just Sync and Promise, both with a non-empty suffix. + +import { beforeAll, describe, expect, test } from "vitest"; +import when from 'when'; +import { java } from "../testHelpers"; + +describe('noAsync', () => { + beforeAll(async () => { + var api = Object.keys(java).filter((key) => typeof java[key] === 'function'); + expect(api.includes('isJvmCreated'), 'Expected `isJvmCreated` to be present, but it is NOT.').toBeTruthy(); + expect(java.isJvmCreated()).toBeFalsy(); + + function before() { + var promise = when.promise(function (resolve) { + expect(java.isJvmCreated()).toBeFalsy(); + resolve(); + }); + return promise; + } + + function after() { + var promise = when.promise(function (resolve) { + expect(java.isJvmCreated()).toBeTruthy(); + resolve(); + }); + return promise; + } + + java.asyncOptions = { + syncSuffix: "Sync", + promiseSuffix: 'Promise', + promisify: require('when/node').lift + }; + java.registerClientP(before, after); + java.registerClientP(null, after); + java.registerClientP(before); + + await new Promise(resolve => { + java.ensureJvm().done(function () { + expect(java.isJvmCreated()).toBeTruthy(); + resolve(); + }); + }); + }); + + test('api', () => { + var arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeTruthy(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addPromise !== 'undefined', 'Expected `addPromise` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.add === 'undefined', 'Expected `add` to NOT be present, but it is.').toBeTruthy(); + expect(typeof arrayList.addAsync === 'undefined', 'Expected `addAsync` to NOT be present, but it is.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + var ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + var arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.sizeSync()).toBe(0); + }); + + test('staticAPI', () => { + var String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatPromise'), 'Expected `formatPromise` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('format'), 'Expected `format` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeFalsy(); + }); + + test('syncCalls', () => { + var arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.addSync("hello"); + arrayList.addSync("world"); + expect(arrayList.sizeSync()).toBe(2); + }); + + test('sStaticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + var String = java.import("java.lang.String"); + expect(String.formatSync('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('promiseCalls', async () => { + var arrayList = java.newInstanceSync("java.util.ArrayList"); + await new Promise(resolve => { + arrayList.addPromise("hello") + .then(() => { return arrayList.addPromise("world"); }) + .then(() => { return arrayList.sizePromise(); }) + .then((size) => { + expect(size).toBe(2); + resolve(); + }); + }); + }); +}); \ No newline at end of file diff --git a/testAsyncOptions/syncDefaultPlusPromise.test.js b/testAsyncOptions/syncDefaultPlusPromise.test.js new file mode 100644 index 00000000..18ee86ed --- /dev/null +++ b/testAsyncOptions/syncDefaultPlusPromise.test.js @@ -0,0 +1,73 @@ +// Just Sync and Promise, with Sync the default (i.e. no suffix). +// This is the configuration that RedSeal wants for use with Tinkerpop/Gremlin. + +import { describe, expect, test } from "vitest"; +import { getJava } from "../testHelpers"; + +const java = getJava({ + syncSuffix: "", + promiseSuffix: 'P', + promisify: require('when/node').lift // https://github.com/cujojs/when +}); + +describe('syncDefaultPlusPromise', () => { + test('api', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + expect(arrayList).toBeTruthy(); + expect(java.instanceOf(arrayList, "java.util.ArrayList")).toBeTruthy(); + + expect(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addP !== 'undefined', 'Expected `addP` to be present, but it is NOT.').toBeTruthy(); + expect(typeof arrayList.addSync === 'undefined', 'Expected `addSync` to NOT be present, but it is.').toBeTruthy(); + expect(typeof arrayList.addAsync === 'undefined', 'Expected `addAsync` to NOT be present, but it is.').toBeTruthy(); + }); + + test('importClass', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // This test verifies the import runs without error. + const ArrayList = java.import("java.util.ArrayList"); + expect(ArrayList).toBeTruthy(); + const arrayList = new ArrayList(); + expect(arrayList).toBeTruthy(); + expect(arrayList.size()).toBe(0); + }); + + test('staticAPI', () => { + const String = java.import("java.lang.String"); + expect(String).toBeTruthy(); + + const api = Object.keys(String).filter((key) => typeof String[key] === 'function'); + expect(api.includes('format'), 'Expected `format` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatP'), 'Expected `formatP` to be present, but it is NOT.').toBeTruthy(); + expect(api.includes('formatSync'), 'Expected `formatSync` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.').toBeFalsy(); + expect(api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.').toBeFalsy(); + }); + + test('syncCalls', () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + arrayList.add("hello"); + arrayList.add("world"); + expect(arrayList.size()).toBe(2); + }); + + test('staticSyncCalls', () => { + // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. + // Among other things, java.import creates Sync functions for static methods. + const String = java.import("java.lang.String"); + expect(String.format('%s--%s', "hello", "world")).toBe("hello--world"); + }); + + test('promiseCalls', async () => { + const arrayList = java.newInstanceSync("java.util.ArrayList"); + await new Promise(resolve => { + arrayList.addP("hello") + .then(() => { return arrayList.addP("world"); }) + .then(() => { return arrayList.sizeP(); }) + .then((size) => { + expect(size).toBe(2); + resolve(); + }); + }); + }); +}); diff --git a/testAsyncOptions/testAllThreeSuffix.js b/testAsyncOptions/testAllThreeSuffix.js deleted file mode 100644 index 7f610ce5..00000000 --- a/testAsyncOptions/testAllThreeSuffix.js +++ /dev/null @@ -1,99 +0,0 @@ -// testAllThreeSuffix.js - -// All three variants have non-empty suffix, i.e a suffix is required for any variant. - -var java = require("../"); -var assert = require("assert"); - -java.asyncOptions = { - syncSuffix: "Sync", - asyncSuffix: "Async", - promiseSuffix: 'Promise', - promisify: require('when/node').lift // https://github.com/cujojs/when -}; - -module.exports = { - testAPI: function(test) { - test.expect(6); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.'); - test.ok(typeof arrayList.addAsync !== 'undefined', 'Expected `addAsync` to be present, but it is NOT.'); - test.ok(typeof arrayList.addPromise !== 'undefined', 'Expected `addPromise` to be present, but it is NOT.'); - test.ok(typeof arrayList.add === 'undefined', 'Expected `add` to NOT be present, but it is.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.sizeSync(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.'); - test.ok(api.includes('formatAsync'), 'Expected `formatAsync` to be present, but it is NOT.'); - test.ok(api.includes('formatPromise'), 'Expected `formatPromise` to be present, but it is NOT.'); - test.ok(!api.includes('format'), 'Expected `format` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addSync("hello"); - arrayList.addSync("world"); - test.strictEqual(arrayList.sizeSync(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.formatSync('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testAsyncCalls: function(test) { - test.expect(4); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addAsync("hello", function(err, result) { - test.ifError(err); - arrayList.addAsync("world", function(err, result) { - test.ifError(err); - arrayList.sizeAsync(function(err, size) { - test.ifError(err); - test.strictEqual(size, 2); - test.done(); - }); - }); - }); - }, - - testPromiseCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addPromise("hello") - .then(function () { return arrayList.addPromise("world"); }) - .then(function () { return arrayList.sizePromise(); }) - .then(function (size) { - test.strictEqual(size, 2); - test.done(); - }); - } -} diff --git a/testAsyncOptions/testAsyncSuffixSyncDefault.js b/testAsyncOptions/testAsyncSuffixSyncDefault.js deleted file mode 100644 index 784b54ba..00000000 --- a/testAsyncOptions/testAsyncSuffixSyncDefault.js +++ /dev/null @@ -1,160 +0,0 @@ -// testAsyncSuffixSyncDefault.js - -// Use "Async" for the asyncSuffix, and "" for the syncSuffix. - -var java = require("../"); -var assert = require("assert"); - -module.exports = { - launch: function(test) { - test.expect(4); - java.asyncOptions = { - syncSuffix: "", - asyncSuffix: "Async", - ifReadOnlySuffix: "_alt" - }; - - function before(callback) { - java.classpath.push('test/'); - test.ok(!java.isJvmCreated()); - callback(); - } - - function after(callback) { - test.ok(java.isJvmCreated()); - callback(); - } - - java.registerClient(before, after); - - java.ensureJvm(function(err) { - test.ifError(err); - test.ok(java.isJvmCreated()); - test.done(); - }); - }, - - testAPI: function(test) { - test.expect(5); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(typeof arrayList.addAsync !== 'undefined', 'Expected `addAsync` to be present, but it is NOT.'); - test.ok(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.'); - test.ok(typeof arrayList.addPromise === 'undefined', 'Expected `addPromise` to NOT be present, but it is.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.size(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('format'), 'Expected `format` to be present, but it is NOT.'); - test.ok(api.includes('formatAsync'), 'Expected `formatAsync` to be present, but it is NOT.'); - test.ok(!api.includes('formatSync'), 'Expected `formatSync` to NOT be present, but it is.'); - test.ok(!api.includes('formatPromise'), 'Expected `formatPromise` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.add("hello"); - arrayList.add("world"); - test.strictEqual(arrayList.size(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.format('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testAsyncCalls: function(test) { - test.expect(4); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addAsync("hello", function(err, result) { - test.ifError(err); - arrayList.addAsync("world", function(err, result) { - test.ifError(err); - arrayList.sizeAsync(function(err, size) { - test.ifError(err); - test.strictEqual(size, 2); - test.done(); - }); - }); - }); - }, - - // See testUnusableMethodName.js for the purpose of these last two tests. - // In that test, Test.name_alt() is an async method. - // In this test, it is a sync method. - testUnusableMethodNameThrows: function(test) { - test.expect(1); - var Test = java.import("Test"); - test.ok(Test); - test.throws( - function() { - Test.name(); - }, - function(err) { - if (err instanceof TypeError) { - test.done(); - return true; - } else { - test.done(err); - return false; - } - } - ); - }, - - testAlternateMethodNameWorks: function(test) { - test.expect(4); - var Test = java.import("Test"); - test.ok(Test); - test.strictEqual(Test.name_alt(), "name"); - test.strictEqual(Test.caller_alt(), "caller"); - test.strictEqual(Test.arguments_alt(), "arguments"); - test.done(); - }, - - testReservedFieldName: function(test) { - test.expect(7); - var TestEnum = java.import("Test$Enum"); - test.ok(TestEnum); - - // 'foo' and 'bar' are valid enum names - test.strictEqual(TestEnum.foo.toString(), "foo"); - test.strictEqual(TestEnum.bar.toString(), "bar"); - - // TestEnum.name is actually the name of the proxy constructor function. - test.strictEqual(TestEnum.name, "javaClassConstructorProxy"); - - // Instead we need to acccess TestEnum.name_alt - test.strictEqual(TestEnum.name_alt.toString(), "name"); - test.strictEqual(TestEnum.caller_alt.toString(), "caller"); - test.strictEqual(TestEnum.arguments_alt.toString(), "arguments"); - - test.done(); - }, -} diff --git a/testAsyncOptions/testClientBeforeError.js b/testAsyncOptions/testClientBeforeError.js deleted file mode 100644 index cd3011ab..00000000 --- a/testAsyncOptions/testClientBeforeError.js +++ /dev/null @@ -1,32 +0,0 @@ -// testClientBeforeError.js - -var java = require("../"); -var nodeunit = require("nodeunit"); - -module.exports = { - - clientBeforeError: function(test) { - test.expect(6); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - }; - - function before(callback) { - test.ok(!java.isJvmCreated()); - callback(new Error('dummy error')); - } - - java.registerClient(before); - - java.ensureJvm(function(err) { - test.ok(err && typeof err === 'object'); - test.ok(err instanceof Error); - test.strictEqual(err.message, 'dummy error'); - test.ok(!java.isJvmCreated()); - test.done(); - }); - } - -} diff --git a/testAsyncOptions/testClientBeforeSyncThrows.js b/testAsyncOptions/testClientBeforeSyncThrows.js deleted file mode 100644 index 8d5d4bab..00000000 --- a/testAsyncOptions/testClientBeforeSyncThrows.js +++ /dev/null @@ -1,32 +0,0 @@ -// testClientBeforeSyncThrows.js - -var java = require("../"); -var nodeunit = require("nodeunit"); - -module.exports = { - - clientBeforeSyncThrows: function(test) { - test.expect(6); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - }; - - function before() { - test.ok(!java.isJvmCreated()); - throw new Error('dummy error'); - } - - java.registerClient(before); - - java.ensureJvm(function(err) { - test.ok(err && typeof err === 'object'); - test.ok(err instanceof Error); - test.strictEqual(err.message, 'dummy error'); - test.ok(!java.isJvmCreated()); - test.done(); - }); - } - -} diff --git a/testAsyncOptions/testClientBeforeThrows.js b/testAsyncOptions/testClientBeforeThrows.js deleted file mode 100644 index 79614aa2..00000000 --- a/testAsyncOptions/testClientBeforeThrows.js +++ /dev/null @@ -1,32 +0,0 @@ -// testClientBeforeThrows.js - -var java = require("../"); -var nodeunit = require("nodeunit"); - -module.exports = { - - clientBeforeThrows: function(test) { - test.expect(6); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - }; - - function before(callback) { - test.ok(!java.isJvmCreated()); - throw new Error('dummy error'); - } - - java.registerClient(before); - - java.ensureJvm(function(err) { - test.ok(err && typeof err === 'object'); - test.ok(err instanceof Error); - test.strictEqual(err.message, 'dummy error'); - test.ok(!java.isJvmCreated()); - test.done(); - }); - } - -} diff --git a/testAsyncOptions/testClientPBeforeError.js b/testAsyncOptions/testClientPBeforeError.js deleted file mode 100644 index 33a02f26..00000000 --- a/testAsyncOptions/testClientPBeforeError.js +++ /dev/null @@ -1,43 +0,0 @@ -// testClientPBeforeError.js - -var java = require("../"); -var nodeunit = require("nodeunit"); -var when = require('when'); - -module.exports = { - - clientPBeforeError: function(test) { - test.expect(6); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - promiseSuffix: 'Promise', - promisify: require('when/node').lift // https://github.com/cujojs/when - }; - - function beforeP() { - var promise = when.promise(function(resolve, reject) { - test.ok(!java.isJvmCreated()); - reject(new Error('dummy error')); - }); - return promise; - } - - java.registerClientP(beforeP); - - java.ensureJvm().done( - function () { - test.ok(false); - }, - function(err) { - test.ok(err && typeof err === 'object'); - test.ok(err instanceof Error); - test.strictEqual(err.message, 'dummy error'); - test.ok(!java.isJvmCreated()); - test.done(); - } - ); - } - -} diff --git a/testAsyncOptions/testClientPBeforeThrows.js b/testAsyncOptions/testClientPBeforeThrows.js deleted file mode 100644 index 5d58dab5..00000000 --- a/testAsyncOptions/testClientPBeforeThrows.js +++ /dev/null @@ -1,43 +0,0 @@ -// testClientPBeforeThrows.js - -var java = require("../"); -var nodeunit = require("nodeunit"); -var when = require('when'); - -module.exports = { - - clientPBeforeThrows: function(test) { - test.expect(6); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - promiseSuffix: 'Promise', - promisify: require('when/node').lift // https://github.com/cujojs/when - }; - - function beforeP() { - var promise = when.promise(function(resolve, reject) { - test.ok(!java.isJvmCreated()); - throw new Error('dummy error'); - }); - return promise; - } - - java.registerClientP(beforeP); - - java.ensureJvm().done( - function () { - test.ok(false); - }, - function(err) { - test.ok(err && typeof err === 'object'); - test.ok(err instanceof Error); - test.strictEqual(err.message, 'dummy error'); - test.ok(!java.isJvmCreated()); - test.done(); - } - ); - } - -} diff --git a/testAsyncOptions/testDefacto.js b/testAsyncOptions/testDefacto.js deleted file mode 100644 index 314a8ebd..00000000 --- a/testAsyncOptions/testDefacto.js +++ /dev/null @@ -1,115 +0,0 @@ -// testDefacto.js - -// In the defacto case, the developer sets asyncOptions, but specifies the defacto standard behavior. - -var java = require("../"); -var nodeunit = require("nodeunit"); - -module.exports = { - - launch: function(test) { - test.expect(9); - var api = Object.keys(java).filter((key) => typeof java[key] === 'function'); - test.ok(api.includes('isJvmCreated'), 'Expected `isJvmCreated` to be present, but it is NOT.'); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - asyncSuffix: "" - }; - - function before() { - test.ok(!java.isJvmCreated()); - } - - function after() { - test.ok(java.isJvmCreated()); - } - - java.registerClient(before, after); - java.registerClient(undefined, after); - java.registerClient(before, undefined); - - java.ensureJvm(function(err) { - test.ifError(err); - test.ok(java.isJvmCreated()); - - // Verify that ensureJvm is idempotent - java.ensureJvm(function(err) { - test.ifError(err); - test.done(); - }); - }); - }, - - testAPI: function(test) { - test.expect(5); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.'); - test.ok(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.'); - test.ok(typeof arrayList.addPromise === 'undefined', 'Expected `addPromise` to NOT be present, but it is.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.sizeSync(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('format'), 'Expected `format` to be present, but it is NOT.'); - test.ok(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.'); - test.ok(!api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.'); - test.ok(!api.includes('formatPromise'), 'Expected `formatPromise` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addSync("hello"); - arrayList.addSync("world"); - test.strictEqual(arrayList.sizeSync(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.formatSync('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testAsyncCalls: function(test) { - test.expect(4); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.add("hello", function(err, result) { - test.ifError(err); - arrayList.add("world", function(err, result) { - test.ifError(err); - arrayList.size(function(err, size) { - test.ifError(err); - test.strictEqual(size, 2); - test.done(); - }); - }); - }); - } -} diff --git a/testAsyncOptions/testDefactoPlusPromise.js b/testAsyncOptions/testDefactoPlusPromise.js deleted file mode 100644 index 730c889d..00000000 --- a/testAsyncOptions/testDefactoPlusPromise.js +++ /dev/null @@ -1,124 +0,0 @@ -// testDefactoPlusPromise.js - -// The defacto case but with promises also enabled. - -var java = require("../"); -var assert = require("assert"); - -module.exports = { - launch: function(test) { - test.expect(7); - var api = Object.keys(java).filter((key) => typeof java[key] === 'function'); - test.ok(api.includes('isJvmCreated'), 'Expected `isJvmCreated` to be present, but it is NOT.'); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - asyncSuffix: "", - promiseSuffix: 'Promise', - promisify: require('when/node').lift // https://github.com/cujojs/when - }; - - function before(callback) { - test.ok(!java.isJvmCreated()); - callback(); - } - - function after(callback) { - test.ok(java.isJvmCreated()); - callback(); - } - - java.registerClient(before, after); - java.registerClient(null, after); - java.registerClient(before); - - java.ensureJvm().done(function() { - test.ok(java.isJvmCreated()); - test.done(); - }); - }, - - testAPI: function(test) { - test.expect(5); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.'); - test.ok(arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.'); - test.ok(arrayList.addPromise !== 'undefined', 'Expected `addPromise` to be present, but it is NOT.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.sizeSync(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('format'), 'Expected `format` to be present, but it is NOT.'); - test.ok(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.'); - test.ok(api.includes('formatPromise'), 'Expected `formatPromise` to be present, but it is NOT.'); - test.ok(!api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addSync("hello"); - arrayList.addSync("world"); - test.strictEqual(arrayList.sizeSync(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.formatSync('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testAsyncCalls: function(test) { - test.expect(4); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.add("hello", function(err, result) { - test.ifError(err); - arrayList.add("world", function(err, result) { - test.ifError(err); - arrayList.size(function(err, size) { - test.ifError(err); - test.strictEqual(size, 2); - test.done(); - }); - }); - }); - }, - - testPromiseCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addPromise("hello") - .then(function () { return arrayList.addPromise("world"); }) - .then(function () { return arrayList.sizePromise(); }) - .then(function (size) { - test.strictEqual(size, 2); - test.done(); - }); - } -} diff --git a/testAsyncOptions/testDefault.js b/testAsyncOptions/testDefault.js deleted file mode 100644 index e58a773f..00000000 --- a/testAsyncOptions/testDefault.js +++ /dev/null @@ -1,82 +0,0 @@ -// testDefault.js - -// In the default case, the developer does not set asyncOptions. -// We should get the defacto standard behavior. - -var java = require("../"); -var nodeunit = require("nodeunit"); - -java.asyncOptions = undefined; - -module.exports = { - testAPI: function(test) { - test.expect(5); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.'); - test.ok(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.'); - test.ok(typeof arrayList.addPromise === 'undefined', 'Expected `addPromise` to NOT be present, but it is.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.sizeSync(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('format'), 'Expected `format` to be present, but it is NOT.'); - test.ok(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.'); - test.ok(!api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.'); - test.ok(!api.includes('formatPromise'), 'Expected `formatPromise` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addSync("hello"); - arrayList.addSync("world"); - test.strictEqual(arrayList.sizeSync(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.formatSync('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testAsyncCalls: function(test) { - test.expect(4); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.add("hello", function(err, result) { - test.ifError(err); - arrayList.add("world", function(err, result) { - test.ifError(err); - arrayList.size(function(err, size) { - test.ifError(err); - test.strictEqual(size, 2); - test.done(); - }); - }); - }); - } -} diff --git a/testAsyncOptions/testInvalidLaunch.js b/testAsyncOptions/testInvalidLaunch.js deleted file mode 100644 index 21c1bf33..00000000 --- a/testAsyncOptions/testInvalidLaunch.js +++ /dev/null @@ -1,58 +0,0 @@ -// testInvalidLaunch.js - -var java = require("../"); -var nodeunit = require("nodeunit"); - -module.exports = { - - failedLaunch: function(test) { - test.expect(3); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - asyncSuffix: "" - }; - - // First show that if asyncOptions.promisify is undefined, using the promise variant of ensureJvm throws an error. - test.throws(function() { java.ensureJvm(); }, Error, /requires its one argument to be a callback function/); - - test.ok(!java.isJvmCreated()); - test.done(); - }, - - callbackNotAFunction: function(test) { - test.expect(3); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "", - promiseSuffix: 'P', - promisify: require('when/node').lift // https://github.com/cujojs/when - }; - - test.throws(function() { java.ensureJvm('foo'); }, Error, /requires its one argument to be a callback function/); - - test.ok(!java.isJvmCreated()); - test.done(); - }, - - jvmCanStillBeLaunched: function(test) { - // None of the previous tests should have caused the JVM to be created, so it should still be possible to create one. - - test.expect(2); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "", - promiseSuffix: 'P', - promisify: require('when/node').lift // https://github.com/cujojs/when - }; - - java.ensureJvm().done(function() { - test.ok(java.isJvmCreated()); - test.done(); - }); - } - -} diff --git a/testAsyncOptions/testNoAsync.js b/testAsyncOptions/testNoAsync.js deleted file mode 100644 index 47f596c8..00000000 --- a/testAsyncOptions/testNoAsync.js +++ /dev/null @@ -1,115 +0,0 @@ -// testNoAsync.js - -// Just Sync and Promise, both with a non-empty suffix. - -var java = require("../"); -var assert = require("assert"); -var when = require('when'); - -module.exports = { - launch: function(test) { - test.expect(7); - var api = Object.keys(java).filter((key) => typeof java[key] === 'function'); - test.ok(api.includes('isJvmCreated'), 'Expected `isJvmCreated` to be present, but it is NOT.'); - test.ok(!java.isJvmCreated()); - - java.asyncOptions = { - syncSuffix: "Sync", - promiseSuffix: 'Promise', - promisify: require('when/node').lift - }; - - function before() { - var promise = when.promise(function(resolve, reject) { - test.ok(!java.isJvmCreated()); - resolve(); - }); - return promise; - } - - function after() { - var promise = when.promise(function(resolve, reject) { - test.ok(java.isJvmCreated()); - resolve(); - }); - return promise; - } - - java.registerClientP(before, after); - java.registerClientP(null, after); - java.registerClientP(before); - - java.ensureJvm().done(function() { - test.ok(java.isJvmCreated()); - test.done(); - }); - }, - - testAPI: function(test) { - test.expect(6); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(typeof arrayList.addSync !== 'undefined', 'Expected `addSync` to be present, but it is NOT.'); - test.ok(typeof arrayList.addPromise !== 'undefined', 'Expected `addPromise` to be present, but it is NOT.'); - test.ok(typeof arrayList.add === 'undefined', 'Expected `add` to NOT be present, but it is.'); - test.ok(typeof arrayList.addAsync === 'undefined', 'Expected `addAsync` to NOT be present, but it is.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.sizeSync(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('formatSync'), 'Expected `formatSync` to be present, but it is NOT.'); - test.ok(api.includes('formatPromise'), 'Expected `formatPromise` to be present, but it is NOT.'); - test.ok(!api.includes('format'), 'Expected `format` to NOT be present, but it is.'); - test.ok(!api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addSync("hello"); - arrayList.addSync("world"); - test.strictEqual(arrayList.sizeSync(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.formatSync('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testPromiseCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addPromise("hello") - .then(function () { return arrayList.addPromise("world"); }) - .then(function () { return arrayList.sizePromise(); }) - .then(function (size) { - test.strictEqual(size, 2); - test.done(); - }); - } -} diff --git a/testAsyncOptions/testSyncDefaultPlusPromise.js b/testAsyncOptions/testSyncDefaultPlusPromise.js deleted file mode 100644 index 113be49c..00000000 --- a/testAsyncOptions/testSyncDefaultPlusPromise.js +++ /dev/null @@ -1,85 +0,0 @@ -// testSyncDefaultPlusPromise.js - -// Just Sync and Promise, with Sync the default (i.e. no suffix). -// This is the configuration that RedSeal wants for use with Tinkerpop/Gremlin. - -var java = require("../"); -var assert = require("assert"); - -java.asyncOptions = { - syncSuffix: "", - promiseSuffix: 'P', - promisify: require('when/node').lift // https://github.com/cujojs/when -}; - -module.exports = { - testAPI: function(test) { - test.expect(6); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - test.ok(arrayList); - test.ok(java.instanceOf(arrayList, "java.util.ArrayList")); - - test.ok(typeof arrayList.add !== 'undefined', 'Expected `add` to be present, but it is NOT.'); - test.ok(typeof arrayList.addP !== 'undefined', 'Expected `addP` to be present, but it is NOT.'); - test.ok(typeof arrayList.addSync === 'undefined', 'Expected `addSync` to NOT be present, but it is.'); - test.ok(typeof arrayList.addAsync === 'undefined', 'Expected `addAsync` to NOT be present, but it is.'); - test.done(); - }, - - testImportClass: function(test) { - test.expect(3); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // This test verifies the import runs without error. - var ArrayList = java.import("java.util.ArrayList"); - test.ok(ArrayList); - var arrayList = new ArrayList(); - test.ok(arrayList); - test.strictEqual(arrayList.size(), 0); - test.done(); - }, - - testStaticAPI: function(test) { - test.expect(6); - var String = java.import("java.lang.String"); - test.ok(String); - - var api = Object.keys(String).filter((key) => typeof String[key] === 'function'); - test.ok(api.includes('format'), 'Expected `format` to be present, but it is NOT.'); - test.ok(api.includes('formatP'), 'Expected `formatP` to be present, but it is NOT.'); - test.ok(!api.includes('formatSync'), 'Expected `formatSync` to NOT be present, but it is.'); - test.ok(!api.includes('formatAsync'), 'Expected `formatAsync` to NOT be present, but it is.'); - test.ok(!api.includes('formatundefined'), 'Expected `formatundefined` to NOT be present, but it is.'); - test.done(); - }, - - testSyncCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.add("hello"); - arrayList.add("world"); - test.strictEqual(arrayList.size(), 2); - test.done(); - }, - - testStaticSyncCalls: function(test) { - test.expect(1); - // Note: java.import executes javascript code in lib/nodeJavaBridge that makes sync calls to java classes. - // Among other things, java.import creates Sync functions for static methods. - var String = java.import("java.lang.String"); - test.strictEqual(String.format('%s--%s', "hello", "world"), "hello--world"); - test.done(); - }, - - testPromiseCalls: function(test) { - test.expect(1); - var arrayList = java.newInstanceSync("java.util.ArrayList"); - arrayList.addP("hello") - .then(function () { return arrayList.addP("world"); }) - .then(function () { return arrayList.sizeP(); }) - .then(function (size) { - test.strictEqual(size, 2); - test.done(); - }); - } - -} diff --git a/testAsyncOptions/testUnusableMethodName.js b/testAsyncOptions/testUnusableMethodName.js deleted file mode 100644 index 1da67e4b..00000000 --- a/testAsyncOptions/testUnusableMethodName.js +++ /dev/null @@ -1,161 +0,0 @@ -// testUnusableMethodName.js - -// For any function, the property 'name' is an unwritable property. -// The value returned by java.import() is a constructor-like function that has the shape of the class. -// In particular, any static methods of the class will be added as properties of the function. -// If a class has a static method named 'name', then an exception woudld be thrown when -// node-java attempts to set assign the static method to the .name property of constructor-like function. -// As a workaround, node-java will append the `ifReadOnlySuffix` to the property name. - -var java = require("../"); -var nodeunit = require("nodeunit"); - -module.exports = { - - launch: function(test) { - test.expect(4); - java.asyncOptions = { - syncSuffix: "Sync", - asyncSuffix: "", - ifReadOnlySuffix: "_alt" - }; - - function before(callback) { - java.classpath.push('test/'); - test.ok(!java.isJvmCreated()); - callback(); - } - - function after(callback) { - test.ok(java.isJvmCreated()); - callback(); - } - - java.registerClient(before, after); - - java.ensureJvm(function(err) { - test.ifError(err); - test.ok(java.isJvmCreated()); - test.done(); - }); - }, - - testUnusableMethodName_nameThrows: function(test) { - test.expect(1); - var Test = java.import("Test"); - test.ok(Test); - test.throws( - function() { - Test.name(function(err) { - test.fail(); // should not get here - }); - }, - function(err) { - if (err instanceof TypeError) { - test.done(); - return true; - } else { - test.done(err); - return false; - } - } - ); - }, - - testUnusableMethodName_callerThrows: function(test) { - test.expect(1); - var Test = java.import("Test"); - test.ok(Test); - test.throws( - function() { - Test.caller(function(err) { - test.fail(); // should not get here - }); - }, - function(err) { - if (err instanceof TypeError) { - test.done(); - return true; - } else { - test.done(err); - return false; - } - } - ); - }, - - testUnusableMethodName_argumentsThrows: function(test) { - test.expect(1); - var Test = java.import("Test"); - test.ok(Test); - test.throws( - function() { - Test.arguments(function(err) { - test.fail(); // should not get here - }); - }, - function(err) { - if (err instanceof TypeError) { - test.done(); - return true; - } else { - test.done(err); - return false; - } - } - ); - }, - - testAlternateMethodName_name_altWorks: function(test) { - test.expect(3); - var Test = java.import("Test"); - test.ok(Test); - Test.name_alt(function(err, val) { - test.ifError(err); - test.strictEqual(val, "name"); - test.done(); - }); - }, - - testAlternateMethodName_caller_altWorks: function(test) { - test.expect(3); - var Test = java.import("Test"); - test.ok(Test); - Test.caller_alt(function(err, val) { - test.ifError(err); - test.strictEqual(val, "caller"); - test.done(); - }); - }, - - testAlternateMethodName_arguments_altWorks: function(test) { - test.expect(3); - var Test = java.import("Test"); - test.ok(Test); - Test.arguments_alt(function(err, val) { - test.ifError(err); - test.strictEqual(val, "arguments"); - test.done(); - }); - }, - - testReservedFieldName: function(test) { - test.expect(7); - var TestEnum = java.import("Test$Enum"); - test.ok(TestEnum); - - // 'foo' and 'bar' are valid enum names - test.strictEqual(TestEnum.foo.toStringSync(), "foo"); - test.strictEqual(TestEnum.bar.toStringSync(), "bar"); - - // TestEnum.name is actually the name of the proxy constructor function. - test.strictEqual(TestEnum.name, "javaClassConstructorProxy"); - - // Instead we need to acccess TestEnum.name_alt - test.strictEqual(TestEnum.name_alt.toString(), "name"); - test.strictEqual(TestEnum.caller_alt.toString(), "caller"); - test.strictEqual(TestEnum.arguments_alt.toString(), "arguments"); - - test.done(); - }, -} diff --git a/testAsyncOptions/unusableMethodName.test.js b/testAsyncOptions/unusableMethodName.test.js new file mode 100644 index 00000000..30ed9831 --- /dev/null +++ b/testAsyncOptions/unusableMethodName.test.js @@ -0,0 +1,122 @@ +// For any function, the property 'name' is an unwritable property. +// The value returned by java.import() is a constructor-like function that has the shape of the class. +// In particular, any static methods of the class will be added as properties of the function. +// If a class has a static method named 'name', then an exception woudld be thrown when +// node-java attempts to set assign the static method to the .name property of constructor-like function. +// As a workaround, node-java will append the `ifReadOnlySuffix` to the property name. + +import { beforeAll, describe, expect, test } from "vitest"; +import { java } from "../testHelpers"; + +describe('unusableMethodName', () => { + beforeAll(async () => { + await new Promise(resolve => { + function before(callback) { + java.classpath.push('test/'); + expect(java.isJvmCreated()).toBeFalsy(); + callback(); + } + + function after(callback) { + expect(java.isJvmCreated()).toBeTruthy(); + callback(); + } + + java.asyncOptions = { + syncSuffix: "Sync", + asyncSuffix: "", + ifReadOnlySuffix: "_alt" + } + java.registerClient(before, after); + + java.ensureJvm(function (err) { + expect(err).toBeFalsy(); + expect(java.isJvmCreated()).toBeTruthy(); + resolve(); + }); + }); + }); + + test('unusableMethodName_nameThrows', () => { + var Test = java.import("Test"); + expect(Test).toBeTruthy(); + expect(() => { + Test.name(function (_err) { + throw new Error('should not get here'); + }); + }).toThrowError(TypeError); + }); + + test('unusableMethodName_callerThrows', () => { + var Test = java.import("Test"); + expect(Test).toBeTruthy(); + expect(() => { + Test.caller(function (_err) { + throw new Error('should not get here'); + }); + }).toThrowError(TypeError); + }); + + test('unusableMethodName_argumentsThrows', () => { + var Test = java.import("Test"); + expect(Test).toBeTruthy(); + expect(() => { + Test.arguments(function (_err) { + throw new Error('should not get here'); + }); + }).toThrowError(TypeError); + }); + + test('alternateMethodName_name_altWorks', async () => { + var Test = java.import("Test"); + expect(Test).toBeTruthy(); + await new Promise(resolve => { + Test.name_alt(function (err, val) { + expect(err).toBeFalsy(); + expect(val).toBe("name"); + resolve(); + }); + }); + }); + + test('alternateMethodName_caller_altWorks', async () => { + var Test = java.import("Test"); + expect(Test).toBeTruthy(); + await new Promise(resolve => { + Test.caller_alt(function (err, val) { + expect(err).toBeFalsy(); + expect(val).toBe("caller"); + resolve(); + }); + }); + }); + + test('alternateMethodName_arguments_altWorks', async () => { + var Test = java.import("Test"); + expect(Test).toBeTruthy(); + await new Promise(resolve => { + Test.arguments_alt(function (err, val) { + expect(err).toBeFalsy(); + expect(val).toBe("arguments"); + resolve(); + }); + }); + }); + + test('reservedFieldName', () => { + var TestEnum = java.import("Test$Enum"); + expect(TestEnum).toBeTruthy(); + + // 'foo' and 'bar' are valid enum names + expect(TestEnum.foo.toStringSync()).toBe("foo"); + expect(TestEnum.bar.toStringSync()).toBe("bar"); + + // TestEnum.name is actually the name of the proxy constructor function. + expect(TestEnum.name).toBe("javaClassConstructorProxy"); + + // Instead we need to access TestEnum.name_alt + expect(TestEnum.name_alt.toString()).toBe("name"); + expect(TestEnum.caller_alt.toString()).toBe("caller"); + expect(TestEnum.arguments_alt.toString()).toBe("arguments"); + }); +}); \ No newline at end of file diff --git a/testHelpers.js b/testHelpers.js index 01d5b687..7149b011 100644 --- a/testHelpers.js +++ b/testHelpers.js @@ -1,4 +1,4 @@ -var java = require("./"); +export const java = require("./"); java.options.push("-Djava.awt.headless=true"); //java.options.push('-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005'); @@ -6,27 +6,16 @@ java.classpath.push("test/"); java.classpath.push("test/commons-lang3-3.1.jar"); java.classpath.push("test8/"); -function promisifyQ(f) { - // Q doesn't provide a promisify function that works directly on a method. - // The .denodeify() (aka .nfbind()) function requires a bound function. - return function(/* arguments */) { - return require('q').nbind(f, this).apply(undefined, arguments); - } -} - -java.asyncOptions = { - syncSuffix: "Sync", - asyncSuffix: "", - promiseSuffix: 'Promise', - promisify: require('when/node').lift // https://github.com/cujojs/when +export function getJava(asyncOptions) { + java.asyncOptions = asyncOptions ?? { + syncSuffix: "Sync", + asyncSuffix: "", + promiseSuffix: 'Promise', + promisify: require('when/node').lift // https://github.com/cujojs/when + }; + // force initialization + java.import("java.util.ArrayList"); -// We've tested with 5 different Promises/A+ implementations: -// promisify: require('bluebird').promisify // https://github.com/petkaantonov/bluebird/ -// promisify: require('promise').denodeify // https://github.com/then/promise -// promisify: require('vow-node').promisify // https://github.com/dfilatov/vow-node -// promisify: require('when/node').lift // https://github.com/cujojs/when -// promisify: promisifyQ // https://github.com/kriskowal/q requires wrapper promisifyQ. -}; - -module.exports.java = java; + return java; +} diff --git a/testRunner.js b/testRunner.js index 7a990e67..b47d5ee5 100644 --- a/testRunner.js +++ b/testRunner.js @@ -1,38 +1,38 @@ // testRunner.js -// This is a custom test runner. All tests are run with nodeunit, but in separate +// This is a custom test runner. All tests are run with vitest, but in separate // processes, which allows us to test java with different configuration options. -var async = require('async'); -var chalk = require('chalk'); -var childProcess = require('child_process'); -var glob = require('glob'); -var path = require('path'); +const async = require('async'); +const chalk = require('chalk'); +const childProcess = require('child_process'); +const glob = require('glob'); +const path = require('path'); -var tests = glob.sync(path.join('testAsyncOptions', '*.js')); +const tests = glob.sync(path.join('testAsyncOptions', '*.test.js')).sort((a, b) => a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase())); -tests.unshift('test test8'); // Arrange to run the primary tests first, in a single process +tests.unshift('test'); // Arrange to run the primary tests first, in a single process function runTest(testArgs, done) { - var cmd = 'node_modules/.bin/nodeunit '; - if(process.platform == "win32") - cmd = 'node_modules\\.bin\\nodeunit '; - cmd += testArgs; + const vitest = path.join('node_modules', '.bin', 'vitest'); + const cmd = testArgs === 'test' ? `vitest --dir test` : `${vitest} ${testArgs}`; + console.log(`running "${cmd}"...`); childProcess.exec(cmd, function (error, stdout, stderr) { - // It appears that nodeunit merges error output into the stdout - // so these three lines are probably useless. var errText = stderr.toString(); - if (errText !== '') + if (errText !== '') { console.error(chalk.bold.red(errText)); + } process.stdout.write(stdout.toString()); done(error); }); } -async.eachSeries(tests, runTest, function(err) { +async.eachSeries(tests, runTest, function (err) { if (err) { console.error(chalk.bold.red(err)); process.exit(1); + return; } + console.log(chalk.green('Tests completed successfully!')); });